Linux
MongoDB 主從 - Windows 或 Linux
我最近將我的 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 中預載入所需數據並在幾分鐘後刪除)
- 常見的數據庫錯誤,例如:無法從傳輸連接中讀取數據…
對我來說,可靠性/備份/性能的最佳救援設置是什麼?
- 將 MongoDB 移動到 Linux(前提是我使用此數據庫的 .Net 應用程序將駐留在同一 LAN 內的 Windows Server 上)?或者
- 使用 Windows 上的 Master 和 Linux 上的 Slave 設置 2 台伺服器副本集?或者
- 你建議什麼…?
編輯-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 伺服器。以下是一些原因:
- 您已經看到了意外的行為,例如意外關機、磁碟空間問題、RAM 問題等等。
- 支持社區正在“期待”Linux 上的標準 MongoDB,它使一切變得更容易,尤其是當您獲得社區支持時。
- 最近有人發布了關於 Windows 上的 MySQL 伺服器被不兼容的升級破壞的文章,這並不完全超出想像可能會發生同樣事情的可能性,因為大多數更新將針對 SQL Server 之類的東西進行測試,但可能不會針對 Mongo .
我會更加謹慎地在 Linux 上執行 Mongo,並在不同的作業系統上使用 Slave。在某種程度上,我什至會擔心在不同的 Linux 發行版上執行從屬設備(主要是因為 glibc 的變化,等等)。我無法開始想像我會看到這樣的集群是一件好事的情況。
所以這是計劃:
遷移您的 MongoDB 伺服器,以便它們在 linux 上。嚴重地。
增加 MongoDB 伺服器的數量:一個 2 伺服器副本集很好,除了有奇數個伺服器(尤其是奇數素數)意味著多數選擇更容易,如果你有 2 個伺服器,並且任何一個都看不到對方,那麼你就會遇到一個難以解決的腦裂場景。
您可以有 2 個主伺服器和一個僅進行仲裁的節點..
如果您有 3、5、7 個伺服器,那麼您至少有一個可以作為仲裁者的節點,並決定哪個集是活動集。這就是為什麼10Gen 推薦的最低限度是 3 人組。