MongoDB分庫
測試機配置
- SAS 硬盤
- 16GB內存
- 千兆網
- 8 cores cpu </ul>
- 版本: 2.2.3
- replicaset: 3臺物理機
- driver:pymongo2.5.2(w=2,safe=True,use_greenlets) </ul>
mongodb
分庫前測試結果
之前有測試過mongodb的讀寫性能 對于單條數據比較小的應用場景 非常適合 讀寫的吞吐量很不錯 但是我們的應用場景是單條數會超過1MB 實際測試下來的結果是寫鎖非常嚴重 吞吐量保持在20qps左右 但是mongodb的CPU占用率不到70% 內存占用量在40% - 50% 磁盤IO也未到瓶頸 mongostate
查看狀態的時候 寫鎖的比例非常高
給常用查詢的字段加索引
開始測試時 沒有給查詢的字段加索引 使用explain
的結果如下:
db.users.find({'uid':'123456789'}).explain()
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 0,
"nscannedObjects" : 2,
"nscanned" : 2,
"nscannedObjectsAllPlans" : 2,
"nscannedAllPlans" : 2,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 9,
"indexBounds" : {},
}
在查詢的時候 使用的是BasicCursor
沒有對查詢uid
添加索引 導致查詢時需要遍歷所有的ns
添加索引db.users.ensureIndex({'uid':1})
后 再看查詢的解釋
db.users.find({'uid':'123456789'}).explain()
{
"cursor" : "BtreeCursor uid_1",
"isMultiKey" : false,
"n" : 0,
"nscannedObjects" : 0,
"nscanned" : 0,
"nscannedObjectsAllPlans" : 0,
"nscannedAllPlans" : 0,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"uid" : [
[
"123456789",
"123456789"
]
]},
}
添加索引后 吞吐有一定的提升 但是非常有限 我們測試的主要場景是大量的更新操作 查看mongostat
的結果 還是寫鎖嚴重
分庫
mongodb在2.2后的寫鎖是數據庫級別的 所以我們嘗試著進行分庫 在單個replicaset集群上部署多個數據庫 然后進行測試 實際的測試結果為 寫鎖被分散到多個數據庫上 但是local這個數據庫的寫鎖比例突然上升了很多 能到120%+
查看local這個數據庫 里面存的數據
switched to db local
dds:PRIMARY> show collections;
me
oplog.rs
replset.minvalid
slaves
system.indexes
system.replset
上述collections中 me是mongodb的host信息 slaves里面存了secondary和oplog同步的信息 opslog.rs里面記錄的是oplog 懷疑是oplog同步導致local寫鎖比例上升
添加replicaset集群
為了驗證上述猜測 我們在測試的三臺物理機上又搭建了一個replicaset 然后再進行測試 結果非常好 local寫鎖有明顯下降 吞吐量提高到150qps
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!