热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从0到1理解ElasticSearch文档写入和检索原理

1、elasticsearch基础概念节点(Node):物理概念,一个运行的elasticsearch实例,一般是一台机器上一个进程,用来存储数据并参与集群的索引和搜索。可以分为以

文章目录[隐藏]

  • 1、elasticsearch基础概念
  • 2、elasticsearch集群架构
    • 2.1、分层部署
    • 2.2、混合部署
  • 3、Elasticsearch文档写入原理
    • 3.1、文档写入流程
    • 3.2、文档存储
      • 3.2.1、文档存储结构
      • 3.2.2、倒排索引存储
      • 3.2.3、segment合并
  • 4、Elasticsearch检索原理
  • 5、参考资料:

1、elasticsearch基础概念
  1. 节点(Node): 物理概念,一个运行的elasticsearch实例,一般是一台机器上一个进程,用来存储数据并参与集群的索引和搜索。可以分为以下几种类型:
  • 专有主节点(Master Node):为确保一个集群的稳定,分离主节点和数据节点,主要职责是和集群相关操作的内容,如创建和删除索引,跟踪哪些节点是集群的一部分,并决定哪些分片分配给相关节点。在大规模集群中,开启专有Master Node可增强集群的稳定性。
  • 协调节点(Coordinator Node):该节点只处理路由请求,处理搜索,分发索引文件,相当于一个只能的负载均衡器,协调节点将请求分发给存储数据的Data Node。每个Data Node在本地执行请求,并将请求结果返回给Cooridinator Node 。协调节点收集完数据后,将每个节点的数据合并为单个全局结果。
  • 数据节点(Data Node):存储索引数据的节点,主要对文档进行增删改查、聚合等操作。数据节点对cpu、内存、io要求比较高,在优化的时候需要监控数据节点的状态,当资源不够的时候,需要再集群中添加新的节点。
  1. 索引(Index):逻辑概念,索引是相同特性的文档集合(相当于关系型数据库的database),包括配置信息mapping和倒排正排数据文件,一个索引的数据文件可能会分布于一台机器,也有可能分布于多台机器。
  2. 类型(Type):一个类型通常是一个Index的一个逻辑分区,允许一个Index下存储不同类型的文档(相当于关系型数据库中table),在6.x版本,只允许一个Index包含一个Type,在7.x以后这个概念将会被删除。
  3. 文档(Document):一个文档是可以被索引的基础信息单元(相当于关系型数据库中一行数据)。文档可以用Json格式来表示。
  4. 映射(Mapping):模式映射(相当于关系型数据库的schema)用于定义索引结构。
  5. 字段(Field):字段是Elasticsearch里面的最小单元,相当于数据库中的某一列,类似于Json里面的一个key。
  6. 分片(Shard):为了支持更大量的数据,索引一般会按某个维度分成多个部分,每个部分就是一个分片,分片会被Node管理。一个Node一般会管理多个分片,但是为了可靠性和可用性,同一个索引的分片尽量会分布在不同的Node上。分片有两种,主分片(Primary Shard)和副本分片(Replica Shard)。分片的数量只能在索引创建的时候指定,创建后不能更改,每个分片的大小建议是小于50G,所以设计分片的提前预估数据量来设置合适的分片。
  7. 副本(Replica):同一个分片(Shard)的备份数据,一个分片可能有0个或者多个副本,这些副本中的数据保证强一致性或者最终一致性。

2、elasticsearch集群架构

2.1、分层部署

通过配置隔离Master Node和Data Node

#master node 配置
node.name: master
node.master: true
node.data: false
#data node 配置
node.name: node1
node.master: false
node.data: true
分层部署图

2.2、混合部署

Master Node也是Data Node,通过集群选举出Master Node,选举策略 discovery.zen.minimum_master_nodes = (master_eligible_nodes / 2) + 1

混合部署图

3、Elasticsearch文档写入原理

3.1、文档写入流程

文档写入流程图
  1. 假设选中了Node2(DataNode) 发送写入Index1索引的请求,此时的Node2可以被称为协调节点(Coordinating Node);
  2. Coordinaing Node会根据算法(shard id的计算公式:shard_num = hash(_routing) % num_primary_shards,hash函数是murmur3Hash,_routing默认是文档ID(_id))进行路由,请求到对应的DataNode,假设对应的主分片为P1;
  3. 请求数据写入P1;
  4. 数据同步到R1;
  5. 返回数据写入结果。

3.2、文档存储

3.2.1、文档存储结构

每个Elasticsearch分片都是一个Lucene索引(Index),每个Lucene都包含了多个段(segment),每个segment有多个文档(Document)以及维护了一份词(terms)与文档Id关系的倒排索引(Inverted Index)数据。文档存储结构如下图所示:

文档存储结构图

3.2.2、倒排索引存储

倒排索引存储过程图
  • 从 in-memory buffer 到 disk page cache 的过程,对应 ElasticSearch 的 refresh() API,默认 1s 触发一次;
  • 从 disk page cache 到 disk 的过程,则对应 ElasticSearch 的 flush() API,默认 30min 触发一次;
  • translog 自己从 disk page cache 到 disk 的持久化,是 5s 一次

3.2.3、segment合并

segment小文件合并过程图
  • 自动refresh流程每秒会创建一个新的段,每一个段都会消耗文件句柄;
  • 小的段被合并到大的段,然后这些大的段再被合并到更大的段(小于5G);
  • 新的段被打开用来搜索,老的段被删除。

4、Elasticsearch检索原理
文档检索过程图
  • 假如选择了Node3,此时Node3称为coordinating node(协调节点)
  • 协调节点(Coordinating Node)将查询请求广播到每一个数据节点,这些数据节点的分片会处理该查询请求。
  • 每个分片进行数据查询,将符合条件的数据放在一个优先队列中,并将这些数据的文档ID、节点信息、分片信息返回给协调节点。
  • 协调节点将所有的结果进行汇总,并进行全局排序。
  • 协调节点向包含这些文档ID的分片发送get请求,对应的分片将文档数据返回给协调节点,最后协调节点将数据返回给客户端。

5、参考资料:

ElasticSearch 索引的存储机制推演:https://www.yuque.com/terencexie/geekartt/es-index-store

ElasticSearch架构原理入门篇:https://juejin.cn/post/6994789245227368479

从Elasticsearch来看分布式系统架构设计:https://zhuanlan.zhihu.com/p/33375126

elastic:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/elasticsearch-intro.html


推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
author-avatar
平凡岁月ss
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有