1. 节点属性相关
- 节点角色属性:
- Elasticsearch 节点有多种角色,如
master-eligible
(可成为主节点的节点)、data
(数据节点)、ingest
(预处理节点)等。只有标记为 master-eligible
的节点才有资格参与主节点选举。通过配置文件中的 node.master: true
来设置该属性。例如,在 elasticsearch.yml
配置文件中,一个可成为主节点的节点配置如下:
node.name: node1
node.master: true
node.data: false
- 具有 `master-eligible` 角色的节点会在集群状态信息交换中表明自己有参与选举的资格。
- 节点权重属性:
- 每个
master-eligible
节点都有一个权重值,默认权重为 1
。可以通过在配置文件中设置 node.master_weight
来调整权重。例如:
node.master_weight: 10
- 权重值在选举过程中起到重要作用,权重越高的节点在选举时越有可能被选为临时 Master。它可以帮助管理员根据节点的硬件资源(如 CPU、内存等)来分配选举优先级,资源更强大的节点设置更高的权重,以便在选举中更具优势。
2. 网络通信机制
- 基于 Ping 的发现机制:
- Elasticsearch 使用基于 Ping 的机制来发现集群中的其他节点。节点启动时,会通过 UDP 广播(默认)或单播(可配置)的方式向网络中的其他节点发送 Ping 请求。例如,在单播模式下,需要在配置文件中指定可连接的节点列表:
discovery.seed_hosts: ["node1:9300", "node2:9300"]
- 接收到 Ping 请求的节点会回复响应,告知自己的状态信息,包括节点名称、角色、版本等。通过这种方式,节点可以发现集群中的其他节点,并建立连接。
- 集群状态信息交换:
- 节点之间通过 TCP 连接进行集群状态信息的交换。节点会定期(默认 1 秒)向其他节点发送包含自身状态信息(如已发现的节点列表、集群状态版本等)的消息。
- 当一个
master-eligible
节点发现当前集群没有 Master 节点(例如,集群刚启动或者 Master 节点故障)时,它会发起选举流程。该节点会向其他 master-eligible
节点发送选举请求消息,包含自己的节点信息和权重等。
- 其他
master-eligible
节点收到选举请求后,会根据一定的规则(如比较权重、节点 ID 等)决定是否投票给该节点。如果收到大多数(超过一半)master-eligible
节点的投票,该节点就会成为临时 Master。
- 在选举过程中,网络通信的稳定性至关重要。如果网络出现分区(即部分节点之间无法通信),可能会导致脑裂问题,即不同分区内各自选举出 Master 节点。为了避免这种情况,Elasticsearch 要求选举时必须有超过半数的
master-eligible
节点在线并能够通信。
3. 选举流程总结
- 当集群中没有 Master 节点时,
master-eligible
节点开始发起选举。
- 每个发起选举的节点向其他
master-eligible
节点发送包含自身节点属性(如权重、节点 ID 等)的选举请求。
- 接收到选举请求的
master-eligible
节点根据节点权重、节点 ID 等因素决定是否投票。一般来说,权重高的节点更容易获得投票。如果权重相同,则比较节点 ID,ID 较小的节点更有可能获得投票。
- 当某个
master-eligible
节点获得超过半数 master-eligible
节点的投票时,它就成为临时 Master。
- 临时 Master 会负责协调集群状态的更新,维护节点列表,处理索引创建、删除等集群级别的操作。在这个过程中,持续通过网络与其他节点保持通信,确保集群状态的一致性和稳定性。