我们现在假设有一个这样的集群,有3个主分片,有6各复制分片如下图所示:

我们杀掉一个master节点来模拟故障。一个集群必须要有一个主节点才能使其功能正常,所以集群做的第一件事就是各个节点选举一个新的主节点:node2。主分片p_a0在我们杀掉node1时已经丢失了,我们的索引在丢失主分片时不能正常工作。如果此时检查集群健康,我们将看到状态red:不是所有的主分片都可用!
幸运的是丢失的一个主分片的完整拷贝存在于其他节点上,所以新主节点做的第一件事是把这个在node2或node3上的复制分片升级为主分片,这时集群健康回到yellow状态。这个提升是瞬间完成的,就好像按了一下开关。看起来就像下图这个样子:

为什么集群的健康状态是yellow而不是green?我们有三个主分片,但是我们指定了每个主分片对应两个复制分片,当前却只有一个复制分片被分配,这就是集群状态无法达到green的原因,不过不用太担心这个:当我们杀掉node2,我们的程序依然可以在没有丢失数据的情况下继续运行,因为node3还有每个分片的拷贝。
如果我们重启node1,集群将能够重新分配丢失的复制分片,集群状况与之前类似。如果node1依旧有旧分片的拷贝,它将会尝试再次利用它们,它只会从主分片上复制在故障期间有数据变更的那一部分。
网友评论