当前位置:   article > 正文

二、ES-万字长文读懂ES

二、ES-万字长文读懂ES

1. ES索引设计

索引设计的重要性

  • 索引创建后,索引的分片只能通过_split和_shrink接口对其进行成倍的增加和缩减
    • 因为es的数据是通过_routing分配到各个分片上面的,所以本质上是不推荐去改变索引的分片数量的,因为这样都会对数据进行重新的移动
    • 索引只能新增字段,不能对字段进行修改和删除,缺乏灵活性,所以每次都只能通过_reindex重建索引了,还有就是一个分片的大小以及所以分片数量的多少严重影响到了索引的查询和写入性能

在这里插入图片描述

基于时间的Index设计

原因&时间间隔&如何分片

原因

  • 如果数据都存储在一个Index中,很难进行扩展和调整
  • 根据时间来切分Index,则可以实现一定的灵活性,既可以在数据量过大时及时调整Shard个数,也可以及时响应新的业务需求
  • 大多数业务场景下,客户对数据的请求都会命中在最近一段时间上,通过切分Index,可以尽可能的避免扫描不必要的数据,提高性能

时间间隔

  • 时间越短越能保持灵活性,但是这样做就会导致产生大量的Index,而每个Index都会消耗资源来维护其元信息的,因此需要在灵活性、资源和性能上做权衡
  • 先考虑总共要存储多久的数据,然后选一个既不会产生大量Index又能够满足一定灵活性的间隔假如业务增长的特别快,比如上周产生了1亿数据,这周就增长到了10亿,那么就需要调低这个间隔来保证有足够的弹性能应对变化

如何实现分割

  • 切分行为是由客户端(数据的写入端)发起的,根据时间间隔与数据产生时间将数据写入不同的Index中,为了易于区分,会在Index的名字中加上对应的时间标识

分片设计

  • 分片设计,就是如何设定主分片的个数
  • 在很多场景下,即使不设定也不会有问题(ES7默认是1个主分片一个副本分片),但是如果不提前考虑,一旦出问题就可能导致系统性能下降、不可访问、甚至无法恢复

分片不是越多越好

  • 每个分片本质上就是一个Lucene索引, 因此会消耗相应的文件句柄, 内存和CPU资源。
    每个搜索请求会调度到索引的每个分片中. 如果分片分散在不同的节点倒是问题不太. 但当分
    开始竞争相同的硬件资源时, 性能便会逐步下降。
  • ES使用词频统计来计算相关性. 当然这些统计也会分配到各个分片上. 如果在大量分片上只维护了很少的数据, 则将导致最终的文档相关性较差。

限制分片大小

  • 单个Shard的存储大小不超过30GB:主要是考虑Shard Relocate过程的负载,我们知道,如果Shard不均衡或者部分节点故障,Elasticsearch会做Shard Relocate,在这个过程中会搬移Shard,如果单个Shard过大,会导致CPU、IO负载过高进而影响系统性能与稳定性
  • 评估分片数量:单个Index的Primary Shard个数 = k * 数据节点个数
    • 在保证第一点的前提下,单个Index的Primary Shard个数不宜过多,否则相关的元信息与缓存会消耗过多的系统资源
    • 小索引设计:对于很小的Index,可以只分配1~2个Primary Shard的
    • 使用索引模板:把已经创建好的某个索引的参数设置(settings)和索引映射(mapping)保存下来作为模板,在创建新索引时,指定要使用的模板名,就可以直接重用已经定义好的模板中的设置和映射
      • 通过索引进行匹配,看看新建的索引是否符合索引模板,如果符合,就将索引模板的相关设置应用到新的索引
      • 如果你需要每间隔一定的时间就建立一次索引,你只需要配置好索引模板,以后就可以直接使用这个模板中的设置,不用每次都设置settings和mappings.

模板的一些参数

index_patterns  必须配置,用于在创建期间匹配索引名称的通配符(*)表达式数组
template  可选配置,可以选择包括别名、映射或设置配置
composed_of  可选配置,组件模板名称的有序列表。组件模板按指定的顺序合并,这意味着最后指定的组件模板具有最高的优先级
priority  可选配置,创建新索引时确定索引模板优先级的优先级。选择具有最高优先级的索引模板。如果未指定优先级,则将模板视为优先级为0(最低优先级)
version  可选配置,用于外部管理索引模板的版本号
_meta  可选配置,关于索引模板的可选用户元数据,可能有任何内容
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

映射

什么是映射

  • 数据库建表的时候,我们DDL依据一般都会指定每个字段的存储类型,例如:varchar、int、datetime等,目的很明确,就是更精确的存储数据,防止数据类型格式混乱,在Elasticsearch中也是这样,创建索引的时候一般也需要指定索引的字段类型,这种方式称为映射(Mapping)
    • 被动创建(动态映射)
      • 字段和映射类型不需要事先定义,只需要存在文档的索引,ES会根据数据内容自动添加映射字段定义
      • 一般生产环境下需要禁用动态映射,使用动态映射可能出现以下问题:造成集群元数据一直变更,导致不稳定;可能造成数据类型与实际类型不一致
    • 主动创建(显示映射)
      • 动态映射只能保证最基础的数据结构的映射,所以可以使用PUT {index}/mapping来更新指定索引的映射内容
      • 常见的类型
        • text:当一个字段是要被全文搜索的,text类型会被分词,不用于排序,很少用于聚合
        • keyword类型不会被分词,常用于关键字搜索

映射属性

  • type:字段数据类型,常见的简单类型有:
    • 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
    • keyword类型只能整体搜索,不支持搜索部分内容
    • 数值:long、integer、short、byte、double、float、
    • 布尔:boolean
    • 日期:date
    • 对象:object
  • index:是否创建索引,默认为true
  • analyzer:使用哪种分词器
  • properties:该字段的子字段
    {
         
        "age": 21,
        "weight": 52.1,
        "isMarried": false,
        "info": "真相只有一个!",
        "email": "zy@itcast.cn",
        "score": [99.1, 99.5, 98.9],
        "name": 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/992373
推荐阅读
相关标签
  

闽ICP备14008679号