默认情况下,es进程会绑定本地回环地址(127.0.0.1),扫描本地上的9300~9305端口,尝试和这些端口的启动的其他es进程通信,然后组成一个集群。
但是对于生产环境,每台节点需要绑定在非回环地址上才可以和其他节点通信,同时使用集群发现机制来和其他节点上的es node通信。
一、discovery集群发现机制
1、集群中的节点相互发现组成集群
2、负责es集群master的选举
es默认的discovery机制是zen discovery机制,zen discovery机制提供了unicast discovery集群发现机制,集群发现时节点间通信依赖的transport module(网络模块和协议)。
3、Ping
这是一个节点使用发现机制去寻找其他节点的进程。同时支持多播和单播方式的发现(也可以组合使用)
二、discovery配置
1、unicast(默认,单播方式)
以discovery.zen.ping.unicast作为前缀:
配置 | 描述 |
---|---|
hosts | 是一个数组的配置,或以逗号分隔的字符串。格式为host:port,或者host[port1-port2] |
需要配置一个主机列表,用于gossip(流言式)通信协议的路由器,如果通过hostname指定,ping的时候会被解析成ip地址。
基于gossip流言式通信协议的unicast集群发现机制:多个节点发现对方并且组成一个集群,需要一批公共节点(unicast node list),其他节点发送请求到公共节点上,通过公共节点交换各自的信息,进而让所有node感知到其他的node存在,进而相互通信,最终组成一个集群。
当一个node于公共节点中的成员通信之后,会收到一份完整的集群状态,状态中包含集群中所有的node。接着该node再与master通信,加入集群中。
公共节点的配置如下:
discovery.zen.ping.unicast.hosts: ["master", "slave1", "slave2"]
2、multicast(不推荐,多播方式)
多播ping发现的方式通过向其他节点发送一个或多个多播请求来实现,存在的节点将会接收并且响应。提供下面的一组配置,以discovery.zen.ping.multicast做前缀:
配置 | 描述 |
---|---|
group | 默认值为224.2.2.4 |
port | 默认值为54328 |
ttl | 多播消息的ttl。默认为3 |
address | 绑定的地址,默认为null,即绑定所有可用的network接口。 |
将elasticsearch.yml 配置multicast.enabled设为false可以禁用多播方式。
网络轻微抖动,有可能导致节点间无法相互发现。
三、es中涉及两种角色
1、master节点
(1)维护集群的状态信息(集群的元信息),当集群状态信息变化了,同步元数据给其他data node节点
(2)node加入集群或者从集群中下线,重新分配shard
(3)创建或者删除索引
2、data节点
负责数据的存储和读写
四、Master选举
1、在ping发现过程中为集群选择一个master,设置discovery.zen.ping_timeout参数(默认3秒),如果网路慢或者堵塞,导致master选举超时,那么此时增加该参数值,确保集群启动的稳定性。
discovery.zen.ping_timeout: 60s
2、完成一个集群的master选举之后,每次新的node加入集群,都会发送join request到master node。设置discovery.zen.join_timeout保证node稳定加入集群,增加join的等待时长。如果一次join不上,默认重试20次
3、master node宕机了,集群中的node会再次进行一次ping过程,选出新的master。
4、ping过程选出的master必须有若干个候选master node节点,如果必须拥有的候选master node个数不满足,则选出来的master被停止。然后重新选举master。
候选master node配置参数:
discovery.zen.minimum_master_nodes
注意:节点在成为主节点之后可以通过将node.master设为false来退出。注意,一旦一个节点被明确设为一个客户端节点(node.client设为true),则不能再成为主节点(node.master会自动设为false)。
五、集群故障探查
1、master探查
master会ping集群中所有其他的node,确保他们是否存活
2、node探查
每个node会ping master node来确保master node是存活的。如果不存活,发起一次master选举
ping_interval:每隔多长时间ping一次node,默认是1秒
ping_timeout:每次ping的timeout等待时长,默认是30秒
ping_retries:一个node被ping多少次都失败,判定node故障。默认是3次
以discovery.zen.fdprefix为前缀:
配置 | 描述 |
---|---|
ping_interval | 节点ping的频率。默认为1秒。 |
ping_timeout | 等待节点响应的超时时间,默认为30秒 |
ping_retries | ping失败/超时重试次数。默认为3. |
六、集群状态的更新
master node 是集群中唯一一个可以对集群状态更新的node。
1、master node每次会处理一个集群的更新事件来更新状态。
2、然后将更新后的状态发布到集群中的其他node。每个node会接受publish message,ack message
3、如果master没有在discovery.zen.commit_timeout指定时间内(默认30秒),从discovery.zen.minimum_master_nodes节点获取ack响应,那么这次集群状态事件会被reject,不会应用。
如果在指定时间内收到了指定数量的ack消息,那么集群状态会被commit,master会向所有node发送commit message。
4、node收到commit message后才将之前收到的集群状态应用到自己node的本地状态中。
5、master会等待所有node再次响应是否更新了本地状态。
在一个等待超时时间内(discovery.zen.publish_timeout),该超时时间即集群状态发布开始计时。
discovery.zen.publish_timeout默认是30秒
6、收到了响应,本次状态事件更新结束。master执行下一个更新事件。
七、master宕机集群做出何种响应
设置discovery.zen.no_master_block参数
1、all
一旦master宕机,所有操作全部拒绝
2、write(默认)
master宕机,所有写操作拒绝,读操作被允许