Elasticsearch 集群发现机制:Zen Discovery 详解
Elasticsearch 集群的节点发现机制是确保节点能够自动识别集群成员、选举主节点并维持集群一致性的核心模块。默认采用 Zen Discovery 机制,支持单播(Unicast)和多播(Multicast)两种方式,其中单播是生产环境的推荐配置。
Zen Discovery 核心功能
Zen Discovery 负责集群的以下关键流程:
- 节点发现:新节点加入集群时,通过预配置的节点列表找到集群中的现有节点。
- 主节点选举:当集群无主节点或主节点故障时,自动选举新的主节点。
- 集群状态同步:主节点与其他节点同步集群元数据(如索引、分片分布)。
节点发现方式
单播(Unicast):生产环境首选
单播是通过预先配置的节点列表(种子节点)进行节点发现,避免多播的网络广播开销和安全风险,是 Elasticsearch 的默认推荐方式。
配置方式
在 elasticsearch.yml 中指定种子节点列表:
1 2 3 4
| discovery.zen.ping.unicast.hosts: - "node1.example.com:9300" - "node2.example.com:9300" - "192.168.1.100:9300"
|
工作原理
- 新节点启动时,向
discovery.zen.ping.unicast.hosts 中的种子节点发送 ping 请求。
- 种子节点回应集群中的其他节点信息,新节点据此加入集群。
- 无需配置所有节点,只需包含集群中少量节点(如主节点候选节点),新节点会自动发现其他成员。
多播(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.fd.ping_interval:主节点检测其他节点的频率(默认 1s)。
discovery.zen.fd.ping_retries:ping 失败重试次数(默认 3 次)。
discovery.zen.fd.ping_timeout:ping 超时时间(默认 30s),超时则认为节点故障。
节点加入集群的流程
- 新节点启动:读取
elasticsearch.yml 中的 cluster.name 和单播种子节点。
- 发送 ping 请求:向种子节点发送 ping,获取集群现有节点列表。
- 加入集群:与主节点通信,验证集群名称是否一致,成功后加入集群。
- 分片分配:主节点根据集群状态,为新节点分配分片(如副本分片)。
最佳实践
- 单播优先:生产环境禁用多播,仅使用单播配置种子节点(建议包含所有主节点候选)。
- 脑裂防护:严格设置
discovery.zen.minimum_master_nodes,主节点候选数建议为奇数(3、5 个)。
- 超时参数调优:在网络不稳定的环境(如跨机房),增大
ping_timeout 和 fd.ping_timeout,避免节点误判。
- 种子节点冗余:种子节点列表至少包含 2 个节点,防止单节点故障导致新节点无法加入。