华为云用户手册

  • replace函数 将字符串中的匹配字符串替换成指定的字符串,如果未指定替换字符串,则将匹配的字符串从原来的字符串中删除。 语法:replace(str, subStr, replaceStr) 表6 参数说明 参数名称 描述 类型 是否必选 str 原始字符串。 String 是 subStr 目标子串。 String 是 replaceStr 用于替换的字符串。 String 否 返回值类型:String类型 示例:SELECT REPLACE('hello world', 'o'), REPLACE('hello world', 'w', 'new w') 表7 查询分析结果 类型 场景1 场景2 查询语句 REPLACE('hello world', 'o') REPLACE('hello world', 'w', 'new w') 返回结果 hell wrld hello new world
  • rpad函数 在字符串的结尾填充指定字符,直到指定长度后返回结果字符串。如果未指定填充字符,则使用“ ”进行填充。 语法:rpad(str, len, rpadStr) 表4 参数说明 参数名称 描述 类型 是否必选 str 原始字符串。 String 是 len 结果字符串的长度。 如果原始字符串的长度小于len,那么在字符串的结尾填充指定的字符。 如果原始字符串的长度大于len,那么只返回字符串的len个字符。 Integer 是 rpadStr 填充字符。 String 否 返回值类型:String类型 示例:SELECT RPAD('hello world', 10), RPAD('hello', 10, 'e') 表5 查询分析结果 类型 场景1 场景2 查询语句 RPAD('hello world', 10) RPAD('hello', 10, 'e') 返回结果 hello worl helloeeeee
  • lpad函数 在字符串的开头填充指定字符,直到指定长度后返回结果字符串。如果未指定填充字符,则使用“ ”进行填充。 语法:lpad(str, len, lpadStr) 表2 参数说明 参数名称 描述 类型 是否必选 str 原始字符串。 String 是 len 结果字符串的长度。 如果原始字符串的长度小于len,那么在字符串的开头填充指定的字符。 如果原始字符串的长度大于len,那么只返回字符串的len个字符。 int 是 lpadStr 填充字符。 String 否 返回值类型:String类型 示例:SELECT LPAD('hello world', 10), LPAD('hello', 10, 'e') 表3 查询分析结果 类型 场景1 场景2 查询语句 LPAD('hello world', 10) LPAD('hello', 10, 'e') 返回结果 hello worl eeeeehello
  • repeat函数 将字符串重复指定次数。 语法:repeat(str, num) 表10 参数说明 参数名称 描述 类型 是否必选 str 原始字符串。 String 是 num 重复次数 Integer 是 返回值类型:String类型 示例:SELECT REPEAT('hello world', 2), REPEAT('hello world', 0) 表11 查询分析结果 类型 场景1 场景2 查询语句 REPEAT('hello world', 2) REPEAT('hello world', 0) 返回结果 hello worldhello world
  • 函数列表 表1 字符串函数 函数 描述 lpad函数 在字符串的开头填充指定字符,直到指定长度后返回结果字符串。如果未指定填充字符,则使用“ ”进行填充。 rpad函数 在字符串的结尾填充指定字符,直到指定长度后返回结果字符串。如果未指定填充字符,则使用“ ”进行填充。 replace函数 将字符串中的匹配字符串替换成指定的字符串,如果未指定替换字符串,则将匹配的字符串从原来的字符串中删除。 reverse函数 将字符串转换成反向顺序的字符串。 repeat函数 将字符串重复指定次数。 contains_string函数 判断字符串是否包含指定字符串。 icontains_string函数 判断字符串是否包含指定字符串,字符串不区分大小写。 textcat函数 将两个字符串拼接起来,返回拼接后的结果。 btrim函数 删除字符串左右两侧的空格。 parse_long函数 将字符串转换成基于指定基数的Long型,如果未指定基数,则基于十进制对原始字符串进行转换。 split函数 使用指定的分隔符拆分字符串,并返回子字符串的集合。如果设置了limit,则使用limit限制拆分字符串的数量。 split_part函数 使用指定的分隔符拆分字符串,并返回指定位置的字符串。如果拆分后指定的位置超过数组的长度,则返回“”。 split_to_map函数 使用指定的第一个分隔符拆分字符串,然后使用指定的第二个分隔符第二次拆分字符串,返回第二次拆分后的结果。 string_format函数 返回以Java的String.format方式格式化的字符串。 strpos函数 查询目标子串初次出现在字符串中的位置,如果目标子串未出现在字符串中,则返回0。 substr函数 使用起始位置和长度返回子字符串。如果没有长度参数,则返回从起始位置开始的整个字符串,同substring。 substring函数 使用起始位置和长度返回子字符串。如果没有长度参数,则返回从起始位置开始的整个字符串。 length函数 如果字符串表达式是字符数据类型,则返回输入的字符长度;否则,返回字符串表达式的字节长度(不小于位数除以8的最小整数)。 char_length函数 与length函数功能一致,如果字符串表达式是字符数据类型,则返回输入的字符长度;否则,返回字符串表达式的字节长度(不小于位数除以8的最小整数)。 character_length函数 与length函数功能一致。 strlen函数 与length函数功能一致。 levenshtein_distance函数 计算两个字符串str1和str2之间的最小编辑距离。 normalize函数 格式化字符串。 to_utf8函数 将字符串转换为UTF-8编码格式。 chr函数 将ascii值转换成字符。 concat函数 用于将多个参数拼接成一个字符串。
  • 参数获取方式 上线区域表,使用华为云主机时参考以下信息: 表2 区域表 区 域名 称 区域 终端节点 华北-北京四 cn-north-4 https://lts-access.cn-north-4.myhuaweicloud.com:8102 华东-上海一 cn-east-3 https://lts-access.cn-east-3.myhuaweicloud.com:8102 华南-广州 cn-south-1 https://lts-access.cn-south-1.myhuaweicloud.com:8102 亚太-新加坡 ap-southeast-3 https://lts-access.ap-southeast-3.myhuaweicloud.com:8102 当前仅华北-北京四、华东-上海一、华南-广州区域使用SDK时支持跨云/本地上报日志,Endpoint端口使用443。 日志组ID:在 云日志 服务控制台,选择“日志管理”,鼠标悬浮在日志组名称上,可查看日志组名称和日志组ID。 日志流ID:单击日志组名称对应的按钮,鼠标悬浮在日志流名称上,可查看日志流名称和日志流ID。
  • 配置参数说明 producer config参数说明。 参数名称 描述 类型 是否需要填写 默认值 projectId 华为云账号的项目ID(project id)。 String 必填 - ak 华为云账号的AK。 String 必填 - sk 华为云账号的SK。 String 必填 - region 云日志服务的区域。 String 必填 - endpoint 上报目的。 String 必填 - logGroup LTS的日志组ID。 string 必填 - logStream LTS的日志流ID。 string 必填 - 日志生成GenerateLog方法类参数说明。单次上报条数小于4096条,且小于512K。 参数名称 描述 类型 是否需要填写 contents 批量日志内容。 []string 是 labels 日志标签,map格式。 map[string]string 是 日志上报SendLog方法类参数说明。 表1 SendLog方法类参数说明 参数名称 描述 类型 是否需要填写 groupId 日志组id string 是 streamId 日志流id string 是 log 日志结构 class Log 是
  • 安装Python SDK 获取LTS Python SDK包源码。 git clone https://gitee.com/lordstar-habile/huaweicloud-lts-python-sdk.git 安装相关依赖。 pip3 install requests pip3 install loguru pip3 install six 编写上报日志代码。 可以自定义发送成功与失败时的回调方法,实现方式请参考如下命令:创建CallBack对象,实现invoke_on_success和invoke_on_failed方法,并且在发送日志时直接使用。 class CallBack(object): def invoke_on_success(self, result): pass def invoke_on_failed(self, result): pass 示例如下: import random import time from concurrent.futures import ThreadPoolExecutor from loguru import logger from producer.core.producer import Producer from producer.callback.call_back import CallBack from producer.model import lts_store from producer.model.config import Config from producer.utils import common def generate_random_str(str_len=16): """ 生成一个指定长度的随机字符串 """ random_str = '' base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789' length = len(base_str) - 1 for i in range(str_len): random_str += base_str[random.randint(0, length)] return random_str def send_log_single_producer(): thread_num = 100 threads = [] begin_ms = common.current_time_ms() submit_send_log_thread_pool = ThreadPoolExecutor(max_workers=thread_num, thread_name_prefix="send_log_thread") config = Config() config.endpoint = "" config.access_key = "" config.access_secret = "" config.region_id = "" config.project_id = "" producer = Producer.init_producer(config) producer.start_producer() group_id = "" stream_id = "" log_content = generate_random_str(1024) log = [log_content] labels = {"keyA": "valueA"} log_p = lts_store.generate_log(log, labels) for i in range(thread_num): new_thread = submit_send_log_thread_pool.submit(send_log_function, producer, group_id, stream_id, log_p) threads.append(new_thread) for t in threads: t.result() end_ms = common.current_time_ms() logger.info("end send log, cost [{}]ms", end_ms - begin_ms) def send_log_function(one_producer, group_id, stream_id, log_p): for i in range(2000): one_producer.send_log_with_callback(group_id, stream_id, log_p) class MyCallBack(CallBack): def invoke_on_success(self, result): logger.info("send log success") def invoke_on_failed(self, result): logger.error("send log success") if __name__ == '__main__': send_log_single_producer() time.sleep(1000)
  • 加强权限管理 配置 IAM 用户实现权限隔离 CSS 服务支持通过IAM对用户权限进行精细化管理,通过设置不同的企业组织和操作权限,达到对 CS S集群的访问权限隔离。IAM权限配置请参见创建IAM用户并授权使用CSS。 避免直接使用管理员账号访问集群 安全模式的Elasticsearch集群和OpenSearch集群拥有默认管理员账号admin,管理员账号拥有最高权限,可以访问集群中的任意数据,建议通过设置集群的普通用户去使用集群。通过Kibana或OpenSearch Dashboards配置普通用户访问集群索引数据的权限。用户权限基于用户(User)、权限(Permission)、角色(Role)管理,可以基于业务需求配置用户角色和权限。操作指导请参见创建Elasticsearch集群用户并授权使用或创建OpenSearch集群用户并授权使用。
  • 启用安全配置 创建安全模式的集群 CSS服务给Elasticsearch集群和OpenSearch集群提供了安全模式。安全模式的集群需要通过用户名和密码验证才能访问,非安全模式的集群则不需要安全认证即可直接访问。除非业务环境进行了严格的网络控制,且数据重要程度低,否则不建议您创建非安全模式的集群。集群安全模式的切换请参见更改Elasticsearch集群安全模式或更改OpenSearch集群安全模式。 开启HTTPS访问 如果Elasticsearch集群和OpenSearch集群未配置SSL加密通信,那么在CSS客户端和服务器之间传输数据时,很容易受到窃听、篡改和“中间人”攻击。为了提高数据传输的安全性,建议您创建安全模式的集群,并开启HTTPS访问。由于加密解密开销,启用HTTPS后集群性能可能下降约20%,建议评估业务场景的性价比。集群访问协议切换请参见更改Elasticsearch集群安全模式或更改OpenSearch集群安全模式。 避免绑定EIP直接通过互联网访问集群 避免将CSS集群部署在公网或者DMZ里,应该部署在公司内部网络,并使用路由器或者防火墙技术把集群保护起来,避免通过直接绑定弹性公网IP(简称EIP)的方式从互联网访问集群,防止未授权的访问及DDoS攻击等。为避免公网暴露风险,建议关闭集群的公网访问,如果业务必须通过公网访问,请配置独享型负载均衡访问CSS集群,并严格配置独享型负载均衡器的安全组规则限制。操作指导请参见配置Elasticsearch集群独享型负载均衡或配置OpenSearch集群独享型负载均衡。
  • 提升账号密码安全性 定期重置管理员用户的密码 安全模式的Elasticsearch集群和OpenSearch集群拥有默认管理员账号admin,管理员账号拥有最高权限,建议定期重置密码。通过定期重置策略,可有效降低密码泄露风险,显著提升账户安全性,保护敏感数据和系统免受潜在的安全威胁。操作指导请参见CSS服务中如何重置安全集群的管理员密码? 提升密码复杂度 CSS服务的Elasticsearch集群和OpenSearch集群作为搜索引擎,易成为攻击者的目标。用户需要妥善保存集群的访问账号与密码,避免泄漏。同时建议您提升密码的复杂度,避免使用弱密码。CSS会对集群的管理员密码进行复杂度校验,建议密码长度不少于12位,包含大小写字母、数字及特殊字符(如!@#$%)的组合,防止密码强度过低导致密码被破解。
  • 前提条件 已准备好存有数据的MySQL数据库,本案例以云数据库的RDS for MySQ L实例 为例,具体操作请参见购买RDS for MySQL实例。 已准备好用于同步数据的Logstash集群,具体操作请参见创建Logstash集群。本文以7.10.0版本的Logstash集群为例。 已准备好Elasticsearch集群,具体操作请参见创建Elasticsearch集群。本文以7.10.2版本的Elasticsearch集群为例。 以上三者在同一VPC下面。 当使用的是自建或第三方MySQL数据库时,则需要确认数据库驱动是否是MariaDB驱动。 是,则可以直接开始配置数据同步。 否,则需要参考常见问题:MySQL驱动不兼容怎么办?上传与RDS版本兼容的SQL JDBC驱动到Logstash集群中。
  • 约束限制 Elasticsearch中的_id字段必须与MySQL中的id字段相同。 这是为了确保当MySQL中的记录写入Elasticsearch时,同步任务可在MySQL记录与Elasticsearch索引之间建立一个直接映射的关系。例如,当MySQL中更新了某条记录时,同步任务会覆盖Elasticsearch中与更新记录具有相同ID的索引。 当MySQL中插入或者更新数据时,对应记录必须有一个包含更新或插入时间的字段。 Logstash在每次轮询MySQL时,会记录最后读取记录的时间戳,并在下一次读取时只获取该时间戳之后更新或插入的符合条件的记录。 确保MySQL数据库、Logstash集群和Elasticsearch集群在同一时区,否则当同步与时间相关的数据时,同步前后的数据可能存在时区差。
  • 应用场景 CSS服务的Logstash集群默认安装了logstash-input-jdbc插件,该插件为Logstash提供了从关系型数据库RDS MySQL中导入和处理数据的能力,通过配置Logstash配置文件,定义JDBC输入和Elasticsearch输出,实现定期同步数据库中的数据到Elasticsearch。该方案可以用于以下场景: 数据实时更新与同步:将RDS MySQL中的数据实时同步到Elasticsearch,以便利用Elasticsearch强大的搜索和分析能力。 日志分析 与检索:将MySQL中的日志数据同步到Elasticsearch,进行快速检索和分析。 应用性能监控:将应用性能数据存储在MySQL中,通过Logstash同步到Elasticsearch,进行实时监控和性能分析。 数据备份与恢复:通过Logstash将MySQL数据备份到Elasticsearch,以便在数据丢失或损坏时快速恢复。
  • 方案架构 图1 RDS MySQL数据同步至Elasticsearch 使用Logstash将RDS MySQL数据同步至Elasticsearch的方案流程如图1所示。 在CSS服务的Logstash中通过默认插件logstash-input-jdbc,在Logstash配置文件中配置数据库JDBC输入和Elasticsearch输出,将全量或增量RDS MySQL数据实时同步至Elasticsearch。
  • 迁移时长 迁移过程的耗时长短依赖于源集群和目标集群的节点个数或索引shard个数。迁移过程分为备份阶段和恢复阶段,备份阶段耗时由源集群决定,恢复阶段耗时由目标集群决定。迁移总时长的评估公式如下: 当索引shard个数大于节点个数时 总时长(s)= 集群迁移的数据量(GB)÷ 40MB ÷(源集群节点个数+目的集群节点个数)x 索引个数 当索引shard个数小于节点个数时 总时长(s)= 集群迁移的数据量(GB)÷ 40MB ÷(源集群索引shard个数+目的集群索引shard个数)x 索引个数 评估公式是基于理想状态下(即单节点以最快速度40MB/s传输)的迁移时长,实际迁移时长还会受到网络、资源等因素影响。
  • 应用场景 通过备份与恢复实现华为云Elasticsearch集群间数据迁移仅适用于源集群和目标集群都是CSS服务的集群,且依赖 对象存储服务 OBS。常用于以下场景: 跨地域或跨账号迁移:将其他Region或账号下的Elasticsearch集群迁移到当前集群中。 跨版本迁移:将低版本的Elasticsearch集群数据迁移到高版本的集群中。 集群合并:将两个Elasticsearch集群的索引数据合并到一个集群中。
  • 方案优势 易于操作和管理:在CSS服务控制台使用集群快照功能实现备份恢复,操作简单,且易于管理和自动化。 适用于大规模数据迁移:快照备份适用于数据量大的场景,特别是当数据量达到GB、TB甚至PB级别时。 支持跨地域和跨账号迁移:通过结合OBS的跨区域复制功能,可以实现跨地域和跨账号的数据迁移。 恢复过程可控:在恢复数据时,可以选择恢复特定索引或全部索引,并且可以指定恢复到特定的集群状态。 迁移时长可控:基于迁移时长评估公式可以配置数据迁移速率,理想状态下等于文件复制速率。
  • 步骤四:创建知识库 如果需要基于知识库进行智能问答,则需要在Dify平台配置知识库。 在Dify平台上方选择“知识库”。 单击“创建知识库”。 选择“导入已有文本”,上传文本文件。 单击“下一步”,根据业务需要设置知识库,其中Embedding模型和Rerank模型选择1接入的模型。 图8 设置知识库 单击“保存并处理”,等待知识库嵌入完成。此时,文本文件就通过Dify平台调用Embedding搜索大模型写入了OpenSearch向量数据库。 单击“前往文档”,进入知识库。 单击左侧“召回测试”,验证是否可以正常召回文本内容。 如图9所示,回答正确,表示文档召回成功。 图9 召回测试
  • 步骤五:创建智能问答助手 在Dify平台创建聊天助手,并进行调试预览,验证AI应用是否能够正常运行。 在Dify平台上方选择“工作室”。 单击“创建空白应用”,配置应用信息。“选择应用类型”必须选择“聊天助手”,“应用名称”可以自定义,例如test。 单击“创建”,进入应用编排页面。 在编排页面右侧,确认应用已关联DeepSeek模型服务。 图10 确认模型 在编排页面调试智能问答助手,验证功能。 智能问答助手支持2种调试方式:直接问答和知识增强问答。 直接问答:聊天助手不对接知识库,直接调用DeepSeek模型生成问答。 该方式无需配置“上下文”,智能问答助手会直接使用DeepSeek回答问题,如图11所示。 图11 直接大模型问答 知识增强问答:聊天助手对接知识库,并基于知识库内容,结合DeepSeek模型输出精准答案。 该方式需要先在“上下文”添加步骤四:创建知识库创建的知识库,再进行问答,为了突出和大模型回答的差异,可以在“提示词”添加内容“仅根据上下文进行回答”,智能问答助手就会优先根据知识库的文档进行回答,如图12所示。 图12 结合知识库问答
  • 步骤三:Dify接入Embedding和DeepSeek Dify作为一个开源的大语言模型(LLM)应用开发平台,通过配置和调用搜索大模型和DeepSeek模型服务的API,来实现功能集成和扩展。 在Dify平台接入搜索大模型,包含Embedding模型和Rerank模型。 单击Dify平台右上角的头像,选择“设置”中的“模型供应商”。 在模型供应商页面中选择“OpenAI-API-compatible”,单击“添加模型”配置Embedding和Rerank模型。配置说明参见表1。 表1 添加搜索大模型 参数名称 Embedding参数值 Rerank参数值 模型类型 选择“Text Embedding”。 选择“Rerank”。 模型名称 填写“query2doc”或“query2query”。 在FAQ短文本召回场景中,当query召回相似query时,doc不参与检索,建议使用query2query模型,其他场景选择query2doc模型。 填写“rerank”。 API endpoint URL 填写“http://{搜索大模型的内网访问地址}/v1”,搜索大模型的内网访问地址即为2获取的IP地址和端口号。例如获取到的内网地址为“xx.xx.xx.xx:xxxx”,则此处填写“http://xx.xx.xx.xx:xxxx/v1”。 模型上下文长度 填写“512”。Embedding搜索大模型只支持512。 “OpenAI-API-compatible”模板会对Rerank分数做归一化,这个并不影响最终结果排序,但是如果需要使用分值过滤,则建议使用“Xorbits Inference”模板配置Rerank模型,配置说明参见表2。 表2 添加Rerank模型 参数名称 参数值 模型类型 选择“Rerank”。 模型名称 填写“rerank”。 服务器URL 填写“http://{搜索大模型的内网访问地址}”,搜索大模型的内网访问地址即为2获取的IP地址和端口号。例如获取到的内网地址为“xx.xx.xx.xx:xxxx”,则此处填写“http://xx.xx.xx.xx:xxxx”。 模型UID 填写“rerank”。 在模型列表可以查看接入的模型。 图6 查看接入的模型 在Dify平台接入DeepSeek模型服务。 单击Dify平台右上角的头像,选择“设置”中的“模型供应商”。 在模型供应商页面中选择“OpenAI-API-compatible”,单击“添加模型”配置DeepSeek信息。配置说明参见表3。 表3 添加DeepSeek 参数名称 参数值 模型类型 选择“LLM”。 模型名称 填写DeepSeek模型服务的模型名称,即3获取的模型名称。 API Key 填写DeepSeek模型服务的API Key,即3获取的API Key。 API endpoint URL 填写DeepSeek模型服务的Open API地址,即3获取的API地址。 最大token上限 填写“1024”。DeepSeek模型服务只支持1024。 在模型列表可以查看接入的模型。 图7 查看接入的DeepSeek
  • 应用场景 基于开源框架Dify构建,打造具备双重能力的智能对话助手。系统支持用户自由选择直接调用DeepSeek大模型进行开放式问答,或结合企业私有知识库实现精准信息检索与推理应答,适用于智能客服、知识库问答、个性化推荐等多种业务场景。通过OpenSearch向量数据库实现毫秒级语义检索,配合CSS搜索大模型的Embedding向量化与Rerank重排序技术,可精准匹配海量非结构化数据。独享版大模型服务保障企业数据隔离与模型性能稳定,MaaS平台提供的DeepSeek模型则赋予系统强大的上下文理解和多轮对话能力。
  • 方案优势 该方案适合需要快速构建企业级知识中枢、同时兼顾通用对话能力、创新效率与成本控制的场景,具备以下核心优势: 灵活架构支持知识问答与开放对话模式自由切换,适应多样化业务需求。 私有化部署保障数据安全,满足金融、医疗等敏感行业合规要求。 检索增强生成(RAG)技术有效解决大模型幻觉问题,提升回答准确性与可信度。 开箱即用的可视化配置界面,显著降低AI应用开发门槛,企业可快速完成从数据接入到智能服务上线的全流程。
  • 步骤二:部署Dify 在服务器上部署Dify容器,并接入OpenSearch向量数据库。本案例以弹性 云服务器ECS 为例介绍操作步骤。Dify的详细安装指导请参见Docker Compose部署。 参考快速购买和使用Linux ECS,购买ECS。 ECS的实例规则要大于或等于2U4G,虚拟私有云要和OpenSearch的VPC一致,并且必须绑定弹性公网IP。 参考手工部署Docker,在ECS实例上安装Docker。 克隆Dify的源代码到ECS实例上,并切换至某tag版本分支,以0.15.3版本为例。 git clone https://github.com/langgenius/dify.git && cd dify git checkout -b 0.15.3 0.15.3 进入Dify源代码的Docker目录,修改“.env”文件,配置OpenSearch向量数据库的信息。 进入docker目录,复制生成“.env”文件,并进入编辑。 cd docker && cp .env.example .env vim .env 修改VECTOR_STORE参数值,改为opensearch。 VECTOR_STORE=opensearch 修改OpenSearch向量数据库的信息,改为1获取的信息。 OPENSEARCH_HOST=x.x.x.x # OpenSearch的访问地址(IP地址) OPENSEARCH_PORT=9200 # OpenSearch的端口号 OPENSEARCH_USER=admin # OpenSearch的访问账号(非安全集群直接删除) OPENSEARCH_PASSWORD=******* # OpenSearch的访问密码(非安全集群直接删除) OPENSEARCH_SECURE=true # 如果Opensearch为安全集群则将该配置设置为true 保存修改。 执行命令,启动Dify容器。 docker compose up -d 执行命令,确认容器是否启动成功。 docker ps 显示如下信息表示启动成功。 图5 查看Dify容器 通过ECS的弹性公网IP访问部署在ECS上的Dify平台。 在浏览器输入“http://{ECS公网IP}:80”访问Dify的开发平台。首次登录需注册管理员账号,依次填写邮箱、账号、密码。
  • 应用场景 S3插件(repository-s3)是一个专为Elasticsearch设计的插件,该插件允许用户将Elasticsearch的快照备份存储到与S3 API兼容的存储服务中,例如华为云的对象存储服务(OBS)。S3插件提供了一种高效、灵活且安全的方式来备份Elasticsearch集群的数据。 通过S3插件实现自建Elasticsearch集群和华为云Elasticsearch集群之间的数据迁移,常用于以下场景: 服务迁移上云:将自建的Elasticsearch服务迁移到云平台,以利用云服务的可扩展性、维护简便性和成本效益。 跨版本迁移:将低版本的自建Elasticsearch集群数据迁移到高版本的华为云Elasticsearch集群中。 集群整合:将多个自建Elasticsearch集群迁移到一个华为云Elasticsearch集群中整合为统一的数据平台,以简化管理和提高数据一致性。 技术栈统一:当企业已经在华为云上运行其他服务时,为了技术栈的统一和简化管理,可以选择将Elasticsearch集群也迁移至华为云。
  • 常见问题 迁移过程出现报错“out of memory”怎么办? 迁移过程中出现报错“out of memory”, 表示迁移虚拟机内存溢出,有如下解决方案: 可能是ECS虚拟机的配置不够,建议升级ECS规格,操作指导请参见变更单台ECS规格。 调整ESM的迁移速度,通过在迁移命令中减小“buffer_count”参数,限制内存中的文档数量。 迁移完成后,为什么源集群和目标集群的索引数据存储量不一致? ESM迁移集群后,两个集群的数据存储量不一致是正常的,这是由Elasticsearch的内部存储机制决定的。Elasticsearch存储是有多个shard,每个shard又有多个segment,由于ESM迁移是把源集群数据写入到目标集群,会导致在目标集群重新生成segment和shard,由于segment和shard都会对数据有膨胀,不同集群的segment的shard不同,数据量也不同,如果需要比较数据一致性,则需要对比文档个数的多少,而不是对比数据大小。
  • 通过ESM迁移集群 访问ESM下载地址,下载“migrator-linux-amd64”软件包。 通过SCP工具将下载的“migrator-linux-amd64”软件包上传到Linux ECS的执行路径下。 在Linux ECS的执行路径下执行命令,将源集群的索引结构和数据迁移到目标集群。 # 索引全量迁移 ./migrator-linux-amd64 -s http://source:9200 -d http://dest:9200 -x index_name -m admin:password -n admin:password --copy_settings --copy_mappings -w 5 -b 10 #索引增量迁移 ./migrator-linux-amd6 -s http://source:9200 -d http://dest:9200 -x index-test -m admin:password -n admin:password -w 5 -b 10 -q "timestamp:[\"2022-01-17 03:41:20\" TO \"2022-01-22 03:41:20\"]" 迁移命令的常用参数说明请参见表2,更多详细参数说明请参见ESM文档。 表2 常用参数说明 选型 示例 说明 -s, --source= http://source:9200 源Elasticsearch集群访问地址。 -d, --dest= http://dest:9200 目标Elasticsearch集群访问地址。 -x, --src_indexes= index_name index1,index2 源集群迁移索引名,支持正则匹配和逗号分隔。 -y, --dest_index= index_name_rename 目标集群索引名,支持单索引名称,如果不配置则和源索引名称相同。 -m, --source_auth= admin:password 访问源Elasticsearch集群的用户名和密码,仅安全集群涉及。 -n, --dest_auth= admin:password 访问目标Elasticsearch集群的用户名和密码,仅安全集群涉及。 -w, --workers= 5 读取源端数据速率控制参数,Bulk读取数据并发线程数。 默认值:1 -b, --bulk_size= 10 读取源端数据速率控制参数,Bulk一次读取数据的数据大小。 默认值:5MB --sliced_scroll_size 4 读取源端数据速率控制参考,Bulk Scroll中sliced的大小。 默认值:1 --copy_settings - 迁移源端索引的settings。 --copy_mappings - 迁移源端索引的mappings。 --buffer_count= - 迁移虚拟机缓存在内存中的文档数量。 默认值:10w 数据迁移完成后,通过对比文档个数检查数据一致性。 # 非安全集群 curl -ik http://ip:9200/{索引名称}/_count #安全集群+HTTPS访问 curl -ik https://ip:9200 -u[Username]:[password]/{索引名称}/_count
  • 应用场景 ESM(Elasticsearch Migration Tool)是一个开源的Elasticsearch集群迁移工具。它支持不同版本的Elasticsearch之间的数据迁移,并且可以通过配置Scroll API的参数来控制迁移速率,以适应不同的网络环境和业务需求。以下是ESM实现Elasticsearch集群间数据迁移的一些应用场景: 跨版本迁移:在Elasticsearch集群需要升级到新版本时,ESM可以帮助平滑迁移数据,确保升级过程中数据的完整性和可用性。 集群合并:当企业需要将多个Elasticsearch集群的数据整合到一个集群中以简化管理时,ESM可以高效地完成这一任务。 服务迁移上云:企业可以将自建的Elasticsearch服务迁移至云平台,以利用云服务的弹性扩展、简化维护和成本效益。 变更服务提供商:如果企业当前使用的是第三方Elasticsearch服务,但出于成本、性能或其他战略考虑,希望更换服务提供商至华为云。
  • 方案优势 跨版本兼容性:ESM支持不同版本的Elasticsearch集群间的数据迁移,包括从老版本迁移到新版本。 简化操作:ESM使用简单方便,使用Go语言开发,只需下载编译包安装即可使用。 性能控制:在迁移过程中,可以通过配置Scroll API的参数来控制迁移速率,优化迁移性能。 灵活的迁移方案:ESM提供了灵活的迁移方案,包括全量迁移和增量迁移,以适应不同的业务需求。 开源免费:作为一个开源工具,ESM代码托管在GitHub上,用户可以免费使用。
  • 性能影响 ESM迁移集群的工作原理基于Scroll API,此API能够高效地从源集群查找索引数据,并批量同步至目标集群。这一过程可能会对源集群性能产生影响,具体影响程度取决于目标集群对源集群的读取速度,而读取速度取决于Scroll API的size和slice参数配置。参数配置的详细指导可参考Reindex API文档。 由于ESM能够迅速从源集群读取数据,可能会对源集群的性能产生影响。因此,建议在业务低峰时段进行数据迁移,以监控源集群CPU和内存的性能指标变化。通过调整迁移速度和选择适宜的迁移时间窗口,可以有效控制性能影响。对于涉及大量数据迁移或资源占用较高的集群,特别推荐在业务低峰期执行数据迁移,以确保源端业务操作不受影响。
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全