ElasticSearch跨集群离线同步实战
需求
有个ES集群,每天按日期生成一批索引,需要定时同步到另一个集群。目前有两种同步方式:
- reIndex
- 快照
1. reIndex方式
reIndex方式无需安装任何插件,目标集群只需简单配置。100万条数据大约1分钟内同步完成。
1.1 前置条件
在目标集群的elasticsearch.yml
配置文件中设置源集群的白名单:
reindex.remote.whitelist: "<es_ip>:9022"
1.2 同步实践
使用reindex API进行同步:
POST _reindex?slices=auto
{
"source": {
"remote": {
"host": "http://<es_ip>:9022"
},
"index": "test_data",
"size": 10000
},
"dest": {
"index": "test_data_from_reindex"
}
}
-
size
:默认1000条,这里设置为10000条,加快同步速度。 -
slices
:按分片数自动切分任务,提高并行度。
1.3 实际应用
- 利用脚本查询需要同步的索引列表
- 逐个调用reindex API同步对应索引
- 使用crontab执行定时同步任务
2. 快照方式
快照方式需要安装NFS或其他共享存储。同步极快,100万数据约1秒完成。
2.1 前置条件
-
集群安装NFS,确保源和目标集群可以访问
-
源集群和目标集群在
elasticsearch.yml
中配置共享快照库路径:path.repo: ["/data/share/"]
-
源集群重启后注册快照库:
PUT /_snapshot/my_backup { "type": "fs", "settings": { "location": "/data/share", "max_snapshot_bytes_per_sec": "50mb", "max_restore_bytes_per_ser": "50mb" } }
2.2 备份快照
源集群执行备份命令:
PUT /_snapshot/my_backup/snapshot_20230215_index?wait_for_completion=true
{
"indices": "performance-*-20230215",
"ignore_unavailable": true,
"include_global_state": false
}
2.3 恢复快照
目标集群执行恢复命令:
POST /_snapshot/my_backup/snapshot_20230215_index/_restore
2.4 实际应用
- 脚本获取日期
- 备份对应日期快照
- 同步备份快照到目标集群
遇到的问题及解决方案
1. 压缩快照目录后存在漏包问题
-
问题: 使用单个压缩包压缩20GB快照目录,解压后发现缺少部分文件
-
解决: 将快照目录分多个压缩包压缩,避免漏包;或者在现场测试环境验证恢复
2. 恢现快照时报错
-
问题: 恢复快照时报错
could not read repository data from index blob
-
原因: 现场ES 7.3.1,公司ES 7.17.6,版本差异导致的权限问题
-
解决: 在公司ES的
jvm.options
添加:-Djava.security.policy=/opt/module/elasticsearch-7.17.6/modules/x-pack-sql/plugin-security.policy
3. 解压缩工具问题
-
问题: 使用unzip解压快照压缩包失败
-
解决: 改用7z解压
4. 权限问题
-
问题: 恢复快照后,目录属主为root
-
解决: 恢复后修改属主为es用户:
chown -R es:es /data/share
性能数据模拟
使用reindex生成新索引,修改索引数据时间,用于模拟测试:
nohup ./createPerfermance.sh >createPerfermance.log 2>&1 &