2013-07-24 49 views
3

我有具有併發集合讀作,也是應用程序的某些部分更新同一個集合,但在裝載過程中每次讀取和更新操作採取了這麼多的時間,它會隨着時間的推移很慢如何避免在MongoDB中鎖定


下面是一些查詢

nscanned:4 nupdated:2 keyUpdates:3 numYields: 1 locks(micros) w:2475463 10247ms 
nscanned:4 nupdated:2 keyUpdates:2 numYields: 1 locks(micros) w:2077481 1054ms 

集只有70K記錄的日誌。 併發讀取和寫入幾乎10

這是我已經做了

拆分與
  1. 3成員副本集

  2. 拆分鍵被散列和兩個DB和收藏水平分片是enble

  3. 每個副本盒子有足夠的能力和RAM。

  4. 查詢是有界的索引和db.collection.find().explain()有這個輸出

    { 
        "cursor" : "BtreeCursor fp.ulc_1_c_1_p_1", 
        "isMultiKey" : true, 
        "n" : 0, 
        "nscannedObjects" : 2, 
        "nscanned" : 2, 
        "nscannedObjectsAllPlans" : 2, 
        "nscannedAllPlans" : 2, 
        "scanAndOrder" : false, 
        "indexOnly" : false, 
        "nYields" : 0, 
        "nChunkSkips" : 0, 
        "millis" : 0, 
        "indexBounds" : { 
         "fp.ulc" : [ 
          [ 
           "0ca01c47c984b5583d455e42aafded2c", 
           "0ca01c47c984b5583d455e42aafded2c" 
          ] 
         ], 
         "c" : [ 
          [ 
           false, 
           false 
          ] 
         ], 
         "p" : [ 
          [ 
           1372062247612, 
           1.7976931348623157e+308 
          ] 
         ] 
        } 
    } 
    

我也曾嘗試設置閱讀偏好與繼發但過了一段時間後,它也進入緩慢 另外我注意到mongostat中的鎖是從mongostat輸出的

insert query update delete getmore command flushes mapped vsize res faults  locked db idx miss %  qr|qw ar|aw netIn netOut conn set repl  time 
    *0  *0  6  *0  4  2|0  0 54.4g 109g 1.74g  0 collectDb:199.7%   0  6|0  0|1  3k 130k 21 set1 PRI 08:27:55 
    *0  *0  15  *0  11  8|0  1 54.4g 109g 1.74g  0 collectDb:200.1%   0  6|0  0|1 11k 357k 21 set1 PRI 08:27:58 
    7  *0  34  *0  18 26|0  0 54.4g 109g 1.75g  0 collectDb:202.9%   0  6|0  0|1 36k 362k 21 set1 PRI 08:28:00 
    1  *0  13  *0  8  7|0  0 54.4g 109g 1.75g  0 collectDb:192.3%   0  6|0  0|1 12k 287k 21 set1 PRI 08:28:03 
    1  *0  9  *0  7  8|0  0 54.4g 109g 1.75g  0 collectDb:196.1%   0  6|0  0|1  5k 258k 21 set1 PRI 08:28:04 
    5  *0  20  *0  10 13|0  0 54.4g 109g 1.75g  0 collectDb:207.7%   0  6|0  0|1 23k 214k 21 set1 PRI 08:28:08 
    8  *0  38  *0  21 29|0  0 54.4g 109g 1.74g  0 collectDb:215.9%   0  5|0  0|1 40k 548k 21 set1 PRI 08:28:12 
    6  *0  44  *0  24 22|0  0 54.4g 109g 1.75g  0 collectDb:199.5%   0  3|0  0|1 45k 509k 21 set1 PRI 08:28:15 
    2  4  27  *0  11 28|0  0 54.4g 109g 1.75g  0 collectDb:169.2%   0  6|0  0|1 21k 318k 21 set1 PRI 08:28:18 
    2  *0  29  *0  18 20|0  0 54.4g 109g 1.74g  0 collectDb:255.5%   0  5|0  0|1 28k 588k 21 set1 PRI 08:28:24 
+0

正在做什麼樣的更新?他們是增加新的領域還是隻更換現有的領域? – Sai

+0

他們在現有文檔中添加新密鑰 –

+0

通過添加新密鑰,您究竟意味着什麼?你能否詳細說明一下。謝謝 – Sai

回答

3

所以我終於想出了一些避免在mongodb中鎖定的最佳方法。

我做了

  • 更新我的MongoDB到最新的穩定產能的釋放2.4.8 from here

  • 更新我的EBS優化的IOPS 2000 Raid 10 ebs

  • 監視我的慢查詢從mongod.log文件,併爲每個驅動器還IOWAIT。

  • 增加了一些多鍵索引和化合物指數法From Mongodb indexs docs

  • ,也是我觀看每個EC2實例包括副本集的初級和次級部件的RAM的消耗。

  • Change the instance輸入Ebs優化與吉比特以太網接口和每個服務器上超過16 gb ram,以便大多數時間ram可用於索引和當前數據集。

  • 很好閱讀Documentation爲亞馬遜實例和他們的最佳用例,以便您可以更好地理解您的要求。


雖然鎖定是MongoDB中的一個主要問題,但我認爲他們是在集合級別鎖定工作,所以可能會在即將到來的版本,它可以解決幾乎所有涉及到性能下降,由於鎖定。 這裏是jira鏈接,你可以檢查狀態。