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

为什么这个错误发生 #

node_disconnected_exception 表示与集群中的某个节点的连接已断开。这通常发生在节点间通信过程中。

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

  1. 节点宕机:目标节点进程崩溃或服务器故障
  2. 网络问题:节点间的网络连接中断
  3. 节点关闭:节点正在被正常关闭
  4. 连接超时:节点响应时间过长导致连接超时
  5. 防火墙阻断:防火墙规则阻止了节点间通信
  6. 高负载:节点负载过高导致无法及时响应
  7. 端口占用:通信端口被其他进程占用
  8. 配置错误:节点发现或网络配置不正确

如何修复这个错误 #

1. 检查节点状态 #

# 查看集群中的所有节点
GET /_cat/nodes?v

# 查看节点详细信息
GET /_nodes

2. 检查网络连接 #

# 测试节点间的网络连通性
telnet <node_ip> 9300

# 检查端口是否开放
netstat -an | grep 9300
# 或
ss -tuln | grep 9300

3. 重启断开的节点 #

# 在目标服务器上重启 Easysearch
sudo systemctl restart easysearch

# 或使用其他方式启动
bin/easysearch -d

4. 检查防火墙设置 #

# 检查防火墙规则
sudo firewall-cmd --list-all

# 开放必要端口
sudo firewall-cmd --add-port=9300/tcp --permanent
sudo firewall-cmd --reload

5. 查看节点日志 #

# 查看错误日志
tail -f /path/to/easysearch/logs/easysearch.log

# 查找与连接相关的错误
grep -i "disconnect" /path/to/easysearch/logs/easysearch.log

6. 检查集群配置 #

# 验证节点发现配置
GET /_cluster/settings?flat_settings=true

# 检查 easysearch.yml 配置
# discovery.seed_hosts: ["host1:9300", "host2:9300"]

7. 排除故障节点 #

如果节点持续不可用:

# 从集群中排除节点
PUT /_cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.exclude._name": "problematic_node"
  }
}

# 或按 IP 排除
PUT /_cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.exclude._ip": "192.168.1.100"
  }
}

8. 检查资源使用 #

# 查看节点资源使用情况
GET /_nodes/stats

# 检查 JVM 内存
GET /_nodes/stats/jvm

# 检查 CPU 和负载
GET /_nodes/stats/process,os

9. 调整超时设置 #

如果网络延迟高:

# easysearch.yml
cluster.fault_detection.follower_check.interval: 30s
cluster.fault_detection.follower_check.timeout: 60s
cluster.fault_detection.leader_check.interval: 30s
cluster.fault_detection.leader_check.timeout: 60s

10. 恢复节点后重新加入 #

# 节点恢复后会自动尝试重新加入集群
# 检查节点是否成功加入
GET /_cat/nodes?v

# 如果未自动加入,检查配置并重启

预防措施 #

  • 配置适当的超时时间以适应网络延迟
  • 使用稳定的网络环境
  • 监控节点健康状态和连接状态
  • 配置足够的候选主节点以防止脑裂
  • 定期检查和维护网络设备
  • 确保节点配置正确,特别是发现配置
  • 使用负载均衡器分发请求
  • 为关键操作实现客户端重试机制
  • 监控集群状态,及时发现节点问题