ElasticSearch性能優(yōu)化實踐(JVM調優(yōu)+ES調優(yōu))

一颜说、背景介紹

近一年內對公司的 ELK 日志系統(tǒng)做過性能優(yōu)化脑沿,也對 SkyWalking 使用的 ES 存儲進行過性能優(yōu)化庄拇,在此做一些總結溶弟。本篇主要是講 ES 在 ELK 架構中作為日志存儲時的性能優(yōu)化方案辜御。

ELK 架構作為日志存儲方案

ELK日志架構.png

二、現(xiàn)狀分析

1. 版本及硬件配置

  • JDK:JDK1.8_171-b11 (64位)
  • ES集群:由3臺16核32G的虛擬機部署 ES 集群碳抄,每個節(jié)點分配20G堆內存
  • ELK版本:6.3.0
  • 垃圾回收器:ES 默認指定的老年代(CMS)+ 新生代(ParNew)
  • 操作系統(tǒng):CentOS Linux release 7.4.1708(Core)

2. 性能問題

隨著接入ELK的應用越來越多,每日新增索引約 230 個璧尸,新增 document 約 3000萬到 5000萬

每日上午和下午是日志上傳高峰期蛀序,在 Kibana 上查看日志哼拔,發(fā)現(xiàn)問題:
(1) 日志會有 5-40 分鐘的延遲
(2) 有很多日志丟失,無法查到

3. 問題分析

3.1 日志延遲

首先了解清楚:數據什么時候可以被查到檬姥?

數據先是存放在 ES 的內存 buffer,然后執(zhí)行 refresh 操作寫入到操作系統(tǒng)的內存緩存 os cache秉犹,此后數據就可以被搜索到崇堵。

所以狰贯,日志延遲可能是我們的數據積壓在 buffer 中沒有進入 os cache 涵紊。

3.2日志丟失

查看日志發(fā)現(xiàn)很多 write 拒絕執(zhí)行的情況

write 線程池拒絕任務的日志.png

從日志中可以看出 ES 的 write 線程池已經滿負荷,執(zhí)行任務的線程已經達到最大16個線程塘幅,而200容量的隊列也已經放不下新的task踏揣。

查看線程池的情況也可以看出 write 線程池有很多寫入的任務

GET /_cat/thread_pool?v&h=host,name,type,size,active,largest,rejected,completed,queue,queue_size
write 線程池拒絕任務的情況.png

所以我們需要優(yōu)化 ES 的 write 的性能又谋。

4.解決思路

4.1 分析場景

ES 的優(yōu)化分為很多方面,我們要根據使用場景考慮對 ES 的要求任斋。

根據個人實踐經驗废酷,列舉三種不同場景下的特點

  • SkyWalking:一般配套使用ES作為數據存儲澈蟆,存儲鏈路追蹤數據、指標數據等信息。
  • ELK:一般用來存儲系統(tǒng)日志带膀,并進行分析,搜索嗽元,定位應用的問題剂癌。
  • 全文搜索的業(yè)務:業(yè)務中常用 ES 作為全文搜索引擎,例如在外賣應用中监嗜,ES 用來存儲商家桐猬、美食的業(yè)務數據溃肪,用戶在客戶端可以根據關鍵字、地理位置等查詢條件搜索商家厨钻、美食信息莉撇。

這三類場景的特點如下:

SkyWalking ELK 全文搜索的業(yè)務
并發(fā)寫 高并發(fā)寫 高并發(fā)寫 并發(fā)一般不高
并發(fā)讀 并發(fā)低 并發(fā)低 并發(fā)高
實時性要求 2分鐘以內 30秒以內 1分鐘內
數據完整性 可容忍丟失少量數據 可容忍丟失少量數據 數據盡量100%不丟失

關于實時性

  • SkyWalking 在實際使用中,一般使用頻率不太高涂佃,往往是發(fā)現(xiàn)應用的問題后辜荠,再去 SkyWalking 查歷史鏈路追蹤數據或指標數據造烁,所以可以接受幾分鐘的延遲。
  • ELK 不管是開發(fā)、測試等階段,時常用來定位應用的問題,如果不能快速查詢出數據我碟,延遲太久怎囚,會耽誤很多時間,大大降低工作效率贩虾;如果是查日志定位生產問題缎罢,那更是刻不容緩策精。
  • 全文搜索的業(yè)務中一般可以接受在1分鐘內查看到最新數據,比如新商品上架一分鐘后才看到询刹,但盡量實時凹联,在幾秒內可以可看到住闯。

4.2 優(yōu)化的方向

可以從三方面進行優(yōu)化:JVM性能調優(yōu)、ES性能調優(yōu)春寿、控制數據來源

三绑改、ES性能優(yōu)化

可以從三方面進行優(yōu)化:JVM 性能調優(yōu)、ES 性能調優(yōu)、控制數據來源

1. JVM調優(yōu)

第一步是 JVM 調優(yōu)耳璧。
因為 ES 是依賴于 JVM 運行旨枯,沒有合理的設置 JVM 參數,將浪費資源昆汹,甚至導致 ES 很容易 OOM 而崩潰满粗。

1.1 監(jiān)控 JVM 運行情況

(1) 查看 GC 日志

GC日志中很多Young GC.png

問題:Young GC 和 Full GC 都很頻繁,特別是 Young GC 頻率高檬洞,累積耗時非常多。

(2) 使用 jstat 看下每秒的 GC 情況

jstat發(fā)現(xiàn)Young GC頻繁.png

參數說明

  • S0:幸存1區(qū)當前使用比例
  • S1:幸存2區(qū)當前使用比例
  • E:伊甸園區(qū)使用比例
  • O:老年代使用比例
  • M:元數據區(qū)使用比例
  • CCS:壓縮使用比例
  • YGC:年輕代垃圾回收次數
  • FGC:老年代垃圾回收次數
  • FGCT:老年代垃圾回收消耗時間
  • GCT:垃圾回收消耗總時間
    問題:從 jstat gc 中也可以看出,每秒的 eden 增長速度非嘲樱快,很快就滿了勃蜘。

1.2 定位 Young GC 頻繁的原因

1.2.1 檢查是否新生代的空間是否太小

用下面幾種方式都可查看新、老年代內存大小
(1) 使用 jstat -gc pid 查看 Eden 區(qū)阳惹、老年代空間大小
(2) 使用 jmap -heap pid 查看 Eden 區(qū)穆端、老年代空間大小
(3) 查看 GC 日志中的 GC 明細

GC明細.png

其中 996800K 為新生代可用空間大小,即 Eden 區(qū)+1個 Survivor 區(qū)的空間大小仿便,所以新生代總內存是996800K/0.9, 約1081M

上面的幾種方式都查詢出攒巍,新生代總內存約1081M嗽仪,即1G左右;老年代總內存為19864000K柒莉,約19G闻坚。新仅偎、老比例約1:19,出乎意料。

1.2.1 新老年代空間比例為什么不是 JDK 默認的1:2【重點弦牡!】

這真是一個容易踩坑的地方椭豫。
如果沒有顯示設置新生代大小搬素,JVM 在使用 CMS 收集器時會自動調參,新生代的大小在沒有設置的情況下是通過計算得出的桑嘶,其大小可能與 NewRatio 的默認配置沒什么關系而與 ParallelGCThreads 的配置有一定的關系。

參考:CMS GC 默認新生代是多大?

所以:新生代大小有不確定性寸五,最好配置 JVM 參數 -XX:NewSize劲适、-XX:MaxNewSize 或者 -xmn ,免得遇到一些奇怪的 GC败晴,讓人措手不及纯路。

1.3 上面現(xiàn)象造成的影響

新生代過小搓逾,老年代過大的影響

  • 新生代過小:
    (1) 會導致新生代 Eden 區(qū)很快用完矛市,而觸發(fā) Young GC墩衙,Young GC 的過程中會 STW(Stop The World)奔滑,也就是所有工作線程停止入蛆,只有 GC 的線程在進行垃圾回收食店,這會導致 ES 短時間停頓。頻繁的 Young GC旱眯,積少成多蓬蝶,對系統(tǒng)性能影響較大梨撞。
    (2) 大部分對象很快進入老年代旦签,老年代很容易用完而觸發(fā) Full GC喧笔。
  • 老年代過大:會導致 Full GC 的執(zhí)行時間過長帽驯,F(xiàn)ull GC 雖然有并行處理的步驟,但是還是比 Young GC 的 STW 時間更久溃斋,而 GC 導致的停頓時間在幾十毫秒到幾秒內界拦,很影響 ES 的性能,同時也會導致請求 ES 服務端的客戶端在一定時間內沒有響應而發(fā)生 timeout 異常梗劫,導致請求失敗享甸。

1.4 JVM優(yōu)化

1.4.1 配置堆內存空間大小

32G 的內存,分配 20G 給堆內存是不妥當的梳侨,所以調整為總內存的50%蛉威,即16G。
修改 elasticsearch 的 jvm.options 文件

-Xms16g
-Xmx16g

設置要求:

  • Xms 與 Xmx 大小相同走哺。

    在 jvm 的參數中 -Xms 和 -Xmx 設置的不一致蚯嫌,在初始化時只會初始 -Xms 大小的空間存儲信息,每當空間不夠用時再向操作系統(tǒng)申請丙躏,這樣的話必然要進行一次 GC择示,GC會帶來 STW。而剩余空間很多時晒旅,會觸發(fā)縮容栅盲。再次不夠用時再擴容,如此反復废恋,這些過程會影響系統(tǒng)性能谈秫。同理在 MetaSpace 區(qū)也有類似的問題扒寄。

  • jvm 建議不要超過 32G,否則 jvm 會禁用內存對象指針壓縮技術拟烫,造成內存浪費

  • Xmx 和 Xms 不要超過物理 RAM 的50%该编。 參考:官方堆內存設置的建議

    Xmx 和 Xms 不要超過物理內存的50%。Elasticsearch 需要內存用于JVM堆以外的其他用途硕淑,為此留出空間非常重要课竣。例如,Elasticsearch 使用堆外緩沖區(qū)進行有效的網絡通信喜颁,依靠操作系統(tǒng)的文件系統(tǒng)緩存來高效地訪問文件稠氮,而 JVM 本身也需要一些內存。

1.4.2 配置堆內存新生代空間大小

因為指定新生代空間大小半开,導致 JVM 自動調參只分配了 1G 內存給新生代。

修改 elasticsearch 的 jvm.options 文件赃份,加上

-XX:NewSize=8G
-XX:MaxNewSize=8G

老年代則自動分配 16G-8G=8G 內存寂拆,新生代老年代的比例為 1:1。修改后每次 Young GC 頻率更低抓韩,且每次 GC 后只有少數數據會進入老年代纠永。

2.3 使用G1垃圾回收器(未實踐)

G1垃圾回收器讓系統(tǒng)使用者來設定垃圾回收堆系統(tǒng)的影響,然后把內存拆分為大量的小 Region谒拴,追蹤每個 Region 中可以回收的對象大小和回收完成的預計花費的時間尝江, 最后在垃圾回收的時候,盡量把垃圾回收對系統(tǒng)造成的影響控制在我們指定的時間范圍內英上,同時在有限的時間內盡量回收更多的垃圾對象炭序。
G1垃圾回收器一般在大數量、大內存的情況下有更好的性能苍日。

ES默認使用的垃圾回收器是:老年代(CMS)+ 新生代(ParNew)惭聂。如果是JDK1.9,ES 默認使用G1垃圾回收器相恃。

因為使用的是 JDK1.8辜纲,所以并未切換垃圾回收器。后續(xù)如果再有性能問題再切換G1垃圾回收器拦耐,測試是否有更好的性能耕腾。

1.5 優(yōu)化的效果

1.5.1 新生代使用內存的增長率更低

優(yōu)化前

優(yōu)化前.png

每秒打印一次 GC 數據∩迸矗可以看出扫俺,年輕代增長速度很快,幾秒鐘年輕代就滿了火脉,導致 Young GC 觸發(fā)很頻繁牵舵,幾秒鐘就會觸發(fā)一次柒啤。而每次 Young GC 很大可能有存活對象進入老年代,而且畸颅,存活對象多的時候(看上圖中第一個紅框中的old gc數據)担巩,有(51.44-51.08)/100 * 19000M = 約68M。每次進入老年代的對象較多没炒,加上頻繁的 Young GC涛癌,會導致新老年代的分代模式失去了作用,相當于老年代取代了新生代來存放近期內生成的對象送火。當老年代滿了拳话,觸發(fā) Full GC,存活的對象也會很多种吸,因為這些對象很可能還是近期加入的弃衍,還存活著,所以一次 Full GC 回收對象不多坚俗。而這會惡性循環(huán)镜盯,老年代很快又滿了,又 Full GC猖败,又殘留一大部分存活的速缆,又很容易滿了,所以導致一直頻繁 Full GC恩闻。

優(yōu)化后

優(yōu)化后.png

每秒打印一次 GC 數據艺糜。可以看出幢尚,新生代增長速度慢了許多破停,至少要60秒才會滿,如上圖紅框中數據侠草,進入老年代的對象約(15.68-15.60)/100 * 10000 = 8M辱挥,非常的少。所以要很久才會觸發(fā)一次 Full GC 边涕。而且等到 Full GC 時晤碘,老年代里很多對象都是存活了很久的,一般都是不會被引用功蜓,所以很大一部分會被回收掉园爷,留一個比較干凈的老年代空間,可以繼續(xù)放很多對象式撼。

1.5.2 新生代和老年代 GC 頻率更低

ES 啟動后童社,運行14個小時

優(yōu)化前

優(yōu)化前.png

Young GC 每次的時間是不長的,從上面監(jiān)控數據中可以看出每次GC時長 1467.995/27276 約等于 0.05秒著隆。那一秒鐘有多少時間實在處理Young GC ? 計算公式:1467秒/(60秒×60分14小時)= 約0.028秒扰楼,也就是100秒中就有2.8秒在Young GC呀癣,也就是有2.8S的停頓,這對性能還是有很大消耗的弦赖。同時也可以算出多久一次Young GC项栏, 方程是: 60秒×60分*14小時/ 27276次 = 1次/X秒,計算得出X = 0.54蹬竖,也就是0.54秒就會有一次Young GC沼沈,可見 Young GC 頻率非常頻繁。

優(yōu)化后

優(yōu)化后效果.png

Young GC 次數只有修改前的十分之一币厕,Young GC 時間也是約八分之一列另。Full GC 的次數也是只有原來的八分之一,GC 時間大約是四分之一旦装。

GC 對系統(tǒng)的影響大大降低页衙,性能已經得到很大的提升。

2.ES調優(yōu)

上面已經分析過ES作為日志存儲時的特性是:高并發(fā)寫同辣、讀少拷姿、接受30秒內的延時、可容忍部分日志數據丟失旱函。
下面我們針對這些特性對ES進行調優(yōu)。

2.1 優(yōu)化 ES 索引設置

2.2.1 ES 寫數據底層原理

本人整理了一下數據寫入的底層原理

ES寫入數據的原理.png

refresh
ES 接收數據請求時先存入 ES 的內存中描滔,默認每隔一秒會從內存 buffer 中將數據寫入操作系統(tǒng)緩存 os cache棒妨,這個過程叫做 refresh;

到了 os cache 數據就能被搜索到(所以我們才說 ES 是近實時的含长,因為1s 的延遲后執(zhí)行 refresh 便可讓數據被搜索到)

fsync
translog 會每隔5秒或者在一個變更請求完成之后執(zhí)行一次 fsync 操作券腔,將 translog 從緩存刷入磁盤,這個操作比較耗時拘泞,如果對數據一致性要求不是跟高時建議將索引改為異步纷纫,如果節(jié)點宕機時會有5秒數據丟失;

flush
ES 默認每隔30分鐘會將 os cache 中的數據刷入磁盤同時清空 translog 日志文件,這個過程叫做 flush陪腌。

merge

ES 的一個 index 由多個 shard 組成辱魁,而一個 shard 其實就是一個 Lucene 的 index ,它又由多個 segment 組成诗鸭,且 Lucene 會不斷地把一些小的 segment 合并成一個大的 segment 染簇,這個過程被稱為段merge。執(zhí)行索引操作時强岸,ES會先生成小的segment锻弓,ES 有離線的邏輯對小的 segment 進行合并,優(yōu)化查詢性能蝌箍。但是合并過程中會消耗較多磁盤 IO青灼,會影響查詢性能暴心。

2.2.2 優(yōu)化方向
2.2.2.1 優(yōu)化 fsync

為了保證不丟失數據,就要保護 translog 文件的安全:

Elasticsearch 2.0 之后, 每次寫請求(如 index 杂拨、delete专普、update、bulk 等)完成時, 都會觸發(fā)fsync將 translog 中的 segment 刷到磁盤, 然后才會返回200 OK的響應;

或者: 默認每隔5s就將 translog 中的數據通過fsync強制刷新到磁盤.

該方式提高數據安全性的同時扳躬, 降低了一點性能.

==> 頻繁地執(zhí)行fsync操作, 可能會產生阻塞導致部分操作耗時較久. 如果允許部分數據丟失, 可設置異步刷新 translog 來提高效率脆诉,還有降低 flush 的閥值,優(yōu)化如下:

"index.translog.durability": "async",
"index.translog.flush_threshold_size":"1024mb",
"index.translog.sync_interval": "120s"
2.2.2.2 優(yōu)化 refresh

寫入 Lucene 的數據贷币,并不是實時可搜索的击胜,ES 必須通過 refresh 的過程把內存中的數據轉換成 Lucene 的完整 segment 后,才可以被搜索役纹。

默認1秒后偶摔,寫入的數據可以很快被查詢到,但勢必會產生大量的 segment促脉,檢索性能會受到影響辰斋。所以,加大時長可以降低系統(tǒng)開銷瘸味。對于日志搜索來說宫仗,實時性要求不是那么高,設置為5秒或者10s旁仿;對于SkyWalking藕夫,實時性要求更低一些,我們可以設置為30s枯冈。

設置如下:

"index.refresh_interval":"5s"
2.2.2.3 優(yōu)化 merge

index.merge.scheduler.max_thread_count 控制并發(fā)的 merge 線程數毅贮,如果存儲是并發(fā)性能較好的 SSD,可以用系統(tǒng)默認的 max(1, min(4, availableProcessors / 2))尘奏,當節(jié)點配置的 cpu 核數較高時滩褥,merge 占用的資源可能會偏高,影響集群的性能炫加,普通磁盤的話設為1瑰煎,發(fā)生磁盤 IO 堵塞。設置max_thread_count 后琢感,會有 max_thread_count + 2 個線程同時進行磁盤操作丢间,也就是設置為 1 允許3個線程。

設置如下:

"index.merge.scheduler.max_thread_count":"1"
2.2.2 優(yōu)化設置
2.2.2.1 對現(xiàn)有索引做索引設置
# 需要先 close 索引,然后再執(zhí)行,最后成功之后再打開
# 關閉索引
curl -XPOST 'http://localhost:9200/_all/_close'

# 修改索引設置
curl -XPUT -H "Content-Type:application/json" 'http://localhost:9200/_all/_settings?preserve_existing=true' -d '{"index.merge.scheduler.max_thread_count" : "1","index.refresh_interval" : "10s","index.translog.durability" : "async","index.translog.flush_threshold_size":"1024mb","index.translog.sync_interval" : "120s"}'

# 打開索引
curl -XPOST 'http://localhost:9200/_all/_open'

該方式可對已經生成的索引做修改驹针,但是對于后續(xù)新建的索引不生效烘挫,所以我們可以制作 ES 模板,新建的索引按模板創(chuàng)建索引。

2.2.2.2 制作索引模板
# 制作模板 大部分索引都是業(yè)務應用的日志相關的索引饮六,且索引名稱是 202* 這種帶著日期的格式
PUT _template/business_log
{
  "index_patterns": ["*202*.*.*"],
  "settings": {
  "index.merge.scheduler.max_thread_count" : "1","index.refresh_interval" : "5s","index.translog.durability" : "async","index.translog.flush_threshold_size":"1024mb","index.translog.sync_interval" : "120s"}
}

# 查詢模板是否創(chuàng)建成功
GET _template/business_log

因為我們的業(yè)務日志是按天維度創(chuàng)建索引其垄,索引名稱示例:user-service-prod-2020.12.12,所以用通配符202..*匹配對應要創(chuàng)建的業(yè)務日志索引卤橄。

2.2 優(yōu)化線程池配置

前文已經提到過绿满,write 線程池滿負荷,導致拒絕任務窟扑,而有的數據無法寫入喇颁。

而經過上面的優(yōu)化后,拒絕的情況少了很多嚎货,但是還是有拒絕任務的情況橘霎。

所以我們還需要優(yōu)化write線程池。

從 prometheus 監(jiān)控中可以看到線程池的情況:

為了更直觀看到ES線程池的運行情況殖属,我們安裝了 elasticsearch_exporter 收集 ES 的指標數據到 prometheus姐叁,再通過 grafana 進行查看。

經過上面的各種優(yōu)化洗显,拒絕的數據量少了很多外潜,但是還是存在拒絕的情況,如下圖:

image.png

write 線程池如何設置:

參考:ElasticSearch線程池

write

For single-document index/delete/update and bulk requests. Thread pool type is fixed with a size of # of available processors, queue_size of 200. The maximum size for this pool is 1 + # of available processors.

write 線程池采用 fixed 類型的線程池挠唆,也就是核心線程數與最大線程數值相同处窥。線程數默認等于 cpu 核數,可設置的最大值只能是 cpu 核數加1玄组,也就是16核CPU碧库,能設置的線程數最大值為17。

優(yōu)化的方案:

  • 線程數改為17巧勤,也就是 cpu 總核數加1
  • 隊列容量加大。隊列在此時的作用是消峰弄匕。不過隊列容量加大本身不會提升處理速度颅悉,只是起到緩沖作用。此外迁匠,隊列容量也不能太大剩瓶,否則積壓很多任務時會占用過多堆內存。

config/elasticsearch.yml文件增加配置

# 線程數設置
thread_pool:
  write:
    # 線程數默認等于cpu核數城丧,即16  
    size: 17
    # 因為任務多時存在任務拒絕的情況延曙,所以加大隊列大小,可以在間歇性任務量陡增的情況下亡哄,緩存任務在隊列枝缔,等高峰過去逐步消費完。
    queue_size: 10000

優(yōu)化后效果

線程池拒絕的情況.png

可以看到,已經沒有拒絕的情況愿卸,這樣也就是解決了日志丟失的問題灵临。

2.3 鎖定內存,不讓 JVM 使用 Swap

Swap 交換分區(qū):

Swap 分區(qū)通常被稱為交換分區(qū)趴荸,這是一塊特殊的硬盤空間儒溉,即當物理內存不夠用的時候,操作系統(tǒng)會從物理內存中取出一部分暫時不用的數據发钝,放在交換分區(qū)中顿涣,從而為當前運行的程序騰出足夠的內存空間。也就是當物理內存不夠用時酝豪,用磁盤來頂替物理內存涛碑。
優(yōu)點是:通過操作系統(tǒng)的調度,應用程序實際可以使用的內存空間將遠遠超過系統(tǒng)的物理內存寓调。由于硬盤空間的價格遠比 RAM 要低锌唾,因此這種方式無疑是經濟實惠的。
缺點是:頻繁地讀寫硬盤夺英,會顯著降低操作系統(tǒng)的運行速率晌涕,這也是使用 swap 交換分區(qū)最大的限制。

參考:ElasticSearch官方解釋為什么要禁用交換內存

Swap 交換分區(qū)對性能和節(jié)點穩(wěn)定性非常不利痛悯,一定要禁用余黎。它會導致垃圾回收持續(xù)幾分鐘而不是幾毫秒,并會導致節(jié)點響應緩慢载萌,甚至與集群斷開連接惧财。

有三種方式可以實現(xiàn) ES 不使用Swap分區(qū)

2.3.1 Linux 系統(tǒng)中的關閉 Swap (臨時有效)

執(zhí)行命令

sudo swapoff -a

可以臨時禁用 Swap 內存,但是操作系統(tǒng)重啟后失效

2.3.2 Linux 系統(tǒng)中的盡可能減少 Swap 的使用(永久有效)

執(zhí)行下列命令

echo "vm.swappiness = 1">> /etc/sysctl.conf

正常情況下不會使用 Swap扭仁,除非緊急情況下才會 Swap垮衷。

2.3.3 啟用 bootstrap.memory_lock

config/elasticsearch.yml 文件增加配置

#鎖定內存,不讓 JVM 寫入 Swap乖坠,避免降低 ES 的性能
bootstrap.memory_lock: true

2.4 減少分片數搀突、副本數

分片

索引的大小取決于分片與段的大小,分片過小熊泵,可能導致段過小仰迁,進而導致開銷增加;分片過大可能導致分片頻繁 Merge顽分,產生大量 IO 操作徐许,影響寫入性能。

因為我們每個索引的大小在15G以下卒蘸,而默認是5個分片雌隅,沒有必要這么多,所以調整為3個。

"index.number_of_shards": "3"

分片的設置我們也可以配置在索引模板澄步。

副本數

減少集群副本分片數冰蘑,過多副本會導致 ES 內部寫擴大。副本數默認為1村缸,如果某索引所在的1個節(jié)點宕機祠肥,擁有副本的另一臺機器擁有索引備份數據,可以讓索引數據正常使用梯皿。但是數據寫入副本會影響寫入性能仇箱。對于日志數據,有1個副本即可东羹。對于大數據量的索引剂桥,可以設置副本數為0,減少對性能的影響属提。

"index.number_of_replicas": "1"

分片的設置我們也可以配置在索引模板权逗。

3.控制數據來源

3.1 應用按規(guī)范打印日志

有的應用1天生成10G日志,而一般的應用只有幾百到1G冤议。一天生成10G日志一般是因為部分應用日志使用不當斟薇,很多大數量的日志可以不打,比如大數據量的列表查詢接口恕酸、報表數據堪滨、debug 級別日志等數據是不用上傳到日志服務器,這些即影響日志存儲的性能蕊温,更影響應用自身性能袱箱。

四、ES性能優(yōu)化后的效果

優(yōu)化后的兩周內ELK性能良好义矛,沒有使用上的問題:

  • ES 數據不再丟失

  • 數據延時在10秒之內发笔,一般在5秒可以查出

  • 每個 ES 節(jié)點負載比較穩(wěn)定,CPU 和內存使用率都不會過高凉翻,如下圖

    ES節(jié)點運行情況.png

五筐咧、參考文檔

參考

記一次 ElasticSearch 優(yōu)化總結

ElasticSearch 的數據寫入流程及優(yōu)化

百億級實時計算系統(tǒng)性能優(yōu)化–—ElasticSearch篇

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
禁止轉載,如需轉載請通過簡信或評論聯(lián)系作者噪矛。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市铺罢,隨后出現(xiàn)的幾起案子艇挨,更是在濱河造成了極大的恐慌,老刑警劉巖韭赘,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缩滨,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機脉漏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門苞冯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人侧巨,你說我怎么就攤上這事舅锄。” “怎么了司忱?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵皇忿,是天一觀的道長。 經常有香客問我坦仍,道長鳍烁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任繁扎,我火速辦了婚禮幔荒,結果婚禮上,老公的妹妹穿的比我還像新娘梳玫。我一直安慰自己爹梁,他們只是感情好,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布汽纠。 她就那樣靜靜地躺著卫键,像睡著了一般。 火紅的嫁衣襯著肌膚如雪虱朵。 梳的紋絲不亂的頭發(fā)上莉炉,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音碴犬,去河邊找鬼絮宁。 笑死,一個胖子當著我的面吹牛服协,可吹牛的內容都是我干的绍昂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼偿荷,長吁一口氣:“原來是場噩夢啊……” “哼窘游!你這毒婦竟也來了?” 一聲冷哼從身側響起跳纳,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤忍饰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后寺庄,有當地人在樹林里發(fā)現(xiàn)了一具尸體艾蓝,經...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡力崇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赢织。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亮靴。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖于置,靈堂內的尸體忽然破棺而出茧吊,到底是詐尸還是另有隱情,我是刑警寧澤俱两,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布饱狂,位于F島的核電站,受9級特大地震影響宪彩,放射性物質發(fā)生泄漏休讳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一尿孔、第九天 我趴在偏房一處隱蔽的房頂上張望俊柔。 院中可真熱鬧,春花似錦活合、人聲如沸雏婶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽留晚。三九已至,卻和暖如春告嘲,著一層夾襖步出監(jiān)牢的瞬間错维,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工橄唬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赋焕,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓仰楚,卻偏偏與公主長得像隆判,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子僧界,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內容