MongoDB在单个linux机器上分片

比方说,我想在一台机器上有一个带有5个碎片的MongoDB服务器,每个碎片都有3台服务器的副本。

这会提高性能吗? 这有什么缺点?

正面:

  • 如果数据被散列到不同的分片,你将能够并发写入。 MongoDB在执行写操作时会locking该实例上的整个数据库,因此即使是非分片副本集也只能一次写入一个
  • 这是一个学习分片/副本集/pipe理的好方法,但如果你只是想这样做,你可以用更less的实例
  • 复制会非常快:)

缺点:

  • 你需要一个强大的机器(多CPU,但也尽可能多的内存和快速磁盘)真正受益于性能 – Mongo渴望RAM! 为了获得最佳性能,您的总索引大小应该适合内存,这意味着如果每个碎片有2个索引,则需要5 * 3 * 2 = 30个内存,以及操作系统内存等。
  • 您可能不会从slaveOK查询选项中获益太多
  • 你将无法防止硬件故障 – 如果盒子去了,你所有的碎片和你的副本集

据我的理解你的问题,你问是否可以有一个主服务器,其上运行五个mongod实例,每个实例通过configuration服务器被识别为mongos的单独服务器,然后是三个类似configuration的服务器作为每个分片的副本集成员。 我的回答是基于这个解释。

通常这不是一个好主意。 如果你正在运行五个独立的mongod进程(每个进程都在mongo config服务器中定义),并且每个进程写入一个单独的磁盘(主轴,而不是分区),这是可以接受的,并且实际上在磁盘I / O. 但是,您不会将Master的内存用于最大的潜力,而且您已经不必要地复杂化了您的设置(特别是在备份/恢复方面。

通常,只有当由于磁盘写入I / O而导致延迟时才会碎片化。 (通过打开语言驱动程序中的从属读取,可以缓解读取的I / O延迟。)这表示需要扩展您的体系结构。 牢记这一点很重要,因为这意味着你应该购买更多的服务器。 保持一个主人也使生活更简单; 分片增加了你的复杂性。

从一个副本集开始,如果写入操作是一个问题, 那么你分片。 添加分片比删除分片容易得多。

(这一切都忽略了获得更快磁盘和更多内存的潜力,固态硬盘经常使分片变得不必要)。

如果你只是在configurationSharding和Replica Sets,你正在做的事情是好的。 (你可能应该避免在生产中做htis)。老实说,我会推荐以另一种方式来做; 在每个主机上放置一个分片,然后启动副本集成员(但避免将主成员放在同一个主机上),如下所示:

|Host1 | Host2 | Host3 | Host4 | |Shard1Pri | Shard2Pri | Shard3Pri | Shard4Pri | |Shard2Sec | Shard3Sec | Shard4Sec | Shard1Sec | |Shard3Sec | Shard4Sec | Shard1Sec | Shard2Sec | |Shard4Sec | Shard1Sec | Shard2Sec | Shard3Sec |