概要描述
适用场景是,在Search服务不停止的前提下,在集群中下线某节点。
详细说明
-
确认需要下线的节点。
假设下线前有M个节点(其中master有M1个, data有M2个), 要下线N个节点(其中master有N1个, data有N2个)。一般建议一次下线一个节点,本文就以下线一个节点为例说明。
curl 'localhost:9200/_cat/nodes?v'
通过上面命令来确认下线节点是否是data和master: node.role 一列包含
d
就为data节点,包含m
就为master节点,master 一列为*
表明是active master;如下图,3个节点都是data节点,前两个节点还是master节点;
-
检查配置文件。
如果配置文件(一般为 /etc/search1/conf/elasticsearch.yml)里配置了以下几个配置项, 请根据下线后的实际情况进行调整。其他没有配置的配置项可以不用修改。
gateway.expected_nodes: 确保至少不大于M-N gateway.expected_data_nodes: 确保至少不大于M2-N2 gateway.expected_master_nodes: 确保至少不大于M1-N1 gateway.recover_after_nodes: 确保至少不大于M-N gateway.recover_after_data_nodes: 确保至少不大于M2-N2 gateway.recover_after_master_nodes: 确保至少不大于M1-N1 discovery.zen.ping.unicast.hosts: 列表里剔除要下线的节点 discovery.zen.minimum_master_nodes: 确保至少不大于M1-N1
上述参数的调整需要在manager页面修改,如果通过后台直接修改会被Manager重写回去。
-
在任意Search节点上执行以下命令来指定要下线的节点列表,从而使这些节点上的shard移动到别的节点。
curl -XPUT 'localhost:9200/_cluster/settings?pretty' -d ' { "transient": { "cluster.routing.allocation.exclude._name":"nodename1,nodename2,nodename3,......" ① } }'
① 节点名字,可以通过 curl ‘localhost:9200/_cat/nodes?v’ 命令,或者配置文件里的 node.name 来查看;nodename1,nodename2,nodename3" 多个值之间不能有空格。
如本文档下线 xixia02 节点,下线之前可以看到该节点是有shard分布的;
curl -XPUT 'localhost:9200/_cluster/settings?pretty' -d ' { "transient":{"cluster.routing.allocation.exclude._name":"xixia02"} }'
-
等待active index的shard开始移动, 可以通过如下命令观察shard移动情况。
curl 'localhost:9200/_cat/shards?v' | grep RELOCAT
-
对于closed index, 必须要重新open index才可以移动它的shard。等它的shard移动完毕, 可以再close。
-
如果发现有index(包括active和closed)的replica数量大于M2-N2-1, 则要调整该index的replica至M2-N2-1, 否则会有shard不能落到节点上。调整的命令为如下:
curl -XPUT 'localhost:9200/
/_settings?pretty' -d ' { "index.number_of_replicas": M2-N2-1 }' -
等到第4步观察不到任何shard在移动时, 请在9200页面确认要下线的所有Transwarp Search节点已经没有任何shard存在, 然后可以通过8180界面停止所有要下线的Search节点。
可以看到 xixia02 节点上已没有任何shard存在。