在MongoDB 2.2中为每个集合创建不同的数据库

7
MongoDB 2.2相比之前版本,针对每个数据库有一个写锁,而不是全局写锁。因此,如果我将每个集合存储在单独的数据库中,可以有效地实现每个集合的写锁(这将使其看起来像MyISAM的表级锁定)。这种方法是否有缺陷?

1
你想这样做是因为你看到写锁限制了你的写入吞吐率吗? - Asya Kamsky
是的,我一直在从不同的数据源下载数据,然后将批量插入发送到数据库,而且不仅有一个程序发送这些批量插入,而是有多个程序。 - lovesh
我不理解关闭标志的原因。 - lovesh
我知道你正在向数据库发送批量插入,但是你是否遇到了写锁定引起的问题,或者你只是认为你需要将集合拆分成单独的数据库? - Asya Kamsky
1
似乎不太可能 - 我可以在我的笔记本电脑上使用多个线程向同一集合写入40,000个文档每秒,而且在这种情况下只有一个单独的写锁。除非您认为写锁是限制因素(即您的写入正在等待写锁而不是等待I/O带宽或因为它们正在更新多个索引等),否则拆分可能没有帮助。 - Asya Kamsky
显示剩余5条评论
2个回答

6

锁定的一个关键限制是local数据库。该数据库包括用于复制的oplog集合。

如果您正在生产环境中运行,应该使用副本集。如果使用副本集,则需要注意对该数据库的写入锁定效果。

如果这些集合都在等待oplog,那么将其拆分成10个DB毫无意义。

在大步骤重新编写之前,请确保oplog不会引起问题。

此外,请注意,MongoDB实现了基于数据库的安全性。如果使用任何安全功能,则现在要创建更多的数据库来保护。


我明白你的意思,但我对oplog不是非常熟悉,不过我现在应该明白了。不错的观点。 - lovesh
盖茨,你能否解释一下如何测量oplog与我的数据库之间的锁争用情况? - expert

2

是的,这样可以行得通。10gen在他们关于锁定的讲座中实际上提供了这个选项。

我可能会将每个集合都隔离开来。大多数数据库似乎有2-5个高活动集合。为了简单起见,最好将低活动集合组合在一个数据库中,将高活动集合放在它们自己的数据库中。


2
谢谢。您能指引我一些演讲或链接,让我可以看到更多相关内容吗? - lovesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接