Elasticsearch(ES)的高可用机制是一套分布式容错 + 数据冗余 + 自动故障转移的完整体系,核心目标是:数据不丢失、服务不中断、故障自动恢复,无需人工干预。其机制完全基于之前提到的「分片、副本、节点、集群」核心组件,层层递进保障可用性。
一、高可用的核心目标
在展开机制前,先明确 ES 高可用的 3 个核心诉求(避免理解偏差):
- 数据不丢失:无论单节点故障、机架故障,甚至部分集群节点下线,都不会丢失任何已写入的数据;
- 服务不中断:故障发生时,读写请求仍能正常响应(仅可能有短暂延迟,无明显感知);
- 自动恢复:故障后无需人工操作,集群自动完成数据冗余修复、服务切换,恢复到健康状态。
二、核心高可用机制(从底层到上层)
1. 数据冗余:副本分片是基础(“备份兜底”)
高可用的前提是「数据多份存储」,ES 通过副本分片(Replica Shard) 实现数据冗余,核心规则如下:
-
副本与主分片的关系:副本是主分片(Primary Shard)的完整拷贝,主分片处理写入请求(增删改)后,会实时将数据同步到所有副本分片;
-
强制分离部署:ES 的分片分配器(Shard Allocator)会严格保证:「同一主分片的所有副本,不会部署在同一节点上」(避免节点宕机导致主副同时丢失);
- 进阶优化:生产环境建议开启「机架感知」(Rack Awareness),配置后 ES 会确保「同一分片的主副副本,不会部署在同一机架」(避免机架断电 / 网络故障导致数据丢失);
-
多副本容错:副本数量越多,容错能力越强。例如:1 个主分片 + 2 个副本,即使 2 个节点宕机,只要剩余节点包含其中 1 份数据(主或副),数据就不会丢失。
关键补充:副本不仅是备份,还能分担查询压力,但冗余的核心价值是「高可用」—— 无副本的索引,只要主分片所在节点宕机,数据直接丢失,完全无高可用可言。
2. 故障自动转移:服务不中断的核心(“自动切换”)
当集群出现故障(节点宕机、分片不可用)时,ES 会通过「自动故障转移」机制,快速切换服务,避免中断。主要分为 3 类故障场景:
(1)主分片故障(最常见)
-
场景:存储主分片 P0 的节点 A 宕机,P0 变为不可用;
-
转移流程(毫秒级完成):
- 主节点(Master Node)通过心跳检测(默认每 1 秒)发现节点 A 失联,标记 P0 为「未分配(Unassigned)」;
- 主节点从 P0 的所有副本分片(如 R0,部署在节点 B)中,选举一个「健康的副本分片」升级为新的主分片;
- 新主分片(原 R0)开始接收写入请求,同时 ES 自动在其他可用节点上,为新主分片创建一个新的副本分片(恢复「主 + 副」的冗余结构);
-
结果:客户端无感知,写入 / 查询请求正常响应,数据无丢失。
(2)数据节点故障(整节点下线)
-
场景:节点 B(存储多个主分片和副本分片)突然宕机;
-
转移流程:
- 主节点检测到节点 B 失联,标记该节点上所有分片为「不可用」;
- 对节点 B 上的「主分片」:逐一从其副本分片(部署在其他节点)中选举新主分片;
- 对节点 B 上的「副本分片」:无需升级,直接在其他节点上重新创建对应的副本(确保每个主分片仍有足够副本);
-
结果:只要剩余节点数量足够承载所有分片,集群会在几秒内恢复所有分片的可用性,服务不中断。
(3)主节点故障(集群 “大脑” 下线)
主节点负责管理集群元数据(索引结构、分片分配、节点状态),其高可用通过「主节点选举」实现:
-
集群启动时,所有节点会通过「投票机制」选举 1 个主节点(默认需超过半数节点同意,即 “quorum” 机制);
-
主节点故障时:
- 其他节点检测到主节点失联(心跳超时,默认 3 秒);
- 符合「主节点候选资格」的节点(默认所有节点都有资格,生产环境建议单独配置「候选主节点」)自动发起选举;
- 超过半数候选节点投票同意后,新主节点上任,接管集群管理;
-
关键保障:
- 选举期间,集群「只读不写」(查询请求仍可正常响应,写入请求会阻塞到选举完成,通常耗时 1-3 秒);
- 生产环境建议配置「3 个候选主节点」(避免 “脑裂”:多个主节点同时存在),确保选举能快速达成共识。
3. 集群元数据高可用:“大脑” 不丢指令
集群元数据(索引映射、分片分配规则、节点角色等)是集群运行的核心,其高可用通过以下两点保障:
- 元数据同步:主节点会将所有元数据实时同步到集群中所有其他节点(包括数据节点、协调节点),确保每个节点都有完整的元数据副本;
- 元数据持久化:主节点会将元数据持久化到本地磁盘(
config目录下的集群状态文件),即使主节点宕机重启,也能从磁盘恢复元数据,避免丢失。
4. 数据一致性保障:避免 “脏数据”
高可用不仅要求数据不丢失,还要求数据正确(无冲突、无脏数据),ES 通过以下机制保障数据一致性:
- 写入确认机制:客户端写入数据时,默认需等待「主分片写入成功 + 至少 1 个副本分片同步成功」后,才返回 “写入成功”(可通过
wait_for_active_shards参数配置,如要求所有副本同步成功); - 版本控制:每个文档有唯一版本号(
_version),写入时通过版本号校验避免并发冲突(如两个客户端同时修改同一文档,只有先写入的会成功,后写入的会返回版本冲突,需重试); - 分片同步机制:主分片与副本分片之间通过「操作日志(Translog)」同步数据 —— 主分片写入数据时,先记录 Translog,再同步到副本,副本写入成功后反馈给主分片,主分片再提交到倒排索引,确保主副数据完全一致。
三、生产环境高可用配置建议(实操关键)
仅依赖默认机制不够,需通过以下配置进一步提升高可用能力:
-
副本数量配置:默认 1 个副本,生产环境建议配置为 2 个(
number_of_replicas: 2),确保即使 2 个节点宕机,仍有可用副本; -
主分片规划:主分片数量创建后不可修改,需提前规划(单分片数据量控制在 10-50GB),避免后续扩容麻烦;
-
节点角色分离:
- 单独配置 3 个「候选主节点」(
node.master: true, node.data: false),仅负责集群管理,不存储数据,避免数据节点压力影响主节点稳定性; - 配置足够的「数据节点」(
node.master: false, node.data: true),承载分片存储和读写请求;
- 单独配置 3 个「候选主节点」(
-
机架感知配置:在
elasticsearch.yml中配置node.attr.rack: 机架ID(如rack1、rack2),ES 会自动将同一分片的主副副本分配到不同机架,避免机架故障导致数据丢失; -
超时参数优化:
- 心跳超时(
discovery.zen.fd.ping_timeout):默认 3 秒,可调整为 5 秒(避免网络抖动误判节点宕机); - 主节点选举超时(
discovery.zen.minimum_master_nodes):设置为「候选主节点数 / 2 + 1」(如 3 个候选主节点,设置为 2),防止脑裂;
- 心跳超时(
-
跨区域部署:核心业务建议跨可用区 / 跨地域部署集群(如阿里云 ECS 跨可用区),避免单区域故障导致集群不可用。