故障恢复
前文我们已经提到过 Elasticsearch 可以应对节点故障。让我们来尝试一下。如果我们把第一个节点杀掉,我们的集群就会如下图所示:
被杀掉的节点是主节点。而为了集群的正常工作必须需要一个主节点,所以首先进行的进程就是从各节点中选择了一个新的主节点:Node 2
。
主分片 1
和 2
在我们杀掉 Node 1
后就丢失了,我们的索引在丢失主节点的时候是不能正常工作的。如果我们在这个时候检查集群健康状态,将会显示 red
:存在不可用的主节点!
幸运的是,丢失的两个主分片的完整拷贝在存在于其他的节点上,所以新的主节点所完成的第一件事情就是将这些在 Node 2
和 Node 3
上的从分片提升为主分片,然后集群的健康状态就变回至 yellow
。这个提升的进程是瞬间完成了,就好像按了一下开关。
那么为什么集群健康状态依然是是 yellow
而不是 green
呢?是因为现在我们有3个主分片,但是我们之前设定了1个主分片有2个从分片,但是现在却只有1份从分片,所以状态无法变为 green
,不过我们可以不用太担心这里:当我们再次杀掉 Node 2
的时候,我们的程序依旧可以在没有丢失任何数据的情况下运行,因为 Node 3
中依旧拥有每个分片的备份。
如果我们重启 Node 1
,集群就能够重新分配丢失的从分片,这样结果就会与三节点两从集群一致。如果 Node 1
依旧还有旧节点的内容,系统会尝试重新利用他们,并只会复制在故障期间的变更数据。
到目前为止,我们已经清晰地了解了 Elasticsearch 的横向扩展以及数据安全的相关内容。接下来,我们将要继续讨论分片的生命周期等更多细节。