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

为什么这个错误发生 #

node_not_connected_exception 表示尝试向未连接的节点发送消息。这是一个传输层异常,当节点间没有建立连接时发生。

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

  1. 节点未启动:目标节点未运行
  2. 网络连接断开:节点间的网络连接中断
  3. 连接超时:连接建立超时导致断开
  4. 节点离线:目标节点已离开集群
  5. 防火墙阻止:防火墙阻止了节点间通信
  6. 配置错误:节点地址或端口配置错误
  7. 节点重启:目标节点重启导致连接断开
  8. 连接数过多:达到最大连接数限制
  9. 网络分区:网络分区导致节点无法通信
  10. SSL/TLS 握手失败:安全连接建立失败

如何修复这个错误 #

1. 检查节点连接状态 #

# 查看集群中的所有节点
GET /_cat/nodes?v&h=name,ip,transport.address

# 查看节点连接
GET /_nodes/transport

2. 验证目标节点状态 #

# 在目标节点上检查服务状态
sudo systemctl status easysearch

# 或
sudo service easysearch status

# 检查进程
ps aux | grep easysearch

3. 测试网络连接 #

# 测试基本网络连接
ping <target_node_host>

# 测试传输端口
telnet <target_node_host> 9300

# 使用 nc 测试
nc -zv <target_node_host> 9300

# 测试 HTTP 端口
curl http://<target_node_host>:9200

4. 检查防火墙规则 #

# 检查 iptables
sudo iptables -L -n | grep 9300

# 开放传输端口
sudo iptables -I INPUT -p tcp --dport 9300 -j ACCEPT

# 使用 firewalld
sudo firewall-cmd --add-port=9300/tcp --permanent
sudo firewall-cmd --reload

5. 等待节点重新加入集群 #

# 如果节点正在重启,等待其重新加入
# 监控集群状态
GET /_cat/nodes?v

# 等待集群恢复
GET /_cluster/health?wait_for_status=yellow&timeout=50s

6. 重启节点 #

# 如果连接有问题,可以重启节点
sudo systemctl restart easysearch

# 等待节点启动
GET /_cat/nodes?v

7. 检查传输配置 #

# 在 easysearch.yml 中检查传输配置
network.host: 0.0.0.0  # 或特定 IP
transport.port: 9300
transport.tcp.connect_timeout: 30s
transport.tcp.compress: true

8. 检查集群名称 #

# 确保所有节点使用相同的集群名称
# easysearch.yml
cluster.name: "my_cluster"

9. 清理旧连接 #

# 重启可以清理旧连接状态
sudo systemctl restart easysearch

# 或等待超时后自动重连

10. 查看节点日志 #

# 查看连接相关错误日志
grep -i "connect\|disconnect\|node.*not.*connected" /path/to/easysearch/logs/easysearch.log | tail -100

# 查看传输层日志
grep -i "transport.*error" /path/to/easysearch/logs/easysearch.log | tail -50

11. 手动触发重连 #

# 某些操作会触发重新连接
# 如查询集群状态
GET /_cluster/state

# 或查看所有节点
GET /_nodes

12. 检查连接数限制 #

# 查看当前连接数
netstat -an | grep 9300 | wc -l

# 增加文件描述符限制
ulimit -n 65536

13. 排除并重新加入节点 #

# 如果节点持续有问题,可以先排除
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.exclude._name": "problem_node"
  }
}

# 等待分片迁移完成后,重启并重新加入
# 然后恢复设置
PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.exclude._name": null
  }
}

14. 检查 DNS 解析 #

# 测试 DNS 解析
nslookup <node_host>
dig <node_host>

# 使用 IP 地址而非主机名
# 在 easysearch.yml 中配置 discovery.seed_hosts
discovery.seed_hosts: ["192.168.1.10:9300", "192.168.1.11:9300"]

15. 增加连接超时 #

# 增加连接超时配置
transport.tcp.connect_timeout: 60s
transport.tcp.keep_alive: true
transport.tcp.keep_interval: 30s

预防措施 #

  • 保持网络稳定
  • 配置正确的防火墙规则
  • 使用合理的超时设置
  • 监控节点连接状态
  • 实现自动重连机制
  • 使用 DNS 负载均衡
  • 保持节点配置一致
  • 监控网络质量
  • 配置足够的连接数限制
  • 优雅关闭节点