AWS EC2搭建Elasticsearch多节点集群遇master_not_discovered_exception故障
问题:AWS EC2上Elasticsearch多节点集群健康检查失败及节点访问控制确认
场景与问题
- 基于AWS EC2搭建3节点Elasticsearch集群:1台master节点,2台data节点
- 初始状态下,master和data节点的公网IP均可被外部访问。为限制访问范围,修改data节点安全组入站规则,仅允许master节点的公网IP访问9200-9300端口
- 修改后异常:访问
master公网IP:9200可正常响应,但访问master公网IP:9200/_cluster/health时返回如下错误:
{ "error": { "root_cause": [ { "type": "master_not_discovered_exception", "reason": null } ], "type": "master_not_discovered_exception", "reason": null }, "status": 503 }
各节点配置
Data节点2(node-2)
cluster.name: Cluster-Presentation node.name: node-2 network.host: 172.31.34.104 discovery.seed_hosts:["172.31.34.104","172.31.40.191","172.31.38.85"] cluster.initial_master_nodes: ["172.31.38.85"] xpack.security.enabled: false
Data节点1(node-3)
cluster.name: Cluster-Presentation node.name: node-3 network.host: 172.31.40.191 discovery.seed_hosts: ["172.31.34.104","172.31.40.191","172.31.38.85"] cluster.initial_master_nodes: ["172.31.38.85"] xpack.security.enabled: false
Master节点(node-1)
cluster.name: Cluster-Presentation node.name: node-1 network.host: 172.31.38.85 discovery.seed_hosts: ["172.31.34.104","172.31.40.191","172.31.38.85"] cluster.initial_master_nodes: ["172.31.38.85"] xpack.security.enabled: false
需求
- 修复
master_not_discovered_exception错误,恢复集群健康检查正常 - 确认data节点是否应仅允许master节点访问,禁止外部直接访问
分析与解决方案
1. 错误原因
你修改data节点安全组时,将允许访问的来源设为master节点的公网IP,但Elasticsearch集群内部节点通信是通过私有IP进行的。data节点现在拒绝了master节点用私有IP发起的9300端口(节点间通信专用端口)请求,导致master无法发现data节点,集群节点失联,触发master_not_discovered_exception。
2. 修复步骤
- 调整data节点安全组入站规则:将允许访问9200-9300端口的来源改为master节点的私有IP(172.31.38.85),而非公网IP
- 同时确保所有节点的安全组都允许集群内其他节点的私有IP访问9300端口(节点间通信必须依赖该端口)
- 重启所有Elasticsearch节点,等待集群重新完成节点发现与连接
3. Data节点访问控制确认
是的,data节点确实不应直接暴露给外部访问:
- 外部请求应统一通过master节点(或专门的client节点)转发到data节点
- 限制data节点的访问源为集群内节点的私有IP,可有效降低攻击面,避免外部直接操作数据节点
- 如果需要对外提供服务,建议在master节点前配置负载均衡,或将master节点配置为兼具client角色,作为对外访问入口
内容的提问来源于stack exchange,提问作者Athavan T
相关产品推荐
相关产品推荐

