本次測試選取YCSB(Yahoo! Cloud System Benchmark)做爲測試客戶端工具。YCSB是Yahoo開源的一個nosql測試工具,用來測試比較各類nosql的性能,項目地址:https://github.com/brianfrankcooper/YCSB。項目的mongodb目錄下有詳細的安裝和測試方法。mysql
YCSB支持常見的nosql數據庫讀寫,如插入,修改,刪除,讀取等。它可使用多線程來提升客戶端的性能。能夠方便的自定義各類場景,如95%插入5%讀,或者90%讀5%更新5%插入等等。能夠自定義數據請求分佈方式:平均分佈,zipfian(大約20%數據得到80%訪問請求),最新數據。git
1. 選擇客戶端線程數。使用YCSB測試,要選擇一個合適的線程數,不然測試的瓶頸可能在客戶端而不是數據庫,通過比較,大概100個線程時,YCSB達到最大性能。github
2.定義測試場景。本次測試的場景以下:
sql
workloada | 寫多讀少,90%插入,5%讀,5%更新。 |
workloadb | 讀多寫少,95%讀,5%更新。 |
workloadc | 讀多寫少,100%讀。 |
workloadd | 讀多寫少,95%讀,5%插入。 |
workloadf | 讀多寫少,50%讀,50%讀寫修改同一條記錄。 |
workloadg | 讀多寫少,60%讀,20%讀,20%更新。 |
3.測試不一樣數量記錄下的各類場景。分紅兩個階段:mongodb
1),load。加載數據。命令爲:
數據庫
./bin/ycsb load mongodb -threads 100 -s -P workloads/workloada -p mongodb.url=mongodb://mongos:28000/ycsb?w=0 > outputLoad.txtjson
執行load 命令時,僅有recordcount參數起做用,如recordcount=60000000表示加載六千萬條記錄。執行run命令時,recordcount不起做用。mongos是集羣中mongos實例的ip地址。ubuntu
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個實例部署在configs服務器上,YCSB,mongos實例,shard1,shard2各自部署在一臺服務器。shard1和shard2都是單獨的mongodb instance,不是replicate set。mongodb 使用2.6版本。
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 CPU@3.10GHz 1核 | 1G |
表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
圖1,一個分片時各個場景下吞吐量隨記錄量的變化曲線。
圖2,兩個分片時各個場景下吞吐量隨記錄量的變化曲線。
圖3,重寫場景(workloada) 不一樣分片數量的吞吐量隨記錄量的變化曲線。
圖4,重讀場景(workloadb) 不一樣分片數量的吞吐量隨記錄量的變化曲線。
圖1
圖2
圖3
圖4
由圖1,workloada能夠看出,mongodb的寫性能率先達到瓶頸,隨着記錄數量增長,降低很快,而讀取的性能變化很小。
由圖3和圖4,能夠看出,當mongodb遇到寫瓶頸時,增長分片,大大增長寫性能,少許增長讀性能。
可能因爲數據量,或者YCSB的瓶頸,測試中mongodb讀性能未出現瓶頸。
1.Mongodb的讀性能很高,適合重讀的場景。
2.經過增長分片,能夠大大增長mongodb集羣的寫性能, 部分增長讀性能。
3.與關係型數據庫相比,mongodb 的優點
文檔型數據庫,json風格的文件存儲,結構清晰,無需ORM。
複製和高可用性,易於擴展。
自動分片
使用基於文檔的查詢語言,有必定的查詢能力。
任何屬性可索引。
因此對於不太複雜的查詢場景下,mongodb能夠很方便的做爲mysql的替代方案,提升db的讀寫能力。對於大數據場景,內容管理和交付平臺,用戶數據管理中心,日誌平臺等都適合使用mongodb。