解决Elasticsearch集群 master_not_discovered_exception 异常

错误描述

查看集群健康返回以下错误:

{
	"error": {
		"root_cause": [{
			"type": "master_not_discovered_exception",
			"reason": null
		}],
		"type": "master_not_discovered_exception",
		"reason": null
	},
	"status": 503
}

我通过docker命令在三台机器上分别启动es应用后,单个节点可以通过网络访问,但是他们彼此之间却显示无法通信,导致选举失败,发现不了主节点。

问题排查

查看es日志发现:

java.net.NoRouteToHostException: No route to host (Host unreachable)

重要的关键属性是network.publish_host。它是节点向其他节点发布的地址,作为其他节点加入集群时要到达的地址。

可能是防火墙的原因:

service iptables status #查看防火墙状态

如果没关的话使用以下命令:

systemctl stop firewalldsy
stemctl disable firewalld

关闭后发现还是不行,这里发下我发生错误时节点的es配置:

#跨域配置
http.cors.enabled: true
http.cors.allow-origin: "*"
#集群名称
cluster.name: elasticsearch-cluster
#节点名称
node.name: node-1
#是不是有资格竞选主节点
node.master: true
#是否存储数据
node.data: true
#最大集群节点数
node.max_local_storage_nodes: 3
#网络地址
network.host: 0.0.0.0
#端口
http.port: 9200
#内部节点之间沟通端口
transport.tcp.port: 9300
#es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["192.168.2.90","192.168.2.91","192.168.2.92"]
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["node-1", "node-2","node-3"]

直到我在加入了以下配置后成功解决了该问题:

#设置当前节点与其他节点交互的IP地址
network.publish_host: 192.168.2.90

正确结果

{
  "cluster_name" : "elasticsearch-cluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 3,
  "active_shards" : 6,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}
原理分析

network.bind_host设置允许控制不同的网络组件将绑定的主机。默认情况下,绑定主机将是anyLocalAddress(通常为0.0.0.0或者:: 0)。默认情况下network.host将设置network.bind_hostnetwork.publish_host为相同的值。

内部ip(eth1)用于让elasticsearch的不同节点相互通信,发现等,而外部ip地址(eth0)是我的web应用程序在另一个网络中发出请求的地址。bind_host(我的例子中的ip,与默认值0.0.0.0相同,用于连接所有接口)是elasticsearch侦听的地方,publish_host(本例中为internal ip)是elasticsearch与其他集群组件进行通信的地方。

这样,我们就可以从bind_host地址访问ES群集,而elasticsearch使用publish_host地址与群集通信。

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: master_not_discovered_exceptionElasticsearch中的一个错误,通常表示节点无法连接到主节点。这可能是由于网络问题、主节点故障或其他原因导致的。要解决此问题,您可以尝试重新启动节点、检查网络连接或查看Elasticsearch日志以获取更多信息。 ### 回答2: master_not_discovered_exception是指Elasticsearch集群中的节点无法与主节点连接。这个错误一般发生在以下情况下: 1. 主节点关闭或失去联网状态,从而导致集群变成没有主节点; 2. 新的节点加入集群,但是没有指定正确的主节点; 3. 网络中出现问题,导致集群中的节点无法访问主节点。 要解决这个问题,我们需要采取以下步骤: 1. 确认主节点是否在线或是否正常工作。可以通过命令"curl -X GET 'http://主节点IP地址:9200/_cat/nodes?v'"来检查主节点是否启动。 2. 确认新加入的节点配置是否正确,主节点的IP地址是否正确配置在新节点的配置文件中。 3. 确认网络是否正常,节点之间是否能够相互访问。可以在各个节点上通过ping命令来测试网络连通性。 如果问题依然存在,我们可以尝试重启所有集群节点和主节点,并重新配置集群。如果有必要,可以使用命令"curl -X DELETE 'http://localhost:9200/_cluster/health?wait_for_status=yellow'"来终止当前的集群会话,并重启整个集群。 总之,master_not_discovered_exception通常是由于网络或配置问题导致的,我们需要仔细检查集群中的每个节点的配置和网络设置,才能解决这个问题。 ### 回答3: master_not_discovered_exceptionElasticsearch 中一个常见的错误,它通常出现在集群中的某个节点无法与集群的主节点建立连接时。这种错误会导致节点无法加入集群或无法执行查询和索引操作。 造成 master_not_discovered_exception 的原因可能有多种。常见的原因包括: 1. 网络问题:主节点和其他节点之间的网络连接可能出现问题。这可能是由于网络延迟、网络拥塞或网络中断等原因导致的。如果主节点和其他节点之间无法建立连接,Elasticsearch 会抛出 master_not_discovered_exception 错误。 2. 主节点宕机或重启:如果主节点宕机或重启,其他节点可能无法连接到主节点。这可能导致节点无法加入集群,并提示 master_not_discovered_exception 错误。 3. 索引或数据丢失:如果在主节点宕机或重启时,存在未复制到备份节点的索引或数据时,集群中的节点可能无法找到主节点上的索引或数据。这将导致节点无法执行查询或索引操作,并提示 master_not_discovered_exception 错误。 解决 master_not_discovered_exception 错误的方法取决于错误的原因。如果是网络问题,需要检查网络连接并确保节点之间可以相互访问。如果是主节点宕机或重启问题,可以尝试重新启动主节点以恢复集群。如果出现索引或数据丢失的情况,可能需要从备份恢复数据。 总的来说,要避免 master_not_discovered_exception 错误,需要保持集群的稳定性和高可用性,并定期备份数据以避免数据丢失。同时,需要及时排查故障,找到错误的根本原因并加以修复。这样可以确保 Elasticsearch 集群的稳定性和可靠性,提高系统的性能和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值