ES 实战磁盘存储优化

Posted 顧棟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES 实战磁盘存储优化相关的知识,希望对你有一定的参考价值。

磁盘存储优化

准备知识

元数据字段

_all

_all 字段是一个特殊的 catch-all 字段,它将所有其他字段的值连接成一个大字符串,使用空格作为分隔符,采用是字段类型是 text 字段,然后分词并编入索引,但是不进行源数据的存储。

_all 字段的主要作用是允许您在不知道哪个字段包含该值的情况下搜索文档中的值。 这使它在开始使用新数据集时成为一个有用的选择。 例如:

GET /my_index/_search

  "query": 
    "match": 
      "_all": "john smith 1970"
    
  

query_string 和 [simple_query_string](https:// www.elastic.co/guide/en/elasticsearch/reference/6.7/query-dsl-simple-query-string-query.html) 查询默认查询 _all 字段(如果启用)。URI search requests中的?q=参数也是如此,其实内部重写了query_string 查询:

GET _search?q=john+smith+new+york

_all 字段很有用,尤其是在使用简单过滤探索新数据时。 然而,通过将字段值连接成一个大字符串,_all 字段失去了短字段(更相关)和长字段(不太相关)之间的区别。 对于搜索相关性很重要的用例,最好专门查询各个字段。

_all 字段同时也需要占用更多的CPU和存储资源。 因此,默认情况下它是禁用的。 如果需要,可以启用。

还可以进行自定义_all字段,存储_all字段, 高显_all字段,更多的只是可以阅读官网。官网地址

索引字段的映射参数

index

这里的index指的是索引字段的配置参数,默认是true,开启索引的字段,才可以进行查询。如果不作为查询条件,可以从_source中获取。

norm

是一种规范因子,主要是方便计算文档的查询结果的分数,会占用更多的存储资源,一般情况下是,索引中的每个文档的每个字段占用一个byte。如果不需要进行特殊的评分的话,可以禁用这个参数。

PUT my_index/_mapping/_doc

  "properties": 
    "title": 
      "type": "text",
      "norms": false
    
  

对于text类型的字段而言,默认开启了norms,而keyword类型的字段则默认关闭了norms。

如果一个字段原来是开启norms,可以进行动态关闭(不支持动态开启),但是历史的数据需要在合并segments才会删除,索引中的数据部分拥有规范因子有的没有,所以查询的计分是不准确的。

doc_values

文档值主要是在文档写入的时候计算存储,它们存储与 _source 相同的值,但以面向列的方式存储,这对于排序聚合更有效。文档值几乎支持所有的字段类型,除了analyzed字符串的字段。

所有支持文档值的字段默认启用它们。如果你确定你不需要对一个字段排序或聚合,或者从脚本中访问字段值,你可以禁用doc值以节省磁盘空间:

PUT my_index

  "mappings": 
    "_doc": 
      "properties": 
        "status_code":  
          "type":       "keyword"
        ,
        "session_id":  
          "type":       "keyword",
          "doc_values": false
        
      
    
  

store

默认情况下,字段值是 indexed 以使它们可搜索,但它们不存储。 这意味着可以查询该字段,但无法检索到原始字段值。但是字段值已经是 _source 字段 的一部分,默认存储。可以通过_source获取字段的原始值。只有在一些特殊的情况下,才会开启这个配置。 例如,如果您有一个包含titledate和一个非常大的content字段的文档,您可能只想检索titledate,而不必从一个大的 _source 字段中获取:

PUT my_index

  "mappings": 
    "_doc": 
      "properties": 
        "title": 
          "type": "text",
          "store": true 
        ,
        "date": 
          "type": "date",
          "store": true 
        ,
        "content": 
          "type": "text"
        
      
    
  


PUT my_index/_doc/1

  "title":   "Some short title",
  "date":    "2015-01-01",
  "content": "A very long content field..."


GET my_index/_search

  "stored_fields": [ "title", "date" ] 

优化措施

  1. 禁用不需要normindex,不支持动态关闭,只能重建索引。

  2. 禁用不需要的doc_values,不支持动态关闭,只能重建索引。

  3. 禁用不需要的store,不支持动态关闭,只能重建索引。

  4. 如果_all被开启了,不支持动态关闭,只能重建索引。

  5. 在CPU资源允许和写入要求不要的情况下,可以更换索引的压缩算法(默认 LZ4)为best_compressionindex.codec这也是静态配置,不支持动态调整。

    PUT my_index
    
      "settings": 
      "index.codec": "best_compression"
      
    
    

重建索引,可以采用reindex方式。

经实践关闭_all可以出现节约30%存储空间,不过优化的效果与单个文档数据的大小,数据内容相关。

以上是关于ES 实战磁盘存储优化的主要内容,如果未能解决你的问题,请参考以下文章

Linux性能优化实战:Linux 磁盘I/O是怎么工作的(上)(24)

Linux性能优化实战:系统的swap变高(08)

实战:如何对磁盘和网络IO进行评估监控定位和优化?

实战:如何对磁盘和网络IO进行评估监控定位和优化?

MySQL 索引及优化实战

MySQL 索引及优化实战