我最近将我的 MS Sql Server DB 移至 Windows Server 2008 上的 MongoDB (2.0)。它包含 2 个数据库,具有以下统计数据。(两个数据库每秒的读取/写入次数约为 100 次)。这些写入由在同一 DB 服务器上运行的 .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 上,从服务器在 Linux 上?或者
- 你建议什么……?
編輯-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
}
答案1
我建议不要使用 Windows 来托管 MongoDB 服务器。原因如下:
- 您已经看到了意外行为,例如意外关机、磁盘空间问题、RAM 问题等等。
- 支持社区“期待”Linux 上的标准 MongoDB,它使一切变得更容易,特别是当您寻求社区支持时。
- 最近有人发布了有关 Windows 上的 MySQL 服务器因不兼容升级而出现故障的帖子,不难想象同样的事情可能会发生,因为大多数更新都会针对 SQL Server 之类的东西进行测试,但可能不会针对 Mongo 进行测试。
我会更加谨慎地在 Linux 上运行 Mongo,而使用不同操作系统上的从属服务器。在某种程度上,我甚至会担心在不同 Linux 发行版上运行从属服务器(主要是因为 glibc 变化等)。我无法想象在什么情况下我会认为这样的集群是好事。
计划如下:
迁移您的 MongoDB 服务器,以便它们在 Linux 上。认真的说。
增加 MongoDB 服务器的数量:2 服务器副本集美好的,除了拥有奇数个服务器(特别是奇质数)意味着多数选择要容易得多之外,如果您有 2 个服务器,并且它们都无法互相看到,那么您就会遇到难以解决的裂脑场景。
你可以有 2 个主服务器,并且一个节点仅有的是否进行仲裁..
如果你有 3、5、7 台服务器,那么你至少有一个节点可以作为仲裁者并决定哪个集合是活动集。这就是为什么建议的最低配置为 3 成员组由 10Gen 提供。