標籤:
1. 測試載入器
本次測試選取YCSB(Yahoo! Cloud System Benchmark)作為測試用戶端工具。YCSB是Yahoo開源的一個nosql測試載入器,用來測試比較各種nosql的效能,項目地址:https://github.com/brianfrankcooper/YCSB。項目的mongodb目錄下有詳細的安裝和測試方法。
YCSB支援常見的nosql資料庫讀寫,如插入,修改,刪除,讀取等。它可以使用多線程來提高用戶端的效能。可以方便的自訂各種情境,如95%插入5%讀,或者90%讀5%更新5%插入等等。可以自訂資料請求分布方式:平均分布,zipfian(大約20%資料獲得80%訪問請求),最新資料。
2. 測試步驟
1. 選擇用戶端線程數。使用YCSB測試,要選擇一個合適的線程數,否則測試的瓶頸可能在用戶端而不是資料庫,經過比較,大概100個線程時,YCSB達到最大效能。
2.定義測試情境。本次測試的情境如下:
| workloada |
寫多讀少,90%插入,5%讀,5%更新。 |
| workloadb |
讀多寫少,95%讀,5%更新。 |
| workloadc |
讀多寫少,100%讀。 |
| workloadd |
讀多寫少,95%讀,5%插入。 |
| workloadf |
讀多寫少,50%讀,50%讀寫修改同一條記錄。 |
| workloadg |
讀多寫少,60%讀,20%讀,20%更新。 |
3.測試不同數量記錄下的各種情境。分成兩個階段:
1),load。載入資料。命令為:
./bin/ycsb load mongodb -threads 100 -s -P workloads/workloada -p mongodb.url=mongodb://mongos:28000/ycsb?w=0 > outputLoad.txt
執行load 命令時,僅有recordcount參數起作用,如recordcount=60000000表示載入六千萬條記錄。執行run命令時,recordcount不起作用。mongos是叢集中mongos執行個體的ip地址。
2),run。load資料完成後,各種情境運行測試。
測試情境workloada,位於workloads目錄下:
./bin/ycsb run mongodb -threads 100 -s -P workloads/workloada -p mongodb.url=mongodb://mongos:28000/ycsb?w=0 > outputRun.txt
每次load資料前要把上次測試中產生的資料刪除,包括各個分區,設定管理員,mongos等的資料。
3. 測試系統架構
叢集設定管理員的3個執行個體部署在configs伺服器上,YCSB,mongos執行個體,shard1,shard2各自部署在一台伺服器。shard1和shard2都是單獨的mongodb instance,不是replicate set。mongodb 使用2.6版本。
4. 伺服器的配置
|
OS |
CPU |
RAM |
| YCSB |
ubuntu14.04 |
Intel(R) Core(TM) i5-4440 CPU @ 3.10GHz 4核 |
1G |
| mongos |
Red Hat 4.4 |
Intel(R) Xeon(R) CPU E5645 @ 2.40GHz 1核 |
8G |
| shards |
Red Hat 4.4 |
Intel(R) Xeon(R) CPU E5645 @ 2.40GHz 1核 |
16G |
| configs |
ubuntu14.04 |
Intel(R) Core(TM) i5-4440 [email protected] 1核 |
1G |
5. 測試結果
表1, 一個分區,1百萬,1千萬,6千萬,1億記錄時各個情境的輸送量(ops/sec)。
表2,兩個分區,1百萬,1千萬,6千萬記錄時各個情境的輸送量(ops/sec)。
| 資料量(百萬) |
workloada |
workloadb |
workloadc |
workloadd |
workloadf |
workloadg |
| 1 |
4878 |
7352 |
7536 |
7885 |
2131 |
5986 |
| 10 |
4343 |
7282 |
7442 |
6996 |
2164 |
6119 |
| 60 |
1669 |
7242 |
7847 |
7810 |
2577 |
6054 |
| 100 |
157 |
7333 |
6796 |
7766 |
2082 |
4389 |
表1
| 資料量(百萬) |
workloada |
workloadb |
workloadc |
workloadd |
workloadf |
workloadg |
| 1 |
6462 |
7416 |
7518 |
7633 |
2622 |
6777 |
| 10 |
5826 |
8198 |
7664 |
8073 |
2093 |
7376 |
| 60 |
5662 |
7707 |
7546 |
7716 |
2181 |
6540 |
|
|
|
|
|
|
|
表2
6. 測試結果分析
圖1,一個分區時各個情境下輸送量隨記錄量的變化曲線。
圖2,兩個分區時各個情境下輸送量隨記錄量的變化曲線。
圖3,重寫情境(workloada) 不同分區數量的輸送量隨記錄量的變化曲線。
圖4,重讀情境(workloadb) 不同分區數量的輸送量隨記錄量的變化曲線。
圖1
圖2
圖3
圖4
由圖1,workloada可以看出,mongodb的寫效能率先達到瓶頸,隨著記錄數量增加,下降很快,而讀取的效能變化很小。
由圖3和圖4,可以看出,當mongodb遇到寫瓶頸時,增加分區,大大增加寫效能,少量增加讀效能。
可能由於資料量,或者YCSB的瓶頸,測試中mongodb讀效能未出現瓶頸。
7.結論
1.Mongodb的讀效能很高,適合重讀的情境。
2.通過增加分區,可以大大增加mongodb叢集的寫效能, 部分增加讀效能。
3.與關係型資料庫相比,mongodb 的優勢
所以對於不太複雜的查詢情境下,mongodb可以很方便的作為mysql的替代方案,提高db的讀寫能力。對於巨量資料情境,內容管理和交付平台,使用者資料管理中心,日誌平台等都適合使用mongodb。
使用YCSB測試mongodb分區叢集效能