YCSB是Yahoo開源的用於測試數據庫(主要是nosql)的性能框架,可以測試Hbase, mongo, redis,elasticSearch等,本文主要介紹壓測elasticsearch的流程。
1.安裝下載YCSB
git clone https://github.com/brianfrankcooper/YCSB.git
clone完成後,看項目目錄結構能發現,有兩個elasticsearch相關的項目
其中elasticsearch支持的版本是2.x, elasticsearch5支持的版本是5.x, 而目前公司的es版本已經升級至7.x,在YCSB中提交記錄中發現了一個版本,https://github.com/brianfrankcooper/YCSB/pull/1469 雖還未合併到主分支,但我們可以下下來,試一下。
重新拉取新分支代碼 :
git clone https://github.com/xosk31/YCSB.git
成功獲取到elasticsearch7的版本
2. 編譯打包
mvn -pl elasticsearch7 -am clean package
打包成功後:
在YCSB/elasticsearch7/target目錄下生成一個YCSB的啓動包:ycsb-elasticsearch7-binding-0.18.0-SNAPSHOT.tar.gz
解壓:tar -xzvf ycsb-elasticsearch7-binding-0.18.0-SNAPSHOT.tar.gz
進入ycsb-elasticsearch7-binding-0.18.0-SNAPSHOT目錄,可看到目錄結構如下:
LICENSE.txt NOTICE.txt README.md bin lib workloads
workloads目錄裏有預設的workloada/b/c/d/e/f幾個文件,打開後,結構類似,都有如下參數,唯一不同是的是幾個 *proportion的值不一樣
recordcount=1000 //測試數據集的總數 operationcount=1000 //測試中執行的操作總數 workload=site.ycsb.workloads.CoreWorkload readallfields=true readproportion=0.5 //讀數據佔操作總數的比例 updateproportion=0.5 //更新數據佔操作總數的比例 scanproportion=0 //掃描數據佔操作總數的比例 insertproportion=0 //寫數據佔操作總數的比例 requestdistribution=zipfian
測試過程中,我們可以根據自己的實際情況,隨意的設置這幾個*proportion的值
3.壓測流程
1.在待壓測集羣上新建測試索引
YCSB不負責表的創建,所以需要自己手動創建用於測試的索引。例如在elasticsearch中,需要手動在待測集羣上創建測試索引test
2.選擇合適的 workload
本次主要做讀和寫,所以只需要準備兩個workload, 一個insertproportion值爲1, 其餘均爲0; 另一個readproportion值爲1,其餘均爲0
3.選擇合適的運行時參數
在當前目錄新增配置文件myproperties.data, 內容如下:可根據自己的實際情況配置
es.cluster.name=tj-es-staging //es集羣名 es.index.name= middle_review_test es.index.key=middle_review_test //es索引名,提前已經建好的測試索引 es.number_of_shards=1 //es的分片數 es.number_of_replicas=1 //分片的副本數 es.remote=true //是否是遠程測試 es.newdb=false es.hosts.list=tjstaging.api.es.srv:80 //es集羣的ip或者域名:port, 多個用逗號隔開 es.security.ssl=false //是否需要進行SSL證書驗證 es.security.ssl.path=changeme //SSL證書目錄 es.authentication=true //是否需要身份驗證 es.credentials.user=changeme //用戶名 es.credentials.password=changeme //密碼
本次qps預設爲30, 100, 200 ,所以將 -threads分別設置爲30, 100, 200即可。除了在 workload 中配置參數外,YCSB 還支持其他運行時參數,比較有用的是-threads,用於設置
客戶端線程數,默認爲 1
4.裝載數據(loading phase)
./bin/ycsb load elasticsearch7 -P workloads/workloada -P myproperties.data -s
裝載數據的主要作用是,爲測試做數據準備,比如需要壓測更新操作,若沒有load操作,則會提示待更新的數據不存在。
可以觀察下裝在數據的輸出日誌,無論配置的workloada是什麼樣的,都只執行insert操作。
[OVERALL], RunTime(ms), 16220 [OVERALL], Throughput(ops/sec), 61.652281134401974 [TOTAL_GCS_PS_Scavenge], Count, 2 [TOTAL_GC_TIME_PS_Scavenge], Time(ms), 23 [TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.14180024660912455 [TOTAL_GCS_PS_MarkSweep], Count, 0 [TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0 [TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0 [TOTAL_GCs], Count, 2 [TOTAL_GC_TIME], Time(ms), 23 [TOTAL_GC_TIME_%], Time(%), 0.14180024660912455 [CLEANUP], Operations, 1 [CLEANUP], AverageLatency(us), 2133.0 [CLEANUP], MinLatency(us), 2132 [CLEANUP], MaxLatency(us), 2133 [CLEANUP], 95thPercentileLatency(us), 2133 [CLEANUP], 99thPercentileLatency(us), 2133 [INSERT], Operations, 1000 [INSERT], AverageLatency(us), 14927.496 [INSERT], MinLatency(us), 9568 [INSERT], MaxLatency(us), 76351 [INSERT], 95thPercentileLatency(us), 23343 [INSERT], 99thPercentileLatency(us), 44575 [INSERT], Return=OK, 1000
5.運行測試(transaction phase)
壓測qps 30:
./bin/ycsb run elasticsearch7 -P workloads/workloada -P myproperties.data -s -threads 30
壓測qps 100:
./bin/ycsb run elasticsearch7 -P workloads/workloada -P myproperties.data -s -threads 100
壓測qps 200:
./bin/ycsb run elasticsearch7 -P workloads/workloada -P myproperties.data -s -threads 200
6.結果解析
Operations 執行的操作數
AverageLatency 平均響應時間
MinLatency 最小響應時間
MaxLatency 最大響應時間
95thPercentileLatency p95
99thPercentileLatency p99
根據最終的結果,用excel繪製柱狀圖,效果如下:
寫AverageLatency 寫p99
讀AverageLatency 讀p99