1. 程式人生 > >阿里雲Elasticsearch效能優化實踐

阿里雲Elasticsearch效能優化實踐

     Elasticsearch是一款流行的分散式開源搜尋和資料分析引擎,具備高效能、易擴充套件、容錯性強等特點。它強化了Apache Lucene的搜尋能力,把掌控海量資料索引和查詢的方式提升到一個新的層次。本文結合開源社群和阿里雲平臺的實踐經驗,探討如何調優Elasticsearch的效能提高索引和查詢吞吐量。

  • . Elasticsearch部署建議
    1.選擇合理的硬體配置,儘可能使用SSD

      Elasticsearch最大的瓶頸往往是磁碟讀寫效能,尤其是隨機讀取效能。使用SSD(PCI-E介面SSD卡/SATA介面SSD盤)通常比機械硬碟(SATA盤/SAS盤)查詢速度快5~10倍,寫入效能提升不明顯。

        對於文件檢索類查詢效能要求較高的場景,建議考慮SSD作為儲存,同時按照1:10的比例配置記憶體和硬碟。對於日誌分析類查詢併發要求較低的場景,可以考慮採用機械硬碟作為儲存,同時按照1:50的比例配置記憶體和硬碟。單節點儲存資料建議在2TB以內,最大不要超過5TB,避免查詢速度慢、系統不穩定。

        在單機儲存1TB資料場景下,SATA盤和SSD盤的全文檢索效能對比(測試環境:Elasticsearch5.5.3,10億條人口戶籍登記資訊,單機16核CPU、64GB記憶體,12塊6TB SATA盤,2塊1.5 TB SSD盤):

磁碟型別

併發數

QPS

平均檢索響應時間

50%請求響應時間

90%請求響應時間

IOPS

SATA盤

10併發

17

563ms

478ms

994ms

1200

SATA盤

50併發

64

773ms

711ms

1155ms

1800

SATA盤

100併發

110

902ms

841ms

1225ms

2040

SATA盤

200併發

84

2369ms

2335ms

2909ms

2400

SSD盤

10併發

94

105ms

90ms

200ms

25400

SSD盤

50併發

144

346ms

341ms

411ms

66000

SSD盤

100併發

152

654ms

689ms

791ms

60000

SSD盤

200併發

210

950ms

1179ms

1369ms

60000

 

        2.給JVM配置機器一半的記憶體,但是不建議超過32G

        修改conf/jvm.options配置,-Xms和-Xmx設定為相同的值,推薦設定為機器記憶體的一半左右,剩餘一半留給作業系統快取使用。jvm記憶體建議不要低於2G,否則有可能因為記憶體不足導致ES無法正常啟動或記憶體溢位,jvm建議不要超過32G,否則jvm會禁用記憶體物件指標壓縮技術,造成記憶體浪費。機器記憶體大於64G記憶體時,推薦配置-Xms30g -Xmx30g 。

 

        3.規模較大的叢集配置專有主節點,避免腦裂問題

        Elasticsearch主節點(master節點)負責叢集元資訊管理、index的增刪操作、節點的加入剔除,定期將最新的叢集狀態廣播至各個節點。在叢集規模較大時,建議配置專有主節點只負責叢集管理,不儲存資料,不承擔資料讀寫壓力。

# 專有主節點配置(conf/elasticsearch.yml):
node.master:true
node.data: false
node.ingest:false

# 資料節點配置(conf/elasticsearch.yml):
node.master:false
node.data:true
node.ingest:true

        Elasticsearch預設每個節點既是候選主節點,又是資料節點。最小主節點數量引數minimum_master_nodes推薦配置為候選主節點數量一半以上,該配置告訴Elasticsearch當沒有足夠的master候選節點的時候,不進行master節點選舉,等master節點足夠了才進行選舉。

        例如對於3節點叢集,最小主節點數量從預設值1改為2。

# 最小主節點數量配置(conf/elasticsearch.yml):
discovery.zen.minimum_master_nodes: 2

        4.Linux作業系統調優

        關閉交換分割槽,防止記憶體置換降低效能。 將/etc/fstab 檔案中包含swap的行註釋掉

sed -i '/swap/s/^/#/' /etc/fstab
swapoff -a

        單使用者可以開啟的最大檔案數量,可以設定為官方推薦的65536或更大些

echo "* - nofile 655360" >> /etc/security/limits.conf

        單使用者執行緒數調大

echo "* - nproc 131072" >> /etc/security/limits.conf

        單程序可以使用的最大map記憶體區域數量

echo "vm.max_map_count = 655360" >> /etc/sysctl.conf

        引數修改立即生效

sysctl -p

 

  • 索引效能調優建議

        1.設定合理的索引分片數和副本數

        索引分片數建議設定為叢集節點的整數倍,初始資料匯入時副本數設定為0,生產環境副本數建議設定為1(設定1個副本,叢集任意1個節點宕機資料不會丟失;設定更多副本會佔用更多儲存空間,作業系統快取命中率會下降,檢索效能不一定提升)。單節點索引分片數建議不要超過3個,每個索引分片推薦10-40GB大小。索引分片數設定後不可以修改,副本數設定後可以修改。Elasticsearch6.X及之前的版本預設索引分片數為5、副本數為1,從Elasticsearch7.0開始調整為預設索引分片數為1、副本數為1。

        不同分片數對寫入效能的影響(測試環境:7節點Elasticsearch6.3叢集,寫入30G新聞資料,單節點56核CPU、380G記憶體、3TB SSD卡,0副本,20執行緒寫入,每批次提交10M左右資料。): 

叢集索引分片數

單節點索引分片數

寫入耗時

2

0/1

600s

7

1

327s

14

2

258s

21

3

211s

28

4

211s

56

8

214s

        索引設定:

curl -XPUT http://localhost:9200/fulltext001?pretty -H 'Content-Type: application/json'   -d '
{
    "settings" : {
      "refresh_interval": "30s",
      "merge.policy.max_merged_segment": "1000mb",
      "translog.durability": "async",
      "translog.flush_threshold_size": "2gb",
      "translog.sync_interval": "100s",
      "index" : {
        "number_of_shards" : "21",
        "number_of_replicas" : "0"
      }
    }
}
'

        mapping設定:

curl -XPOST http://localhost:9200/fulltext001/doc/_mapping?pretty  -H 'Content-Type: application/json' -d '
{
    "doc" : {
        "_all" : {
            "enabled" : false
         },
        "properties" : {
          "content" : {
            "type" : "text",
            "analyzer":"ik_max_word"
          },
          "id" : {
            "type" : "keyword"
          }
        }
    }
}
'

        寫入資料示例:

curl -XPUT 'http://localhost:9200/fulltext001/doc/1?pretty' -H 'Content-Type: application/json' -d '
{
    "id": "https://www.huxiu.com/article/215169.html",
    "content": "“娃娃機,迷你KTV,VR體驗館,堪稱商場三大標配‘神器’。”一家地處商業中心的大型綜合體負責人告訴懂懂筆記,在過去的這幾個月裡,幾乎所有的綜合體都“標配”了這三種“裝置”…"
}'

        修改副本數示例:

curl -XPUT "http://localhost:9200/fulltext001/_settings" -H 'Content-Type: application/json' -d'
{
    "number_of_replicas": 1
}'

        2.使用批量請求

        使用批量請求將產生比單文件索引請求好得多的效能。寫入資料時呼叫批量提交介面,推薦每批量提交5~15MB資料。例如單條記錄1KB大小,每批次提交10000條左右記錄寫入效能較優;單條記錄5KB大小,每批次提交2000條左右記錄寫入效能較優。

        批量請求介面API:

curl -XPOST "http://localhost:9200/_bulk" -H 'Content-Type: application/json' -d'
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_type" : "_doc", "_id" : "2" } }
{ "create" : { "_index" : "test", "_type" : "_doc", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_type" : "_doc", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
'

         3.通過多程序/執行緒傳送資料

        單執行緒批量寫入資料往往不能充分利用伺服器CPU資源,可以嘗試調整寫入執行緒數或者在多個客戶端上同時向Elasticsearch伺服器提交寫入請求。與批量調整大小請求類似,只有測試才能確定最佳的worker數量。 可以通過逐漸增加工作任務數量來測試,直到叢集上的I / O或CPU飽和。

        4.調大refresh interval

        在 Elasticsearch 中,寫入和開啟一個新段的輕量的過程叫做 refresh 。 預設情況下每個分片會每秒自動重新整理一次。這就是為什麼我們說 Elasticsearch 是  實時搜尋: 文件的變化並不是立即對搜尋可見,但會在一秒之內變為可見。
        並不是所有的情況都需要每秒重新整理。可能你正在使用 Elasticsearch 索引大量的日誌檔案,你可能想優化索引速度而不是近實時搜尋,可以通過設定 refresh_interval,降低每個索引的重新整理頻率。

        設定refresh interval API:

curl -XPUT "http://localhost:9200/index" -H 'Content-Type: application/json' -d'
{
    "settings" : {
      "refresh_interval": "30s"
    }
}'

        refresh_interval 可以在既存索引上進行動態更新。 在生產環境中,當你正在建立一個大的新索引時,可以先關閉自動重新整理,待開始使用該索引時,再把它們調回來:

curl -XPUT "http://localhost:9200/index/_settings" -H 'Content-Type: application/json' -d'
{ "refresh_interval": -1 }'
curl -XPUT "http://localhost:9200/index/_settings" -H 'Content-Type: application/json' -d'
{ "refresh_interval": "1s" }'

        5.設計mapping配置合適的欄位型別

        Elasticsearch在寫入文件時,如果請求中指定的索引名不存在,會自動建立新索引,並根據文件內容猜測可能的欄位型別。但這往往不是最高效的,我們可以根據應用場景來設計合理的欄位型別。

        例如寫入一條記錄:

curl -XPUT "http://localhost:9200/twitter/doc/1?pretty" -H 'Content-Type: application/json' -d'
{
    "user": "kimchy",
    "post_date": "2009-11-15T13:12:00",
    "message": "Trying out Elasticsearch, so far so good?"
}'

        查詢Elasticsearch自動建立的索引mapping,會發現將post_date欄位自動識別為date型別,但是message和user欄位被設定為text、keyword冗餘欄位,造成寫入速度降低、佔用更多磁碟空間。

curl -XGET "http://localhost:9200/twitter"
{
  "twitter": {
    "mappings": {
      "doc": {
        "properties": {
          "message": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              
            
           

相關推薦

阿里Elasticsearch效能優化實踐

     Elasticsearch是一款流行的分散式開源搜尋和資料分析引擎,具備高效能、易擴充套件、容錯性強等特點。它強化了Apache Lucene的搜尋能力,把掌控海量資料索引和查詢的方式提升到一個新的層次。本文結合開源社群和阿里雲平臺的實踐經驗,探討如何調優Elastic

eBay Elasticsearch效能優化實踐

摘要:Elasticsearch是基於Apache Lucene的開源搜尋和分析引擎,允許使用者以近乎實時的方式儲存,搜尋和分析資料。雖然Elasticsearch專為快速查詢而設計,但其效能在很大程度上取決於用於應用程式的場景,索引的資料量以及應用程式和使

什麼是最佳的視訊使用者體驗?阿里視訊體驗優化實踐之路

5月29日,VEA中國視訊體驗聯盟與VideoCTO聯合主辦“中國視訊體驗CTO論壇”在成都圓滿落幕。該論壇旨在邀請視訊產業生態鏈

騰訊Elasticsearch叢集規劃及效能優化實踐

​一、引言   隨著騰訊雲 Elasticsearch 雲產品功能越來越豐富,ES 使用者越來越多,雲上的叢集規模也越來越大。我們在日常運維工作中也經常會遇到一些由於前期叢集規劃不到位,導致後期業務增長叢集規模大了之後帶來的各種各樣的叢集可用性及穩定性問題。   這裡列舉下其中比較典型的幾

Elasticsearch飛起來!——效能優化實踐乾貨

0、題記 Elasticsearch效能優化的最終目的:使用者體驗爽。 關於爽的定義——著名產品人樑寧曾經說過“人在滿足時候的狀態叫做愉悅,人不被滿足就會難受,就會開始尋求。如果這個人在尋求中,能立刻得到即時滿足,這種感覺就是爽!”。 Elasticsearch的爽點就是:快、準、全

CSDN博文週刊第2期 |讓Elasticsearch飛起來!——效能優化實踐乾貨

CSDN每週都會產生大量的部落格文章,有一些優質的乾貨文章值得被更多人閱讀,分享。CSDN博文週刊會從過去一週博文中精心挑選一些優質文章來以饗讀者,陪伴大家度過一個愉快週末。 大資料 1、讓Elasticsearch飛起來!——效能優化實踐乾貨 Elasticsearch效能

Elasticsearch飛起來:效能優化實踐乾貨

版權宣告:本文為博主原創文章,未經博主允許不得轉載。轉載請務必加上原作者:銘毅天下,原文地址:blog.csdn.net/laoyang360 https://blog.csdn.net/wojiushiwo987/article/details/85109769 0、題記 Elasticsearc

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

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

Java基礎學習總結(135)——Java程式碼效能優化實踐經驗再總結

前言 程式碼優化的最重要的作用應該是:避免未知的錯誤。在程式碼上線執行的過程中,往往會出現很多我們意想不到的錯誤,因為線上環境和開發環境是非常不同的,錯誤定位到最後往往是一個非常小的原因。然而為了解決這個錯誤,我們需要先自驗證、再打包出待替換的class檔案、暫停業務並重啟,對於一個成熟的專

Flume效能優化實踐

Flume效能優化實踐 發表評論 最近公司落地Flume日誌採集著實反覆了好久,簡單記錄一下效能優化的核心思路。 初始配置所有batch size、transaction size都是1000,channel的capactiy是10000。 版本一 最初我是按Memory Cha

Elasticsearch效能優化建議

之前公司專案中有使用Elasticsearch儲存日誌,當時使用的功能簡單,並沒有深入瞭解Elasticsearch,但是對於該支援文字搜尋的儲存架構還是很感興趣,最近因為想在一個新專案中採用ELK(Elasticsearch+Logstash+Kibana)技術棧來儲存系統日誌,學習有關Elast

niginx的效能優化實踐

一、Nginx 正向代理和反向代理實現 那麼什麼是反向代理其與正向代理有什麼區別? 正向代理的概念: 正向代理是指客戶端與目標伺服器之間增加一個代理伺服器,客戶端直接訪問代理伺服器,在由代理伺服器訪問目標伺服器並返回客戶端並返回 。這個過程當中客戶端需要知道代理伺服器地址,並配置連線。

基於 Nginx 的 HTTPS 效能優化實踐

前言 分享一個卓見雲的較多客戶遇到HTTPS優化案例。 隨著相關瀏覽器對HTTP協議的“不安全”、紅色頁面警告等嚴格措施的出臺,以及向 iOS 應用的 ATS 要求和微信、支付寶小程式強制 HTTPS 需求,以及在合規方面如等級保護對傳輸安全性的要求都在推動 HTTPS 的發展。 雖然 HTTPS 優化

阿里簡訊介面開發實踐(Java)

隨著網際網路的興起,各行各業的需求都在不斷的增加。隨著業務的擴大,企業給使用者傳送簡訊驗證碼的業務,也是如火如荼。在這裡,calvin給各位開發者推薦阿里雲簡訊平臺。原因有二:1.接入較簡單,開發成本低 2.非常穩定,簡訊可達率99%。      &

Nginx 效能優化實踐

概要: Nginx 反向代理與負載均衡 Nginx 實現快取記憶體 Nginx 效能引數調優 一、Nginx 反向代理實現 知識點: 反向代理基本配置 負載均衡配置與引數解析 負載均衡演算法詳解 反向代理基本配置 提問:什麼是反向代理其與正向代理有什麼區別?

阿里伺服器效能監控

我們把專案部署到伺服器後,我們關心一下伺服器的記憶體是否能撐起我們的專案,若專案部署完後記憶體都佔用90%以上,那就注意了,專案很容易被擠掉線。但我們怎麼檢視伺服器的效能呢,下面我們來說說。 開啟阿里雲控制檯 點選完成後進入例項詳情 可以清楚看到右邊會有各種

技術分享:Java效能優化實踐(附效能優化專題思維導圖)

Java 應用效能優化是一個老生常談的話題,筆者根據個人經驗,將 Java 效能優化分為 4 個層級:應用層、資料庫層、框架層、JVM 層。通過介紹 Java 效能診斷工具和思路,給出搜狗商業平臺的效能優化案例以供參考。 Java 應用效能優化是一個老生常談的話題,典型的效能問題如頁面響應慢、介

ES terms聚合統計效能優化實踐

一、terms聚合統計,initialise 階段的耗時,有助於我們調整對應 aggs 的 execution_hint 引數選擇? map:過濾之後,實際納入統計的doc數量特別少,但是欄位總的term數量超級多 適用場景: 過濾完之後,納入統計的d

阿里容器服務DaemonSet實踐

DaemonSet 保證在每個 Node 上都執行一個容器副本,常用來部署一些叢集的日誌、監控或者其他系統管理應用。下面以日誌收集 fluentd 為例,看下如何使用阿里雲容器服務控制檯建立DaemonSet。 準備Kubernetes環境 在阿里雲容器服務控制檯中建立Kubernetes 叢集(1.11

阿里主機效能評測之硬碟

總感覺正在用的息壤VPS主機效能不好,網路也時常性的會出現卡頓。 申請了一臺阿里雲主機,單核1G記憶體,10G資料盤,2M頻寬的配置,先測試下硬碟效能。 硬碟測試 我們用dd命令附帶不同的引數進行測試。 1)命令:dd bs=64k count=4k if=/dev