Elasticsearch性能調優之磁盤讀寫性能優化

優化磁盤空間的佔用,減少磁盤空間的佔用,更多的數據可以進入filesystem cache

比如說你原來,磁盤空間佔用一共是1T,內存只有512G,現在優化了磁盤空間佔用之後,減少了數據量,可能數據量就只有512G了,那麼就可以全部進入內存

1、禁用不需要的功能

聚合,搜索,評分,近似匹配

聚合:doc values
搜索:倒排索引,index
評分:norms
近似匹配:index_options(freqs)

任何一個功能不需要,就把對應的存儲的數據給幹掉,這樣可以節約磁盤空間的佔用,也可以優化磁盤的讀寫性能

默認情況下,es在寫入document到索引的時候,都會給大多數的field增加一份doc values,就是正排索引,用來進行聚合或者排序的。比如說,如果我們有一個叫做foo的數字類型field,我們要對這個字段運行histograms aggr聚合操作,但是可能我們並不需要對這個字段進行搜索,那麼就可以禁止爲這個字段生成倒排索引,只需要doc value正排索引即可。禁用倒排索引:

 

PUT index
{
  "mappings": {
    "type": {
      "properties": {
        "foo": {
          "type": "integer",
          "index": false
        }
      }
    }
  }
}

text類型的field會存儲norm值,用來計算doc的相關度分數,如果我們需要對一個text field進行搜索,但是不關心這個field的分數,那麼可以禁用norm值

 

PUT index
{
  "mappings": {
    "type": {
      "properties": {
        "foo": {
          "type": "text",
          "norms": false
        }
      }
    }
  }
}

text field還會存儲出現頻率以及位置,出現頻率也是用來計算相關度分數的,位置是用來進行phrase query這種近似匹配操作的,如果我們不需要執行phrase query近似匹配,那麼可以禁用位置這個屬性:

 

PUT index
{
  "mappings": {
    "type": {
      "properties": {
        "foo": {
          "type": "text",
          "index_options": "freqs"
        }
      }
    }
  }
}

此外,如果我們不關心相關度頻分,我們可以配置es僅僅爲每個term索引對應的document,我們可以對這個field進行搜索,但是phrase query這種近似匹配會報錯,而且相關度評分會不準確:

 

PUT index
{
  "mappings": {
    "type": {
      "properties": {
        "foo": {
          "type": "text",
          "norms": false,
          "index_options": "freqs"
        }
      }
    }
  }
}

2、不要用默認的動態string類型映射

默認的動態string類型映射會將string類型的field同時映射爲text類型以及keyword類型,這會浪費磁盤空間,因爲我們不一定兩種都需要。通常來說,id field這種字段可能只需要keyword映射,而body field可能只需要text field。

映射一個content,content: text,content.內置字段: keyword

可以通過手動設置mappings映射來避免字符串類型的field被自動映射爲text和keyword:

 

PUT index
{
  "mappings": {
    "type": {
      "dynamic_templates": [
        {
          "strings": {
            "match_mapping_type": "string",
            "mapping": {
              "type": "keyword"
            }
          }
        }
      ]
    }
  }
}

3、禁止_all field

_all field會將document中所有field的值都合併在一起進行索引,很耗費空空間,如果不需要一次性對所有的field都進行搜索,那麼最好禁用_all field。

4、使用best_compression

_source field和其他field都很耗費磁盤空間,最好是對其使用best_compression進行壓縮。用elasticsearch.yml中的index.codec來設置,將其設置爲best_compression即可。

5、用最小的最合適的數字類型

es支持4種數字類型,byte,short,integer,long。如果最小的類型就合適,那麼就用最小的類型。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章