如何在运行时从Elasticsearch集群中删除节点而不停机


71

假设我在集群中有5个节点,并且在运行时必须删除2个节点。那么如何在不影响索引的情况下完成呢?

我有近10 Gbphour的连续数据流,并且不断对其建立索引。

重新平衡会对此有所帮助吗?提前致谢


为什么在此问题中标记solr?我猜这只是与Elasticsearch有关的问题。请不要使用错误的标签。这可能会误导用户去研究无关紧要的问题。
Vamsi Krishna 2013年

Answers:


131

您可以通过告诉集群将其从分配中排除来停用节点。(从此处的文档)

curl -XPUT localhost:9200/_cluster/settings -H 'Content-Type: application/json' -d '{
  "transient" :{
      "cluster.routing.allocation.exclude._ip" : "10.0.0.1"
   }
}';echo

这将导致Elasticsearch将该节点上的分片分配给其余节点,而群集的状态不会变为黄色或红色(即使您具有复制0)。

重新分配所有分片后,您可以关闭节点,然后在该处执行任何操作。完成后,包括要分配的节点,Elasticsearch将再次重新平衡分片。


34
同样,“ cluster.routing.allocation.exclude._name”和“ cluster.routing.allocation.exclude._id”也可用于按节点名称和节点ID停用。当由于错误的配置(/ etc / hosts&elasticsearch.yml)所有节点都具有相同的IP地址(已发布)IP 127.0.1.1时,需要这样做。
阿列克谢·蒂加列夫

2
如何检查关闭退役节点是否可以?
Mischa Arefiev 2015年

11
您可以使用curl -XGET 'http://ES_SERVER:9200/_cluster/health?pretty';如果没有要重定位的节点,则排除的节点必须已耗尽并且可以安全关闭。另一个选择是检查curl -XGET 'http://ES_SERVER:9200/_nodes/NODE_NAME/stats/indices?pretty'节点上是否没有文档。
towr

11
多个_ip记录可以用逗号分隔,例如:“ cluster.routing.allocation.exclude._ip”:“ 10.0.0.1,10.0.0.2”
Marc Tamsky 2015年

1
@TomMiller-没关系。如果您在将其从负载均衡器中删除之前将其从路由分配中删除,它仍将处理查询并返回结果。
Paul Lemke

10

要从集群中删除elasticsearch节点,只需运行以下命令

curl -XPUT P.P.P.P:9200/_cluster/settings -H 'Content-Type: application/json' -d '{
  "transient" :{
      "cluster.routing.allocation.exclude._ip" : "X.X.X.X"
   }
}';echo

P.P.P.P是主节点的专用IP,localhost如果elasticsearch正在运行,您也可以使用localhostX.X.X.X是要从群集中删除的节点的专用IP。

该命令将给出acknowledgement true是否接受删除该节点并开始数据重定位。检查数据重定位是否结束,并且节点上没有剩余的碎片,然后停止elasticsearch进程和stop/terminate实例。在本文中可以找到检查数据重定位和碎片的命令。


我认为这是不正确的。至少在v1.7.5上,如果排除一个节点,它将不会获得分配给它的NEW碎片,但是不会影响现有的碎片。
TheFiddlerWins
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.