我只是对分片和复制的工作方式感到困惑。
根据我在文档中找到的定义:
复制:MongoDB 中的副本集是一组维护相同数据集的 mongod 进程。
分片:分片是一种跨多台机器存储数据的方法。
根据我的理解,如果我有 75 GB 的数据,然后通过使用复制(3 个服务器),它将在每台服务器上存储 75GB 数据,这意味着服务器 1 上有 75GB,服务器 2 上有 75GB,服务器 3 上有 75GB。(如果我错了,请纠正我)。
并且通过使用分片,它将在服务器 1 上存储为 25GB 数据,在服务器 2 上存储为 25GB 数据,在服务器 3 上存储为 25GB 数据。(对?)。
但是后来我在教程中遇到了这一行:
分片存储数据。为了提供高可用和数据一致性,在生产分片集群中,每个分片都是一个副本集
一个副本集大小为75GB,而分片大小为25GB,那么它们如何等价呢?
这让我很困惑。我想我错过了一些明显的东西。请帮我解决一下这个。
Phi*_*ipp 158
一个副本集意味着你有MongoDB中的多个实例,其中每个镜子都彼此的数据。一个副本集由一个 Master(也称为“Primary”)和一个或多个 Slave(也称为 Secondary)组成。任何从服务器都可以提供读取操作,因此您可以通过向副本集添加更多从服务器来提高读取性能(前提是您的客户端应用程序能够实际使用不同的集合成员)。但是写操作总是发生在副本集的主节点上,然后传播到从节点,所以当你添加更多的从节点时,写操作不会变得更快。
副本集还提供容错能力。当副本集的一个成员出现故障时,其他成员接管。当master宕机时,slave会选举一个新的master。出于这个原因,建议生产部署始终使用 MongoDB 作为至少三台服务器的副本集,其中两台保存数据(第三台是无数据的“仲裁器”,当确定新主服务器时需要它其中一名奴隶倒下了)。
分片集群意味着集群的每个分片(也可以是副本集)负责处理一部分数据。每个请求,包括读取和写入,都由数据所在的集群提供服务。这意味着可以通过向集群添加更多分片来提高读写性能。哪个文档驻留在哪个分片上由每个集合的分片键决定。应该选择数据可以均匀分布在所有集群上的方式,这样对于最常见的查询来说,分片键所在的位置很清楚(例如:当您经常查询时user_name,分片键应该包括字段,user_name因此每个查询只能委托给具有该文档的一个分片)。
缺点是容错性受到影响。当集群的一个分片出现故障时,其上的任何数据都无法访问。出于这个原因,集群的每个成员也应该是一个副本集。这不是必需的。当您不关心高可用性时,分片也可以是没有复制的单个 mongod 实例。但是对于生产用途,您应该始终使用 replication。
Sharded Cluster
/ | \
Shard A Shard B Shard C
/ \ / \ / \
+-------+ +---------+ +-------+ +---------+ +-------+ +---------+
|Primary| |Secondary| |Primary| |Secondary| |Primary| |Secondary|
| 25GB |=| 25GB | | 25 GB |=| 25 GB | | 25GB |=| 25GB |
+-------+ +---------+ +-------+ +---------+ +-------+ +---------+
Run Code Online (Sandbox Code Playgroud)
当您想将 75GB 的数据拆分为 3 个 25GB 的分片时,您至少需要将 6 个数据库服务器组织成三个副本集。每个副本集由两台服务器组成,它们拥有相同的 25GB 数据。
您还需要用于三个副本集的仲裁器的服务器以及集群的 mongos 路由器和配置服务器。仲裁器非常轻量级,仅在副本集成员出现故障时才需要,因此它们通常可以与其他东西共享相同的硬件。但是 Mongos 路由器和配置服务器应该是冗余的并且在它们自己的服务器上。
sys*_*138 25
这两个东西可以叠加,因为它们是不同的。使用两者意味着您将跨多组副本分片您的数据集。换句话说,你复制碎片;没有分片的数据集是单个“分片”。
具有 3 个分片和 3 个副本的 Mongo 集群将有 9 个节点。
| 归档时间: |
|
| 查看次数: |
85468 次 |
| 最近记录: |