ES集群由节点(Node)构成,节点类型可配置以下:node
conf/elasticsearch.yml: node.master: true/false node.data: true/false
node.master: true --master的候选节点,能够参与选举,在ES的文档中常被称做master-eligible nodeelasticsearch
node.data: true --数据节点,会存储分配在该node上的shard的数据并负责这些shard的写入、查询等。分布式
任何一个集群内的node均可以执行任何请求,其会负责将请求转发给对应的node进行处理,因此当node.master和node.data都为false时,这个节点能够做为一个相似proxy的节点,接受请求并进行转发、结果聚合等。工具
ZenDiscovery是ES本身实现的一套用于节点发现和选主等功能的模块,没有依赖Zookeeper等工具spa
简单来讲,节点发现依赖如下配置:code
conf/elasticsearch.yml: discovery.zen.ping.unicast.hosts: [1.1.1.1, 1.1.1.2, 1.1.1.3]
这个配置能够看做是,在本节点到每一个hosts中的节点创建一条边,当整个集群全部的node造成一个联通图时,全部节点均可以知道集群中有哪些节点,不会造成孤岛。官方推荐这里设置为全部的master-eligible node文档
上面提到,集群中可能会有多个master候选节点,此时就要进行master选举,保证只有一个当选master。若是有多个node当选为master,则集群会出现脑裂,脑裂会破坏数据的一致性,致使集群行为不可控,产生各类非预期的影响。ast
为了不产生脑裂,ES采用了常见的分布式系统思路,保证选举出的master被多数派(quorum)的候选节点承认,以此来保证只有一个master。这个quorum经过如下配置进行配置:集群
conf/elasticsearch.yml: discovery.zen.minimum_master_nodes: 2