说说 Elasticsearch 的物理设计

作者 : 开心源码 本文共2025个字,预计阅读时间需要6分钟 发布时间: 2022-05-13 共158人阅读

一个拥有 3 个节点的 Elasticsearch 集群,默认情况下,每个索引由 5 个主要分片组成,而每个主要分片又有一个副本,所以一共加起来是 10 个分片。请看图 1:

Elasticsearch 通过副本分片可以提高服务可靠性与搜索性能。另外,分片也是 Elastic search 将数据从一个节点迁移到另一个节点的最小单位。

1 创立集群

一个节点是一个 Elasticsearch 实例。在服务器启动 Elasticsearch 之后,就创立了一个节点。通过启动多个 Elasticsearch 进程,即可以在同一台服务器上创立多个节点。

多个节点可以加入同一个集群,这样数据就能够在多个节点上传播,从而提升性能。而且,每一个主分片,在不同的节点上都有对应的副本分片,这样即便其中任何一个节点宕机,Elasticsearch 依赖可以提供服务,提高了可用性。

对于使用 Elasticsearch 的应用程序而言,不用关心集群中究竟有几个节点。应用只要要连接到集群中的任一节点,就可提供搜索服务。

1.1 索引文档

默认情况下,索引某一篇文档,系统会首先根据文档 ID 的散列值选择一个主分片,并将该文档发送到该主分片。有可能主分片在另一个节点,比方图 2 中的节点 B 的主分片 1。对应用来说,这一点是透明的。接着,该文档被发送到该主分片的所有副本分片进行索引,比方该文档会从图 2 中的节点 B 的主分片 1 发送到节点 A 的副分片 1,实现数据同步。

数据同步功能使得副本分片也可以响应后续搜索请求,而且副本分片还可以在原有主分片异常时自动更新为主分片,提高搜索服务可用性。

1.2 搜索索引

当搜索一个索引时, Easticsearch 需要在该索引的完整分片集合中进行查找 ( 即图 3 中节点 A 的所有主、副分片 ),由于有数据同步机制,所以主分片和副本分片中的文档是相同的。而且 Elasticsearch 会对搜索请求在索引的主、副分片中,进行负载均衡。

实际情况是,Elasticsearch 使用 round-robin 轮询机制来选择可用的分片 ( 主分片或者副本分片 ) ,并将搜索请求转发到相应的分片(图 6)。而后 Elasticsearch 会从这些分片收集结果,接着对这些结果进行聚集,最后将聚集后的结果返回给搜索应用(图 7)。

2 分片

Elasticsearch 所能解决的最小单元就是分片。一个分片实际是 Lucene 的索引,即一份包含倒排索引的文件目录。倒排结构,使得不用扫描所有文档的情况下,就能找到所需要的文档。

一个 Elasticsearch 索引被分为多个分片。由于 Elasticsearch 是使用 Apache Lucene 作为核心的程序库实现数据索引和搜索功能。所以 Elasticsearch 的一个分片就是一个 Lucene 的索引,也就是说ー个Elasticsearch 索引实际是由多个 Lucene 索引组成的。

在图 4 中,可以看到一个分片实际就是一个 Lucene 索引。它是一个倒排索引,它默认存储原始文档内容,以及能够帮助搜索的词条字典,每个词条包含词频信息。

由于词条字典包含词条与文档之间的映射关系,所以在搜索时, Elasticsearch 会根据这个词条字典快速地识别出所匹配的文档。

词条字典还包含词频信息,这样 Elasticsearch 即可以快速地获取某篇文档中某个词条出现的次数。词频用于计算结果的相关性得分。比方搜索 “追光者”,这个词在文档 id1 中出现的次数最多。那么在 TF-IDF 排序算法中,Elasticsearch 会给它最高得分,让文档 id1 排在结果列表的最前面。

TF-IDF 是一种用于信息检索与数据挖掘的常用加权技术。TF (Term Frequency) 表示词频;而 IDF(Inverse Document Frequency)表示逆文本频率指数。字词的重要性会随着它在文档中出现的次数(词频)成正比添加,但同时会随着它在语料库中出现的频率(逆文本频率指数,浅显来讲,就是这些词太常见,比方 “的地得”)成反比下降。

Elasticsearch 索引可以由一个或者多个主分片以及零个或者多个副本分片所组成。也就是说,通过配置,可以没有副本分片(不推荐),也可以一个主分片配置多个副本分片,比方图 5。

由于在运行时,只有副本分片可以在运行时增加或者移除,所以在创立索引之前,我们必需决定主分片的数量。注意: 过少的分片将限制可扩展性,但过多的分片会影响性能。

3 分发分片

最简单的 Elasticsearch 集群只有一个节点,即一台机器只运行着一个 Elasticsearch 进程。

集群的扩展方式分为两种:

  1. 垂直扩展 – 为节点添加更多硬件资源。比方为虚拟机分配更多解决器,或者是为物理机添加更多的内存。但单个节点不能无限添加资源,而且还需要从经济成本出发来做考量。
  2. 水平扩展 – 加入更多节点。请求就会被分发到这些节点上,即工作由这些节点分摊了。

不论集群是怎么的一种扩展方式,只需存在多个节点,Elasticsearch 就会以负载均衡的方式,把分片分发到所有的节点。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 说说 Elasticsearch 的物理设计

发表回复