当 MongoDB 需要存储海量数据时,单节点不足以存储全量数据,且可能无法提供令人满意的吞吐量。所以,可以通过 MongoDB 分片机制来支持水平扩展。
分片集群特点
- 对应用完全透明
- 数据自动均衡
- 动态扩容
- 提供三种分片方式
分片集群组件
- shard (opens new window):每个分片包含分片数据的子集。每个分片都可以部署为副本集。
- mongos (opens new window):mongos 充当查询路由器,在客户端应用程序和分片集群之间提供接口。从 MongoDB 4.4 开始,mongos 可以支持 hedged reads (opens new window)以最大程度地减少延迟。
- config servers (opens new window):提供集群元数据存储和分片数据分布的映射。
分片集群的分布
- MongoDB 复制集以 collection 为单位 ,将数据分布在集群中的各个分片上。最多允许 1024 个分片。
- MongoDB 复制集的分片之间数据不重复,只有当所有分片都正常时,才能完整工作。
- MongoDB 数据库可以同时包含分片和未分片的集合的 collection。分片 collection 会分布在集群中各节点上。而未分片的 collection 存储在主节点上。每个数据库都有其自己的主节点。
分片和未分片的 collection:
路由节点 mongos
要连接 MongoDB 分片集群 (opens new window),必须连接到 mongos
(opens new window)路由器。这包括分片和未分片的 collection。客户端不应该连接到单个分片节点进行读写操作。
连接 mongos
(opens new window)的方式和连接 mongod
(opens new window)相同,例如通过 mongo
(opens new window)shell 或 MongoDB 驱动程序 (opens new window)。
路由节点的作用:
- 提供集群的单一入口
- 转发应用端请求
- 选择合适数据节点进行读写
- 合并多个数据节点的返回
一般,路由节点 mongos 建议至少 2 个。