为什么这个错误发生 #
master_not_discovered_exception 表示节点无法发现或连接到集群的主节点。主节点是集群的协调中心,负责管理集群状态、索引创建、分片分配等关键操作。
这个错误可能由以下原因引起:
- 主节点宕机:主节点进程崩溃或服务器故障
- 网络问题:节点之间的网络连接中断或配置错误
- 集群配置问题:
discovery.zen.ping.unicast.hosts或cluster.initial_master_nodes配置错误 - 主节点选举失败:集群中没有足够的候选主节点(master-eligible nodes)形成法定人数
- 防火墙限制:端口 9300(节点间通信端口)被防火墙阻止
- 资源耗尽:主节点因资源不足(内存、CPU)无法响应
- 集群分裂:网络分区导致集群分裂成多个独立的子集群
- 节点启动顺序:在集群初始化时,节点启动顺序不正确
如何修复这个错误 #
1. 检查集群状态 #
# 查看集群健康状态
GET /_cluster/health
# 查看节点信息
GET /_cat/nodes?v
# 查看主节点信息
GET /_cat/master?v
2. 检查并修复网络连接 #
# 测试节点间的网络连通性
telnet <node_ip> 9300
# 检查防火墙规则
sudo firewall-cmd --list-all
# 或
sudo iptables -L -n
3. 检查配置文件 #
验证 easysearch.yml 中的配置:
# 确保配置了正确的候选主节点
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
# 或配置单播发现
discovery.seed_hosts: ["192.168.1.1:9300", "192.168.1.2:9300"]
4. 重启候选主节点 #
如果主节点无法恢复,可以手动重启候选主节点来触发选举:
# 逐个重启候选主节点
sudo systemctl restart easysearch
5. 增加候选主节点数量 #
确保集群中有足够数量的候选主节点(建议为 3 个或奇数个)来避免脑裂问题。
6. 检查日志 #
# 查看主节点日志
tail -f /path/to/easysearch/logs/easysearch.log
# 重点关注与主节点选举、发现相关的错误信息
grep -i "master" /path/to/easysearch/logs/easysearch.log
7. 设置合理的法定人数 #
在配置文件中设置:
# 设置法定人数,防止脑裂
discovery.zen.minimum_master_nodes: 2 # (master_eligible_nodes / 2) + 1
8. 临时解决方案 #
如果集群完全不可用且需要紧急恢复,可以考虑:
- 停止所有节点
- 选择一个节点作为临时主节点
- 修改配置并逐个启动节点
预防措施 #
- 配置多个候选主节点以确保高可用性
- 确保网络稳定,监控节点间连接状态
- 设置合适的法定人数参数
- 定期备份集群配置和数据
- 配置集群监控告警,及时发现问题
- 在生产环境中使用专用的主节点(不存储数据)以提高稳定性





