探索ElasticSearch-ElasticSearch集群的工作原理(七)

1,717 阅读4分钟

前言

ElasticSearch为我们提供了开箱即用的特性。我们不用去关心底层的细节也能够正常使用ElasticSearch来为我们服务。但是,如果要深入理解ElasticSearch仅仅在浅层次的使用层面肯定是远远不够的。如果,你不仅仅满足于简单使用ElasticSearch,那么推荐你继续往下面阅读。

通过本文,你将会解答下面这几个问题。

  • 新的ElasticSearch是如何加入集群的?
  • ElasticSearch集群是如何判断节点是否存活的?
  • 文档是如何分发到某一个分片上面的?

ElasticSearch集群工作原理

节点的发现

当网络中已经存在了一个ElaticSearch的集群时,启动了一个新的ElasticSearch的节点,那么此节点会自动加入到该ElasticSearch的集群中。那么,到底这个节点是怎么加入到集群的呢?

举个例子。现在网络中存在一个master节点和一个data节点的集群,那么当网络中再次启动一个ElasticSearch的节点时,会发生什么呢?如下图所示。

新启动的ElasticSearch会进行一个多播的操作。该节点会向所有在网络中的机器都发送一个ping的请求。可能大部分情况下,该机器都不是ElasticSearch的机器,此时没有相应返回。但是,当发送请求到ElasticSearchmaster节点上面时,会返回相关的响应。一但判断新的ElasticSearch的集群名称是相同的时候,master节点会记录该节点所在的机器,执行相关的数据转移。之后该节点将成为了ElasticSearch集群的一个新的节点。

节点的探活

上面探讨的是新的ElasticSearch节点加入时,集群工作的原理。那么如果正常工作的集群中,有节点出现宕机行为呢?ElasticSearch的集群是怎么感知到有节点宕机,剔除损坏的节点,而且进行数据的转移的呢?

还是上面这个例子,这个时候已经有三个ElasticSearch的节点了。如下图所示。

因为要保证集群的正常工作,所以master节点会定期进行探活工作。具体为每隔一段时间就去ping其他已知的ElaticSearch的节点。

如果这个时候,有一个节点宕机了,那么master节点将没有办法收到响应。此时,master节点将会将原来的副本分片提升为主分片。将整个集群设置为Yellow状态。表示已经有部分数据丢失,但是当前集群还是存在全部的数据,继续提供搜索服务,但是不保证集群的性能等指标。

文档的分发

那么当索引一个新的文档时,ElasticSearch是怎么将该文档分发的呢?

还是上面那个例子。集群中有三个节点,而且一个索引的三个分片均匀分布在三个节点上面。此时要索引一个id为2的新文档,那么会被路由分发到那个节点上面呢?

其实文档的分布遵循这下面这个公式。

shard_num = hash(_routing) % num_primary_shards

那我们假设上面新文档进行hash之后,仍然是2,那么最后会落到shard为2的分片上面,如下图所示。

小结

节点的发现上面讨论是默认的情况下,其实ElasticSearch中可以配置很多其他的发现策略。文档的分发也可以通过_routing字段来制定使用哪一个值来作为hash函数的入参。这些,下次讲解下。

关于写作

以后这里每天都会写一篇文章,题材不限,内容不限,字数不限。尽量把自己每天的思考都放入其中。

如果这篇文章给你带来了一些帮助,可以动动手指点个赞,顺便关注一波就更好了。

如果上面都没有,那么写下读完之后最想说的话?有效的反馈和你的鼓励是对我最大的帮助。

另外打算把博客给重新捡起来了。欢迎大家来访问吃西瓜

我是shane。今天是2019年9月8日。百天写作计划的第四十六天,46/100。