MongoDB 入门第七课:分片集群

什么是分片

分片是一种跨多台机器分布数据的方法,MongoDB 使用分片来支持具有非常大的数据集和高吞吐量操作的部署。通俗的讲,分片就是指将数据拆分,将其分散存在不同的机器上的过程。

我们可以将 MongoDB 的分片与 MySQL 分区方案做一个类比,与 MySQL 不同,它几乎能自动完成所有事情,只要告诉 MongoDB 要分配数据,它就能自动维护数据在不同服务器之间的均衡。

分片的优势

  1. 对集群进行抽象,令集群不可见:MongoDB 自带了一个叫做 mongos 的专有路由进程。mongos 是掌握统一路口的路由器,其会将客户端发来的请求准确无误的路由到集群中的一个或者一组服务器上,同时会把接收到的响应拼装起来发回到客户端
  2. 保证集群总是可读写:将 MongoDB 的分片和复制功能结合使用,在确保数据分片到多台服务器的同时,也确保了每份数据都有相应的备份,这样就可以确保有服务器宕机时,其他的从库可以立即接替宕机的部分继续工作
  3. 使集群易于扩展:当系统需要更多的空间和资源的时候,MongoDB 可以轻松的扩充系统容量

分片集群架构

在这里插入图片描述

  1. Config Server:存放配置信息,存储集群所有节点、分片数据路由信息。默认需要配置3个Config Server 节点
  2. Mongos:数据路由,和客户端交互,它本身并没有存储数据,需要去找 config server
  3. shard:数据的真实存储位置

Mongos 并不持久化数据,集群所有的元数据都会存储到 Config Server,而用户的数据会议分散存储到各个 shard。Mongos 启动后,会从配置服务器加载元数据,开始提供服务,将用户的请求正确路由到对应的碎片。

数据分布

在每一个 shard server 内部,数据被分为 chunks,每个 chunk 代表这个 shard server 内部的一部分数据。当一个 chunk 的大小超过配置中的 chunk size (默认值64M)时,MongoDB 会把这个 chunk 切分成更小的 chunk。当各个 shard 上的 chunk 数量不平衡时,mongos 有后台进程 balancer 负责 chunk 的迁移,把 chunk 从 chunk 数量最多的 shard 节点挪动到数量最少的节点,来均衡各个 shard server 的负载,集群搭建完毕后系统默认开启一个 chunk。

chunk 的分裂和迁移是非常消耗 IO 资源的,所以我们应该选择适合业务的 chunksize,如果采用小的 chunksize,迁移速度快,数据分布均匀,但数据分裂频繁,路由节点消耗更多资源;如果采用大的 chunksize,数据分裂少,数据块移动集中消耗 IO 资源。

chunk 只会分裂,不会合并,所以即使将 chunkSize 改大,现有的 chunk 数量不会减少,但 chunk 大小会随着写入不断增长,直到达到目标大小。

数据区分

分片键

MongoDB 对数据的分片以集合为基本单位,而集合中的数据通过片键(Shard key)划分。所谓片键,就是在集合中选一个键,用该键的值作为数据拆分的依据。MongoDB 提供了基于范围的分片方式和基于哈希的分片方式。

在对集合进行分片时,你需要选择一个片键,片键是每条记录都必须包含的,且建立了索引的单个字段或复合字段,MongoDB 按照片键将数据划分到不同的数据块中,并将数据块均衡地分布到所有分片中。

分片键用于路由查询,是不可变的,带有索引的,其大小限制为 512bytes。

基于范围的分片方式

在这里插入图片描述

Sharded Cluster 支持将单个集合的数据分散存储在多 shard 上,用户可以指定根据集合内文档的某个字段即 shard key 来进行范围分片。对于基于范围的分片,MongoDB 按照片键的范围把数据分成不同部分。

基于哈希的分片

在这里插入图片描述

分片过程中利用哈希索引作为分片的单个键,且哈希分片的片键只能使用一个字段,而基于哈希片键最大的好处就是保证数据在各个节点分布基本均匀。

哈希分片与距离分片对比,数据的分离性更好,能将文档随机的分散到各个 chunk,但其范围查询能力不足,所有范围查询要分发到后端所有的 Shard 才能找出满足条件的文档。

参考:MongoDB 分片集群技术

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值