主节点
主节点的职责主要是和集群操作相关的内容,如常见的删除索引,跟踪哪些节点是集群的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康非常重要。
默认情况下每一个节点都有可能成为主节点。如果没有自己指定主节点的话,node.master:true ,node.data: false ,默认先启动的那个为主节点。索引数据和搜索数据等操作会占用大量的cpu资源,所以为了保证一个集群的稳定性,分离主节点和数据节点是一个比较好的选择。
为了防止数据丢失,配置discovery.zen.minimum_master_nodes设置是至关重要的(默认 为1),每个主节点应该知道形成一个集群的最小数量的主节点的数量。设置这个值的原则是:(master_eligible_nodes/2)+1.这个参数也可以动态设置:
PUT _cluster/settings{ "transisent":{ "discovery.zen.minimum_master_nodes":2 } }
数据节点
数据节点主要是存储索引数据的节点,主要对文档进行增删改查操作。数据节点对cpu,内存,io要求较高,在优化的时候需要监控数据节点的状态,当资源不够的时候,需要在集群中添加新的节点,数据节点的配置为 node.master: false , node.data: true。
客户端节点
客户端节点就是当 node.master: false node.data: fasle的时候,该节点只能处理路由请求,处理搜索,分发索引等操作,从本质上来说该客户端的点表现为智能负载均衡器,这在一个比较大的集群中是非常有用的,它协调主节点和数据节点,可以得到集群的状态,根据集群的状态可以直接路由请求。
注意:
添加太多的客户端节点对集群来说是一种负担,因为主节点必须等待每一个节点集群状态的更新确认,客户端的节点作用不应该被夸大,数据节点也可以起到类似的作用。
路由
路由就是确定文档到具体哪个分配的过程
一个文档,在索引的时候会被存储在单独一个分片上,如何路由,ES根据一个简单的算法决定:shard=hash(routing)%number_of_primary_shards
routing值是一个任意字符串,他默认是_id但也可以自定义。这个routing字符串通过哈希函数生成一个数字,然后除以主切片的数量得到一个余数(remainder),余数的范围永远是0到number_of_primary_shards-1,这个数字就是特定文档所在的分片。
这也解释了为什么主分片的数量只能在创建索引时定义且不能修改,如果主分片的数量在未来改变了,所有先前的路由值就失效了,文档也就永远找不到了。