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

Elasticsearch 简介 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。 elasticSearch 的使用场景 1、在海量数据前提下,对数据进行检索。比如:京东,淘宝等电商项目 课程目标: 1. 了解企业级搜索引擎 2. 安装elasticsearch {linux 系统} 3. 安装kibana并利用kibana对Elasticsearch 索引中的数据进行搜索、查看、交互操作 4. 项目实战{ELK} 课程目录: 01 课程介绍 02 elasticsearch 简介 03 elasticsearch 使用场景 04 安装elasticsearch 之前先安装jdk 05 安装elasticsearch 06 测试elasticsearch是否安装成功  07 安装kibana 08 elasticsearch 基本认识 以及添加索引和删除索引 09 elasticsearch 添加查询数据 10 elasticsearch 修改删除数据 11 elasticsearch 有条件的查询 12 分词子属性fuzzy查询 13 elasticsearch 过滤使用 14 elasticsearch 排序与分页 15 elasticsearch 如何查询指定的字段 16 elasticsearch 高亮显示 17 elasticsearch 聚合 18 elasticsearch mapping 概念 19 elasticsearch 的中文词库 20 elasticsearch 中文词库安装测试 21 elasticsearch 中文词库的使用案例 22 elasticsearch 自定义词库配置 23 安装nginx 配置中文词库 24 测试elasticsearch 自定义中文词库 25 搭建项目父工程 26 搭建项目bean-interface-common 27 搭建search 的service web 项目 28 测试项目是否能与elasticsearch联通 29 创建数据库并搭建首页 30 数据上传功能的实现类完成 31 数据上传控制器完成 32 dubbo 介绍以及安装zookeeper 33 将数据从mysql 上传到elasticsearch 中 34 elasticsearch查询功能分析 35 编写业务需求的dsl 语句 36 编写输入参数返回结果集的实体类 37 实现类编写 38 编写实现类中dsl 语句 39 返回集结果转换 40 结果测试 41 测试通过输入查询条件并将数据显示到页面
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页