【ElasticSearch系列-07】ES的开发场景和索引分片的设置及优化

ElasticSearch系列整体栏目


内容链接地址
【一】ElasticSearch下载和安装https://zhenghuisheng.blog.csdn.net/article/details/129260827
【二】ElasticSearch概念和基本操作https://blog.csdn.net/zhenghuishengq/article/details/134121631
【三】ElasticSearch的高级查询Query DSLhttps://blog.csdn.net/zhenghuishengq/article/details/134159587
【四】ElasticSearch的聚合查询操作https://blog.csdn.net/zhenghuishengq/article/details/134159587
【五】SpringBoot整合elasticSearchhttps://blog.csdn.net/zhenghuishengq/article/details/134212200
【六】Es集群架构的搭建以及集群的核心概念https://blog.csdn.net/zhenghuishengq/article/details/134258577
【七】ES的开发场景和索引分片的设置及优化https://blog.csdn.net/zhenghuishengq/article/details/134302130

ES的开发场景和索引分片的设置及优化

  • 一,ES的开发场景和索引分片的设置及优化
    • 1,ES应用场景
      • 1.1,信息搜索库
      • 1.2,时间序列库
    • 2,分片的设计和管理
      • 2.1,单个分片
      • 2.2,多个分片
        • 2.2.1,算分不准原因
      • 2.3,分片的设计
        • 2.3.1,分片类型选择以及优缺点
        • 2.3.2,主分片设计与案例
        • 2.3.3,副本分片设计
    • 3,ElasticSearch底层读写原理
      • 3.1,数据的写入
        • 3.1.1,数据写入的流程
        • 3.2.2,数据存储文件形式
      • 3.2,数据的读取
        • 3.2.1,根据id查询
        • 3.2.2,根据关键字查询
      • 3.3,数据读写优化

一,ES的开发场景和索引分片的设置及优化

在上一篇中,讲解了Es集群的搭建,以及一些索引,分片,副本等的概念,接下来这篇主要讲解在实际开发中,ElasticSearch的一些应用场景

1,ES应用场景

在实际开发中,es主要有两种应用场景:一种是基于数据量大,但是数据增长量慢的应用场景,如订单查询,商品查询等;一种是基于数据量大,数据增长量快的应用场景,如每天都会有大量的日志信息,通过时间序列对日志进行存储和查询等。

1.1,信息搜索库

这就是第一种情况,针对于数据量大,但是增长量慢的应用场景。如在一个商城app中,其商品的信息、订单的信息等,在数据加入到es之后,可以选择通过商品的类型或者名称进行分片存储,在查询时只需要根据商品类型或者名称查询对应的分片结点即可

这种场景更加需要考虑的是搜索的相关度,如涉及算分,权重这些,与时间的范围无关。

在这里插入图片描述

如上图中搜索框中输入的家电,下面会展示所有的家电信息,品牌等,那么在es中做索引分片时,就可以根据品牌进行分片存储等。需要注意的是,单个分片最好不要数据量太大,如不要超过20g,如果数据量太多,可以通过增加副本分片的数量,从而提高吞吐量

如果是单个索引的数据量太大,可以通过reindex进行索引拆分,可以根据某种枚举字段进行拆分,如订单可以根据区域进行拆分,商品根据品牌进行拆分等。

1.2,时间序列库

根据时间序列进行统计,容日志的查询等,一般每条数据都会有一条时间戳,并且每条文档基本上都不会更新,主要是为了查询,因此对数据的写入要求会比较高。如每天有几万条数据插入到es数据库中

在创建索引时,可以直接根据时间进行创建索引,如每天或者每周或者每月的方式进行划分,如每天有上万条日志信息,那么就可以直接根据时间进行创建索引,每天晚上可以开启一个定时任务去创建索引,随后今天一天的数据全部存储在这个索引中,后续作统计时,只需要定位到这个索引片即可

PUT /logs_2023-11-07

也可以直接选择使用这个Date Math表达式,其语法如下

<static_name{date_math_expr{date_format|time_zone}}>

使用这个Date Math的官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.16/date-math-index-names.html

如官方文档给的实例,显示的结果就是创建今天的日期的索引,前缀就是my-index

# PUT /<my-index-{now/d}>
PUT /%3Cmy-index-%7Bnow%2Fd%7D%3E

在这里插入图片描述

上面的百分号在官网中也有对应的值,只需要根据这些值进行修改即可

在这里插入图片描述

官网提供的转义表达式有这些,如now/d等等,从<、-、{、}、/ 等一一的按照上面的值进行替换即可

在这里插入图片描述

如果是需要查询最近的数据,也可以采用冷热分离的架构,将最近几天的数据加入到hot热点数据中;并且在存储日志这种信息是,丢失几条数据也是没事的,因此在设置副本的数量时,可以直接设置为0

如果前端是要固定的查询一个索引,那么可以通过别名的方式去新增索引,先将原索引删除,然后将创建的新索引的别名设置为原索引的名称

2,分片的设计和管理

2.1,单个分片

在es7开始,在创建一个索引时,默认是只有一个分片和一个副本的。如下例子,本人就是使用的7.7的版本,在创建一个索引之后,其默认的分片数和副本数就是1。因为直接使用单个分片,可以避免很多问题,如算分问题,聚合问题

"number_of_shards" : "1",
"number_of_replicas" : "1",

在这里插入图片描述

但是单个分片也存在一些缺点,如在集群中,单个分片不能很好的实现水平扩展,除非要手动reindex增加分片,将数据进行拆分

2.2,多个分片

多个分片和单个分片的优缺点刚好相反,多个分片是有利于实现节点的水平扩展的,在性能上会高于单分片的索引。但是多分片也会出现一些问题,如算分不准,聚合查询等问题

2.2.1,算分不准原因

当数据量大的时候,一般数据都是均分分布在各个节点的,因此不会出现这种算分不准的情况,一般是会出现在数据量小的情况,如每个分片的数据量都比较小,举个例子

先创建一个索引,并设置分片数为3

PUT /zhs_db
{
  "settings":{
    "number_of_shards" : "3"
  }
}

随后往文档中插入数据,这里不使用_bulk批量插入,因为批量插入会在一个分片中。往里面插入三条数据,根据hash规则,那么三条数据就会分别落在三个分片中,一个分片中一条数据

POST /zhs_db/_doc/1?routing=zhenghuisheng
{
 "content":"Cross Cluster elasticsearch Search"
}

POST /zhs_db/_doc/2?routing=zhenghuisheng2
{
 "content":"elasticsearch Search"
}

POST /zhs_db/_doc/3?routing=zhenghuisheng3
{
 "content":"elasticsearch"
}

随后进行match查询这个content,并且value为elasticSearch

GET /zhs_db/_search
{
  "query": {
    "match": {
      "content": "elasticsearch"
    }
  }
}

在执行上面的查询之后,其结果如下,本来是所占文档比率越高,算分的值越大,就是id为3的占百分百,因此按理来说是算分最高的,然而实际在查询出来的是id为1的算分最高,实际id为1的算分是最低的,因此综合来看,这个算分就是不准的

在这里插入图片描述

主要原因是每个分片都有自己打分的标准,每个分片都是基于自己分片上的数据的相关度来进行计算的,其最主要原因是数据量少,因此如果是数据量少的情况下,还是建议设置这个分片数为1

当然在数据量小的时候,也有对应的解决方案,就是使用DFS Query Then Fetch ,其原理就是将所有的数据全部搜索出来,然后统一放在一个协调结点中,通过协调节点再进行一次完整的算分。但是在实际开发中,这种方式并不推荐使用,因为其性能相对是较低的

GET /zhs_db/_search?search_type=dfs_query_then_fetch
{
  "query": {
    "match": {
      "content": "elasticsearch"
    }
  }
}

2.3,分片的设计

2.3.1,分片类型选择以及优缺点

上面说了单个分片和多个分片使用的优缺点,接下来谈谈在实际开发中,是如何设计这个分片的。

往往来说,分片的数量是需要大于结点数的,那么这样基本都是优选考虑多分片数据,这样有利于在新增数据节点时,可以进行自动的分配,并且如果一个索引的数据分布在不同的节点,这样就可以并行的执行,并且在数据写入时,也可以分散到多个机器。

但是分片过多,也会带来一些副作用,因为每一个分片就是一个Lucene索引,其实就是一个进程,如果过多的分片,就会占用机器的资源,导致带来额外的开销,并且所有的分片都是需要Master主节点进行维护和管理,这样就会导致master主节点承受更大的负担,因此分片需要控制在10W之内

2.3.2,主分片设计与案例

在实际开发中,日志类的数据只需要设置主分片数,但是不需要设置副本数,而其他的数据增长量慢的需要设置主分片数和副本数,接下来谈谈主分片数需要如何设计

  • 当数据为搜索类时,如商品信息类,那么单个分片不要超过20个G的数据
  • 当数据为日志类时,如订单类、流水类,那么单个分片不要超过50G的数据

搜索类设计:如根据品牌进行设计,一个品牌对应一个索引,一个索引对应一个主分片和一个副本分片

日志类设计:每天创建一个日志索引,每个日志索引创建10个分片,一个月需要创建300个分片,不需要副本

2.3.3,副本分片设计

一般在实际开发中,副本都是设置为0或者1,日志类数据不需要副本,可以直接设置为0,搜索类数据一般设置为1,副本就是类似于主分片的一个从分片,有主分片中的全部数据。

副本分片数据就是数据在住分片中插入完成之后,再在副本分片中再保存一份,如果副本分片数过多,那么在存入副本数据时就会花费更多的时间,在写性能上会有一定的影响

但是副本分片也有好处,首先就是可以提高查询的效率,并且可以防止数据丢失,保证数据的安全性,因此副本分片是需要的,但是也不能设计太大,日志类除外。并且可以通过不断的调整副本分片的个数,来是整个系统的查询率和响应率达到最佳状态

为了避免分配的不均衡,分片数的调整如下:

  • index.routing.allocation.total_shards_per_node:表示在索引中每个Node的最大分片数量,-1表示无穷大
  • cluster.routing.allocation.total_shards_per_node:表示在集群中每个Node结点最大分片的数量,-1表示无穷多个

3,ElasticSearch底层读写原理

上面谈到了分片和副本的一些概念和设计,接下来通过es写入数据的流程来分析,分片和副本的功能到底是什么。

3.1,数据的写入

3.1.1,数据写入的流程

在前面谈到了通过不同的数据节点实现不同的功能,写入请求是需要先通过协调节点,在转发到data数据节点存储,随后先将数据存储到主分片上面,然后再将数据同步到副本分片上面,其具体的流程实现如下

  • 1,在用户发起写请求之后,首先该请求会先到协调节点
  • 2,协调结点接收到这个请求之后,会通过route路由的方式将请求转发给对应的节点
  • 3,随后会将数据同步到该节点的主分片上,如果有副本分片,则将数据给副本分片也同步一份
  • 4,当master主分片和副本分片都同步完数据之后,协调节点再给客户端一个存入成功的响应
3.2.2,数据存储文件形式

segment file :在mysql中,mysql是以页为单位存储在磁盘中,在ElasticSearch中,是通过这个Segment file的方式存储,每一个文件的本质就是一个倒排索引,一个大的分片中,都是由各个小的Segment file文件合并成的。文件过多时会自动合并各个小文件,也可以手动强制合并,在合并时会将被标记删除的文档给物理删除

commit point :当将某个文档删除时,ElasticSearch不会立马删除,而是先通过这个commit point文件做一个标志,每个文件中都有.del的一个标志,如果设置了被删除的状态,那么在查询数据时,默认会将这个文档给过滤掉。这个也有点类似于mysql的行格式,里面有字段用于标记是否被删除

translog文件 :类似于mysql的redolog文件,防止因为宕机造成数据丢失,用于做数据恢复

os cache :缓存,每隔一s会进行一个刷盘操作,也可以通过refresh强制刷盘

3.2,数据的读取

数据的查询主要有两种方式,一种是直接根据id进行查询,一种是直接根据关键字进行匹配

3.2.1,根据id查询

根据id查询的方式是比较简单的,首先也是先由客户端发起请求,随后将请求发送到协调者结点,协调者节点通过这个id进行hash取模定位到Data数据节点,数据节点上有主分片和副本分片,这两种分片都可以进行数据的查询,会通过随机的方式选择副本还在主分片,如下面的P0和R0,会在这两个分片中,选择一个分片作为数据查询的依据,随后将响应结果返回给协调者分片分片,最后再通过协调者分片将数据返回给用户

当然如果副本分片和主分片之间,也可以做一个负载均衡,来提高整个系统的高性能

在这里插入图片描述

3.2.2,根据关键字查询

其流程大致和上面的一样,先将请求给协调者节点,随后定位到Data数据节点,但是在查询数据再到返回数据的过程中,需要经历过两个阶段的操作。

因为es底层使用的是倒排索引,因此第一步是先将需要查询带有关键字的数据全部查询出来,随后携带那一行数据的id,再通过id查询,这就是相当于要查询两次,用mysql来解释,就是通过一个加了索引的字段进行数据查询,随后将携带的id进行回表操作

  • query phase:第一步就是这个,先将全部的数据返回给协调者节点,再协调者节点中进行过滤、排序等操作
  • fetch phase:第二步就是根据第一步所确定的结果,通过数据的id再进行一次查询工作将数据返回

3.3,数据读写优化

上面了解了读写的底层原理,在知道原理之后,那么就可以根据原理进行优化操作。

读取数据优化

如在读取数据时,减少这种通配符查询、前缀查询等需要全文检索的查询;如不需要算分的字段可以使用精确查询;使用Filter Context,利用内部的缓存机制,减少不必要的算分;结合profile、explain分析查询慢的问题等

写入数据优化

在写入数据时,可以使用批量插入数据来增加系统的吞吐量,或者使用多线程的方式插入数据;

分片优化

除了在查询优化,也可以在分片上做优化,数据量不大的情况可以使用单分片,数据量大使用多分片时,需要防止分片过多带来的开销。对于这种时间序列的查询,可以强制的force merge,将不需要的文档删除,从而减少这种segment的数量。

除了上面的几中优化之外,还可以对服务端硬件设备等进行优化,还可以调节这个refresh的频率进行优化、调整translog写入磁盘的频率进行调整等。如下面的这个模板,设置refresh刷新时间,translog刷盘等

DELETE myindex
PUT myindex
{
  "settings": {
    "index": {
      "refresh_interval": "30s",  #30s一次refresh
      "number_of_shards": "2"
    },
    "routing": {
      "allocation": {
        "total_shards_per_node": "3"  #控制分片,避免数据热点
      }
    },
    "translog": {
      "sync_interval": "30s",
      "durability": "async"    #降低translog落盘频率
    },
    "number_of_replicas": 0
  },
  "mappings": {
    "dynamic": false,     #避免不必要的字段索引,必要时可以通过update by query
索引必要的字段
    "properties": {}
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高德地图 web js端 出现 INVALID_USER_SCODE 10008 MD5安全码未通过验证

图片意思就是在引入 高德js和css 链接前 引入 <script type"text/javascript">window._AMapSecurityConfig {securityJsCode:您申请的安全密钥,} </script> 到这里就完美结束了

【JavaEE初阶】 TCP三次握手四次挥手(超详细版)

文章目录 &#x1f334;三次握手四次挥手总览&#x1f6eb;三次握手&#xff08;建立连接&#xff09;&#x1f6a9;为什么要三次握手&#x1f4cc;解决彼此双发彼此认同的问题&#x1f4cc;验证双方的接听发送能力是否正常 &#x1f6a9;建立连接阶段涉及到的两个重要状态: &a…

blender动画制作软件拓扑全流程

拓扑在三维动画制作中至关重要&#xff0c;原因如下&#xff1a; 1. 动画变形&#xff1a; 自然形变&#xff1a; 良好的拓扑结构能够支持角色或物体在动画中的自然形变&#xff0c;例如关节弯曲、肌肉收缩等。流畅运动&#xff1a; 适当的拓扑有助于保持模型表面的平滑性&…

Linux友人帐之网络编程基础FTP服务器

一、概述 1.1FTP基本概念 FTP&#xff08;File Transfer Protocol&#xff09;是一种用于文件传输的标准协议。FTP服务是一种能够让用户通过FTP协议在本地计算机和远程服务器之间进行文件传输的服务。FTP服务可以允许用户上传或下载文件&#xff0c;也可以进行目录浏览、文件删…

Windows安装Docker(无网)

Windows安装Docker&#xff08;无网&#xff09; window无网安装Docker 1. 开启虚拟化功能 1. 开启window的虚拟化功能 方式一&#xff1a;直接在window的搜索框搜索 “启用或关闭windows功能”&#xff0c;就可以快捷进入【启用或关闭windows功能】页面 方式二&#xff1…

【MySQL】想不想知道数据库到底是啥?想了就进来看看

数据库是什么 前言正式开始连接mysql理解mysql第一层理解第二层理解第三层理解 小问题见见猪跑show databases;create database xxx;create table xxx; 主流数据库mysql架构SQL语句的种类存储引擎 前言 你手上有没有MySQL&#xff1f;有了最好&#xff0c;没有的话建议下一个&…

2022美亚杯团队赛

2022美亚杯团体赛 - XDforensics-Wiki 2022 美亚杯 团体赛AGC部分资格赛服务器部分 所有服务器部分解题思路_2022美亚杯团体赛复盘-CSDN博客 目录 AGC 1 2 Media Sever挂载 3 ssh登入的看法 PTS 4 5 ssh日志 6 7 查看docker列表 8 查看docker运行 9 建立网站…

solidworks对电脑要求高吗?2023solidworks配置要求

solidworks对电脑要求高吗&#xff1f;SolidWorks是一款功能强大的三维CAD软件&#xff0c;对电脑配置有一定的要求。一般来说&#xff0c;运行SolidWorks需要的电脑配置包括较高的处理器性能、足够的内存和存储空间&#xff0c;以及一块性能良好的显卡。此外&#xff0c;对于大…

Leetcode_3:无重复字符的最长子串

题目描述&#xff1a; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 示例 2: 输入: s "bbbbb"…

记一次上位机软件线程泄露的分析及解决

上位机软件在客户现场隔一段时间说操作了没反应&#xff0c;但是上位机又没死&#xff0c;出现了一些奇怪现象&#xff1a; 左上角的时间不走了&#xff08;本来是1s运行一次&#xff09;使用任务管理器查看&#xff0c;内存占用1.5G,线程有3000多个&#xff0c;正常情况下&am…

将 ONLYOFFICE 文档编辑器与 С# 群件平台集成

在本文中&#xff0c;我们会向您展示 ONLYOFFICE 文档编辑器与其自有的协作平台集成。 ONLYOFFICE 是一款开源办公套件&#xff0c;包括文本文档、电子表格和演示文稿编辑器。这款套件支持用户通过文档编辑组件扩展第三方 web 应用的功能&#xff0c;可直接在应用的界面中使用。…

VMware ifconfig ip报错解决记录

1.报错 ifconfig后出现以下报错 lo: flags73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 9216 b…

Element-Ui入门教学——<el-upload>限制上传文件类型

要限制<el-upload>上传文件的类型&#xff0c;需要给组件绑定:before-upload属性。 before-upload可选参数, 上传文件之前的钩子&#xff0c;参数为上传的文件&#xff0c;若返回 false 或者 Promise 则停止上传。HTML代码 <template><el-uploadclass"uplo…

竞赛 题目: 基于深度学习的疲劳驾驶检测 深度学习

文章目录 0 前言1 课题背景2 实现目标3 当前市面上疲劳驾驶检测的方法4 相关数据集5 基于头部姿态的驾驶疲劳检测5.1 如何确定疲劳状态5.2 算法步骤5.3 打瞌睡判断 6 基于CNN与SVM的疲劳检测方法6.1 网络结构6.2 疲劳图像分类训练6.3 训练结果 7 最后 0 前言 &#x1f525; 优…

Simulia仿真之CST的使用指南(1) | 百世慧®

前言 CST是Computer Simulation Technology的缩写,是全球范围内众多工程师都喜欢使用的高端电磁仿真分析软件。 本文又名《智慧的CST生活》这里一共列出了120个章节&#xff0c;其中包括CST使用过程中的有用小技巧&#xff0c;还有给用户提供技术支持的过程中常见的问题。本专…

Linux服务器上搭建JupyterNotebook教程

搭建需知 1.确保是Linux服务器&#xff1b; 2.已经在linux服务器上安装好anaconda3&#xff1b; 搭建教程 请按照顺序依次执行下面的命令&#xff1a; 1、安装Jupyter Notebook 执行以下命令&#xff0c;安装jupyter notebook conda install jupyter【注】 如果anaconda3…

maven-compiler-plugin和spring-boot-maven-plugin的区别

两者都能打包&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 格式不同&#xff01;&#xff01;&#xff01;用处不同&#xff01;&#xff01;&#xff01; 以实验为准&#xff0c;下面开始实验&#xff1a; maven-compiler-plugin &…

双11狂欢最后一天

大家好&#xff0c;本年度双11即将到来&#xff0c;为了答谢大家多年来的支持及更广泛的推广VBA的应用&#xff0c;“VBA语言専功”在此期间推出巨大优惠&#xff1a;此期间打包购买VBA技术资料实行半价优惠。 1&#xff1a;面向对象&#xff1a;学员及非学员 2&#xff1a;打…

Android发热监控实践

一、背景 相信移动端高度普及的现在&#xff0c;大家或多或少都会存在电量焦虑&#xff0c;拥有过手机发热发烫的糟糕体验。而发热问题是一个长时间、多场景的指标存在&#xff0c;且涉及到端侧应用层、手机 ROM 厂商系统、外界环境等多方面的影响。如何有效衡量发热场景、定位…

NZ系列工具NZ06:VBA创建PDF文件说明

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…