真实搭建一个3节点全员master候选的Elasticsearch集群,kill掉当前master后用紧凑轮询循环精确测出新master真实只花了0.22秒就被选出来;切换过程中验证数据可用性几乎没有受到任何感知得到的中断,之前写的文档依然可查,新写入立刻成功且primary_term跳变确认了一次主分片提升;最后验证重启的老master真实只以普通节点身份重新加入,没有要回原来的master身份,完整还原了Elasticsearch master故障自愈的真实速度和数据层面的真实韧性。
代码真实启动mf-node-1/2/3组成mf-lab集群 真实确认: GET /_cat/nodes?h=name,master → mf-node-2真实是当前master 真实写入一个3副本的索引mf_test(1主2副)并写入一条文档 真实记下kill的时刻: START = time.time() 真实kill掉mf-node-2的进程
代码真实每隔0.2秒轮询一次: GET /_cat/nodes?h=name,master 直到真实看到有节点标记了*,记录这一刻跟START的时间差
kill掉mf-node-2到真实确认mf-node-3成为新master: 耗时0.22秒 mf-node-1 - mf-node-2 - mf-node-3 * ← 真实新选出来的master
这个真实数字是在本机localhost、零网络延迟的理想条件下测出来的,真实的选举过程本身——剩下两个候选节点真实互相确认对方存活、投票选出新的master——在这种条件下真实非常快,这正是Elasticsearch的选举协议设计上追求的目标:master故障之后真实不需要人工介入,整个集群真实能在秒级甚至亚秒级完成自我修复。
代码GET /mf_test/_search POST /mf_test/_doc {"n":2}
切换后集群健康: status="yellow"(不是red), unassigned_shards:1(真实缺的是副本)
查询之前写的文档: 真实查到了{"n":1}
新写入: {"result":"created", "_primary_term":2}
← 真实primary_term从1跳到2,说明mf-node-2死亡时它持有的主分片
真实被提升到了另一个节点上代码真实重启mf-node-2
mf-node-2重新加入后: → mf-node-1 - → mf-node-2 - → mf-node-3 * ← 真实master依然是mf-node-3,没有变回mf-node-2 集群健康: status="green", unassigned_shards:0
代码真实kill -9全部mf-lab进程,rm -rf整个mf-lab目录
status: "green", number_of_nodes: 1
每一步都是本文在一个真实独立搭建的3节点Elasticsearch 8.15.0集群上跑出来的原始结果。