一个副本集意味着你的MongoDB的多个实例,每个互为镜像的所有数据。一个副本集由一个主服务器(也称为“主服务器”)和一个或多个从属服务器(又称为“从属服务器”)组成。读取操作可以由任何从属服务器提供服务,因此您可以通过向副本集添加更多从属服务器来提高读取性能(前提是您的客户端应用程序能够实际使用不同的集合成员)。但是写操作总是在副本集的主服务器上发生,然后传播到从服务器,因此,当您添加更多从服务器时,写操作不会更快。
副本集还提供容错功能。当副本集的成员之一发生故障时,其他成员接任。当主机发生故障时,从机将选举一个新的主机。因此,建议进行生产性部署时,始终将MongoDB用作至少三台服务器的副本集,其中两台用于保存数据(第三台是无数据“仲裁器”,在确定新主服务器时需要使用“仲裁器”。一名奴隶掉了下来。
分片集群意味着集群的每个分片(也可以是副本集)负责处理部分数据。每个请求(包括读写)均由数据所驻留的群集服务。这意味着可以通过向群集添加更多分片来提高读写性能。哪个文档位于哪个分片上,由每个集合的分片键确定。应该以这样一种方式进行选择:数据可以均匀地分布在所有群集上,这样对于分片键所在的最常见查询是很清楚的(例如:当您频繁查询时user_name
,分片键应包括字段,user_name
因此每个查询只能委派给具有该文档的一个分片)。
缺点是容错能力受损。当集群的一个分片出现故障时,该集群上的任何数据都将无法访问。因此,群集的每个成员也应该是一个副本集。这不是必需的。如果您不关心高可用性,则分片也可以是没有复制的单个mongod实例。但是对于生产用途,应始终使用复制。
那么这对您的示例意味着什么?
Sharded Cluster
/ | \
Shard A Shard B Shard C
/ \ / \ / \
+-------+ +---------+ +-------+ +---------+ +-------+ +---------+
|Primary| |Secondary| |Primary| |Secondary| |Primary| |Secondary|
| 25GB |=| 25GB | | 25 GB |=| 25 GB | | 25GB |=| 25GB |
+-------+ +---------+ +-------+ +---------+ +-------+ +---------+
如果要将75GB的数据分成3个25GB的碎片,则需要至少6个数据库服务器,这些服务器按三个副本集组织。每个副本集由两个具有相同25GB数据的服务器组成。
您还需要用于三个副本集的仲裁服务器的服务器,以及集群的mongos路由器和配置服务器。仲裁器非常轻巧,仅在副本集成员出现故障时才需要,因此它们通常可以与其他设备共享同一硬件。但是Mongos路由器和config-server应该是冗余的,并且在自己的服务器上。