MongoDB分庫

jopen 11年前發布 | 18K 次閱讀 MongoDB NoSQL數據庫

測試機配置

  • SAS 硬盤
  • 16GB內存
  • 千兆網
  • 8 cores cpu
  • </ul>

    mongodb

    • 版本: 2.2.3
    • replicaset: 3臺物理機
    • driver:pymongo2.5.2(w=2,safe=True,use_greenlets)
    • </ul>

      分庫前測試結果

      之前有測試過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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!