一、前言:
遇到一个需求需要对线上ES
集群进行角色拆分,目前是节点即是master
也是 data
,集群是对外提供服务,操作需要谨慎,所以对于滚动重启ES实例比较重要,再将ES实例重新上线。ES提供了非常便利的API来支持这一点。
目前的方案是:将需要重启的某个ES实例上的数据都迁移到别的节点,然后在重启节点,待数据恢复后,在将节点允许分配副本。
具体方案:
es集群示例:
比如我们有这样一个ES集群,selk21节点 需要临时下线:
步骤1:将该节点动态排除es集群
这将导致Elasticsearch将该节点上的分片分配给其余节点,而不会将群集状态更改为黄色或红色(即使您的副本数设置为0)。
API 为:
PUT _cluster/settings
{
"transient" : {
"cluster.routing.allocation.exclude._ip" : "10.11.36.1"
}
}
具体的执行命令:
curl -s -u admin:admin -XPUT 10.11.36.1:29200/_cluster/settings -d '
{
"transient" : {
"cluster.routing.allocation.exclude._ip" : "10.11.36.1"
}
}'
注意 这个操作是transient集群重启后,这个设置会失效
步骤2 重启节点
步骤一配置完成以后,我们就会看到shard在集群中开始迁移,待迁移完成以后。
对selk21节点进行重启处理。
步骤3 重新加入集群
API:
PUT _cluster/settings
{
"transient" : {
"cluster.routing.allocation.exclude._ip" : ""
}
}
具体是执行命令:
curl -s -u admin:admin -XPUT 10.11.36.1:29200/_cluster/settings -d '
{
"transient" : {
"cluster.routing.allocation.exclude._ip" : ""
}
}'
只要让_name匹配不到对用的node即可, 除了_name 之外, 还可以用_ip、_host进行匹配
参考:
http://vearne.cc/archives/561