我在serverfault上问过这个问题,但我实际上是在寻找MongoDB配置视角的答案。我尝试将分片数据库服务器的性能与分片和复制的数据库服务器进行比较。
分片配置由8个分片组成,每个分片在三台不同的机器上运行,从而构成总共24个分片。所有这8个分片都在每台机器的同一分区中运行。
分片和复制版本再次是8个分片,就像普通分片一样,并且所有8个mongod
在每台机器的同一分区上运行。但除此之外,这三台机器中的每一台机器现在在另一个分区上运行额外的16个线程,这些线程作为在其他机器上运行的8 mongod
的辅助线程。这是我使用复制因子为3的数据块准备分片和复制配置的方法。
需要注意的重要一点是,一旦加载了数据,就不会对其进行修改。因此,在主要和次要的同步后,我读到的是哪一个并不重要。
要运行查询,我使用一个完全不同的机器(让我们称之为配置)运行mongos
,这台机器的唯一目的是接收查询并在集群上运行它们。
与我的预期相反,每台计算机上8个线程的普通分片(总数= 3 * 8 = 24)对于查询的效果要好于分片+复制配置。
我编写了一个脚本来执行查询。因此,为了对脚本计时,我使用time ./testScript
并查看结果。我尝试通过登录mongo
配置并运行db.getMongo().setReadPref('secondary')
来更改已复制群集的读取首选项,然后退出shell并运行time ./testScript
之类的查询。
问题是:
所有四台机器都在运行Linux,我已经将ulimit -n从初始值1024增加到2048,以允许更多连接。集合正确分布,所有mongods具有相同数量的块。不言而喻,两种配置中的指数都是相同的。
硬件规格 - 架构:AMD64 - RAM:64 GB - 核心数:32
答案 0 :(得分:1)
在同一台机器上进行复制,甚至可能在同一物理磁盘上进行复制会导致在同一台机器上多次写入相同数据的情况。此处可能出现磁盘延迟和IO调度问题。将数据写入磁盘3次比执行一次更自然。很可能新的插入必须等待,因为最后一个插入仍然被从属mongod
写在同一磁盘或服务器上(这会占用CPU周期)。完全没有意义做某事像这样。设置副本集旨在增强完整服务器发生故障时数据的可用性。对于其他一切,有RAID。
另外,还有另一个因素可以解决当前设置中独立分片更快的问题:在分片集合中,每个文档仅写入一个特定分片。所以这就是独立设置更快的原因。
关于你的设置的一个注意事项:在一台机器上运行多个mongods根本没有意义。我看到单个mongod进程占用了64GB的RAM和双绑定网络接口和企业级SSD的整个IO带宽。那些mongod进程确实也有相当大的开销。所以一般来说,每个主机只应该有一个数据承载mongod进程。
您应该问自己的是您想要实现的目标:高并行性或高可用性。使用三节点设置,分片并不真正有意义。我使用单个mongod进程在RF为3的这些节点上设置副本集。通过这种方式,您可以获得节点和的最高性能,您可以获得高可用性,可以进行滚动维护等。如果您需要向外扩展,则需要添加另外三台服务器以保持RF为3并实现并行性(当然还有配置服务器)。
编辑关于第二个问题:不,写关注是在连接级别(当前连接,即查询级别)上设置的。当前连接是db.getMongo()
返回的内容。