方案一:跨机房集群迁移
适用场景:
客户ES集群在自建IDC机房里
大量数据需要同步到腾讯云ES集群
写入不可中断,业务要保证查询
原理:
把IDC自建的es集群与腾讯云es集群互通,做成一个大集群,通过es本身的数据同步功能做同步。
迁移过程中,需要限制迁移速率和查询范围,这样才不会影响线上es使用
数据迁移完后,原IDC机房的es集群可以下线,然后切换查询、写入设置到腾讯新es集群里
注意事项:这种方案没法展现迁移状态
方案二:Reindex api迁移
适用场景:
客户ES集群在自建IDC机房里
大量数据需要同步到腾讯云ES集群
原es集群数据可停止写入
原理:
ES自带有reindex 迁移数据的API
Reindex采用scroll快照方式查询数据并导出的方式
如果在迁移的期间,原集群有删除或者修改的操作,会导致数据不一致
注意事项:这种方式需要根据数据量来定下停止写入时间,估算好,操作期间es源集群不能有数据增量、修改的操作
方案三:elastic-dump工具迁移
介绍:
elasticsearch-dump是一款开源的ES数据迁移工具,github地址: https://github.com/taskrabbit/elasticsearch-dump
迁移单个索引:
elasticdump --input=http://x.x.x.1:9200/companydatabase --output=http://x.x.x.2:9200/companydatabase --type=settings
elasticdump --input=http://x.x.x.1:9200/companydatabase --output=http://x.x.x.2:9200/companydatabase --type=mapping
elasticdump --input=http://x.x.x.1:9200/companydatabase --output=http://x.x.x.2:9200/companydatabase --type=data
迁移所有索引:
此操作并不能迁移索引的配置如分片数量和副本数量,必须对每个索引单独进行配置的迁移,或者直接在目标集群中将索引创建完毕后再迁移数据:
elasticdump --input=http://x.x.x.1:9200 --output=http://x.x.x.2:9200
注意事项:这种方式需要根据数据量来定下停止写入时间,估算好
操作期间es源集群不能有数据增量、修改的操作
方案四:logstash工具迁移
介绍:
logstash支持从一个ES集群中读取数据然后写入到另一个ES集群,因此可以使用logstash进行数据迁移
操作配置:
代码语言:yaml复制input {
elasticsearch {
hosts => ["http://x.x.x.1:9200"]
index => "*"
docinfo => true }
}
output {
elasticsearch {
hosts => ["http://x.x.x.2:9200"]
index => "%{[@metadata][_index]}"
}
}
总体迁移注意事项
风险点:
1. elasticsearch 本身的稳定性可能影响迁移数据的正确性;
2. 迁移过程中,可能出现数据迁移异常,如果出现迁移线程异常,需要人为干预;
3. 需要限流,需要保证迁移占用带宽不影响其他服务;
4. 自建机房的 elasticsearch 服务下线之后,需要调用方将调用 es 服务的 ip 或者域名指向新的 elasticsearch 服务,
5. 可能需要调用方重启客户端。
最佳实践:
1. 集群索引最好提前创建,避免凌晨自动并发生成大量索引导致集群 hang 住,集群异常;
2. 索引最好是采用静态 mapping,避免频繁的 mapping 变更导致集群元数据的变更引起集群 hang 住;
3. 根据实际应用场景和硬件配置,建议在小规格节点下单 shard 大小不要超过 20GB。更高规格的节点单 shard 大小不要超过 50GB。同时即使是高规格节点,对于日志分析场景或者超大索引,建议单 shard 大小不要超过 50GB,对于在线分析类的业务场景,建议单个 shard 大小不要超过 20GB;
4. 一般情况下, 日志场景,对于单个日志集数据量特别小的情况,可以按月创建索引;
5. 不建议单个集群 shard 数量太多,因为集群元数据太大之后,每次元数据变更都会造成集群的卡顿;
6. 如果集群只有一个索引,那么 shard 的个数(包括副本)要尽可能匹配节点数,等于节点数,或者是节点数的整数倍。如果集群为多个业务提供服务,则集群整体的 shard 数均匀分布即可;