1. 程式人生 > >阿里雲elasticsearch實踐(最大限度提高寫入速度)

阿里雲elasticsearch實踐(最大限度提高寫入速度)

ES學習文件

  1. 如果英文文件閱讀有困難,參考:Elasticsearch: 權威指南,但是中文文件有滯後性,比如目前es已經到6.X版本,而中文文件以2.X版本為基礎,因此對於新版本的話會有部分不適用。
  2. 參考部落格:銘毅天下

使用阿里雲 elasticsearch

使用阿里雲 elasticsearch服務,就可以不用再自己安裝elasticsearch,購買後即可立即使用,方便快捷。
如果使用java客戶端進行訪問會有限制:
這裡寫圖片描述
具體請參考:阿里雲elasticsearch介紹

elasticsearch外掛

  • head外掛
    通過head外掛連線es,可以從介面上進行視覺化檢視叢集健康值、索引名稱、型別名稱,同時可進行基本查詢以及es本身的DSL複雜查詢
    這裡寫圖片描述

    head外掛可以直接使用360或者谷歌瀏覽器外掛直接安裝即可,不用再另外安裝,下載地址:es head外掛
  • X-PACK外掛
    可以提供身份驗證,更好的保證資料安全。阿里雲elasticsearch已經集成了X-PACK

  • IK分詞外掛
    常用中文分詞外掛,阿里雲elasticsearch已經有預置該外掛,可以直接進行分詞使用

阿里雲elasticsearch實踐

  1. 同步資料庫資料到es包含兩個過程,一個是從資料庫中查出指定的資料,一個是將資料庫查出來的資料儲存到es中
  2. 阿里雲elasticsearch規格選用
    cpu:4核
    記憶體:16G
    硬碟:256GB SSD(強烈建議使用固態硬碟,固態硬碟對於es的同步、更新效率有巨大的提升空間)
    叢集節點:3
  3. 一般我們初始化資料到es的時候,資料量是非常大的,可能有幾千萬直至上億,因此對於查詢的sql一定要優化到非常快
  4. 儲存資料到es也是優化的重點,以下將列出所有優化步驟:

一定要用bulk批量提交

elasticsearch允許單次提交資料在15M以內,也不能過大,不然有可能會失敗,因此我們可以批量查出多條資料(具體要多少資料才進行bulk條要看欄位的多少,可以先儲存部分資料到es驗證下,目前總共佔用多少容量,然後推算)。。千萬不要用一條條提交,這個對於寫入有巨大的提升!

禁用_all欄位
_all欄位是elasticsearch在儲存的時候會自己生成一個欄位,相當於將所有需要儲存的資料全部冗餘在這個欄位裡面,普通查詢一般是用不到這個欄位的,直接禁用掉:

http://localhost:9200/test_index/
{
  "settings": {
    "number_of_shards": 7
  },
  "mappings": {
    "testRequest": {
      "_all": {
        "enabled": false
      }
    }
  }
}

注意:這裡的number_of_shards這邊設定為7(預設是5),那具體要怎麼來確認到底需要建立多少分片數量呢?
請參考:es如何設定分片數量

提高硬碟的寫入速率,前提是一定要固態硬碟!機械硬碟不能設定太高

http://localhost:9200/_cluster/settings/
{
  "persistent": {
    "indices.store.throttle.max_bytes_per_sec": "200mb"
  }
}

注意:persistent,表示是永久設定,將會寫入到elasticsearch配置檔案中

關閉段合併merge

http://localhost:9200/_cluster/settings/
{
  "transient": {
    "indices.store.throttle.type": "none"
  }
}

注意:transient,表示是臨時設定,一旦elasticsearch重啟,這個配置會立即失效。

更改副本分片為0(非常重要)
elasticsearch預設主分片數量是5,同時會生成對應的5個副本分片,每次在儲存資料的時候會將主分片的資料拷貝到副本分片上,這個過程非常耗費資源,我們可以在初始化同步過程中先將副本分片數量改為0,等同步完成後再將副本分片改回5,這樣在我們改回來之後就只會有一次的複製主分片資料到副本分片資料的過程,可極大提升同步效率

http://localhost:9200/test_index/_settings/
{
  "index": {
    "number_of_replicas": 0
  }
}

設定refresh重新整理間隔為不重新整理

http://localhost:9200/test_index/_settings/
{
  "index": {
    "refresh_interval": "-1"
  }
}

設定資料flush方式為非同步,且加大translog檔案大小

http://localhost:9200/test_index/_settings/
{
  "index.translog.durability": "async",
  "index.translog.flush_threshold_size": "1024mb"
}

儲存完資料到elasticsearch後

由於在寫入時為了最大限度提高寫入速度,我們做了一些特殊配置,因此在同步完資料後,需要將對應的配置還原回來

開啟段合併merge

http://localhost:9200/_cluster/settings/
{
  "transient": {
    "indices.store.throttle.type": "merge"
  }
}

恢復副本分片數量

http://localhost:9200/test_index/_settings/
{
  "index": {
    "number_of_replicas": 1
  }
}

設定refresh重新整理間隔為1s

http://localhost:9200/test_index/_settings/
{
  "index": {
    "refresh_interval": "1s"
  }
}

設定flush同步方式為request,同時修改translog檔案大小為512M

http://localhost:9200/test_index/_settings/
{
  "index.translog.durability": "request",
  "index.translog.flush_threshold_size": "512mb"
}

驗證結果

匯入總條數:44000000條
資料容量大小:40G(加上副本分片共80G)
耗時:耗費2小時40分鐘左右
elasticsearch伺服器效能監控:
這裡寫圖片描述
由上圖可見:CPU的使用效率已經接近極限,可最大限度利用阿里雲elasticsearch伺服器效能