本章,我将讲解如何搭建一个Elasticsearch集群。一般来说,一个Elasticsearch集群至少建议有4~5个节点。我会在本章中,通过虚拟机部署一个4节点的ES集群,每个节点都是2核4G的机器。
这里思考下,每台机器上启动一个ES进程,那么怎么让多台机器上的ES进程之间互相发现对方,然后组成一个ES集群呢?这就涉及Elasticsearch的集群发现机制。
一、zen discovery集群发现
默认情况下,Elasticsearch进程启动后会绑定在127.0.0.1
上,然后扫描本机上的9300-9305
端口,尝试跟那些端口上启动的其他ES进程通信,组成一个集群。这对于在本机上搭建ES集群是很方便的,但是对于生产环境是不行的。在生产环境中的多台机器上部署ES集群,就涉及到了 zen discovery 机制。
Elasticsearch是一种p2p分布式架构,集群中的每个节点都可以直接跟其它节点进行通信。在Elasticsearch集群中,有两种角色: master node 和 data node ,一个集群只有一个master node,其它都是data node。
事实上Elasticsearch集群中,有三种节点:master node、master eligible node、data node。master eligible node表示master候选节点,ES会从这些候选节点中选举出一个作为master node,其它master eligible node只是在master node故障的时候有接替他的资格,但是还是作为data node去使用。
1.1 master node
master node的责任就是 负责维护集群状态信息(cluster state),也就是集群元数据信息 。当cluster state发生变化时,master node会将最新的cluster state推送给集群中所有的data node,所以每一个data node都有一份完整的cluster state。
1.2 data node
集群中,除了master node以外的节点,都是data node。data node就是负责数据的读写。
1.3 unicast
zen discovery底层实际上是采用了unicast discovery集群发现机制,unicast discovery会提供一个种子node作为中转路由节点。简单来说,如果要让多个节点发现对方并组成一个集群,那么就得有一个中间的公共节点,然后不同的节点就发送请求到这些公共节点,接着通过公共节点交换各自的信息,让所有的node感知到其他的node存在,并且进行通信,最后组成一个集群。这其实就是基于 gossip流言通信协议 的unicast集群发现机制。
unicast要求配置一个主机列表,用来作为gossip通信协议的路由器。这些机器如果通过hostname来指定,那么在ping的时候会被解析为ip地址。unicast discovery机制最重要的两个配置如下:
- discovery.zen.ping.unicast.hosts:用逗号分割的主机列表,比如["host1", "host2"];
- hosts.resolve_timeout:hostname被DNS解析为ip地址的timeout时长。
当一个node与unicast node list中的一个成员通信之后,就会接收到一份完整的集群状态,里面包含集群中所有的node。
1.4 master选举
每个node都会通过ping跟其它node通信,在这个过程中,ES集群会自动完成Master选举。在完成集群的master选举之后,如果有新的node加入集群,都会发送一个join request到master node。如果master node宕机,那么集群中的node会再次进行ping过程,并且选举出一个新的master。
以下几个参数在Master选举中非常重要:
- discovery.zen.master_election.ignore_non_master_pings:如果设为true,会强制区分master候选节点,如果node的
node.master
设置为了false,还来发送ping请求参与master选举,那么这些node会被忽略掉,因为他们没有资格参与; - discovery.zen.minimum_master_nodes:用于设置对于一个新选举的master,要求必须有多少个master候选node去连接这个新选举的master,如果这些要求没有满足,那么master node就会被停止,然后重新选举新master。这个参数必须设置为候选node的quorum数量。一般避免只有两个候选node,因为2的quorum还是2,在这种情况下,任何一个候选节点宕机,集群就无法正常运作了;
- discovery.zen.ping_timeout:用来设置ping超时时间,默认3s。如果因为网络慢或拥塞,导致master选举超时,那么可以增加这个参数值,确保集群启动的稳定性。
1.5 故障发现
Elasticsearch有两种集群故障发现机制:
- 第一种是通过master进行的,master会ping集群中所有的其他node,确保它们是否是存活着的;
- 第二种是每个node都会去ping master node来确保master node是存活的,否则就会发起一个选举过程。
有下面三个参数用来配置集群故障发现:
- ping_interval: 每隔多长时间ping一次node,默认1s;
- ping_timeout: 每次ping的timeout时长,默认是30s;
- ping_retries: 如果一个node被ping多少次都失败了,就会认为node故障,默认是3次。
二、集群部署
2.1 机器配置
虚拟机如何安装我就不赘述了,读者可以采用VMware+Centos安装。假设我们已经安装好了4台Linux虚拟机,并配置了hostname分别为elasticsearch01
、elasticsearch02
、elasticsearch03
、elasticsearch04
,也配置好了各种运行环境,比如JRE环境。
2.2 ES节点部署
首先下载Elasticsearch的安装包并解压,包内目录说明如下:
bin:存放es的一些可执行脚本,比如用于启动es进程的脚本,以及用于安装插件的elasticsearch-plugin脚本
conf:存放es的配置文件,比如elasticsearch.yml
data:存放es的数据文件,就是每个索引的shard的数据文件
logs:存放es的日志文件
plugins:存放es的插件
script:存放一些脚本文件
关于master node和data node设置,可以通过以下参数:
# 如果都置为true,表示该节点为master eligible node
node.master: true
node.data: false
关于master node和data node的数量分配,一般有如下建议:
- 如果是小集群(node数量小于10),那就所有的node作为master eligible node;
- 如果大集群,建议单独拆分master node和data node。
三、总结
本章,我主要介绍了Elasticsearch集群的discover机制,下一章,我将对集群部署中的重要参数做讲解。
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。