问答题832/1053Elasticsearch中的节点(比如共20个),其中的10个选了一个master,另外10个选了另一个master,怎么办?

难度:
2021-11-02 创建

参考答案:

在 Elasticsearch 集群中,master 节点是负责集群管理和协调的关键节点,包括索引的创建、节点的加入或移除、分片的分配等。如果你有 20 个节点,并且其中 10 个节点选择了一个 master,而另外 10 个节点选择了另一个 master,意味着你可能遇到了一个集群分裂(split brain)问题。集群分裂会导致多个 master 节点同时存在,这样会导致集群的不可预测性,比如数据不一致、元数据丢失、操作冲突等。

集群分裂(Split Brain)问题

集群分裂问题是指在网络分区或其他故障情况下,Elasticsearch 集群中的多个节点可能会选择不同的 master 节点,导致集群的两部分都认为自己是 master,从而产生冲突。

如何解决这个问题

Elasticsearch 提供了多种机制来防止和解决集群分裂问题,以下是一些常见的解决方案:

1. 设置最小主节点数(discovery.zen.minimum_master_nodes

Elasticsearch 提供了一个设置 discovery.zen.minimum_master_nodes 参数来确保只有一个 master 节点在集群中被选举为主节点。这个设置可以防止多个 master 节点的选举,进而避免集群分裂问题。

  • 原理:该设置指定了集群中至少需要多少个 master 节点响应才能完成 master 选举。例如,在 20 个节点的集群中,如果设置 discovery.zen.minimum_master_nodes 为 11(即大多数节点),那么在集群中只有 11 个节点同意某个节点为 master 时,才会成功选举为主节点。

    如果集群中只有 10 个节点可以访问,无法满足 minimum_master_nodes 的要求,集群就无法选举出 master 节点,防止集群分裂。

  • 配置示例

    1discovery.zen.minimum_master_nodes: 11
  • 计算方法
    为了避免 Split Brain,最小主节点数的推荐值应该设置为 N / 2 + 1N 为集群中的节点数),这样只有在大多数节点一致的情况下,集群才会选举出 master 节点。

    • 例如,20 个节点时,discovery.zen.minimum_master_nodes = 11
    • 16 个节点时,discovery.zen.minimum_master_nodes = 9

2. 使用 ZenD和Zen2 (Zen Discovery) 协议

ZenD 是 Elasticsearch 使用的一个集群发现协议,它负责集群节点的发现和 Master 节点的选举。ZenD 协议(默认使用 Zen1)通过网络交换来确保集群的一致性。

Zen2 是后续的改进版本,在 Zen2 中,选举过程更加可靠,可以避免集群分裂问题。在 Zen2 中,节点选择 master 的过程更加智能和安全。

3. 配置自动修复机制

当集群检测到分裂时,可以配置一些自动修复机制来恢复集群的正常状态。对于集群分裂后的恢复,Elasticsearch 会在网络恢复或节点重新连接时自动恢复正常状态。

4. 监控和报警机制

除了以上的配置手段,还需要定期监控集群状态,及时发现和响应可能出现的分裂现象。可以通过 Elasticsearch 自带的监控工具(如 X-Pack Monitoring)或第三方监控工具来监控集群健康状况,特别是关注 master 节点的选举状态。

为什么需要设置 discovery.zen.minimum_master_nodes

设置 discovery.zen.minimum_master_nodes 是为了防止在网络分区或节点故障时,多个节点同时选举不同的 master。假设你有 20 个节点,正常情况下,集群中应该只有一个 master 节点。如果没有设置 discovery.zen.minimum_master_nodes,在某些节点丢失连接时,剩余的节点可能会认为自己是主节点,导致两个 master 同时存在。

假设在没有该配置的情况下,20 个节点中的 10 个节点失去连接,并且 10 个节点仍然在线。在这种情况下,集群中的两个部分(每部分包含 10 个节点)可能会分别选举出各自的 master 节点,造成数据不一致的情况。

通过设置 discovery.zen.minimum_master_nodes 为 11(即大多数节点),集群会强制确保只有大多数节点同意某个节点为 master 时才会选举该节点为主节点,这样可以避免 Split Brain 问题。

最近更新时间:2024-12-12