ES特定場景性能優化

1. Overview

本文主要介紹一下Elasticsearch(後文簡稱ES)做相關基準測試的流程,及分享一些我們做過的一些測試結論。

簡要說明下我們使用情況:

寬表的用戶畫像OLAP分析場景,集羣規模200節點,數據量30T左右全熱數據,24h更新及查詢,總數據量1500億,日更新200億。

2. 基準測試

2.1 測試流程

由於 ES 是近乎線性擴展的分佈式系統,所以對上述需求可以總結成同一個測試模式:

​ 1. 使用和線上集羣相同硬件配置的服務器搭建一個單節點集羣。

​ 2. 使用和線上集羣相同的映射創建一個 0 副本,1 分片的測試索引。

​ 3. 使用和線上集羣相同的數據寫入進行壓測。

​ 4. 觀察寫入性能,或者運行查詢請求觀察搜索聚合性能。

​ 5. 持續壓測數小時,使用監控系統記錄 eps、requesttime、fielddata cache、GC count、Throughput、latency、Heap used 等關鍵數據。

測試完成後,根據監控系統數據,確定單分片的性能拐點,或者適合自己預期值的臨界點。這個數據,就是一個基準數據。之後的擴容計劃,都可以以這個基準單位進行。

2.2 集羣拓撲

單數據節點測試環境:

ES集羣:

1 data node(內存:31g,SSD)(1臺物理機)

1 client node

3 master node

集羣測試環境:

ES集羣:

12 data node(內存:31g,SSD)(6臺物理機)

1 client node

3 master node

集羣部署拓撲結構:(master、data、client分離部署,監控集羣獨立)

部署拓撲結構

2.3 測試工具

Elasticsearch:7.3.x

ESRally: 1.0.3

2.3.1 具體操作

esrally --track=xxx_test --challenge=append-no-conflicts-index-only --target-hosts=xx.xx.xx.xx:9200 --pipeline=benchmark-only --cluster-health=yellow --client-options="timeout:120"

在這裏插入圖片描述

壓測對比:

esrally compare --baseline=20180228T085405Z --contender=20180228T100018Z

在這裏插入圖片描述

綠色:對比測試指標比基準測試數據優

紅色:對比測試指標比基準測試數據差

2.3.2 參數測試優化

index.translog.flush_threshold_size

調優值:[512m,1g,2g,4g,6g]

基準參數:

index.refresh_interval: 60s
indices.memory.index_buffer_size: 10%
Processors: 16
Bulk Size: 2000
......

對應的參數測試3-5次,以自己關注的指標取均值

例如我們重點關注Index的吞吐量和性能,關注指標以Median Throughput(docs/s)、99th percentile latency(ms)爲基準

在這裏插入圖片描述

依據此方式選取最優值

3、測試過的部分參數

3.1 參數及說明

類型 參數 默認值 調整值 說明
refresh_interval 1s 60s
index.translog.flush_threshold_size 512mb 2048mb
index.translog.sync_interval 5s 30s
index.translog.durability request async
indices.memory.index_buffer_size 10% 20%
indices.queries.cache.size 10% 20%
thread_pool.write.queue_size 200 500
index.merge.scheduler.max_thread_count Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2)) 4
index.merge.policy.floor_segment 2mb 2mb
index.merge.policy.max_merge_at_once 10 15
index.merge.policy.max_merged_segment 5gb 3gb
index.merge.policy.segments_per_tier 10 15
index.merge.policy.expunge_deletes_allowed 10 15
index.codec default(lz4) default
Processors 20 單物理機多節點需要設置
Shards per node 3 單個node適合的shard數
GC設置 -XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+UseG1GC
-XX:InitiatingHeapOccupancyPercent=70
-XX:G1HeapWastePercent=10
-XX:G1MixedGCCountTarget=32
-XX:ParallelGCThreads=20
-XX:ConcGCThreads=5
FullGC次數和時間較少一半
Bulk size 2000

段合併的底層控制

3.2 mapping結構優化

1、Keyword類型的值,替換給Int類型枚舉,性能收益很小

2、Nested的嵌套存儲方式,隨着nested嵌套數量的增多,update和search性能持續下降

3、Parent-Child的嵌套存儲方式,單獨update 父文檔和子文檔,吞吐量提升30%-50%以上,父子文檔聯合查詢性能下降60%-80%左右

4. 總結

本文主要針對ES集羣的一些針對特定場景的參數優化做了簡略的介紹,具體場景需求不一樣,優化目標也不一樣,不一定能完全複用到其他場景,優化思路供參考。

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