Linux

MongoDB 主從 - Windows 或 Linux

  • February 1, 2013

我最近將我的 MS Sql Server DB 移動到 Windows Server 2008 上的 MongoDB (2.0)。它包含 2 個具有以下統計資訊的數據庫。(兩個數據庫每秒大約有 100 次讀取/寫入)。這些寫入由執行在同一數據庫伺服器上的 .Net 應用程序執行。

> db.stats()
{
       "db" : "FirstDB",
       "collections" : 112,
       "objects" : 94020788,
       "avgObjSize" : 62.86065307174409,
       "dataSize" : 5910208136,
       "storageSize" : 14340792320,
       "numExtents" : 1277,
       "indexes" : 110,
       "indexSize" : 4279800784,
       "fileSize" : 27837595648,
       "nsSizeMB" : 16,
       "ok" : 1
}

> db.stats()
{
       "db" : "SecondDB",
       "collections" : 10,
       "objects" : 2926198,
       "avgObjSize" : 158.5025346883567,
       "dataSize" : 463809800,
       "storageSize" : 720027648,
       "numExtents" : 49,
       "indexes" : 8,
       "indexSize" : 115248896,
       "fileSize" : 2080374784,
       "nsSizeMB" : 16,
       "ok" : 1
}

我發現 MongoDB 可以以所需的讀/寫速度保存我的所有數據。現在我需要專家的幫助來加強我的單伺服器(數據庫 + 應用程序)設置的可靠性;

但是,在 1 個月的時間裡,我遇到了以下 MongoDB-On-Windows 問題;

  • 由於收集損壞而導致意外關閉
  • MongoDB 沒有為已刪除的對象釋放磁碟空間(目前大約 28 GB 並且還在增長)
  • 頁面錯誤數量增加
  • 無法控制 RAM 中的數據(無法在 RAM 中預載入所需數據並在幾分鐘後刪除)
  • 常見的數據庫錯誤,例如:無法從傳輸連接中讀取數據…

對我來說,可靠性/備份/性能的最佳救援設置是什麼?

  1. 將 MongoDB 移動到 Linux(前提是我使用此數據庫的 .Net 應用程序將駐留在同一 LAN 內的 Windows Server 上)?或者
  2. 使用 Windows 上的 Master 和 Linux 上的 Slave 設置 2 台伺服器副本集?或者
  3. 你建議什麼…?

編輯-1:

> db.serverStatus()
{
       "host" : "OWNEROR-GTPD0H9",
       "version" : "2.2.2",
       "process" : "mongod",
       "pid" : 5972,
       "uptime" : 2246315,
       "uptimeMillis" : NumberLong("2246314871"),
       "uptimeEstimate" : 1418073,
       "localTime" : ISODate("2013-02-01T18:20:48.371Z"),
       "locks" : {
               "." : {
                       "timeLockedMicros" : {
                               "R" : NumberLong(1009609910),
                               "W" : NumberLong("41166641284")
                       },
                       "timeAcquiringMicros" : {
                               "R" : NumberLong("233444382285"),
                               "W" : NumberLong("26675293061")
                       }
               },
               "admin" : {
                       "timeLockedMicros" : {
                               "r" : NumberLong("20598738435"),
                               "w" : NumberLong(0)
                       },
                       "timeAcquiringMicros" : {
                               "r" : NumberLong("681905051780"),
                               "w" : NumberLong(0)
                       }
               },
               "local" : {
                       "timeLockedMicros" : {
                               "r" : NumberLong(7054206),
                               "w" : NumberLong(0)
                       },
                       "timeAcquiringMicros" : {
                               "r" : NumberLong(323140436),
                               "w" : NumberLong(0)
                       }
               },
               "FirstDB" : {
                       "timeLockedMicros" : {
                               "r" : NumberLong("40372661580"),
                               "w" : NumberLong("54059509747")
                       },
                       "timeAcquiringMicros" : {
                               "r" : NumberLong("769458843030"),
                               "w" : NumberLong("357708107433")
                       }
               },
               "SecondDB" : {
                       "timeLockedMicros" : {
                               "r" : NumberLong("25053503869"),
                               "w" : NumberLong("395081595504")
                       },
                       "timeAcquiringMicros" : {
                               "r" : NumberLong("69429086729"),
                               "w" : NumberLong("9163194312205")
                       }
               }
       },
       "globalLock" : {
               "totalTime" : NumberLong("2246314871000"),
               "lockTime" : NumberLong("41166641284"),
               "currentQueue" : {
                       "total" : 54,
                       "readers" : 52,
                       "writers" : 2
               },
               "activeClients" : {
                       "total" : 2,
                       "readers" : 0,
                       "writers" : 2
               }
       },
       "mem" : {
               "bits" : 64,
               "resident" : 69,
               "virtual" : 34059,
               "supported" : true,
               "mapped" : 16793,
               "mappedWithJournal" : 33586
       },
       "connections" : {
               "current" : 114,
               "available" : 19886
       },
       "extra_info" : {
               "note" : "fields vary by platform",
               "page_faults" : 631285910,
               "usagePageFileMB" : 6848,
               "totalPageFileMB" : 49132,
               "availPageFileMB" : 34274,
               "ramMB" : 24567
       },
       "indexCounters" : {
               "note" : "not supported on this platform"
       },
       "backgroundFlushing" : {
               "flushes" : 37430,
               "total_ms" : 86130745,
               "average_ms" : 2301.115281859471,
               "last_ms" : 3853,
               "last_finished" : ISODate("2013-02-01T18:19:49.233Z")
       },
       "cursors" : {
               "totalOpen" : 227,
               "clientCursors_size" : 227,
               "timedOut" : 125,
               "totalNoTimeout" : 226
       },
       "network" : {
               "bytesIn" : 46807928165,
               "bytesOut" : 24400717839,
               "numRequests" : 462799358
       },
       "opcounters" : {
               "insert" : 92590009,
               "query" : 92755757,
               "update" : 183285338,
               "delete" : 7489,
               "getmore" : 1004,
               "command" : 94208472
       },
       "asserts" : {
               "regular" : 0,
               "warning" : 0,
               "msg" : 0,
               "user" : 97431,
               "rollovers" : 0
       },
       "writeBacksQueued" : false,
       "dur" : {
               "commits" : 17,
               "journaledMB" : 0.139264,
               "writeToDataFilesMB" : 0.033338,
               "compression" : 2.2571516556184057,
               "commitsInWriteLock" : 0,
               "earlyCommits" : 0,
               "timeMs" : {
                       "dt" : 3291,
                       "prepLogBuffer" : 0,
                       "writeToJournal" : 8,
                       "writeToDataFiles" : 1,
                       "remapPrivateView" : 38
               }
       },
       "recordStats" : {
               "accessesNotInMemory" : 3942359,
               "pageFaultExceptionsThrown" : 15956,
               "FirstDB" : {
                       "accessesNotInMemory" : 163718,
                       "pageFaultExceptionsThrown" : 6931
               },
               "SecondDB" : {
                       "accessesNotInMemory" : 3778641,
                       "pageFaultExceptionsThrown" : 9025
               },
               "admin" : {
                       "accessesNotInMemory" : 0,
                       "pageFaultExceptionsThrown" : 0
               },
               "local" : {
                       "accessesNotInMemory" : 0,
                       "pageFaultExceptionsThrown" : 0
               }
       },
       "ok" : 1
}

我建議不要使用 Windows 來託管 MongoDB 伺服器。以下是一些原因:

  1. 您已經看到了意外的行為,例如意外關機、磁碟空間問題、RAM 問題等等。
  2. 支持社區正在“期待”Linux 上的標準 MongoDB,它使一切變得更容易,尤其是當您獲得社區支持時。
  3. 最近有人發布了關於 Windows 上的 MySQL 伺服器被不兼容的升級破壞的文章,這並不完全超出想像可能會發生同樣事情的可能性,因為大多數更新將針對 SQL Server 之類的東西進行測試,但可能不會針對 Mongo .

我會更加謹慎地在 Linux 上執行 Mongo,並在不同的作業系統上使用 Slave。在某種程度上,我什至會擔心在不同的 Linux 發行版上執行從屬設備(主要是因為 glibc 的變化,等等)。我無法開始想像我會看到這樣的集群是一件好事的情況。

所以這是計劃:

遷移您的 MongoDB 伺服器,以便它們在 linux 上。嚴重地。

增加 MongoDB 伺服器的數量:一個 2 伺服器副本集很好,除了有奇數個伺服器(尤其是奇數素數)意味著多數選擇更容易,如果你有 2 個伺服器,並且任何一個都看不到對方,那麼你就會遇到一個難以解決的腦裂場景。

您可以有 2 個主伺服器和一個進行仲裁的節點..

如果您有 3、5、7 個伺服器,那麼您至少有一個可以作為仲裁者的節點,並決定哪個集是活動集。這就是為什麼10Gen 推薦的最低限度是 3 人組。

引用自:https://serverfault.com/questions/472963