2010-12-10 60 views
16

我目前正在评估的MongoDB为我们写重应用...MongoDB的 - 利用多CPU服务器的写重应用

目前MongoDB使用单线程写操作,并且也使用时,它是做写全局锁...是否有可能利用多CPU服务器上的多个CPU来获得更好的写入性能?你对全局写锁定有什么解决方法?

+1

检查http://stackoverflow.com/questions/2954957/mongodb-vs-couchdb-speed-optimization。 – 2010-12-10 09:38:46

回答

15

所以现在,简单的解决方案是碎片。

是的,通常在整个服务器上进行分片。但是,完全可以在一个盒子上分割。您只需启动不同端口上的碎片并为它们提供不同的文件夹。在一个盒子上有2个碎片的Here's a sample configuration

MongoDB团队认识到这是一种低于标准,我知道他们正在寻找更好的方法来实现这一目标。

显然,一旦你在一个盒子上得到多个分片并增加你的写入线程,你将不得不对磁盘IO保持警惕。根据我的经验,我已经能够用单个写入线程饱和磁盘。如果你的插入/更新比较简单,你可能会发现额外的写入线程不会做任何事情。 (Map-Reduces在这里是个例外,分拆绝对有帮助)

+0

谢谢...我会试试看......我们必须做一些大规模的分析,这对于一个功能强大的服务器来说可能是非常有用的。你知道这种配置的任何负面影响吗? – StackUnderflow 2010-12-10 17:11:36

+0

负面影响:在单个节点上设置集群非常复杂,当然还有单点故障。显然,我会首先测试这样一个解决方案,看它是否满足您的需求,我认为通过运行单个节点来查看吞吐量是多少这是公平的。 – 2010-12-13 03:16:31

+0

您为了使您的数据饱和而做了多少次插入/秒磁盘I/O?我无法使用单个线程获得顺序写入饱和度附近的任何地方。 – EhevuTov 2011-10-20 05:21:48

16

不,仍然推荐使用分片来利用多个CPU核心。 如FAQ

拆分指出通过分布在多个的mongod实例的集合,从而允许碎片服务器(即mongos处理)提高并发执行任何数量的操作的同时到各种下游mongod实例

每个mongod实例独立于分片群集中的其他实例,并使用MongoDB读写器锁定)。一个mongod实例上的操作不会阻止任何其他操作。

拆分在一个盒子有其问题,因为一个用户在mongodb-user邮件列表

经过一番显著实验说明,我发现一个MongoDB的碎片守护进程不能使用一个以上的CPU 。在一个24个CPU的盒子上,性能会扩大,直到我们碰到8个左右的碎片,然后又会有另一个限制。

+1

非常感谢您的回答。所以我们的数据库服务器将获得两个四核CPU。 – Philipp 2013-03-14 12:52:39