Elasticsearch 中的节点(比如共 20 个),其中的 10 个选了一个 master,另外 10 个选了另一个 master,怎么办?
参考回答
在 Elasticsearch 集群中,如果节点被划分为两个不同的主节点组,意味着集群的拓扑结构存在问题。这种情况通常由网络分区(Network Partition)或配置问题导致。由于 Elasticsearch 集群基于 Zen-Dodo 协议来进行主节点选举,集群中的所有节点会通过相互投票的方式选举出一个主节点。如果某些节点与其他节点失去联系,它们可能会选举出不同的主节点。
对于这个问题,Elasticsearch 会采取一些措施来防止集群状态的混乱:
- 节点通信丢失:如果部分节点无法与其他节点进行通信,它们会认为自己仍然是集群的一部分,并尝试选举新的主节点。如果出现两个主节点,这意味着集群的“脑裂”状态(Split Brain)发生了。
-
Zen-Dodo 协议的防护:为了防止脑裂,Elasticsearch 使用 Zen-Dodo 协议并依赖 最小主节点数 的配置(
discovery.zen.minimum_master_nodes)。当集群中的主节点选举失败时,Zen-Dodo 协议会要求一个最小数量的主节点参与选举,以避免分裂成多个独立的集群。
详细讲解与拓展
-
Zen-Dodo 协议中的最小主节点数(
minimum_master_nodes):- Elasticsearch 通过配置
discovery.zen.minimum_master_nodes来防止脑裂现象。该配置项指定了集群中至少需要多少个节点参与选举,才能保证选出的主节点有效并且集群不分裂。 - 配置规则:
minimum_master_nodes的值通常是(N / 2) + 1,其中N是集群中主节点的数量。此配置确保了在出现网络分区时,只有一个主节点能够获得多数节点的选举支持,从而防止脑裂。例如:假设集群中有 10 个主节点,则
minimum_master_nodes应设置为 6。这样,至少有 6 个节点需要同意一个主节点才会成为集群的有效主节点。即使 4 个节点失联,剩余的 6 个节点依然能保证主节点选举的稳定性。
- Elasticsearch 通过配置
-
脑裂的表现和处理:
- 脑裂(Split Brain) 是指由于网络分区或其他原因,集群被分为多个子集,每个子集选举了自己的主节点。不同子集之间无法通信,因此它们无法知道其他子集已经选举出了主节点。
- 在脑裂状态下,每个子集都认为自己是独立的集群,并可能在没有协调的情况下进行数据写入。这种情况下,两个主节点可能会产生冲突,导致数据不一致。
- 如何解决这个问题:
- 手动干预:首先,可以通过检查 Elasticsearch 的日志来确定发生脑裂的原因。如果集群中的一部分节点无法与另一部分节点通信,可以通过重新配置网络或恢复节点间的连接来恢复集群的完整性。
- 恢复集群状态:如果脑裂发生,可以通过重新启动分裂的节点或重新配置集群中的节点来解决。例如,手动将某些节点从集群中移除,或者通过
cluster.routing.allocation.enable配置强制集群恢复正常状态。 - 设置
minimum_master_nodes:确保在配置集群时正确设置minimum_master_nodes,避免集群在遇到网络分区时选举出多个主节点。通常,Elasticsearch 会自动为较小的集群计算一个合理的值,但在较大的集群中,管理员应确保该值设置正确。
- 集群健康检查:使用
_cluster/health和_cat/nodesAPI 可以帮助管理员检查集群的状态和节点分布情况,以便及时发现并修复分裂或网络问题。
示例配置
为了防止出现两个主节点,您可以在 Elasticsearch 的配置文件 elasticsearch.yml 中设置 discovery.zen.minimum_master_nodes 配置项。
discovery.zen.minimum_master_nodes: 6
在此示例中,假设集群中有 10 个主节点,minimum_master_nodes 设置为 6,意味着至少需要 6 个主节点同意某个节点成为主节点,从而保证集群不被分裂成两个部分。
总结
如果 Elasticsearch 集群中的节点被划分为两个不同的主节点组,通常是因为网络分区或配置不当导致的脑裂(Split Brain)现象。通过正确配置 discovery.zen.minimum_master_nodes,可以防止多个主节点的选举,避免脑裂的发生。此配置确保了集群中只有一个主节点能获得大多数节点的选举支持,从而维持集群的一致性和稳定性。