原文地址: http://blog.csdn.net/cnweike/article/details/39083089, 致谢
所谓脑裂问题(类似于精神分裂),就是同一个集群中的不同节点,对于集群的状态有了不一样的理解。
今天,Elasticsearch集群出现了查询极端缓慢的情况,通过以下命令查看集群状态:
curl -XGET 'es-1:9200/_cluster/health'
发现,集群的总体状态是red,本来9个节点的集群,在结果中只显示了4个;但是,将请求发向不同的节点之后,我却发现即使是总体状态是red的,但是可用的节点数量却不一致。
正常情况下,集群中的所有的节点,应该对集群中master的选择是一致的,这样获得的状态信息也应该是一致的,不一致的状态信息,说明不同的节点对master节点的选择出现了异常——也就是所谓的脑裂问题。这样的脑裂状态直接让节点失去了集群的正确状态,导致集群不能正常工作。
可能导致的原因:
1. 网络:由于是内网通信,网络通信问题造成某些节点认为master死掉,而另选master的可能性较小;进而检查Ganglia集群监控,也没有发现异常的内网流量,故此原因可以排除。
2. 节点负载:由于master节点与data节点都是混合在一起的,所以当工作节点的负载较大(确实也较大)时,导致对应的ES实例停止响应,而这台服务器如果正充当着master节点的身份,那么一部分节点就会认为这个master节点失效了,故重新选举新的节点,这时就出现了脑裂;同时由于data节点上ES进程占用的内存较大,较大规模的内存回收操作也能造成ES进程失去响应。所以,这个原因的可能性应该是最大的。
应对问题的办法:
1. 对应于上面的分析,推测出原因应该是由于节点负载导致了master进程停止响应,继而导致了部分节点对于master的选择出现了分歧。为此,一个直观的解决方案便是将master节点与data节点分离。为此,我们添加了三台服务器进入ES集群,不过它们的角色只是master节点,不担任存储和搜索的角色,故它们是相对轻量级的进程。可以通过以下配置来限制其角色:
- node.master: true
- node.data: false
当然,其它的节点就不能再担任master了,把上面的配置反过来即可。这样就做到了将master节点与data节点分离。当然,为了使新加入的节点快速确定master位置,可以将data节点的默认的master发现方式有multicast修改为unicast:
- discovery.zen.ping.multicast.enabled: false
- discovery.zen.ping.unicast.hosts: ["master1", "master2", "master3"]
2. 还有两个直观的参数可以减缓脑裂问题的出现:
discovery.zen.ping_timeout(默认值是3秒):默认情况下,一个节点会认为,如果master节点在3秒之内没有应答,那么这个节点就是死掉了,而增加这个值,会增加节点等待响应的时间,从一定程度上会减少误判。
discovery.zen.minimum_master_nodes(默认是1):这个参数控制的是,一个节点需要看到的具有master节点资格的最小数量,然后才能在集群中做操作。官方的推荐值是(N/2)+1,其中N是具有master资格的节点的数量(我们的情况是3,因此这个参数设置为2,但对于只有2个节点的情况,设置为2就有些问题了,一个节点DOWN掉后,你肯定连不上2台服务器了,这点需要注意)。
以上的解决方法只能是减缓这种现象的发生,并没有从根本上杜绝,但是毕竟是有帮助的,如果大家有其它更好的建议,欢迎探讨。
补充:
ES如果使用zookeeper来实现分布式状态一致性, 或许会更好些, 期待官方可以尽快出一个整合版本.
相关推荐
下面我们就来深入探讨如何搭建一个基于Elasticsearch的集群环境,并实现一些高级功能,比如head插件的安装与使用,以及ES用户认证的创建。 首先,为了安装Elasticsearch,需要准备以下软件环境: - Java环境:...
es高可用 防止集群脑裂问题 防止单点故障问题 Master节点故障 Data节点故障 节点可迁移 集群的横向动态扩容
在Windows环境下搭建Elasticsearch集群,虽然相对Linux环境复杂一些,但仍然可行,且具有一定的灵活性。下面将详细介绍如何在Windows上构建一个一主两从的Elasticsearch集群。 首先,我们需要下载Elasticsearch的...
通过这样的配置,我们能构建一个包含一个主节点和两个数据节点的Elasticsearch集群,同时提供了一个可视化界面`es-head`。运行`docker-compose up -d`命令即可启动所有服务,`-d`参数表示后台运行。在实际环境中,...
Elasticsearch主备集群搭建与配置详解 Elasticsearch 是一款功能强大的开源搜索引擎,广泛应用于日志分析、全文检索和实时数据分析等领域。构建一个主备集群可以提高数据的可用性和可靠性,确保在主节点出现问题时...
本文档总结了 34 道 Elasticsearch 面试题和答案,涵盖了 Elasticsearch 的基础概念、索引架构、集群管理、性能优化、倒排索引、master 选举等多个方面。 一、Elasticsearch 基础概念 1. 什么是 Elasticsearch?...
主要问题在于Elasticsearch集群的数据一致性。在正常的集群运行状态下,所有节点对于集群中master节点的选择应该是一致的,但在网络不稳定时,就可能出现所谓的“脑裂”现象,即不同的节点对master节点的选择出现...
回答中需要讨论ElasticSearch的master选举机制,例如只有候选主节点(master:true)的节点才能成为主节点,min_master_nodes的目的是防止脑裂,选举流程的核心入口为findMaster等。 这些问题涵盖了ElasticSearch的...
### 11、什么是ElasticSearch脑裂? ### 12、你能否列出与 Elasticsearch 有关的主要可用字段数据类型? ### 13、详细描述一下 Elasticsearch 索引文档的过程。 ### 14、elasticsearch 分布式架构原理 ### 15、...
Elasticsearch 集群安装在 CentOS 7.4 上涉及多个步骤,包括服务器准备、基础配置、JDK 安装、以及 Elasticsearch 集群的详细配置。以下是详细的安装和配置过程: 1. **服务器准备**: - 你需要准备三台运行 ...
### 15、elasticsearch 了解多少,说说你们公司 es 的集群架构,索引数据大小,分片有多少,以及一些调优手段 。 ### 16、REST API在 Elasticsearch 方面有哪些优势? ### 17、请解释一下 Elasticsearch 中聚合? ##...
本文档总结了 Elasticsearch 相关的面试问题,涵盖了集群管理、索引文档、搜索过程、聚合实现等多方面的知识点。 一、Elasticsearch 集群管理 Elasticsearch 的集群管理是通过 ZenDiscovery 模块实现的,该模块...
**四、Elasticsearch集群扩容和容灾** 1. **集群健康**:检查集群状态,确保所有节点正常运行。 2. **主分片和复制分片**:主分片是数据的原始副本,复制分片是主分片的备份,用于提高可用性和容错性。 3. **扩容**...
- 在每个节点上启动Elasticsearch集群: `./elasticsearch`。 #### 三、Elasticsearch简单命令操作 - **CURL工具介绍**: Curl是一个命令行工具,用于发送HTTP请求,支持GET、POST等多种方法。 - 示例命令: 创建...
Elasticsearch面试题涵盖了许多关键...面试中,对这些知识点的深入理解和实践经验将展示出你对Elasticsearch的掌握程度和解决实际问题的能力。对于大型ES集群的管理,不仅需要理论知识,还需要实践经验来应对各种挑战。
为了避免脑裂现象,即集群分裂为两个或多个独立的集群,Elasticsearch 配置了 `discovery.zen.minimum_master_nodes` 参数,设定至少需要多少 Master 节点才能构成有效集群,以防止网络分区导致的不一致。...
- **问题背景**:当Elasticsearch集群重启时,可能会遇到Shard恢复时间过长的问题,这会影响到系统的可用性和性能。 - **解决策略**: - 使用`index.recovery.initial_shards`参数来指定初始恢复的分片数量。 - ...
在正常运行时,集群中只有一个Master节点,以避免脑裂问题。数据节点则负责数据存储和检索。 **2. 节点发现** ES使用ZenDiscovery机制进行节点间的发现和通信。配置`discovery.zen.ping.unicast.hosts`来指定可连接...