经常有小伙伴咨询如何将整个es集群数据如何迁移到另一个集群,其中往往会涉及到以下的问题:
跨es版本:老版本es集群数据迁移到新版本es集群。
跨集群:源数据和目的数据分布在两个不同的集群。
跨网络:两套集群分布数据不同的局域网、一套在公有云、一套在自建机房。
目前主流的解决方案分为以下两类:
批量读取旧集群的数据然后再批量写入新集群:elasticsearch-dump、esm、reindex、logstash都是采用这种方式。
底层文件备份恢复:snapshot直接把旧集群的底层的文件进行备份,在新的集群中恢复出来,相比较scroll query + bulk的方式,snapshot的方式迁移速度最快。
源数据集群:单节点rpm方式部署的es7.17.18集群,ip地址为192.168.10.70。
目的数据集群:3节点rpm方式部署的es8.12.2集群,ip地址为192.168.10.61/62/63。
数据中转操作节点:可同时连接两套es集群,用于中转数据。
我们先在目的集群设置索引模板,保证写入速率最大化。
ES支持快照功能,用于实现数据的备份与恢复。我们可以生成单个索引或整个集群的快照,并将其存储在共享文件系统上的存储库中,并且有一些插件支持 S3、HDFS、Azure、Google Cloud Storage 等上的远程存储库。
本实验以NFS为例演示es的快照备份与恢复。
源集群配置
目的集群配置
elasticsearch-dump是一个开源的使用JavaScript语言开发的Elasticsearch数据迁移工具,详细信息请参见文档:https://github.com/elasticsearch-dump/elasticsearch-dump
中转操作节点安装部署
安装elasticdump
Elasticdump标准指令是
- input SOURCE表示读取数据源SOURCE
- output DESTINATION表示将数据源传输到目的地DESTINATION。
- SOURCE/DESTINATION两者都可以是Elasticsearch URL或文件,如果是Elasticsearch URL,例如http://127.0.0.1/index,就意味着是直接往地址为http://127.0.0.1ES库里导入或者从其导出索引相关数据。
- [OPTIONS]是操作选项,比较常用有type和limit,其他操作这里就不展开介绍。
type是ES数据导出导入类型,Elasticdum工具支持以下数据类型的导入导出。
整个迁移过程分为先设置索引参数参数,再迁移mapping结构,待数据迁移完成后再修改number_of_replicas和refresh_interval为合适的值。
迁移mapping
使用elasticdump工具,将es7单节点的geonames索引mapping迁移到三节点es8集群中。
mapping迁移完成后,查看索引信息,已经创建名为geonames的索引。
迁移data
与迁移mapping类似,我们只需要将type从mapping改为data即可,观察控制台输出,每迁移1万条数据耗时约95秒。
elasticdump执行完成后查看目的集群索引,已成功完成迁移,整个过程耗时约3个小时。
esm迁移过程原理与elasticsearch-dump类似,区别在于esm使用go语言开发,号称每分钟可以迁移一千万条数据,仓库地址:https://github.com/medcl/esm
中转操作节点安装部署
安装esm
esm标准指令是
- -s表示读取数据源SOURCE
- -d表示将数据源传输到目的地DESTINATION。
- -x表示需要复制的index名称
- -q表示指定条件的查询语句
- -n表示base认证的用户名和密码
- -w表示并发数,默认为1
- -b表示buck大小,默认5MB
- -f表示复制前删除已有重名索引
- –refresh表示完成后再刷新索引
迁移数据
使用esm工具,将es7单节点的geonames索引模板与数据迁移到三节点es8集群中。
通过控制台可知,整个迁移过程需要时间约1个小时10分钟。
设置索引模板
在迁移数据前,我们先设置索引模板,保证写入速率最大化
配置集群白名单
需要修改目的集群每个节点配置,新增源数据集群es地址,然后重启elasticsearch服务。
执行reindex迁移
在目的集群使用dev tools工具执行如下指令。
- 其中size表示每批次的数据量,默认值1000
- slice表示切片数量,我们有3个数据节点,可将参数设置为3。
- wait_for_completion=false表示异步执行,ES将会以task 来描述此类执行任务
查询异步任务。
实测2.6GB数据迁移用时15分钟。
安装logstash
配置logstash
启动logstash
实测2.6GB数据迁移用时8分钟。
ES除了用于存储业务类数据外,日志和指标数据存储也是其另一大使用场景,在这类业务场景下,数据迁移往往还需要考虑到采集日志客户端逐渐切换过程中日志数据增量迁移的问题。
CCR方案:ES官方推出了CCR跨集群复制方案,可以完美实现数据的实时增量迁移,具体可参考文档https://www.cuiliangblog.cn/detail/section/83558841,需要注意的是开源社区版不支持该功能。
定时任务+时间范围查询方案:然后通过定时任务工具每分钟执行一次迁移工具,查询最近3分钟数据(主要取决于源数据refresh_interval参数,查询时间范围应大于refresh_interval参数),在写入es集群时指定文档id为原始数据id,以保证写入新集群时数据唯一。需要注意的是此方案只能针对数据有增无减的场景使用。可以使用sdk开发程序,或者使用logstash来实现。在增量同步前先执行一次全量迁移任务,保证先前历史数据迁移至新集群,然后再启动增量迁移任务。
修改配置文件,我们只需要将pipeline放置在/etc/logstash/conf.d/目录下并以.conf结尾,logstash启动时会去扫描该目录下所有conf结尾的pipeline并加载。
启动logstash迁移服务
微信公众号同步更新,欢迎关注微信公众号《崔亮的博客》第一时间获取最近文章。