我目前正在评估MongoDb的重写应用程序......
目前,MongoDb使用单线程进行写操作,并且在执行写操作时也使用全局锁...是否可以在多CPU服务器上利用多个CPU来获得更好的写入性能?全局写锁的解决方法是什么?
答案 0 :(得分:17)
不,仍建议使用分片来利用多个CPU核心。 如FAQ
中所述Sharding通过在多个mongod实例上分发集合来提高并发性,允许分片服务器(即 mongos进程 )同时执行任意数量的操作到各个下游 mongod实例 。
每个mongod实例独立于分片群集中的其他实例,并使用MongoDB reader-writer锁定。一个mongod实例上的操作不会阻止其他任何操作。
单个框上的分片存在问题,正如一位用户在mongodb-user邮件列表中所述
经过一些重要的实验,我发现一个MongoDB分片守护进程不能使用多个CPU。在一个24 CPU的盒子上,性能可以扩展,直到我们达到大约8个分片,然后又有另一个限制。
答案 1 :(得分:16)
所以现在,简单的解决方案是碎片。
是的,通常在服务器之间进行分片。但是,完全可以在一个盒子上进行碎片。您只需启动不同端口上的分片,并为它们提供不同的文件夹。一箱上有Here's a sample configuration个2个分片。
MongoDB团队认识到这有点低于标准,我通过与他们交谈知道他们正在寻找更好的方法来实现这一目标。
显然,一旦你在一个盒子上获得多个分片并增加你的写入线程,你就必须警惕磁盘IO。根据我的经验,我已经能够通过一个写线程来使磁盘饱和。如果您的插入/更新相对简单,您可能会发现额外的写入线程不执行任何操作。 (Map-Reduces是例外,分片肯定有帮助)