通过ESM实现Elasticsearch集群间数据迁移
应用场景
ESM(Elasticsearch Migration Tool)是一个开源的Elasticsearch集群迁移工具。它支持不同版本的Elasticsearch之间的数据迁移,并且可以通过配置Scroll API的参数来控制迁移速率,以适应不同的网络环境和业务需求。以下是ESM实现Elasticsearch集群间数据迁移的一些应用场景:
- 跨版本迁移:在Elasticsearch集群需要升级到新版本时,ESM可以帮助平滑迁移数据,确保升级过程中数据的完整性和可用性。
- 集群合并:当企业需要将多个Elasticsearch集群的数据整合到一个集群中以简化管理时,ESM可以高效地完成这一任务。
- 服务迁移上云:企业可以将自建的Elasticsearch服务迁移至云平台,以利用云服务的弹性扩展、简化维护和成本效益。
- 变更服务提供商:如果企业当前使用的是第三方Elasticsearch服务,但出于成本、性能或其他战略考虑,希望更换服务提供商至华为云。
方案架构
通过Reindex API实现Elasticsearch集群间数据迁移的迁移流程如图1所示。
- 在Linux虚拟机上安装ESM迁移工具。
- 通过ESM迁移命令,将源集群的索引数据迁移至目标集群。
方案优势
- 跨版本兼容性:ESM支持不同版本的Elasticsearch集群间的数据迁移,包括从老版本迁移到新版本。
- 简化操作:ESM使用简单方便,使用Go语言开发,只需下载编译包安装即可使用。
- 性能控制:在迁移过程中,可以通过配置Scroll API的参数来控制迁移速率,优化迁移性能。
- 灵活的迁移方案:ESM提供了灵活的迁移方案,包括全量迁移和增量迁移,以适应不同的业务需求。
- 开源免费:作为一个开源工具,ESM代码托管在GitHub上,用户可以免费使用。
性能影响
ESM迁移集群的工作原理基于Scroll API,此API能够高效地从源集群查找索引数据,并批量同步至目标集群。这一过程可能会对源集群性能产生影响,具体影响程度取决于目标集群对源集群的读取速度,而读取速度取决于Scroll API的size和slice参数配置。参数配置的详细指导可参考Reindex API文档。
由于ESM能够迅速从源集群读取数据,可能会对源集群的性能产生影响。因此,建议在业务低峰时段进行数据迁移,以监控源集群CPU和内存的性能指标变化。通过调整迁移速度和选择适宜的迁移时间窗口,可以有效控制性能影响。对于涉及大量数据迁移或资源占用较高的集群,特别推荐在业务低峰期执行数据迁移,以确保源端业务操作不受影响。
约束限制
集群迁移过程中,源集群的索引数据不能增删改,否则会导致迁移失败,或是迁移后的源集群数据和目标集群数据内容不一致。
前提条件
- 源Elasticsearch集群和目标Elasticsearch集群处于可用状态。
- 集群间需要保证网络连通。
- 如果源集群和目标集群在不同VPC,则需要先打通VPC网络建立对等连接。具体操作请参见对等连接简介。
- 如果是自建Elasticsearch集群迁移至华为云,则可以通过给自建Elasticsearch集群配置公网访问打通网络。
- 如果是第三方Elasticsearch集群迁移至华为云,则需要建立企业内部数据中心到华为云的VPN通道或专线。
- 确认集群的索引已开启“_source”。
集群索引的“_source”默认是开启的。执行命令GET {index}/_search,当返回的索引信息里有“_source”信息时表示已开启。
获取Elasticsearch集群信息
在迁移集群前,需要先获取必备的集群信息,用于配置迁移任务。
集群来源 |
要获取的信息 |
获取方式 |
|
---|---|---|---|
源集群 |
华为云Elasticsearch集群 |
|
|
自建Elasticsearch集群 |
|
联系服务管理员获取。 |
|
第三方Elasticsearch集群 |
|
联系服务管理员获取。 |
|
目标集群 |
华为云Elasticsearch集群 |
|
|
源集群的来源不同,获取信息的方式不同,此处仅介绍如何获取华为云Elasticsearch集群的信息。
- 登录云搜索服务管理控制台。
- 在左侧菜单栏选择 。
- 在Elasticsearch集群列表,获取集群名称和访问地址。
图2 获取集群信息
准备迁移虚拟机
创建ECS用于迁移Elasticsearch集群。
- 购买Linux ECS,“镜像”选择CentOS 7系列,“虚拟私有云”和目标集群保持一致。购买操作指导请参见快速购买和使用Linux ECS。
- 测试ECS和源集群、目标集群的连通性。
在ECS执行如下命令测试连通性,当正常返回集群信息时表示已经连通。
# 非安全集群 curl -ik http://ip:9200 #安全集群+HTTPS访问 curl -ik https://ip:9200 -u[Username]:[password]
通过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 Scorll中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
常见问题
- 迁移过程出现报错“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不同,数据量也不同,如果需要比较数据一致性,则需要对比文档个数的多少,而不是对比数据大小。