當 ElasticSearch 的業務量足夠大,好比天天都會產生數百 GB 數據的時候,你就會天然而然的須要一個性能更強的 ElasticSearch 集羣。特別是當你使用的場景是一些典型的大量數據進入的場景,好比網站日誌、用戶行爲記錄、大型電商網站的站內搜索時,一個強勁的 ElasticSearch 是必不可少的組件。在這樣的場景下,如何找到一組合適的 ElasticSearch 集羣?如何評估 ElasticSearch 集羣的性能,就成爲了一個十分重要的因素。html
對於 ElasticSearch 性能測試和壓力測試方面,其實有不少不一樣的方案,好比:node
除了這些定製化的工具意外之外,ElasticSearch 也能夠藉由其 Restful API 來使用Load Runner、JMeter等老牌工具進行測試,這些工具零零散散,各有各的用法和用途,不過,對於廣大開發者而言,仍是官方出的 Rally 更使人滿意。git
在本篇文章中,將會使用 Rally 來完成 ElasticSearch 集羣的壓力測試github
Rally 做爲官方出品的工具,來自官方的信任加成讓他成爲各家進行壓力測試的首選工具。其次, Rally 官方給出了多種默認的數據集(Tracks)。若是你的使用場景覆蓋在這些數據集(好比HTTP 訪問事件數據、地理名稱數據、地理座標點數據、HTTP 請求日誌、問答場景、打車記錄等場景)中,能夠直接使用已有的數據集,來完成測試,而無需製造測試數據。bash
即便你的場景比較特殊,沒法被官方的數據集所覆蓋,也依然能夠根據本身的線上數據,來建立數據集,確保測試效果的準確。網絡
在瞭解了 Rally 後,來具體看一看 Rally 的使用。併發
關於 Rally 的基本安裝,這裏就再也不介紹,總的來講十分簡單,在配置好了 JDK 和 Python 環境之後,只須要執行pip install rally
就能夠完成安裝。若是你的環境複雜,但願以一個更簡單的方式來運行,你也能夠選擇使用 Docker 來運行 Rally ,進行測試。關於更多的安裝方式,你能夠參考 Rally 的安裝文檔.app
在安裝完成了 Rally 後,就能夠開始進行 ElasticSearch 的測試。curl
在測試前,你須要先了解一些基本概念elasticsearch
在瞭解測試的基本概念後,就能夠開始進行壓力測試。
因爲本次測試其實是一次選型的過程,在測試以前,我曾閱讀了 Elastic 官方的權威指南中的硬件部分.在其文檔中提供了對於運轉 ElasticSearch 集羣設備的推薦配置。
所以,我選擇了本來打算購買的三家廠商(阿里雲、騰訊雲、UCloud)的設備進行測試,在具體的配置層面,則在各家購買四臺 8C64G 100GBSSD磁盤的的雲主機來進行測試。
在進行測試前,須要先對已有的三臺設備搭建集羣,並配置集羣連接,確保集羣正常工做。集羣搭建的部分,你能夠參考官方文檔中的Add and remove nodes in your cluster部分。
在完成了集羣的建設後,測試就簡單不少,只須要執行命令,即可以對已經建設好的集羣進行測試,好比:
esrally --track=pmc --target-hosts=10.5.5.10:9200,10.5.5.11:9200,10.5.5.12:9200 --pipeline=benchmark-only
執行完命令後,接下來就是漫長的等待,根據機器的配置和集羣等
在執行了測試命令後,測試完成後,你就能夠得到相應的測試結果。不過,爲了方便進行對比和查看,你能夠在測試的命令中加入參數,從而實現將測試結果導出爲特定的格式。
好比,執行這樣的測試命令,就能夠得到 CSV 格式的測試數據
esrally --track=pmc --target-hosts=10.5.5.10:9200,10.5.5.11:9200,10.5.5.12:9200 --pipeline=benchmark-only -report-format=csv --report-file=~/benchmarks/result.csv
當你獲得了 csv 的結果後,就能夠對數據進行分析和對比了。
當咱們對 Rally 執行測試之後,咱們會拿到大量的數據,而具體這些數據應該如何來看呢?接下來咱們一一來看。
Rally 導出的數據共有 4 列,分別是 Metric(維度)、Task(任務)、Unit(單位)和Result(結果)。
咱們能夠將數據按照 Task 進行切分,你能夠獲得若干組結果,如:
不一樣的組意味着 ElasticSearch 在不一樣場景下的應用,所以,你在對比時,須要按照分組來看數據。而分組內部的數據,就簡單了許多,除了宏觀數據之外,其餘各組的數據基本上都是一個模式的,具體能夠分爲如下 14 組數據。
當你可以理解數據的劃分方式後,對於 Rally 返回的衆多數據就比較好理解了。接下來,咱們以實際例子來看 Rally 返回的數據。
這裏以我測試的數據爲例。
根據每組數據對應的不一樣操做,咱們能夠將其數據分爲若干組,這裏我將數據按照顏色進行了一個基礎的劃分,從上到下依次爲:
首先,先看第一組的索引時間,索引時間共有四個指標:
這四個指標說明了 ElasticSearch 在進行數據處理所須要的索引時間,所以,時間越短越好。
Metric | 騰訊雲 | UCloud | 阿里雲 |
---|---|---|---|
Cumulative indexing time of primary shards | 25.262833333333300 | 19.2662 | 21.40011666666670 |
Min cumulative indexing time across primary shards | 5.0297 | 3.8177666666666700 | 4.2537666666666700 |
Median cumulative indexing time across primary shards | 5.052066666666670 | 3.8252333333333300 | 4.272083333333330 |
Max cumulative indexing time across primary shards | 5.076316666666670 | 3.9190666666666700 | 4.3139 |
在本組測試結果中,騰訊雲的計算時間耗費最長,阿里雲能夠在騰訊的基礎之上,有約 16 % 的性能提高,UCloud 則在騰訊雲的基礎之上提高了 24%。
在測試過程當中,會由於機器的性能等因素,而形成實際測試時間的不一樣。在這三組中,阿里雲是最神奇的一個,由於它測試時間達到了6個小時。而 UCloud 和騰訊雲則分別在 3 小時和 4 小時左右,實際的測試體驗仍是有很大的差距。若是你要復現相應的實驗,建議你在早上進行,這樣出測試結果的時候恰好還在白天。
接下來看合併時間的數據
合併時間組結果相似於索引時間組,不一樣的是測量的數據 Merge 時間。和 index 相似,時間越短越好,合併數量越大越好。
Metric | 騰訊雲 | UCloud | 阿里雲 | Unit |
---|---|---|---|---|
Cumulative merge time of primary shards | 12.6379 | 7.717366666666670 | 11.083600000000000 | min |
Cumulative merge count of primary shards | 90 | 116 | 99 | |
Min cumulative merge time across primary shards | 2.2037 | 1.43605 | 1.8695333333333300 | min |
Median cumulative merge time across primary shards | 2.5391166666666700 | 1.5713166666666700 | 2.2406333333333300 | min |
Max cumulative merge time across primary shards | 2.733966666666670 | 1.6538166666666700 | 2.5342 | min |
在本組測試結果中,騰訊雲的計算時間耗費最長,阿里雲能夠在騰訊的基礎之上,有約 9 % 的性能提高,UCloud 則在騰訊雲的基礎之上提高了 30%~40%
其餘幾組相似的數據,這裏就再也不一一介紹,你們能夠自行下載文章最後的數據進行分析,評估,得出結論。
除了宏觀數據之外,Rally 返回數據中極大比例的是各類不一樣場景下的數據,這裏,咱們也選兩組數據進行對比分析,看一看這些數據應該如何理解。
首先,咱們看一下 node-stats 組的結果。
node-stats 組的結果是針對 node-stats 命令的數據分析結果。這裏的吞吐量越大越好,時延則越小越好。
Metric | Task | 騰訊雲 | UCloud | 阿里雲 | Unit |
---|---|---|---|---|---|
Min Throughput | node-stats | 90.07 | 90.07 | 90.07 | ops/s |
Median Throughput | node-stats | 90.11 | 90.11 | 90.12 | ops/s |
Max Throughput | node-stats | 90.39 | 90.44 | 90.42 | ops/s |
50th percentile latency | node-stats | 2.1798378893436200 | 1.491405833803580 | 1.8348334997426700 | ms |
90th percentile latency | node-stats | 2.521278689346220 | 1.8698435997976000 | 1.9605179221798600 | ms |
99th percentile latency | node-stats | 3.795880397665310 | 3.173550112005610 | 2.901402467268780 | ms |
99.9th percentile latency | node-stats | 12.884928510055500 | 9.625145497986580 | 17.55732728102550 | ms |
100th percentile latency | node-stats | 18.134295778509100 | 10.29519444455220 | 20.23470633321270 | ms |
50th percentile service time | node-stats | 2.111824500389050 | 1.4231965001272300 | 1.7749374997038100 | ms |
90th percentile service time | node-stats | 2.453031599361570 | 1.7979749004553000 | 1.8996412000888100 | ms |
99th percentile service time | node-stats | 3.686133219835030 | 2.9536031294901500 | 2.8262974901645100 | ms |
99.9th percentile service time | node-stats | 12.818092870313500 | 9.55140776220657 | 8.42020982098726 | ms |
100th percentile service time | node-stats | 16.345433999958900 | 10.22649399965300 | 20.173265999801500 | ms |
在本組測試結果中,阿里雲、騰訊雲、UCloud 在性能方面沒有較大的差距。
相似的,咱們能夠對比 country_agg_uncached 組的結果
Metric | Task | 騰訊雲 | UCloud | 阿里雲 | Unit |
---|---|---|---|---|---|
Min Throughput | country_agg_uncached | 3.60 | 3.61 | 3.60 | ops/s |
Median Throughput | country_agg_uncached | 3.60 | 3.61 | 3.60 | ops/s |
Max Throughput | country_agg_uncached | 3.60 | 3.61 | 3.61 | ops/s |
50th percentile latency | country_agg_uncached | 259.7333187786720 | 116.19688144446600 | 197.52657255594400 | ms |
90th percentile latency | country_agg_uncached | 264.3554400450740 | 125.7470980999640 | 201.85445903407500 | ms |
99th percentile latency | country_agg_uncached | 270.25939978284400 | 132.88548155585000 | 205.84624599263400 | ms |
100th percentile latency | country_agg_uncached | 278.76161922358700 | 133.7250455553660 | 206.57134322209500 | ms |
50th percentile service time | country_agg_uncached | 259.5503135007680 | 115.99637649987900 | 197.4296050002520 | ms |
90th percentile service time | country_agg_uncached | 264.2378849999660 | 125.53214089985000 | 201.7642059001450 | ms |
99th percentile service time | country_agg_uncached | 270.08045803115200 | 132.6980350402570 | 205.7533532799970 | ms |
100th percentile service time | country_agg_uncached | 278.6570290008970 | 133.52231299995800 | 206.47192300020800 | ms |
error rate | country_agg_uncached | 0.00 | 0.00 | 0.00 | % |
在本組測試結果中,阿里雲、騰訊雲、UCloud 在吞吐量方面沒有較大的差距,時延方面 UCloud 會更好一點。
關於更多的數據,咱們不在這裏一一介紹,我將測試數據已經附在了文章的最後,你能夠經過下載數據,自行分析,來練習 Rally 的使用和數據分析。
Rally 在執行時,須要下載相應的數據進行真實場景下的模擬,在這種狀況下,Rally 須要從 AWS S3 上下載一些數據包,用於本地的測試。但國內的設備對於 S3 的訪問不算太友好,常常會在下載的時候出現問題,所以,你能夠選擇前置下載數據,這樣在測試的時候能夠直接使用本地的數據來完成測試,減小失敗的可能。
想要前置下載數據也很簡單隻須要執行以下命令:
curl -O https://raw.githubusercontent.com/elastic/rally-tracks/master/download.sh chmod u+x download.sh ./download.sh geonames cd ~ tar -xf rally-track-data-geonames.tar
在執行 download.sh 時加入 track 名,就能夠下載對應 track 數據的壓縮包到本地,你能夠根據本身的實際使用狀況,來決定使用什麼樣的 track 模擬真實場景。
在業務真正使用 ElasticSearch 以前,你能夠像我同樣,藉助於 Rally 對備選的 ElasticSearch 集羣進行壓力測試,並經過對壓測結果進行分析,從而得到明確的選型建議。好比,在我此次測試中,顯然 UCloud 優於其餘兩家,是一個性價比 更高的選擇。固然,這是一個實驗環境下的壓測,仍是須要根據具體的業務場景作測試來進行選型,更爲科學,不過但願壓測方法能給予你們參考,也歡迎你們在後續實際的測試過程當中給予我反饋。
本文涉及到的測試數據都可以在下載地址找到。