说说 Elasticsearch 的物理设计

一个拥有 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 就会以负载均衡的方式,把分片分发到所有的节点。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值