Sharded cluster由Shard、Mongos和Config server 3个组件构成。
Mongos是Sharded cluster的访问入口,
Mongos本身并不持久化数据,Sharded cluster所有的元数据都会存储到Config Server
而用户的数据则会分散存储到各个shard。Mongos启动后,会从config server加载元数据,开始提供服务,将用户的请求正确路由到对应的Shard。
数据分布策略
分片支持单个集合的数据分散在多个分片上。目前主要有两
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
种数据分片的策略。
-
范围分片(Range based sharding)
-
hash分片(Hash based sharding)
范围分片
如图,集合是根据字段来进行分片。根据字段的范围不同将一个集合的数据存储在不同的分片中。
在同一个Shard上,每个Shard可以存储很多个chunk,chunk存储在哪个shard的信息会存储在Config server种,mongos也会根据各个shard上的chunk的数量来自动做负载均衡。
范围分片适合满足在一定范围内的查找,例如查找X的值在【100-200】之间的数据,mongo 路由根据Config server中存储的元数据,可以直接定位到指定的shard的Chunk中
缺点 如果shardkey有明显递增(或者递减)趋势,则新插入的文档多会分布到同一个chunk,无法扩展写的能力
Hash分片
Hash分片是根据用户的shard key计算hash值(64bit整型),根据hash值按照『范围分片』的策略将文档分布到不同的chunk
优点Hash分片与范围分片互补,能将文档随机的分散到各个chunk,充分的扩展写能力,弥补了范围分片的不足,
缺点但不能高效的服务范围查询,所有的范围查询要分发到后端所有的Shard才能找出满足条件的文档。
合理的选择shard key
选择shard key时,要根据业务的需求及『范围分片』和『Hash分片』2种方式的优缺点合理选择,要根据字段的实际原因对数据进行分片,否则会产生过大的Chunk
Mongos
Mongos作为Sharded cluster的访问入口,所有的请求都由mongos来路由、分发、合并,这些动作对客户端driver透明,用户连接mongos就像连接mongod一样使用。
查询请求
-
查询请求不包含shard key,则必须将查询分发到所有的shard,然后合并查询结果返回给客户端
-
查询请求包含shard key,则直接根据shard key计算出需要查询的chunk,向对应的shard发送查询请求
写请求
写操作必须包含shard key,mongos根据shard key算出文档应该存储到哪个chunk,然后将写请求发送到chunk所在的shard。
更新/删除请求
更新、删除请求的查询条件必须包含shard key或者_id,如果是包含shard key,则直接路由到指定的chunk,如果只包含_id,则需将请求发送至所有的shard。
其他命令请求
Config Server
config database
Config server存储Sharded cluster的所有元数据,所有的元数据都存储在config数据库
Config Server可部署为一个独立的复制集,极大的方便了Sharded cluster的运维管理。
abase
Config server存储Sharded cluster的所有元数据,所有的元数据都存储在config数据库
Config Server可部署为一个独立的复制集,极大的方便了Sharded cluster的运维管理。