MongoDB Master and Slave – Windows或Linux

我最近把我的MS Sql Server数据库移到了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可以以所需的读写速度保存所有的数据。 现在我需要专家的帮助来强化我的单服务器(DB +应用程序)设置的可靠性;

但是,在1个月的时间里,我遇到了MongoDB-On-Windows问题。

  • 意料之外的关机导致了腐败的收集
  • MongoDB不释放已删除对象的磁盘空间(目前其大约28 GB,并且正在增长)
  • 页面错误数量增加
  • 无法控制RAM中的数据(无法预先加载RAM中的所需数据并在几分钟后删除)
  • 频繁的数据库错误,如:无法从传输连接读取数据…

对于可靠性/备份/性能来说,最好的救援设置是什么?

  1. 移动MongoDB到Linux(假设我的.Net应用程序使用这个数据库将驻留在同一个局域网内的Windows Server上)? 要么
  2. 使用Windows上的Master和Linux上的Slave来设置双服务器副本集? 要么
  3. 你build议…?

编辑-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 } 

我build议不要使用Windows来托pipeMongoDB服务器。下面是几个原因:

  1. 您已经看到意外的行为,例如意外的closures,磁盘空间问题,RAM问题等等。
  2. 支持社区在Linux上“期待”标准的MongoDB,这使得一切变得更加简单,特别是当你在社区支持之后。
  3. 有人最近发布了关于Windows上的MySQL服务器的一个不兼容升级的问题,这并不完全超出了可能会出现同样的情况的可能性,因为大多数更新将会针对诸如SQL Server之类的东西进行testing,但可能不会针对Mongo 。

我更加谨慎地在Linux上运行Mongo,而在另一个OS上运行Slave。 我甚至担心在不同的Linux发行版上运行一个slave(主要是因为glibc的变化,等等)。 我不能想象在什么情况下,我会看到像这样的群集是一件好事。

所以这是计划:

迁移你的MongoDB服务器,使它们在Linux上。 认真。

增加MongoDB服务器的数量:双服务器副本集是好的 ,除了有奇数个服务器(特别是奇素数)意味着大多数select更容易,如果你有2个服务器,而且没有人能够看到彼此,那么你有一个尴尬的解决裂脑情况。

你可以有2个主服务器和一个只做仲裁的节点 。

如果你有3个,5个,7个服务器,那么你至less有一个节点可以作为仲裁者 ,并且决定哪一组是活动集。 这就是为什么一个3人组是由10Gen 推荐的最小值 。