为什么这个错误发生 #
node_not_connected_exception 表示尝试向未连接的节点发送消息。这是一个传输层异常,当节点间没有建立连接时发生。
这个错误可能由以下原因引起:
- 节点未启动:目标节点未运行
- 网络连接断开:节点间的网络连接中断
- 连接超时:连接建立超时导致断开
- 节点离线:目标节点已离开集群
- 防火墙阻止:防火墙阻止了节点间通信
- 配置错误:节点地址或端口配置错误
- 节点重启:目标节点重启导致连接断开
- 连接数过多:达到最大连接数限制
- 网络分区:网络分区导致节点无法通信
- 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 负载均衡
- 保持节点配置一致
- 监控网络质量
- 配置足够的连接数限制
- 优雅关闭节点





