Elasticsearch 集群中所有节点的滚动节点重启

Rolling node restart of all nodes in an Elasticsearch cluster

我们需要重新启动 elasticsearch 集群中的所有节点,因为它们需要修补。我们需要零停机时间,所以不能同时停止所有数据节点(我们有 1 个主节点和 1 个副本,在 20 个数据节点上有 150 个索引,3 个主节点使用 ES 2.4.4)。

标准方法建议单独重启每个节点,等待其备份并平衡,然后对所有节点重复该过程: https://www.elastic.co/guide/en/elasticsearch/guide/2.x/_rolling_restarts.html

这将花费很长时间,因为我们每个节点大约有 80 个分片,并且需要一段时间才能重新分配它们。是否有任何工具可以识别我们如何同时重启多个数据节点(即识别主分片和辅助分片不在该子集中的节点组)?

或者有没有其他方法可以达到同样的目的?

tldr;由于每个分片只有一个副本,因此您 很可能 无法关闭一个以上的节点并且不会变为红色(对于您的至少一个索引)。


这是一个组合学练习。当您关闭一个节点时,您需要其余节点来为该节点托管的 80 个分片提供服务。

假设您想要关闭 19 个活动节点中的另一个节点,但您的任何索引仍不进入红色状态。这只有在该节点不托管这 80 个分片中的任何一个时才有可能。让我们计算一下这个概率。

Probability that a live node doesn't have one of those 80 shards = (18/19)
Probability that a live node has none of the 80 shards = (18/19)^80 = 0.013 = 1.3%

因此,如果您关闭另一个节点,您变为红色(至少一个索引)的概率为 98.7%。

如果你把你所有的 19 个活动节点加起来,那么你只有 1.3% * 19 = 25% 的机会找到另一个节点来关闭并且仍然不会变红。 (尽管由于独立性假设,我对最后一个陈述并不完全确定,但我相信它传达了这个想法。)