机房网络抖动两分钟后,两个节点都认为自己被选成 master,日志里各有一份 master node changed。写入一边成功一边 404,网络恢复后分片状态全乱。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

GET _cluster/health
GET _cat/master?v
GET _nodes/settings?filter_path=nodes.*.settings.discovery

7.x 去掉了 minimum_master_nodes,改成选举时自动算 quorum,前提是节点能互相发现。配置里还留着 6.x 的 discovery.zen 参数,新参数没写全,集群被拆成两块各自选主。多数派凑不齐时正确行为是停止选主,而不是各选各的。这一点先确认清楚,后面就不用反复试。

「脑裂双 master」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

具体做法是,确认 discovery.seed_hosts 覆盖全部 master 候选节点;首次搭建用 cluster.initial_master_nodes 只写一次;master 候选保持奇数个 至少三个;检查配置里没有残留 discovery.zen 参数。

改完照着核一遍,_cat/master 只返回一个节点,网络恢复后没有出现第二个 master。

作者 9823189