启动一个 ES 实例就是一个节点,节点加入集群是通过配置文件中设置相同的 cluste.name使用发现机制 而实现的,集群是由一个或者多个拥有相同 cluster.name 配置的节点组成,ES集群中也会选举一个节点成为主节点,主节点它的职责是维护全局集群状态,在节点加入或离开集群的时候重新分配分片,并不涉及到数据操作
路由一个文档到一个分片🎉
当索引一个文档的时候,文档会被存储到一个主分片中,Elasticsearch 根据hard = hash(routing) % number_of_primary_shards 来确定文档具体会分配到哪一个分片,即通过hash函数模分片数量,routing默认为_id值
问:为什么我们要在创建索引的时候就确定好主分片的数量 并且永远不会改变这个数量答:因为如果数量变化了,那么所有之前路由的值都会无效,文档也再也找不到了。
主分片和副分片交互🎉
索引与删除一个文档
阶段1:客户端发送了一个索引或者删除的请求给node 1。
阶段2:node 1经过请求中文档的 _id 值判断出该文档应该被存储在shard 0 这个分片中,而且node 1知道shard 0的primary shard位于node 3这个节点上。所以node 1会把这个请求转发到node 3。
阶段3:node 3在shard 0 的primary shard上执行请求。若是请求执行成功,它node 3将并行地将该请求发给shard 0的其他全部replica shard上,也就是存在于node 1和node 2中的replica shard。若是全部的replica shard都成功地执行了请求,那么将会向node 3回复一个成功确认,当node 3收到了全部replica shard的确认信息后,则最后向用户返回一个Success的消息。
更新一个文档
阶段1:客户端向node 1发送一个文档更新的请求。排序
阶段2:一样的node 1经过请求中文档的 _id 值判断出该文档应该被存储在shard 0 这个分片中,而且node 1知道shard 0的primary shard位于node 3这个节点上。所以node 1会把这个请求转发到node 3。
阶段3:node 3从文档所在的primary shard中获取到它的JSON文件,并修改其中的_source中的内容,以后再从新索引该文档到其primary shard中。
阶段4:若是node 3成功地更新了文档,node 3将会把文档新的版本并行地发给其他全部的replica shard所在node中。这些node也一样从新索引新版本的文档,执行后则向node 3确认成功,当node 3接收到全部的成功确认以后,再向客户端发送一个更新成功的信息。
获取文档
阶段2:节点使用文档的 _id 来确定文档属于分片 0 。分片 0 的副本分片存在于所有的三个节点上。 在这种情况下,它将请求转发到 Node 2 。
阶段3:Node 2 将文档返回给 Node 1 ,然后将文档返回给客户端。
在处理读取请求时,协调结点在每次请求的时候都会通过轮询所有的副本分片来达到负载均衡。
一致性问题
consistency,即一致性。在默认设置下,即使仅仅是在试图执行一个_写_操作之前,主分片都会要求 必须要有规定数量(quorum)(或者换种说法,也即必须要有大多数)的分片副本处于活跃可用状态,consistency有以下几个参数:
- one 只要主分片状态 ok 就允许执行_写_操作
- all 必须要主分片和所有副本分片的状态没问题才允许执行_写_操作
- quorum 大多数的分片副本状态没问题就允许执行_写_操作