比方说,我想在一台机器上有一个带有5个碎片的MongoDB服务器,每个碎片都有3台服务器的副本。
这会提高性能吗? 这有什么缺点?
正面:
缺点:
据我的理解你的问题,你问是否可以有一个主服务器,其上运行五个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 |