从「反亲和规则」到「节点宕机全流程恢复」,一步到位讲透
Elasticsearch 有一条硬约束,叫 Shard Allocation Awareness(分片分配感知)
如果把 P0 和 P0 的副本 R0 放在同一台 Node-1 上,该节点宕机时,数据和备份一起丢失——副本形同虚设。
P0 在 Node-1,R0 在 Node-2。Node-1 宕机 → R0 在 Node-2 上毫发无损 → 立即提升为主分片,数据零丢失。
一个 3 节点集群,有 3 个主分片 + 1 个副本。观察 P0 和 R0 的位置。
从一个节点心跳丢失,到集群恢复 GREEN,中间发生了什么?
其他 Master-eligible 节点会发起选举,选出新 Master。这个过程叫 Zen Discovery(ES7+ 用新的协调层)。 新 Master 上来第一件事就是读取集群元数据,然后接管故障恢复流程。所以即使 Master 挂了,恢复也不会中断。
写入会失败并返回错误,因为目标主分片不可用。客户端需要重试。一旦副本提升完成(通常毫秒级),路由表更新后写入即可正常进行。
这就是为什么推荐设置 wait_for_active_shards=all —— 确保写入时所有副本都确认。
至少 1 个副本(生产环境底线)。允许容忍 1 个节点宕机不丢数据。
如果集群很大(比如 10+ 节点),可设 2 个副本,容忍 2 个节点同时宕机。
代价:每增加 1 个副本,存储翻倍,写入延迟增加(需要等更多 ACK)。
可以通过 cluster.routing.allocation.awareness.attributes 配置机架感知,确保分片不但在不同节点、更在不同机架/可用区。