Appearance
集群架构与选举
集群发现机制
1. 单播发现
yaml
# 默认配置
discovery.seed_hosts:
- 192.168.1.1
- 192.168.1.2
- 192.168.1.3
discovery.type: single-node # 单节点模式2. zen discovery(ES 7.x之前)
┌─────────────────────────────────────────┐
│ Zen Discovery │
├─────────────────────────────────────────┤
│ │
│ 1. PING 节点探测 │
│ 2. Unicast 单播列表 │
│ 3. Master Master选举 │
│ 4. Fault 故障检测 │
└─────────────────────────────────────────┘3. 集群协调(7.x+)
yaml
# 推荐配置
cluster.initial_master_nodes:
- node-1
- node-2
- node-3Master选举
选举流程
┌──────────────┐
│ 节点启动 │
└──────┬─────┘
│
┌──────▼──────┐
│ PING所有节点│
└──────┬─────┘
│
┌───────────────┼───────────────┐
│ │ │
┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ 节点A │ │ 节点B │ │ 节点C │
│(master) │ │ │ │ │
└─────┬─────┘ └─────┬─────┘ └─────┬─────┘
│ │ │
└───────────────┼───────────────┘
│
┌──────────────▼──────────────┐
│ 按nodeId排序,票数>半数 │
│ 最小的成为Master │
└──────────────┬──────────────┘
│
┌──────▼──────┐
│ Master就绪 │
└───────────┘选举条件
| 条件 | 说明 |
|---|---|
node.master: true | 节点有资格成为Master |
| 票数 > 节点数/2 | 需要多数派 |
| nodeId最小 | 字典序最小的 |
配置参数
yaml
# 脑裂问题配置
discovery.zen.minimum_master_nodes: 2 # 设为 (master节点数/2)+1故障检测
故障检测机制
Master Data节点
│ │
│──────────── Ping ───────���────────────→│
│←────────── Pong ──────────────────────│
│ │
│ (节点正常,每30s) │
│ │
│───────── Ping ─────────────────────→│
│× (节点无响应) │
│ │
│ ┌──────────────┐ │
│ │ 标记node为 │ │
│ │ 离线 │ │
│ └──────┬───┘ │
│ │ │
│ ┌────▼─────┐ │
│ │ 重新分配 │ │
│ │ 分片 │ │
│ └─────────┘ │fault detection配置
yaml
discovery.zen.fd.ping_interval: 1s # 探测间隔
discovery.zen.fd.ping_timeout: 30s # 响应超时
discovery.zen.fd.ping_retries: 3 # 重试次数脑裂问题
什么是脑裂?
正常情况:
[A/Master] ─────── [B] ─────── [C]
脑裂(两个Master):
[A/Master1] ── × ── [B] ── × ── [C/Master2]
两个集群,各有分片,数据不一致解决方案
yaml
# 1. 配置最小Master节点数
discovery.zen.minimum_master_nodes: 2 # (master节点数/2)+1
# 2. 7.x+,使用cluster coordination
cluster.coordination.election_timeout: 5s
cluster.coordination.minimum_voting_nodes: 3节点类型与职责
节点配置组合
| 配置 | 角色 |
|---|---|
| master:true, data:true | Master + Data |
| master:false, data:true | Data节点 |
| master:true, data:false | Master节点 |
| master:false, data:false | Ingest/协调节点 |
协调节点
yaml
node.master: false
node.data: false
node.ingest: false
# 处理请求转发和结果合并面试考点
Q: Master节点可以是Data节点吗?
可以,但不推荐(压力大)
Q: 脑裂怎么预防?
- 设置minimum_master_nodes
- 使用多数派选举
Q: 数据节点可以当Master?
可以,但数据量大时不推荐
Q: 如何发现集群状态?
bash
GET /_cluster/health
GET /_cluster/health?level=indices
GET /_cluster/health?level=shards