elasticsearch迁移最佳实践

2021-09-06 20:11:59 浏览数 (1)

方案一:跨机房集群迁移

适用场景:

客户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 数均匀分布即可;

0 人点赞