Elasticsearch知识

目录

  • Elasticsearch逻辑设计和物理设计
    • 逻辑设计
    • 物理设计
  • Elasticsearch原理
    • 倒排索引
    • 文档的分析过程
    • 保存文档
    • 搜索文档
    • 写数据的底层原理
      • 数据刷新(fresh)
      • 事务日志的写入
  • ES在大数据量下的性能优化
    • 文件系统缓存优化
    • 数据预热
    • 文档(Document)模型设计
    • 分页性能优化
  • Elasticsearch和DB的差异
  • 参考

Elasticsearch逻辑设计和物理设计

逻辑设计

  • 索引(Index):类似于ES中的一张表,可以通过映射(Mapping)定义索引的结构和设置。
  • 类型(Type):可以对ES的索引进一步做划分。ES 7中已经移除类型,建议一个索引一个类型即可
  • 映射(Mapping):索引结构的定义,包括索引的字段,字段类型,索引的设置等。
  • 文档(Document):索引中的一条记录。

物理设计

Elasticsearch本身是分布式搜索引擎。它的高可用高性能就是通过分片实现的。

  • 主分片:一个索引可以划分成多个主分片,通过将主分片分布到不同的ES节点,从而实现高性能。
  • 副本分片:副本分片和主分片保持数据同步,和主分片不能分布在同一个节点,从而实现主分片的读能力的横向扩展,同时保证主分片不可用时实现故障转移

Elasticsearch原理

倒排索引

每个文档都有唯一的文档ID,一个文档经过分析器变成一组词条

倒排索引:记录词条以及词条出现的文档ID的数据结构,同时倒排索引还会记录词条在文档中出现的频率

文档的分析过程

示例引用自《Elasticsearch实战》。

在文档加入倒排索引之前,需要经过分析器执行分析,转换成一组词条(Term)。

以下是文档“share your experience with Nosql & big data technologies”的分析过程。

  1. 过滤字符:字符过滤器转换个别字符。如:将&转换成and
  2. 切分文本:分词器将文本切分成多个词条
  3. 过滤分词:一组分词过滤器按序转换每个分词。如:小写分词过滤器,将所有的分词转换成小写。
  4. 创建索引:为词条创建倒排索引

保存文档

保存文档是写入主分片,然后,同步到副本分片;搜索文档是根据轮询算法,从主分片副本分片读取。

  1. 通过计算文档ID哈希值,决定文档的目标分片。如果文档的目标分片不在当前节点,将文档转发到目标分片的节点。
  2. 将文档加入倒排索引
  3. 数据同步所有的副本分片,即在副本分片创建倒排索引
  4. 所有的副本分片创建倒排索引成功,节点响应结果给客户端

说明:

  • 协调节点:接收客户端请求/响应客户端的节点,负责数据的请求转发,数据的汇总。

搜索文档

  1. 协调节点使用round-robin随机循环算法,将请求转发到包含完整数据集合的分片集合(包括主分片和副本分片)。

  2. 协调节点收集各节点的返回结果,将结果返回客户端:

    2.1 查询阶段(Query Phase):每个分片将自己的搜索结果的文档ID返回给协调节点,协调节点进行数据的合并排序分页,得到最终结果。

    2.2 拉取阶段(Fetch Phase):协调节点根据文档ID取各个节点上拉取文档数据,最终返回给客户端。
     

写数据的底层原理

Elasticsearch会将数据先写入内存的缓冲区,这时数据并不能用于查询。

  • 刷新数据:缓冲区过大或者默认每隔1秒,将缓冲区中的数据写入段文件(segment file),然后清空缓冲区。数据在缓冲区时是不可见的,变成段文件后,就可以用于查询。段文件不可变,所以每隔一秒ES就会生成一个新的段文件。
  • 事务日志的写入:为了防止数据丢失,ES会实时将数据写入事务日志(tranlog)文件,事务日志文件是在磁盘里的。
  • 数据冲刷:事务日志过大或者默认每隔30分钟,会触发数据冲刷,会将一个提交点(commit point)中的所有段文件(在操作系统缓冲区中的数据)和缓冲区所有的数据写入磁盘,然后,删除事务日志

数据刷新(fresh)

数据刷新负责将缓冲区的数据写入段文件。段文件实际上就Lucene索引。出于性能考虑,数据并不是直接写入磁盘的,而是默认每隔1秒,数据从缓冲区写入系统缓存(OS Cache),变成段文件。之后,就可以通过搜索接口查询到对应的数据了。因为,数据都是在内存中的,所以一旦宕机,数据会丢失。ES通过事务日志保存了数据,所以,能够保证数据的恢复。

ES是接近实时的(Near Real-time)

因为,数据是每1秒刷新的系统缓存,之后才可以访问,所以是接近实时的。

事务日志的写入

为了防止数据丢失,数据在写入缓冲区的同时写入事务日志文件。事务日志同样是先写入系统缓存(OS Cache),然后刷新到磁盘。

index.translog.durability参数- 刷盘策略

index.translog.durability取值:

  • request:每次请求都执行fsync刷盘,ES要等待日志文件刷盘后才返回成功响应。能够保证数据基本不丢失,但是,性能低下,不推荐使用。
  • async:每隔5秒fsync一次translog数据到磁盘,默认值。兼顾数据的持久化和性能。

数据丢失

因为事务日志的默认刷盘方式是每隔5秒fsync一次,所以如果ES宕机,最多可能丢失5秒的数据。

ES在大数据量下的性能优化

文件系统缓存优化

ES中的索引数据会持久化到磁盘中,查询的时候,索引数据从磁盘加载到系统缓存中。

这里的filesystem cache就是上文的OS cache,都是指系统缓存。

ES搜索性能非常依赖于系统缓存,因为系统缓存是在内存中的。如果查询走系统缓存,可以达到几毫秒几百毫秒不等的查询效率;但是,查询走磁盘的话,搜索性能就要达到秒级。

最佳的情况下,机器的内存要达到容纳总数据量的一半。

ES + HBase

为了减少ES的数据量,可以仅在ES索引中保存用于检索的几个字段,将完整的记录保存在HBase中。查询时,先通过ES获取doc id,然后,根据doc id到HBase获取完整的数据。

数据预热

开启定时任务,定时加载一些频繁被访问的热点数据。如:电商系统中,如iphone,后台开个任务,每隔1分钟访问一次相关数据,刷新到系统缓存中。

文档(Document)模型设计

ES尽量不要使用复杂的操作,如:join(关联)/nested/parent-child,对性能影响很大。

可以在Java应用里完成关联,将关联好的数据写入ES中。

分页性能优化

如果要取第100页的10条数据,那么ES的分页流程如下:

  1. 每个分片上的前1000条数据都查到协调节点上,如果有5个分片,那就是5000条数据。
  2. 接着协调节点对这5000条数据做合并、排序
  3. 返回第100页的10条数据。

所以,ES的分页越深,查询越慢。

有两种优化方案:

  1. 不允许深度分页:系统直接不允许深度的分页。
  2. 通过scroll API:类似于游标,或者Java中的迭代器,访问效率可以达到毫秒级。不过只能一页页的访问,不能随机跳到任意一页访问

Elasticsearch和DB的差异

  • Elasticsearch不支持事务,表连接。
  • ES是个自带分布式属性的,高可用、可扩展、高性能,传统关系型数据库存在单机的性能瓶颈
  • ES单个字段的数据类型丰富,除了核心的数据类型,还支持多字段,对象类型、数组类型等。

参考

部分图片引用自:advanced-Java

  • 《Elasticsearch实战》
  • Elasticsearch如何做到亿级数据查询毫秒级返回的:Elasticsearch如何做到亿级数据查询毫秒级返回的? - 掘金
  • 互联网 Java 工程师进阶知识完全扫盲 - Doocs 技术社区
  • 互联网 Java 工程师进阶知识完全扫盲 - Doocs 技术社区

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/167011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据分享】2023年我国省市县三级的瞪羚企业数量(免费获取/Excel/Shp格式)

企业是经济活动的参与主体。一个城市的企业数量决定了这个城市的经济发展水平!比如一个城市的金融企业较多,那这个城市的金融产业肯定比较发达;一个城市的制造业企业较多,那这个城市的制造业肯定比较发达。 之前我们给大家分享了…

《opencv实用探索·二》根据RGB的像素排列来理解图像深度、像素深度和位深度

通常对于RGB图像主要分为RGB16,RGB24和RGB32。RGB16从高位到低位的排列为R->G->B,RGB24和RGB32从高位到低位的排列为B->G->R。 RGB16: 16 位为一个存储单元(一个像素),来存储一个RGB像素;因为人眼对绿色比…

社区物联网云服务架构设计

文章目录 1 摘要2 架构图2.1 社区物联网云服务网络拓扑图2.2 社区物联网云服务通讯流程图2.3 社区远程开锁功能流程图 3 应用场景 1 摘要 随着社区管理越来越智能化,社区物联网升级与改造的市场空间也越来越大。社区物联网包含楼宇对讲、门禁门锁、通道闸等等设备系…

Netty 模型理解

参考文章 1 参考文章 2 官网API文档 Reactor模型 Netty模型 Netty主要基于主从Reactor多线程模型进行了一定的修改,该模型包括以下几个组件: MainReactor(主Reactor):负责处理客户端的连接请求。它监听服务器上的端口…

中电金信:守【政】创新,探路保险数字化转型“新范式”

11月23日,CIIP2023中国保险科技创新合作大会在京举办。大会汇集保险科技领域行业专家、学者、国内外头部险企及保险科技公司负责人等各界人士,立足保险行业高质量发展和创新驱动理念,寻找行业数字化转型新动能、新视角,为保险科技…

python中range函数的用法

range() 是Python的一个内置函数。语法格式为:range(start, stop, step) start是初始值,stop是最终值,step是步长。range()函数仅适用于整数,所有参数都必须是整数。步长值可以为正数或负数,不得为零。使用range函数时…

如何去掉图片水印不伤原图?无痕去水印教程分享!

如何去掉图片水印不伤原图?在电商广告设计和营销领域,水印已经成为一种常见的版权保护手段。不过,水印也给淘宝商家带来了一些困扰。那么如何去掉图片水印还能不伤原图呢,接下来,将分享简单好用的无痕去水印教程&#…

Rust UI开发(二):iced中如何为窗口添加icon图标

注:此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库,用于为rust语言程序构建UI界面。 想要了解如何构建简单窗口的可以看本系列的第一篇: Rust UI开发:使用iced构建UI时,如何在界面显示中文字符 本篇是系…

VMware 虚拟机设置静态IP

1.桥接模式:无线网卡虚拟机可以桥接的,Vmware0是虚拟机默认进入的虚拟网络,打开虚拟网络编辑器把Vmware0桥接到具体的无线网卡上,再打开网卡设置选择桥接模式即可。 2、.NAT模式下 :window下VMnet8: IPv4 地址 . . . …

高级IO—select

高级IO—select 文章目录 高级IO—selectIO的概念 五种IO模型阻塞IO非阻塞IO信号驱动IOIO多路转接异步IO I/O多路转接之select IO的概念 通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出。输入是系统接收的信号或数据,输出则是从其发送的信号或…

Jmeter接口测试——使用教程(下)

前言 上一篇我给大家讲了jmeter的基本介绍跟参数化和jmeter脚本及jmeter断言,今天让我们继续往下看,学习一下jmeter新的知识点。 一、Jmeter关联 我们知道断言是从返回结果中检查有没有预期的值,现在有一个问题,有一个购买商品…

【学习笔记】GameFramework的非官方实例TowerDefense-GameFramework-Demo的流程

一、从游戏开始到打开一个Menu GameStart.unity GameEntry.Builtin.cs ProcedureComponent.cs GameStart.unity->GameFramework->Builtin->Procedure ProcedureLaunch.cs ProcedureSplash.cs ProcedurePreload.cs ProcedureLoadingScene.cs DataTables/Scene.txt Pro…

小学语文老师重点工作

小学语文老师是学生在语言学习过程中的关键引导者,他们的主要职责是帮助学生建立正确的语言基础,培养良好的阅读习惯,并提高学生的语文素养。以下是小学语文老师的一些重点工作。 一、教授语言知识 小学语文老师首要的任务是教授学生语言知识…

《DApp开发:开启全新数字时代篇章》

随着区块链技术的日益成熟,去中心化应用(DApp)逐渐成为数字世界的新焦点。在这个充满无限可能的全新领域,DApp开发为创新者们提供了开启数字时代新篇章的钥匙。 一、DApp:区块链创新成果 DApp是建立在区块链技术基础之…

C/C++ 开发SCM服务管理组件

SCM(Service Control Manager)服务管理器是 Windows 操作系统中的一个关键组件,负责管理系统服务的启动、停止和配置。服务是一种在后台运行的应用程序,可以在系统启动时自动启动,也可以由用户或其他应用程序手动启动。…

chromium通信系统-mojo系统(一)-ipcz系统基本概念

ipcz 是chromium的跨进程通信系统。z可能是代表zero,表示0拷贝通信。 chromium的文档是非常丰富的,关于ipcz最重要的一篇官方文档是IPCZ。 关于ipcz本篇文章主要的目的是通过源代码去分析它的实现。再进入分析前我们先对官方文档做一个总结,…

Java计算两个时间的相差年,日,小时,分,秒

主函数 public static int dateDiff(char flag, Calendar calSrc, Calendar calDes) {long millisDiff getMillis(calSrc) - getMillis(calDes);if (flag y) {return (calSrc.get(Calendar.YEAR) - calDes.get(Calendar.YEAR));}if (flag d) {return (int) (millisDiff / D…

Unity RenderFeature架构分析

自定义RenderFeature接口流程 URP内部ScriptableRenderPass分析 public、protected属性 renderPassEvent :渲染事件发生的时刻colorAttachments :渲染的颜色纹理列表 m_ColorAttachmentscolorAttachment :m_ColorAttachments[0];depthAttac…

【网络奇幻之旅】那年我与大数据的邂逅

🌺个人主页:Dawn黎明开始 🎀系列专栏:网络奇幻之旅 ⭐每日一句:循梦而行,向阳而生 📢欢迎大家:关注🔍点赞👍评论📝收藏⭐️ 文章目录 &#x1f4…

windows远程linux或远程虚拟机连接拒绝问题排查

当我们使用MobaXterm远程连接时,报错如下: 1.首先检查该ubuntu防火墙是否关闭,先将防火墙关闭。 1.检查防火墙状态 sudo ufw status 2.开启防火墙 sudo ufw enable 3.关闭防火墙 sudo ufw disable 2.关闭防火墙后,使用ping命令相…