三台节点每台都兼 master 和 data,跑一个 terms 聚合后集群 30 秒没有 master,日志里 master node changed 出现两次,期间写入全部超时。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,master 要定期处理集群状态和心跳,和 data 抢同一份 CPU 与堆。聚合把堆吃到 90%,master 线程拿不到时间片,其他节点就判定它失联。三台都忙,谁也接不上,选主自然拖长。

「节点角色混部」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。报错里带路径的,先去看那个路径在不在、权限对不对。

GET _cat/nodeattrs?v
GET _nodes/stats/process?filter_path=**.cpu_percent
GET _cluster/health?wait_for_status=green&timeout=50s

同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

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

具体做法是,拆出三个专用 master 节点 只开 master 角色;data 节点设 node.master 为 false 不参与选主;master 节点堆不用太大 但 CPU 要留余量;用 _cat/nodeattrs 和 _nodes/stats 确认角色与负载。

最后用这个标准收尾,重跑同一聚合时 master 不再切换,写入没有超时,health 保持 green。

作者 9823189