兄弟MongoDB迁移者指南:MD分片技术
分片是MongoDB通过水平扩展将数据分布在不同服务器上,以提高存储容量并发送的方法。与 MySQL 分区系统相比,MongoDB 的主要区别在于一切都可以自动完成。只要告诉MongoDB共享数据,就可以保持不同服务器之间的数据平衡。
为什么要包含分片
数据量大、访问量大的数据库应用会给单机运行带来很大的压力。大量的请求会导致机器的CPU疲劳,大量的数据会给机器的存储带来沉重的负载。如果压力大的话,系统内存就会被耗尽,压力就会转移到IO磁盘上。
要解决这些问题,有两种基本方法:垂直开发
和水平开发
。
垂直扩展
:添加更多CPU和存储资源以扩展容量。水平配置
:跨多个服务器共享数据。 MongoDB 的分片是一种水平扩展的形式。
分片设计理念
分片提供了一种处理高流量和大数据量的方法。使用分片可以减少每个分片必须处理的请求数量,因此通过水平扩展,集群可以增加其存储容量和吞吐量。例如,在加载分片时,应用程序必须访问存储数据的分片。
分片的目的
- 提高读写性能
- 扩展存储容量
- 高可用性
分片组结构 包含分片元素 周一 碎片
:即分片,实际数据存储空间,部分数据存储;每个分片都可以设置为 A 副本集。 mongos
:传递查询,提供客户端和集群之间的接口。 配置服务器
:存储元数据和配置数据。
碎片
:即分片,实际数据存储空间,部分数据存储;每个分片都可以设置为 A 副本集。 mongos
:传递查询,提供客户端和集群之间的接口。 配置服务器
:存储元数据和配置数据。 这里需要注意的是,mongos提供了客户端应用程序和分片MongoDB集群之间的功能。这里的分片集群由分片集群和非分片集群组成。下面展示了通过传递访问分片和非分片集合:
如何存储数据:Chunk
如何管理分片中的数据?
什么是块?
在分片服务器内,MongoDB仍然会将数据划分为分片,每个分片代表分片服务器内的一部分数据。片代会有以下两个目标:
分区
:当一个片的大小超过MongoDB的一个片的大小时,后台进程会将该片分割成更小的片,以避免碎片。太大的情况Balancer
:在MongoDB中,balancer是一个后台进程,负责部分迁移,从而平衡各个分片服务器的负载。系统初期有1个部件,标准线长64M,有生产库存。最好选择适合您业务的份量。 MongoDB 自动分区和迁移分片。
集群中数据的分区(分片节点)
- 使用分片存储数据
- 创建集群时,默认发送大小为64M的分片。如果存储要求大于64M,则对该部分进行处理。划分,如果每小时存储太大,添加更大的一块
- ,它会自动平衡并移动。
块大小选项
默认的出厂默认块大小是最好的。
Chunk分区和迁移消耗大量IO资源;分片时间:插入和更新时,读取的数据不会分片。
Chunksize 选择:
小 chunksize
:数据平衡意味着更快的迁移和更多的数据共享。数据共享更加频繁,路由节点消耗更多资源。大块
:很少共享数据。数据块操作会消耗IO资源。通常是100-200M
分区和迁移
随着数据的增长,会超过配置的分区大小,默认是64M,分区就会被分成两个。数据的增加将导致更多的部分被分发。 目前单件数量不平衡。此时,mongos的组件调度器会进行自动平衡。从分片最多的分片节点下降到分片数量最少的节点。
chunkSize对分区和迁移的影响
- MongoDB的标准chunkSize是64MB。如无特殊说明,建议保持默认值; chunkSize将直接影响分区和迁移的行为。
- chunkSize越小,碎片和迁移越多,数据分布越均衡。相反,根据chunkSize的大小,越小分区和迁移,反而会导致数据分布不均匀。
- CunkSize太小,很容易生成
jumbo chunk
(即shardKey的某些值频繁出现,这些文档只能放在一部分,无法进一步划分) . ) 并且不能转让; chunkSize 越大,如果太大,可能是 chunk 中的文档过多(chunk 中的文档数量不能超过 250,000),无法迁移。 - 自动分区是在数据写入时启动的,因此如果将chunkSize更改为较小的大小,系统将需要一些时间来对指定大小的chunk进行分区。
- chunk 只被分割,而不被合并,所以即使增加 chunkSize,现有的 chunk 数量也不会减少,但 chunk 的大小会继续写入,直到达到目标大小。
如何进行分片:分片基础知识和分片算法
MongoDB的核心集合是什么?这是我们要展示的分片键;那么分片采用什么算法呢?这就是接下来要介绍的范围分片和哈希分片。
分片键
分片键是选择集合中的一个字段或一组字段,并使用键值作为数据分区的基础。
分片键必须是索引,索引会通过添加sh.shardCollection自动创建(如果这个集合不存在)。自增分片键不太适合写入和共享数据,因为自增分片键总是会写入一个分片,当达到阈值时可能会写入另一个分片。但通过图像分辨率来询问是非常有效的。
注意:
- 分片键不会更改。
- 分片键必须包含索引。
- 分片键大小限制为 512 字节。
- 分片键用于处理查询。
- MongoDB不接受没有分片的文档
- 插入到集合中的键在集合级别共享(也不支持插入空值)
哈希分片(Hash Hash Sharding)❀Harding进程索引被用作碎片。使用分片哈希键的主要优点是它确保数据在每个节点之间均匀分布。
对于基于哈希的分片,MongoDB 计算字段的哈希并使用该哈希创建数据分片。在使用基于哈希的分片的系统中,具有相同分片键的文档不太可能存储在同一个数据块中,因此数据更好地分离。
注:这里注意一下,标签分享只能基于一个域名吗?从 MongoDB 4.4 版本开始,现在在
Range sharding(范围分片)
单个集合的数据分散并存储在多个分片中。用户可以指定集合中文档的范围,即分片键来进行范围分片(range sharding)。
对于基于区域的分片,MongoDB根据图像键的范围将数据划分为不同的区域:
在使用键分片进行分区的系统中,具有相同分片键的文档可能会存储在其中。数据在同一个块中,因此将存储在同一个分片中。
hash和range的结合
下面是基于索引字段X的各种分片,但是随着X的增加,所有超过20的数据,导致数据不平衡。
现在在(区域)上构建一个与集群中的一个或多个片段相关联的哈希标记。
应用领域(地区)的一些常见广播模式如下:
- 将指定数据放在指定位上。
- 确保它最合适。
- 根据硬件/硬件分片性能将数据发送到分片。
下图显示了 Vondon'omby 的三个碎片和两个区域的存在。 A区代表下限为1,上限为10的区域。B区代表下限为10,上限为20的区域。Sharding Alpha和Beta有A区,Sharding Beta也有A区B Shard Charlie 没有关联区域。集群处于稳定状态。
链接:https://pdai.tech/md/db/nosql-mongo/mongo-z-sharding.html
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。