迁移目标/范围
腾讯云 ES 是基于开源引擎打造的云端全托管 ELK(ES/Logstash/Kibana)服务,拥有高性能自研内核、支持读写分离、存算分离、自治索引、机器学习等能力,同时也支持自动弹性、零运维、低成本的 Serverless 版,被广泛应用于日志分析、在线搜索、向量检索与 RAG(检索增强生成)等场景。
本方案将详细介绍迁移流程、迁移步骤以及注意事项等方面的内容。通过本方案,用户可以在保证数据完整性、安全性和高效性的前提下,无需进行大规模业务改造,即可顺利平滑完成迁移过程。
迁移目标 | 迁移方案优点 | 腾讯云 ES 相对其他日志产品优点 |
自建 ES(ELK)> 腾讯云 ES | ES 业务无需大范围改造 ES 迁移支持全量/增量 支持在线不停服迁移(部分场景) | 自研特性优化,助力客户降本增效 支持多级存储,热 > 冷 > COS 标准/低频/归档存储 功能丰富,包括日志/指标/APM/告警等全观测能力 完全兼容 ELK(ES/Logstash/Kibana),保留原有权限、报表、使用习惯 |
友商云 ES(ELK)> 腾讯云 ES | | |
友商云 Opensearch > 腾讯云 ES | | |
方案简介
ES 迁移主推 Snapshot 方案,如有其他特殊场景,可参考 Logstash 及在线融合方案。具体方案对比如下:
迁移方案 | 适用场景 | 适用产品 | 停服割接时间 | 增量 | 更新 | 删除 | 转化 | 方案实施 |
可接受短暂停服,对迁移速度有要求的场景 | 自建 ES AWS/阿里/华为云 ES | 通过多次增量快照,保证大部分场景下停服时间<=20min | ✓ | ✓ | ✓ | ☓ | 可以根据文档自助迁移 | |
源端版本 > 目标端时,或迁移过程中需要定制化改造的场景 | AWS 云 Opensearch 华为云 Opensearch AWS/阿里/华为云 ES | Logstash 方案需全程停服,停服时间与集群资源性能、专线带宽等因素有关 | ⍻ | ⍻ | ☓ | ✓ | 可以根据文档自助迁移 | |
(腾讯云 ES 特有) | 在线不停服迁移 | 自建 ES | 无需停服 | ✓ | ✓ | ✓ | ☓ | 需腾讯云 ES 后台配合 |
概述
本迁移方案旨在为用户提供一种从自建 ES 或友商云 ES 迁移到腾讯云 ES 的实践教程。本方案将详细介绍使用 Logstash 快照方案的迁移流程、迁移步骤以及注意事项等方面的内容。通过本方案,用户可以在保证数据完整性、安全性和高效性的前提下,顺利完成迁移过程。
方案概览


准备工作
账号开通
客户需要开通一个腾讯云账号。
网络打通
客户的 ES 集群需要有一条能访问腾讯云服务的专线网络或 VPN。
专线:专线接入
注意:
数据迁移务必使用内网,否则默认会走公网进行数据传输,公网传输存在数据泄漏风险和潜在危险。
ES 集群创建
前置确认
确认 ES 集群搭建前基础信息
信息 编号 | 确认信息 | 确认值(此列需要客户确认) | 备注 |
1 | 区域 | 华南地区-广州 | ES 集群所在的区域 |
2 | 产品版本 | ES 7.14.2 | ES 集群版本 全文检索建议7.14.2,向量检索推荐8.13.3 |
3 | 组件种类 | es,logstash,filebeat | ES 集群需要包含的组件 |
4 | 鉴权 | 不开启 | 白金版不支持关闭鉴权,非白金版支持开启/关闭(需提工单支持) |
5 | 业务场景 | 全文检索,向量检索 | 根据业务场景决定集群版本 全文检索建议<=7.14.2,向量检索推荐>8 |
6 | 集群网络&可用区 | 集群网络举例:Default-VPC 子网举例:Default-subnet | 集群所在的 VPC,和可用区子网需要提前规划好 有容灾需求可选择多可用区,节点将均匀分布在所选择的多个可用区,可用节点总量不变 |
7 | 安全组 | 安全组举例:sg-xxxx | ES 集群安全组,如需关联安全组,可在集群创建后进行关联 |
确认 ES 集群资源配置
生产环境的规格参考实际的 ES 业务需求,有特殊机型要求的,需提早申请,以便腾讯侧备货,腾讯云建议基础的 ES 生产环境配置如下:
节点类型 | 节点说明 | 推荐配置 | 节点数量 |
热数据层 | 默认节点类型,可搭配温数据层实现冷热分离架构; 数据写入层。通常将经常查询的数据放置在热层,以提升查询与写入效率。 | 标准型 S1 CPU:8核 内存:32GB 数据盘: 增强型 SSD 云硬盘 500G x 3 | N |
温数据层 | 可选节点,支持仅开启温数据层,也可搭配热数据层实现冷热分离架构; 将访问频率较低且更新频率较低的数据存放在温层,以节约成本。非必要,有冷热分层需求才需要开启。 | 标准型 S1 CPU:4核 内存:16GB 数据盘: 高性能云硬盘 1000G x 3 | N |
专用主节点 | 可选节点,建议10节点以上或分片规模>5000时启用; 管理节点,保证集群的调度正常进行。非必要,默认所有数据节点都是候选主节点。当集群节点数>10 或 数据量较大时建议选购专用主节点。 | 标准型 S1 CPU:4核 内存:16GB | 3 |
协调节点 | 可选节点,默认所有数据节点都是协调节点。建议有特殊需求时候启用; 协调节点只用于处理客户端请求,不存储数据,能够提升集群处理性能和服务稳定性,适用于高并发读写、多聚合查询等cpu密集型业务场景。 | 标准型 S1 CPU:4核 内存:16GB | N |
机器学习节点 | 可选节点,有推理需求时启用; 机器学习节点用于创建机器学习任务,自动进行数据分析,识别异常数据。也可在此节点加载向量模型,提升向量生成和向量检索能力。 | 标准型 S1 CPU:16核 内存:32GB | N |
Kibana 节点 | 默认开启,用于数据可视化,1核2G规格免费,支持购买更高规格。 | 标准型 S1 CPU:1核 内存:2GB | 1 |
集群购买
Logstash 购买
插件安装及词典上传(必要)
在进行数据迁移前,需要确认索引是否使用自定义插件及自定义词典,如果有则需要在云上 ES 集群同步,否则相关索引数据恢复无法成功。
插件查询
使用下面命令查询自建集群使用的插件:
curl -s -uelastic:'源端集群密码' 'http://源端IP:9200/_cat/plugins?h=component,version' | sort | uniq
插件安装


词典查询
自定义词典查询如下:
curl -s -uelastic:'源端集群密码' 'http://源端IP:9200/_settings?pretty' | grep "_path"
自定义词典查询流程图


IK 分词/停用词词典查询
# 进入到ES主目录,$ES_HOME需替换成实际目录 cd /$ES_HOME/config/analysis-ik # 进入ik词典目录下,查看配置文件 cat IKAnalyzer.cfg.xml
未配置任何 ik 词典则默认内容如下,无需更新 ik 词典。如自定义了 ik 词典,则需上传至腾讯云 ES。


词典上传
同义词词典更新


IK 分词/停用词词典更新




数据迁移
方案介绍
介绍:Logstash 是一款专门用于应用程序日志、事件的传输、处理、管理的产品。这里我们可以通过 Logstash 完成跨 ES 集群的数据迁移工作。
适用场景:该种迁移方案适用于集群版本跨度较大,能够接受集群一段时间暂停写的场景。
迁移流程介绍
序号 | 迁移阶段 | 备注 |
1 | 元数据迁移 | 使用同步工具进行元数据迁移,工具使用说明见实践教程文档。集群相关的元数据包括: 索引属性迁移 模板迁移 管道迁移 权限迁移 |
2 | 全量数据迁移 | Logstash 方案需全程停服,停服时间与集群资源性能、专线带宽等因素有关 |
3 | 数据一致性校验 | 数据同步完成后,快速通过 docs.count 来判断数据一致性。 |
用户及角色迁移
如需迁移用户及权限,可使用工具一键迁移:
rpm -vih https://tools-release-1253240642.cos.ap-shanghai.myqcloud.com/elasticsearch/packages/es-security-sync-lastest.x86_64.rpm
或下载后上传再使用 rpm 安装:
rpm -vih es-security-sync-lastest.x86_64.rpm
说明:
security 功能 ES 6 版本才开始支持,ES 8 的 security 索引不允许修改。所以仅支持 6 到 7,以及 7 到 6 的迁移。
迁移示例
es-security-sync \\ --src_url http://10.0.xx.xx:9200 \\ --dst_url http://10.0.xx.xx:9400 \\ --src_user log_user \\ --dst_user log_user \\ --src_password ****** \\ --dst_password ******
索引模板迁移
索引模板为 ES 业务使用中最常用的功能,在迁移前务必先同步索引模板。模板迁移使用工具一键迁移即可:
rpm -vih https://tools-release-1253240642.cos.ap-shanghai.myqcloud.com/elasticsearch/packages/es-template-cp-lastest.x86_64.rpm
或下载后上传再使用 rpm 安装:
rpm -vih es-template-cp-lastest.x86_64.rpm
迁移示例
es-template-cp \\ --src_url http://源ES IP:9200 \\ --dst_url http://腾讯云ES IP:9200 \\ --src_password '******' \\ --dst_password '腾讯云ES密码'
集群管道迁移(按需操作)
ES 管道迁移使用工具一键迁移即可。
#下载jar包 #运行环境: JDK-1.8 wget https://tools-release-1253240642.cos.ap-shanghai.myqcloud.com/elasticsearch/packages/CopyPipelines.jar
示范样例
注意:
任何参数不要空缺,无密码集群可指定任意密码。
样例一
源端,目标端,集群带密码,跳过目标端已存在的同名管道。
java -jar CopyPipelines.jar http://源ES IP:9200 elastic '源端ES密码' http://腾讯云ES IP:9200 elastic '腾讯云ES密码' skip
样例二
源端,目标端,集群带密码,覆盖目标端已存在的同名管道。
java -jar CopyPipelines.jar http://源ES IP:9200 elastic '源端ES密码' http://腾讯云ES IP:9200 elastic '腾讯云ES密码' overwrite
索引属性同步
由于 logstash 不支持迁移 es 索引属性,例如 settings、mapping,所以需要提前同步:
rpm -vih https://tools-release-1253240642.cos.ap-shanghai.myqcloud.com/elasticsearch/packages/es-index-properties-sync-lastest.x86_64.rpm
或下载后上传再使用 rpm 安装:
rpm -vih es-index-properties-sync-lastest.x86_64.rpm
说明:
该工具支持修改索引 setting、mapping。
同步示例
es-index-properties-sync \\ --src_url http://10.0.xx.xx:9200 \\ --dst_url http://10.0.xx.xx:9200 \\ --src_password ****** \\ --dst_password ****** \\ --indices '*,-.*' \\
注意:
需要同步的索引在目标集群需不存在,否则会自动跳过已存在的索引,建议同步索引属性前清理目标集群索引。
Logstash 全量同步
索引分组
在索引数量比较大的场景下,我们需要将索引分成多个组,以启动多个实例或管道来加速迁移。我们提供了分组工具:
工具安装
rpm -vih https://tools-release-1253240642.cos.ap-shanghai.myqcloud.com/elasticsearch/packages/es-index-grouping-lastest.x86_64.rpm
参数说明
--user default: elastic --password default: 默认读取环境变量 export password='***' --ip default: 没有默认值,必要参数,不允许为空 --port default: 9200 --pattern default: 索引匹配规则,默认为 '*',支持逗号分隔 --instances default: 分组数量。没有默认值,必要参数,不允许为空
使用示例
示例 1
ES 实例没有密码认证,端口为9200,且所有索引都需要进行 分组,分组数为10个。
es-index-grouping --ip 源ES IP --instances 10
示例 2
密码赋值和执行命令写成一条,中间无需分号。
password='123456' es-index-grouping --ip 源ES IP --port 9200 --user logUser --pattern '*,-.*' --instances 10
将分组后的 index list 根据不同管道填入 index =>,比如我们将全部索引分了10个组,我们则需要创建10个实例或管道。
Logstash 管道配置
1. 进入 Logstash 控制台,点击管道管理>新建管道。

2. 管道配置:单击引用模板可以快捷配置管道,配置完成后,单击保存并部署。

pipeline.workers:一般为 CPU 数。
pipeline.batch.size:设置批量执行 event 的最大值,一般3000-5000,不建议超过10000。
pipeline.batch.delay:批处理的最大等待时长,一般3000-5000ms即可。
Config 配置
input { elasticsearch { hosts => "源ES IP:9200" index => "*,-.*" # 如果是分组同步,这里则填入其中一个组的 index list,支持通配,例如:index => "index-a-*, index-b-*" user => "elastic" password => "xxxxxx" docinfo => true size => 5000 slices => 4 #建议设置为源端多数索引的分片数量 } } output { elasticsearch { hosts => ["http://腾讯云 ES IP:9200"] user => "elastic" password => "腾讯云ES密码" index => "%{[@metadata][_index]}" document_type => "%{[@metadata][_type]}" document_id => "%{[@metadata][_id]}" } }


如果有索引改名的需求,可以使用 filter 插件进行一下关键词替换:
filter { mutate { gsub => ["[@metadata][_index]", "test-", "ceshi-"] } }
说明:
这里演示的是将 test- 替换为 ceshi-。
Logstash 增量同步
logstash 本身不具备同步增量的能力,其增量的实现需要业务使用 query 语句完成,且需要业务数据有 update_time 之类的字段,以标识数据的更新时间。
如果业务数据只有 create_time 或 @timestamp 这样的字段,则只能做到增量同步,无法做到差异同步(update)。
logstash 不支持同步删除操作,所以在进行 logstash 增量同步后,目标端可能比源端多出部分数据(即logstash同步过程中源端被删除的数据)。
以下为 logstash input 增量同步示例:
开启索引动态 mapping
#为单个索引开启动态mapping PUT index_name/_mapping { "dynamic": true } #为全部索引开启动态mapping PUT *,-.*/_mapping { "dynamic": true }
业务改造
业务新增、更新数据时需要新增 update_time 字段,标识数据的当前更新时间。
增量同步
在按照本文完成了 ES 全量数据同步后,继续配置新管道进行增量数据同步。
input { elasticsearch { # 源端ES地址。 hosts => ["http://源ES IP:9200"] # 安全集群配置登录用户名密码。 user => "elastic" password => "源端ES密码" # 需要迁移的索引列表,多个索引使用英文逗号(,)分隔,支持通配。 index => "sample_data" # 按时间范围查询差异数据,以下配置表示查询最近1小时更新的数据。 query => '{"query":{"range":{"update_time":{"gte":"now-1h/h","lte":"now/m"}}}}' # 定时任务,以下配置表示每半小时执行一次。 schedule => "0 */30 * * * ?" scroll => "5m" docinfo=>true size => 5000 } output { elasticsearch { hosts => ["http://腾讯云 ES IP:9200"] user => "elastic" password => "腾讯云ES密码" index => "%{[@metadata][_index]}" document_type => "%{[@metadata][_type]}" document_id => "%{[@metadata][_id]}" } }
特别注意
logstash 增量同步前建议充分调试,将 input 插件里的 query 语句拿到源端执行,看能否查到数据,例如:
GET sample_data/_search { "query": { "range": { "update_time": { "gte": "now-1h/h", "lte": "now/m" } } }, "_source": "update_time" }
以下两种情况可能导致查询不到相关数据:
源端数据有延迟或者不是流式的,可能是跑批的数据,这样我们则可以把 now-1h 调大一些,比如 now-5h,甚至更大。我们也可以直接获取当前数据的最大时间来判断数据实时性,例如:
GET sample_data/_search { "sort": [ { "update_time": { "order": "desc" } } ], "_source": "update_time" }
源端数据时间字段非 date 类型,而是 keyword 或者 text 类型,那么即便数据是时间字符串,也无法使用时间运算,更无法使用 range 查询,所以结果会为空。
查到的数据比当前时间少8小时,则是符合预期的,因为 ES 默认是使用的 UTC 时间,无需对时间进行额外处理;
如果查到的数据是当前的时间,没有少8小时,则说明数据在写入时候没有使用 UTC 时间,则同步时需要在 logstash 侧使用 now 运算:now + 8h。如果数据本身有延迟,再在8h上额外增加即可。
如果查询报错,则说明使用的时间字段不是时间类型,而是数值类型或其他类型,例如:

数据校验
可以下载数据条数校验工具进行对比,工具仅对比两端集群索引文档数量,不会校验内容是否相同。
工具安装
#下载jar包 #运行环境: JDK-1.8 wget https://tools-release-1253240642.cos.ap-shanghai.myqcloud.com/elasticsearch/packages/ElasticsearchCompare.jar
使用案例
示范样例
共需要如下输入7个参数,任何参数不能空缺,无密码集群可指定任意密码。
参数名 | 解释 | 示范样例 |
srcClusterUrl | 源端集群地址 | http://127.0.0.1:9200 |
srcUser | 源端集群用户名 | elastic |
srcPassword | 源端集群密码 | 12345 |
dstClusterUrl | 目标端集群地址 | http://127.0.0.1:9201 |
dstUser | 目标端集群用户名 | elastic |
dstPassword | 源目标端集群密码 | 12345 |
index pattern | 需要校验的索引的匹配规则 | "*,-.*" |
java -jar ESIndexDocumentCountComparison.jar <srcClusterUrl> <srcUser> <srcPassword> <dstClusterUrl> <dstUser> <dstPassword> <index pattern>
样例
源端,目标端,集群带密码,需要校验两端集群全部索引的数据一致性,如果集群无密码则可输入任意密码。
java -jar ESIndexDocumentCountComparison.jar http://源端ES IP:9200 elastic '源端ES密码' http://腾讯云ES IP:9200 elastic '腾讯云ES密码' "*,-.*"
返回说明
工具首先会返回源端集群的 close 索引,close 状态索引无法检验数据一致性,然后返回对于两边集群数据不一致的索引信息,不返回数据一致的索引信息。
数据不一致返回


数据一致返回


业务切割
数据迁移完成并完成一致性校验,以及完成业务兼容性完全测试,则可以进行业务切割上云,将 es ip 切换为云上内网访问地址即可:

