单台 Linux 机器上的 MongoDB 分片

单台 Linux 机器上的 MongoDB 分片

假设我想要一个 MongoDB 服务器,它在一台机器上有 5 个分片,每个分片有 3 个服务器的副本集。

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

答案1

优点:

  • 只要数据被散列到不同的分片中,您就可以进行并发写入。MongoDB 在执行写入时会锁定该实例上的整个数据库,因此即使是非分片副本集也只能一次写入一个内容
  • 这是学习分片/副本集/管理的好方法,但如果你只是想这样做,你可以用更少的实例来实现这一点
  • 复制会非常快:)

缺点:

  • 您需要一台功能强大的机器(多个 CPU,但也要有尽可能多的内存和快速磁盘)才能真正从性能中受益 - Mongo 需要 RAM!为了获得最佳性能,您的总索引大小应该适合 RAM,这意味着如果每个分片有 2 GB 的索引,您将需要 5 * 3 * 2 = 30 GB 的 RAM,再加上操作系统等的内存
  • 您可能不会从 slaveOK 查询选项中获益太多
  • 你无法防范硬件故障 - 如果设备坏了,你所有的分片和副本集都会坏掉

答案2

据我理解,您的问题是,您是否可以拥有一个主服务器,在该服务器上运行五个 mongod 实例,每个实例都通过配置服务器被标识为 mongos 的单独服务器,然后有三台配置类似的服务器作为每个分片的副本集成员。我的答案基于这种解释。

一般来说这不是一个好主意。如果您正在运行五个单独的 mongod 进程(每个进程都在 mongo 配置服务器中定义),并且每个进程都写入单独的磁盘(主轴,而不是分区),这可能是可以接受的,并且实际上会在磁盘 I/O 方面为您带来一些好处。但是,您不会充分利用 Master 的内存,并且您不必要地复杂化了设置(尤其是在备份/恢复方面)。

通常,只有在磁盘写入 I/O 导致延迟时才需要分片。(可以通过在语言驱动程序中打开 Slave Read 来缓解读取 I/O 延迟。)这表明需要扩展您的架构。记住这一点很重要,因为这意味着您应该购买更多服务器。保留单个主服务器也使生活变得更加简单;分片会增加您的复杂性。

从副本集开始,如果写操作有问题,然后你分片。添加分片比删除分片要容易得多。

(这完全忽略了获得更快磁盘和更多内存的潜力。SSD 通常使得分片变得没有必要。)

如果您只是在尝试配置分片和副本集,那么您所做的一切就都很好。(您可能应该避免在生产环境中使用 htis。)但老实说,我建议以另一种方式进行操作;在每个主机上放置一个分片,并启动副本集成员(但避免将副本集成员与主主机放在同一台主机上),如下所示:

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

相关内容