0%

集群发现机制

Elasticsearch 集群发现机制:Zen Discovery 详解

Elasticsearch 集群的节点发现机制是确保节点能够自动识别集群成员、选举主节点并维持集群一致性的核心模块。默认采用 Zen Discovery 机制,支持单播(Unicast)和多播(Multicast)两种方式,其中单播是生产环境的推荐配置。

Zen Discovery 核心功能

Zen Discovery 负责集群的以下关键流程:

  1. 节点发现:新节点加入集群时,通过预配置的节点列表找到集群中的现有节点。
  2. 主节点选举:当集群无主节点或主节点故障时,自动选举新的主节点。
  3. 集群状态同步:主节点与其他节点同步集群元数据(如索引、分片分布)。

节点发现方式

单播(Unicast):生产环境首选

单播是通过预先配置的节点列表(种子节点)进行节点发现,避免多播的网络广播开销和安全风险,是 Elasticsearch 的默认推荐方式。

配置方式

elasticsearch.yml 中指定种子节点列表:

1
2
3
4
discovery.zen.ping.unicast.hosts:
- "node1.example.com:9300" # 节点1的地址和Transport端口(默认9300)
- "node2.example.com:9300" # 节点2的地址和端口
- "192.168.1.100:9300" # 可直接使用IP
工作原理
  1. 新节点启动时,向 discovery.zen.ping.unicast.hosts 中的种子节点发送 ping 请求。
  2. 种子节点回应集群中的其他节点信息,新节点据此加入集群。
  3. 无需配置所有节点,只需包含集群中少量节点(如主节点候选节点),新节点会自动发现其他成员。

多播(Multicast):不推荐用于生产

多播通过网络广播寻找集群节点,无需预先配置节点列表,但存在以下问题:

  • 网络广播占用带宽,不适合大规模集群。
  • 存在安全风险(非集群节点可能收到广播)。
  • 部分网络环境(如云服务)禁用多播。
配置方式(已过时,6.x 后逐步移除)
1
2
3
discovery.zen.ping.multicast.enabled: true  # 启用多播(默认关闭)
discovery.zen.ping.multicast.group: "224.2.2.4" # 多播组地址
discovery.zen.ping.multicast.port: 54328 # 多播端口

核心配置参数

节点发现与 ping 配置

  • discovery.zen.ping_timeout:节点间 ping 超时时间(默认 3s)。网络较慢时可增大(如 10s),避免误判节点故障。
  • discovery.zen.join_timeout:节点加入集群的超时时间(默认 60s),为 ping_timeout 的 20 倍。
  • discovery.zen.ping.unicast.concurrent_connects:单播时的最大并发连接数(默认 10),节点较多时可适当增大。

主节点选举与脑裂防护

  • discovery.zen.minimum_master_nodes:防止脑裂(集群分裂为多个子集群)的关键参数,需设置为 (主节点候选数 / 2) + 1

    例如:

    • 3 个主节点候选时,值为 2;
    • 5 个主节点候选时,值为 3。
      确保只有超过半数的主节点候选同意,才能选举新主节点。
  • discovery.zen.no_master_block:无主节点时的阻塞策略(默认 write):

    • write:阻塞写入操作,允许读取;
    • all:阻塞所有操作。

故障检测

  • discovery.zen.fd.ping_interval:主节点检测其他节点的频率(默认 1s)。
  • discovery.zen.fd.ping_retries:ping 失败重试次数(默认 3 次)。
  • discovery.zen.fd.ping_timeout:ping 超时时间(默认 30s),超时则认为节点故障。

节点加入集群的流程

  1. 新节点启动:读取 elasticsearch.yml 中的 cluster.name 和单播种子节点。
  2. 发送 ping 请求:向种子节点发送 ping,获取集群现有节点列表。
  3. 加入集群:与主节点通信,验证集群名称是否一致,成功后加入集群。
  4. 分片分配:主节点根据集群状态,为新节点分配分片(如副本分片)。

最佳实践

  1. 单播优先:生产环境禁用多播,仅使用单播配置种子节点(建议包含所有主节点候选)。
  2. 脑裂防护:严格设置 discovery.zen.minimum_master_nodes,主节点候选数建议为奇数(3、5 个)。
  3. 超时参数调优:在网络不稳定的环境(如跨机房),增大 ping_timeoutfd.ping_timeout,避免节点误判。
  4. 种子节点冗余:种子节点列表至少包含 2 个节点,防止单节点故障导致新节点无法加入。

欢迎关注我的其它发布渠道