这篇文章上次修改于 366 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

Elastic是如何选举Master节点的

  • 当一个节点(Node)启动时,它会尝试加入已知的集群,并与其他节点进行通信。
  • 在 Elasticsearch 中,任何节点都有资格成为主节点,但通常会根据配置文件中的设置和节点的性能指标来确定是否具备成为主节点的条件。
  • Zen Discovery 是 Elasticsearch 内置的一种发现机制。每个节点都与其他节点进行通信,互相了解集群中的节点信息。这样,每个节点都能知道其他节点的存在。
  • 当一个节点认为当前的主节点不可用时,它会发起一轮选举。这个节点将向其他节点发送选举请求,其他节点会投票支持或反对这个节点成为主节点。选举中的关键是节点要获得超过半数的投票。如果一个节点获得了足够多的支持,它就会成为新的主节点。
  • 一旦选举完成,新的主节点将广播通知整个集群。其他节点会更新自己的状态,将新的主节点标记为集群的主要协调节点。
  • 如果当前的主节点发生故障,其他节点会通过 Zen Discovery 发起新一轮的选举,选择一个新的主节点来接管集群的管理任务。

Elasticsearch中的节点(比如共20个),其中的10个选了一个master,另外10个选了另一个master,怎么办?

  • 这个时候出现了主节点选择脑裂问题,在Elastic中,通常是通过节点唯一标识的字典顺序作为选举的优先级,字典排序靠前的优先作为master节点。但是在架构设计中,通常我们会设置可参与主节点选举的节点数为奇数个,这样就能保证在选举中出现脑裂的问题。

细描述一下Elasticsearch创建索引文档的过程。

  • 协调节点默认使用文档ID参与计算(也支持通过routing),以便为路由提供合适的分片。 shard = hash(document_id) % (num_of_primary_shards)
  • 当分片所在的节点接收到来自协调节点的请求后,会将请求写入到Memory Buffer,然后定时(默认是每隔1秒)写入到Filesystem Cache,这个从Momery Buffer到Filesystem   Cache的过程就叫做refresh;
  • 当然在某些情况下,存在Momery Buffer和Filesystem Cache的数据可能会丢失,ES是通过translog的机制来保证数据的可靠性的。其实现机制是接收到请求后,同时也会写入到translog中,当Filesystem cache中的数据写入到磁盘中时,才会清除掉,这个过程叫做flush;
  • 在flush过程中,内存中的缓冲将被清除,内容被写入一个新段,段的fsync将创建一个新的提交点,并将内容刷新到磁盘,旧的translog将被删除并开始一个新的translog。
  • flush触发的时机是定时触发(默认30分钟)或者translog变得太大(默认为512M)时;

详细描述一下Elasticsearch更新和删除文档的过程

  • 磁盘上的每个段都有一个相应的.del文件。当删除请求发送后,文档并没有真的被删除,而是在.del文件中被标记为删除。该文档依然能匹配查询,但是会在结果中被过滤掉。当段合并时,在.del文件中被标记为删除的文档将不会被写入新段。

  • 在新的文档被创建时,Elasticsearch会为该文档指定一个版本号,当执行更新时,旧版本的文档在.del文件中被标记为删除,新版本的文档被索引到一个新段。旧版本的文档依然能匹配查询,但是会在结果中被过滤掉。

详细描述一下Elasticsearch搜索的过程

  • 搜索被执行成一个两阶段过程,我们称之为 Query Then Fetch;
  • 在初始查询阶段时,查询会广播到索引中每一个分片拷贝(主分片或者副本分片)。 每个分片在本地执行搜索并构建一个匹配文档的大小为 from + size 的优先队列。PS:在搜索的时候是会查询Filesystem Cache的,但是有部分数据还在Memory Buffer,所以搜索是近实时的。
  • 每个分片返回各自优先队列中 所有文档的 ID 和排序值 给协调节点,它合并这些值到自己的优先队列中来产生一个全局排序后的结果列表。
  • 接下来就是 取回阶段,协调节点辨别出哪些文档需要被取回并向相关的分片提交多个 GET 请求。每个分片加载并 丰富 文档,如果有需要的话,接着返回文档给协调节点。一旦所有的文档都被取回了,协调节点返回结果给客户端。
  • 补充:Query Then Fetch的搜索类型在文档相关性打分的时候参考的是本分片的数据,这样在文档数量较少的时候可能不够准确,DFS Query Then Fetch增加了一个预查询的处理,询问Term和Document frequency,这个评分更准确,但是性能会变差。

倒排索引

  • 在搜索引擎中,每个文档都有一个对应的文档 ID,文档内容被表示为一系列关键词的集合。例如,文档 1 经过分词,提取了 20 个关键词,每个关键词都会记录它在文档中出现的次数和出现位置。那么,倒排索引就是关键词到文档 ID 的映射,每个关键词都对应着一系列的文件,这些文件中都出现了关键词。

中文分词器

  • IK Analyzer:免费开源的java分词器,目前比较流行的中文分词器之一,简单、稳定,想要特别好的效果,需要自行维护词库,支持自定义词典。
  • hanlp: 基于自然处理语言,分词准确度高

hanlp分词器安装


elasticsearch-plugin install file:///你的文件目录/elasticsearch-analysis-hanlp-7.5.1.zip