MongoDB 分片(Sharding)简介
在MongoDB中,分片是一种将数据分布在多个服务器(也称为分片服务器)上的方法,用于水平扩展数据库以处理更大的数据集或更高的吞吐量。劈面对大规模、高容量的数据,单个服务器无法有用处理时,分片是MongoDB的关键特性之一。通太过片,可以进步读写性能,并提供高可用性和容错能力。
MongoDB 分片集群架构
MongoDB的分片集群由三个主要组件构成:
- 分片服务器 (Shard Servers):
- 这些是现实存储数据的节点,每个分片服务器负责存储数据的一部分。集群中的数据被分别为多个“块”(chunks),每个分片服务器负责一部分这些块。
- 设置服务器 (Config Servers):
- 设置服务器存储关于分片集群的元数据,包括数据在各分片之间的分布环境。设置服务器维护集群的状态,并提供路由请求所需的信息。为了确保冗余和容错,在生产环境下的分片集群中必须有恰好三台设置服务器。
- 路由服务器 (Mongos Routers):
- mongos进程作为路由器,介于客户端请求和精确的分片服务器之间。它们自己不存储数据,而是根据设置服务器中存储的元数据,将查询和写入操作定向到精确的分片或一组分片。
每个组件在集群架构中扮演着不同的脚色,共同协作以处理MongoDB中的大规模数据处理。
1. 分片服务器 (Shard Servers)
- 脚色:一个分片是一个MongoDB服务器(或副本集),它存储分片集群中的一部分数据。
- 数据分区:数据被分别为块,这些块分布在分片服务器上。每个块包含肯定范围的数据(通常基于分片键),每个分片负责一个或多个这样的块。
分片键:分片键决定了数据怎样在各个分片之间分配。它是文档中的一个字段或字段组合,MongoDB利用它来对数据举行分区。选择符合的分片键对于实现最佳性能和数据分布至关重要。
- 副本集 (Replica Sets):分片通常实现为副本集,即一组MongoDB服务器,它们维护相同的数据集以提供冗余和高可用性。这样,纵然某个分片节点出现故障,也可以从副本集的其他成员继续提供数据服务。
- 示例:如果你有一个存储用户数据的分片集合,每个分片大概根据user_id范围存储一部分数据。一个分片大概持有user_id 1–1000的数据,另一个分片持有1001–2000的数据,依此类推。
2. 设置服务器 (Config Servers)
- 脚色:设置服务器存储关于分片集群的元数据,包括数据在各分片之间的分布环境以及分片集群自己的状态。
- 职责:
- 块分布:设置服务器存储哪些分片持有哪些块的信息。当客户端查询分片集群时,mongos路由器会咨询设置服务器以确定哪个分片应处理该查询。
- 集群元数据:它们还存储定义数据分区方式的元数据,包括分片键、块范围以及每个块的位置信息。
- 设置服务器的数量:生产环境中应该有恰好三台设置服务器以确保冗余。如果一台设置服务器发生故障,其他两台仍可继续提供元数据。这防止了关键集群信息的单点故障。
- 设置数据:设置服务器存储以下数据:
- 块范围:块范围与分片服务器的映射。
- 分片元数据:有关分片集合、分片键和块数量的信息。
- 集群状态:有关集群状态的信息(例如,当块迁移正在举行时)。
3. 路由服务器 (Mongos Routers)
- 脚色:mongos路由器作为接口,位于客户端应用程序和分片集群之间。它们根据设置服务器中存储的元数据,将客户端请求路由到适当的分片。
- 工作原理:
- 当客户端连接到MongoDB集群时,它会连接到一个或多个mongos进程。mongos进程负责请求的路由。
- 对于读取操作,mongos会将请求转发到精确的分片。如果查询涉及多个分片(例如,没有利用分片键的查询),它大概会将请求发送到多个分片。
- 对于写入操作,mongos确保数据根据分片键写入精确的分片。如果写入操作超过多个分片,mongos会协调该操作的执行。
- 路由逻辑:mongos利用来自设置服务器的信息来确定块的位置以及怎样路由请求。如果块在分片之间移动,mongos会通过设置服务器得知并相应地路由请求。
- 可扩展性:mongos进程自己不存储数据,且是无状态的,这意味着可以通过部署多个mongos进程来水平扩展,以应对更高的流量。客户端可以连接到任何可用的mongos,后者会根据需要路由请求。
MongoDB 分片集群架构图:
- +---------------------+
- | Client |
- +---------------------+
- |
- +--------------------+
- | Mongos Routers |
- | (Query Router) |
- +--------------------+
- | | |
- +------------------------+ | +----------------------+
- | | | |
- +-------------------+ +-------------------+ +-------------------+
- | Shard Server 1 | | Shard Server 2 | | Shard Server 3 |
- | (Replica Set) | | (Replica Set) | | (Replica Set) |
- +-------------------+ +-------------------+ +-------------------+
- | | |
- +-------------------+ +-------------------+ +-------------------+
- | Config Server 1 | | Config Server 2 | | Config Server 3 |
- | (Replica Set) | | (Replica Set) | | (Replica Set) |
- +-------------------+ +-------------------+ +-------------------+
复制代码
- 客户端:通过mongos路由器连接到MongoDB集群。
- Mongos 路由器:处理客户端的请求,并将其路由到适当的分片。
- 分片服务器:存储现实的数据,分布在多个服务器上。
- 设置服务器:存储关于数据分布和集群状态的元数据。
分片集群操作
- 添加/移除分片:当集群增长或缩小,可以添加新的分片服务器或移除现有的分片。MongoDB会动态重新分配块,以平衡负载。
- 块平衡:运行在设置服务器上的MongoDB平衡器确保块在各分片之间均匀分布。如果某个分片的数据过载,块将被迁移到其他分片,以平衡集群。
- 横向扩展:通过增加更多的mongos路由器,可以提拔处理更高流量的客户端请求的能力。通过增加更多的分片服务器,可以增加数据存储和处理能力。
总结
MongoDB的分片集群是一种强大的水平扩展方法。它利用:
- 分片服务器来存储数据,
- 设置服务器来管理元数据和块分布,
- Mongos 路由器根据分片键将客户端请求路由到精确的分片。
通过将数据分布在多个分片上并利用高效的路由机制,MongoDB可以或许处理大规模数据集和高吞吐量,使其成为那些需要超越单个服务器能力的应用程序的理想选择。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |