2012-02-08 64 views
2

在一台更强大的机器上实现mongodb分片与说100个分片只是为了实现更高的concurrenct写入数据库,因为我被告知,每个monogod.exe进程都有一个全局锁?假设这是可能的,那么这个问题会给我更高的写入并发性吗?MongoDB在一台机器上分片

+0

100个碎片可能太多了,但如果在强壮的服务器上使用几个碎片获得更好的写入性能,我不会感到惊讶。尽管如此,为什么不把你的碎片放在单独的较不健壮的服务器上?你期望得到什么样的插入/更新率? – 2012-02-09 00:01:35

+0

主要原因是我需要做的POC的可用性,我想知道是否可以模拟我可用的服务器的分片环境。我假设一个拥有8核心和32GB内存的服务器被认为是强壮的。我希望能够获得1000个并发写入和10,000个并发读取,其中每个读取或写入请求将不会超过0.5秒钟由数据库提供服务。这对于MongoDB更合理吗?每个读取的查询结果大小和要写入的数据量并不大,这主要是为了向db提供许多并发的读取或写入请求。 – iCode 2012-02-09 02:54:12

+0

你在这里深刻体会到了。我甚至有道理吗? – iCode 2012-02-09 02:57:30

回答

9

在机器上运行多个mongods不是一个好主意。每个mongod进程都会尝试使用所有可用的内存,强制其他mongod的内存映射页面内存不足。这将在大多数情况下创建大量的交换。

全局数据库的锁一般不会有问题,因为是体现在:http://blog.pythonisito.com/2011/12/mongodbs-write-lock.html

只用一台机器一个mongod的(但它的罚款添加mongos或配置服务器以及),除非它是一些简单的测试。

欢呼声, 德里克

1

唯一使用情况下,我发现运行在同一台服务器上几个mongod的是增加高延迟连接复制速度。

正如Derick强调的那样,在运行mongodb时,写入锁并不是真正的问题。

要回答你的问题:你能证明蒙戈缩放每台机器的几个实例(每台服务器SEMS 4个实例是不够的),如果你的测试不涉及太多的数据(否则首页输出将大大decrase你的表现,我已经测试过了)

但是,实例仍然会竞争的资源。你所要做的就是将数据库锁定问题转移到资源锁定问题上。

2

我完全不同意。我们的设置中每盒运行8个碎片。它由两个头节点组成,每个头节点都有两台用于复制的机器。总共6盒。这些带有大约120GB内存,32个内核和2TB的强壮框。每盒有8个碎片(为了历史目的,我们可以将其设置为8),我们确保我们有效利用CPU。 RAM自行排除。你必须观察指标,并确保你没有太多分页,但是如果你确实把SSD硬盘泄漏到磁盘驱动器上,那么SSD硬盘就不算太坏。

+0

RAM如何自我排序?另外,您是否决定为更高的写入吞吐量或其他功能设置这么多碎片? – iCode 2014-04-22 02:07:46

+0

我们使用了Mongo Map Reduce(MR),它需要CPU的能力来处理所有的数据。原始分片设置了每个核心的碎片。这给了我们最大的CPU。从那以后,这个盒子已经升级了,所以我们现在每4个内核碎片。至于内存,它是将索引保存在RAM中的练习。数据永远不会适应,所以不要担心。我们监视我们的索引相对于RAM的大小,并已升级到适应。我们也删除了我们不需要的索引。 – 2014-04-22 16:54:51

0

是的,你可以,事实上,这是我们为50+密尔写重型数据库所做的。只要确保每个mongod的所有索引都适合RAM,并且还有增长和维护的空间。

但是,有一个小小的折衷:根据您的目标QPS是什么,这种共享需要机器具有更大的马力,而在单台机器上分片将不会,并且在大多数情况下,您可以取消商品,更便宜的硬件。不管是什么情况,请进行一系列性能测试(ageinst IO,Network,PQS等)并仔细建立您的基准并考虑SSD驱动器的存储,这听起来有点偏颇,但Linux XFS存储器也是需要考虑的事情。