📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

为什么这个错误发生 #

master_not_discovered_exception 表示节点无法发现或连接到集群的主节点。主节点是集群的协调中心,负责管理集群状态、索引创建、分片分配等关键操作。

这个错误可能由以下原因引起:

  1. 主节点宕机:主节点进程崩溃或服务器故障
  2. 网络问题:节点之间的网络连接中断或配置错误
  3. 集群配置问题discovery.zen.ping.unicast.hostscluster.initial_master_nodes 配置错误
  4. 主节点选举失败:集群中没有足够的候选主节点(master-eligible nodes)形成法定人数
  5. 防火墙限制:端口 9300(节点间通信端口)被防火墙阻止
  6. 资源耗尽:主节点因资源不足(内存、CPU)无法响应
  7. 集群分裂:网络分区导致集群分裂成多个独立的子集群
  8. 节点启动顺序:在集群初始化时,节点启动顺序不正确

如何修复这个错误 #

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. 临时解决方案 #

如果集群完全不可用且需要紧急恢复,可以考虑:

  • 停止所有节点
  • 选择一个节点作为临时主节点
  • 修改配置并逐个启动节点

预防措施 #

  • 配置多个候选主节点以确保高可用性
  • 确保网络稳定,监控节点间连接状态
  • 设置合适的法定人数参数
  • 定期备份集群配置和数据
  • 配置集群监控告警,及时发现问题
  • 在生产环境中使用专用的主节点(不存储数据)以提高稳定性