对于扩展/故障切换,mongodb使用一个"副本集",其中有一个主服务器和一个或多个辅助服务器。主要用于写入。辅助数据用于读取。这几乎是SQL编程中使用的主从模式。如果主服务器出现故障,则由辅助服务器群集中的辅助服务器取代它。因此,横向扩展和故障切换的问题得到了解决。然而,这似乎不是一个允许分片的解决方案。一个真正的shard只包含整个数据的一部分,所以如果副本集中的次要数据是shard,那么当它没有为请求提供服务所需的所有数据时,它怎么能成为主要数据呢?
我们不是必须为每个碎片都有一个复制集吗?
这显然是一个初学者的问题,所以一个直观或以其他方式说明如何做到这一点的链接会很有帮助。
您的假设是正确的,每个碎片都包含一个单独的副本集。当写入请求到来时,MongoS会根据shard键为其找到合适的shard,并将数据写入该shard中包含的副本集的Primary。这会导致写入缩放,因为(精心选择的)碎片键应该将写入分布在所有碎片上。
碎片是主和辅助(副本集)的总和,所以是的,每个碎片中都必须有一个副本集。
整个数据的一部分保存在主数据中,并与辅助数据共享以保持一致性。如果主服务器失效,则会选择一个辅助服务器作为新的主服务器,并具有与其前一个服务器相同的数据,以便立即开始服务。这意味着分片的数据仍然存在并且没有丢失。
您通常会将单个碎片映射到单独的副本集。看见http://docs.mongodb.org/manual/core/sharded-clusters/有关MongoDB分片的概述。