一、背景
ES 集群不停机迁移,迁移过程中不影响业务使用。 所用集群版本为 6.3.0 。
二、方案
1、业务通过域名访问集群;
2、在新的机器搭建集群;
3、对原有集群进行快照,万一数据有丢失可以从快照进行恢复;
4、新旧集群进行合并,并强制使旧集群数据通过数据均衡的方式迁移到新集群;
5、下线原有旧集群。
三、实施
1、在新的机器搭建集群的方法
1)机器准备(root设置):参考官网
vim /etc/security/limits.conf 解除文件与内存限制 * soft memlock unlimited * hard memlock unlimited * - nofile 65536 * - core unlimited 生效: 退出再登入 vim /etc/sysctl.conf 添加 vm.max_map_count = 262144 vm.swappiness = 1 生效:sysctl -p
2)配置节点:参考官网
The order of precedence for cluster settings is: transient cluster settings persistent cluster settings settings in the elasticsearch.yml configuration file.
注意事项:
1)ES 堆内存需要在32G 以内,最好是26G。
2)shard越多,QPS就会越低(详情),Shard大小官方推荐值为20-40GB(详情),每1GB堆内存对应集群的分片在20-25之间(26G 可以存储520个 shard)(详情);
每个节点上可以存储的分片数量与可用的堆内存大小成正比关系,但是 Elasticsearch 并未强制规定固定限值。这里有一个很好的经验法则:确保对于节点上已配置的每个 GB,将分片数量保持在 20 以下。如果某个节点拥有 30GB 的堆内存,那其最多可有 600 个分片,但是在此限值范围内,您设置的分片数量越少,效果就越好(详情)。每个节点的 shard 数量设置方法,集群中 shard 分配策略设置方法。
3)master 与 client 节点的内存与 CPU 都用量比较少,相应的参数可以设小些。
2、集群快照的方法:通过自己搭建Hadoop 集群实现(需要安装 hdfs 插件)
curl -XPUT http://XXX/_snapshot/hdfs_repo -H 'Content-Type: application/json' -d ' { "type": "hdfs", "settings": { "uri": "hdfs://XXX:8800/", "path": "hdfs_repo", "compress": true } }'
3、新旧集群合并:可以启动一个能够连接两个集群的 master, 这样两个集群就能合并成一个集群
注意:相同的索引会覆盖,如果集群有部分索引 RED 了,确认无影响后可以通过 reroute 重新分配分片
POST /_cluster/reroute?retry_failed=true&pretty { }
4、集群数据迁移的方法:通过分片配置过滤实现,使数据从旧机器中迁移走。
curl -XPUT http://XXX/_cluster/settings -H 'Content-Type: application/json' -d ' { "transient": { "cluster.routing.allocation.exclude._name": "XXX" } }'
四、其他
1、数据冷热分离
1、使所有分片都不能分配在 ssd 上; curl -XPUT "http://XXX/*/_settings?master_timeout=120s" -H 'Content-Type: application/json' -d' { "index.routing.allocation.exclude.box_type": "hot" }' 2、使 test 能够分配在 ssd 上; PUT test/_settings { "index.routing.allocation.include.box_type": "hot" } 3、启用 tag 感知策略(不设也没关系) PUT /_cluster/settings { "transient" : { "cluster.routing.allocation.awareness.attributes": "box_type" } }
2、使用 esrally 进行压测
3、kibana
4、滚动重启
1、暂停集群数据均衡 PUT _cluster/settings { "transient": { "cluster.routing.rebalance.enable": "none" } } 2、禁止分片分配 PUT _cluster/settings { "transient": { "cluster.routing.allocation.enable": "none" } } 3、刷新索引(可选) curl -XPOST http://XXX/_flush/synced 4、此处进行节点更新操作后再重启 5、重新允许分片分配 PUT _cluster/settings { "persistent": { "cluster.routing.allocation.enable": null } } 6、待集群恢复 green 后再重复2~5步,直到完成所有节点的更新重启 7、恢复集群数据均衡