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集羣的一些針對特定場景的參數優化做了簡略的介紹,具體場景需求不一樣,優化目標也不一樣,不一定能完全複用到其他場景,優化思路供參考。