elasticsearch zen discovery

本文深入探讨了Elasticsearch中Zen发现机制的工作原理,包括如何在集群中实现节点间的相互ping、选举新的master节点、配置感知线程、集群状态更新策略以及无master节点阻塞时的操作策略。

描述

zen是es默认的发现机制,2.0以上的版本提供了ping和unicast(单播)两个模块,1.x的版本还提供了 multicast,以前用1.7的版本es只需要配相同的集群名就可以组成一个集群了,现在必须给一个discovery.zen.ping.unicast.hosts才能发现其它节点来组成集群。

相互ping

当master节点停止或者遇到问题之后集群节点会相互ping并且产生一个新的master节点,这种相互ping会阻止一个节点和master节点出现网络闪断后,就认为master停止的情况,因为它还可以从其他节点获取master节点是否是活跃的

配置

配置 discovery.zen.minimum_master_nodes 用来表组成一个集群最少需要的合格master节点数即(node.master:true)

默认感知

es 跑了两个默认的感知线程,一个是master用来感知集群中的成员节点是否存在,另一个是成员节点感知master节点的存在(如果不存在,初始化一个选举进程)

集群状态更新

master节点是唯一能更新集群状态的节点,它发布状态的更改给成员节点,成员节点收到通知,更改之后,回复消息给master节点,master会有一个等待超时(discovery.zen.publish_timeout ),之后处理在队列中的下一个更新

无master阻塞

当集群不能产生一个master的时候,discovery.zen.no_master_block 用来配置操作的策略,它有两个配置

  1. all (节点上的所有读写操作都被拒绝,这也包括了集群api状态的读写操作)

  2. write(写操作会被拒绝,读操作能成功)

discovery.zen.no_master_block 配置的设置不影响节点基本的api,如节点信息和节点统计api

### Elasticsearch服务在配置`discovery.zen.ping.unicast.hosts`后无法启动的解决方案 Elasticsearch在配置了`discovery.zen.ping.unicast.hosts`参数后,如果服务无法启动,可能是由于以下几个原因导致:网络连接问题、节点间通信失败、配置错误或版本兼容性问题[^1]。以下是针对此问题的详细分析和解决方法。 #### 1. 检查配置文件中的语法和格式 确保`elasticsearch.yml`文件中`discovery.zen.ping.unicast.hosts`的值是正确的数组格式,并且每个主机名或IP地址都用双引号括起来。例如: ```yaml discovery.zen.ping.unicast.hosts: ["es_node1", "es_node2"] ``` 如果使用的是IP地址,则应写为: ```yaml discovery.zen.ping.unicast.hosts: ["192.168.1.10:9300", "192.168.1.11:9300"] ``` 注意,默认情况下,Elasticsearch集群通信端口为`9300`,因此需要明确指定端口号以避免潜在问题[^2]。 #### 2. 网络连通性验证 确认`es_node1`和`es_node2`之间的网络连接是否正常。可以使用以下命令测试两台机器之间的连通性: ```bash ping es_node1 ping es_node2 ``` 此外,还需要确保`9300`端口在所有节点上是开放的,并且防火墙规则允许跨节点的通信。可以通过以下命令检查端口状态: ```bash telnet es_node1 9300 telnet es_node2 9300 ``` #### 3. 集群名称一致性 确保所有节点的`cluster.name`配置相同。如果集群名称不一致,节点将无法相互发现并加入同一个集群。检查`elasticsearch.yml`文件中的`cluster.name`设置: ```yaml cluster.name: my_cluster_name ``` 所有节点的`cluster.name`必须完全匹配[^3]。 #### 4. 日志分析 查看Elasticsearch的日志文件(通常位于`/var/log/elasticsearch/`或`$ES_HOME/logs/`),寻找与启动失败相关的错误信息。常见的错误包括: - 节点间无法建立连接。 - 配置参数错误。 - 版本不兼容。 #### 5. 版本兼容性 确保`es_node1`和`es_node2`运行的是相同的Elasticsearch版本。不同版本的节点可能因协议差异而无法正常通信。可以通过以下命令检查版本: ```bash curl -X GET "http://es_node1:9200/" curl -X GET "http://es_node2:9200/" ``` #### 6. 启动顺序 在多节点环境中,建议先启动一个主节点(通常是`es_node1`),然后再启动其他节点。这样可以减少节点间竞争选举主节点的时间,从而提高启动成功率[^4]。 #### 7. 配置示例 以下是一个完整的`elasticsearch.yml`配置示例: ```yaml cluster.name: my_cluster_name node.name: es_node1 network.host: 0.0.0.0 discovery.zen.ping.unicast.hosts: ["es_node1", "es_node2"] ``` ### 总结 通过检查配置文件的语法、网络连通性、集群名称一致性、日志分析、版本兼容性和启动顺序,可以有效解决Elasticsearch服务在配置`discovery.zen.ping.unicast.hosts`后无法启动的问题[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值