返回顶部
首页 > 资讯 > 数据库 >MongoDB Sharding学习理论篇
  • 702
分享到

MongoDB Sharding学习理论篇

2024-04-02 19:04:59 702人浏览 独家记忆
摘要

mongoDB Sharding技术是MonGoDB为了解决随着数据量的增加和读写请求的增加,单个MongoDB实例无法应对的问题.通过使用Sharding,MongoDB将数据切分成多个部分,将数据分布存

mongoDB Sharding技术是MonGoDB为了解决随着数据量的增加和读写请求的增加,单个MongoDB实例无法应对的问题.通过使用Sharding,MongoDB将数据切分成多个部分,将数据分布存放在多个shard上.Sharding技术使单个shard处理请求减少和存储容量减小,同时,随着集群的扩大,整个集群的吞吐量和容量都会扩大.


MongoDB Sharding学习理论篇



Sharded cluster分片集群有以下几个组件:shards,query routers,config servers.

shards: 用来存储数据,为这个分片集群提供高可用和数据一致性。在一个生产环境中,每个shard都是一个replica set。


query routers: 或者是mongos实例,用于与应用程序交互,将请求转发到后端的shards,然后将请求结果返回给客户端。一个分片集群可以有多个query router即mongos实例用于分摊客户端的请求压力。如果使用多个mongos实例,可以使用HAProxy或者LVS等代理来转发客户端请求到后端的mongos,必须要配置成client affinity模式保证来自同一个客户端的请求转发到后端相同的mongos.通常会将mongos实例部署到应用服务器上。



config servers: 用于存储分片集群的元数据。这些元数据包含整个集群的数据集合data sets与后端shards的对应关系。query router使用这些元数据来将客户端请求定位到后端相应的shards。生产环境的分片集群正好有3个config servers。config servers里的数据非常重要,如果config servers全部挂掉,整个分片集群将不可用。在生产环境中,每个config server都必须放置到不同的服务器上,并且每个分片集群的config server不能共用,必须分开部署。



MongoDB Sharding学习理论篇




MongoDB Sharding学习理论篇



MongoDB Sharding是在Collection即集合层面来分布存储数据的,Sharding依据shard key来讲一个集合的数据来分布存储。

为了将一个集合的数据进行分片,首先需要选择一个shard key。一个shard key可以是存在于一个集合中每个文档的索引字段或者符合索引字段。MongoDB将这个shard key的值切分成多个数据块,然后将这些数据块均匀分布到后端的shard上。MongoDB使用range based partitioning 或者 hash based partitionning来讲一个shard key的值进行切分。shard key一旦选择好是不能变更的。


Range Based Sharding

MongoDB Sharding学习理论篇

Given a range based partitioning system, documents with “close” shard key values e likely to be in the same chunk, and therefore on the same shard.


Hash Based Sharding

对于hash based partitionning,MongoDB会先计算一个字段值得哈希值,然后使用这些哈希值来创建数据块。


MongoDB Sharding学习理论篇



With hash based partitioning, two documents with “close” shard key values are unlikely to be part of t same chunk. This ensures a more random distribution of a collection in the cluster.



Performance Distinctions between Range and Hash Based Partitioning

Range based partitioning支持更有效的范围查询。对于一个shard key给定一个范围查询,query router可以更容易地判断将请求只路由到包含相应数据库的shard上。

Range based partitioning可能会导致数据分布不均,这样会对sharding产生负面作用,比如会出现大部分请求被分发到同一个shard的情况发生。


Hash based partitioning可以确保数据平均分布,但是这样会导致经过哈希处理的值在各个数据块和shard上随机分布,进而使制定的范围查询range query不能定位到某些shard而是在每个shard上进行查询。


Customized Data Distribution with Tag Aware Sharding

MongoDB允许使用tag aware sharding来根据shard key的范围创建并关联一些tag到后端的shards。主要用于同一个分片集群数据分布到多个数据中心的情况。



Maintaining a Balanced Data Distribution

随着数据的增加或者是服务器的增加都会导致整个分片集群的数据分布不均衡,比如一个shard比其他shard上的数据库chunk明显多了很多,或者一个数据块chunk的大小明显比其他chunk大很多。

MongoDB使用两个后台进程来确保一个均衡的分片集群,它们分别是splitting和balancer.


Splitting

Splitting是一个防止chunk变得太大的后台进程,当一个chunk大小超过了指定的大小,MongoDB将会把这个chunk分成两半。插入和更新操作都会触发split。

MongoDB Sharding学习理论篇


Balancing

balancer是一个用于管理chunk迁移的后台进程。

当一个分片集群中一个分片集合的数据分布不均衡时,balancer进程会把拥有最多chunk的shard上的chunk迁移到拥有最少chunk的shard上,直到这个集合的数据分布均衡为止。例如,集合user在shard 1上拥有100个chunk,在shard2上拥有50个chunk,balancer进程会将shard1上的chunk迁移到shard2,直到两个shard上的chunk数量保持均衡位置。

向一个分片集群中添加或删除shard都会影响整个集群的均衡性。


Primary shard

每个数据库都会有一个primary shard存储这个数据库中所有未被分片的集合数据。


MongoDB Sharding学习理论篇


MongoDB Sharding技术的应用场景:

A.如果数据集data set大小将要或者已经超过了单个MongoDB实例的容量大小。

B.活动的工作集working set大小将要超过最大物理内存大小

C.单个MongoDB实例无法满足频繁的写操作。


如果以上三种情况没有满足,不需要部署sharding,只会增加复制度,同时在设计数据模型时,也要考虑到以后作分片的情况。


Data Quantity Requirements

Sharding只会在数据量比较大的情况下才会发挥作用,默认的chunk大小是64MB,只有在满足特定条件下,balancer进程才会将数据迁移到其他shard上,否则数据会一直存储到单个shard上。



Broadcast Operations and Targeted Operations

通常情况下,分片集群处理客户端的请求有以下另种方式:

将操作请求广播到整个集群中所有包含集合中的文档的shard上。

基于shard key将操作请求定位到单个shard或一组shard



MongoDB Sharding学习理论篇




参考文档:

http://docs.mongodb.org/manual/sharding/


您可能感兴趣的文档:

--结束END--

本文标题: MongoDB Sharding学习理论篇

本文链接: https://lsjlt.com/news/41649.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MongoDB Sharding学习理论篇
    MongoDB Sharding技术是MongoDB为了解决随着数据量的增加和读写请求的增加,单个MongoDB实例无法应对的问题.通过使用Sharding,MongoDB将数据切分成多个部分,将数据分布存...
    99+
    2024-04-02
  • MongoDB Sharding学习操作篇二
    接上一篇14.配置集群中的balancer进程balancer进程运行在集群中的某一个mongos实例上,确保chunks均匀分布在整个集群上。更改指定shard的最大存储大小15.移除已有分片集群中的一个...
    99+
    2024-04-02
  • Mongodb学习(安装篇):在Window下安装
     第一步:下载安装包:     官方下载地址←单击此处,如果是win系统,注意是64位还是32位版本的,请选择正确的版本。   ...
    99+
    2024-04-02
  • MongoDB Replica Set使用经验分享理论篇
    MongoDB Replica Set是MongoDB官方推荐的主从复制和高可用方案,用于替代原有的Master-Slave主从复制方案。Replicat Set具有自动切换功能,当Primary挂掉之后,...
    99+
    2024-04-02
  • Mongodb学习(安装篇): 在centos下的安装
      安装篇  ###下载解压文件 [root@192 lamp]# wget http://fastdl.mongodb.org/lin...
    99+
    2024-04-02
  • 学习MongoDB(一)
    一 . MongoDB 1.概述 CMS采用MongoDB数据库存储CMS页面信息,CMS选用Mongodb的原因如下: 1、Mongodb是非关系型数据库,存储Json格式数据 ,数据格式灵活。 2、相比课程管理等核心数据CMS数...
    99+
    2014-10-12
    学习MongoDB(一)
  • 【MongoDB学习笔记22】MongoDB的索引管理
    使用ensureIndex函数创建集合的索引。对集合而言,每个索引只需要创建一次,重复创建没有任何作用;> show collections    s...
    99+
    2024-04-02
  • 【MongoDB学习笔记3】处理Mong
    安装MongoDB后第一次启用shell登录mongo会出现一下的错误:warning: Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused用...
    99+
    2023-01-31
    学习笔记 MongoDB Mong
  • Mongodb学习总结
    Mongodb相关操作总结 2020/4/2 Mongodb使用的是类似与json字符串的形式存储数据 [ { key:value }, { key:value }, ] Mongodb使用了不存在的对...
    99+
    2019-08-19
    Mongodb学习总结
  • mongodb 学习之oplog
    背景:   原来一个同事问我主从mongodb数据库为什么数据差距很大,我让他察看一下两边有啥不一样,发现主的local库有13G从却很小,进入local之后du发现有一个collect...
    99+
    2024-04-02
  • MongoDB学习系列
    用mongodb已经有3年多时间,但是一直没有系统的学习过,更多时候是在问题中摸索,随着最近遇到的问题越来越多,回过头系统的了解下这个数据库,就显得格外有必要了。本稿将从如下几个方面介绍,当然文中内参阅了很...
    99+
    2024-04-02
  • 【MongoDB学习笔记3】处理MongoDB连接错误
    安装MongoDB后第一次启用shell登录mongo会出现一下的错误:warning: Failed to connect to 127.0.0.1:27...
    99+
    2024-04-02
  • MongoDB学习(三) --- MongoDB Java入门
    1、搭建测试环境 步骤一:创建 maven 项目 父项目的pom文件 4.0.0 com.tqylxuecheng xc_parent pom 1.0-SNAPSHOT ...
    99+
    2022-03-31
    MongoDB学习(三) --- MongoDB Java入门
  • Tornado基础学习篇
    1.1 Tornado是什么? Tornado是使用Python编写的一个强大的、可扩展的Web服务器。它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中。 我们现在所知道的Tor...
    99+
    2023-01-30
    基础 Tornado
  • MongoDB学习整理之访问控制
    MongoDB学习整理之访问控制  1、限制特定IP地址访问,只需启动时加入--bind_ip 参数 ,客户端连接时也需要添加--host     &nbs...
    99+
    2024-04-02
  • socket.io学习教程之深入学习篇(三)
    前言 socket.io提供了基于事件的实时双向通讯,本文深入的介绍了socket.io,下面来看看详细的内容吧。 静态文件 socket.io默认情况下会通过socket.io-client包提供soc...
    99+
    2022-06-04
    教程 socket io
  • MongoDB学习(四) --- MongoDB 整合Spring Data
    1、环境搭建 步骤一:修改pom文件,更新依赖 org.springframework.boot spring-boot-starter-data-mongodb org.projectlombok lombok ...
    99+
    2021-09-17
    MongoDB学习(四) --- MongoDB 整合Spring Data
  • MongoDB学习7:Change Strean
    1.什么是Change Stream? Change Stream是MongoDB用于实现变更追踪的解决方案,类似于关系型数据库的触发器,但原理不完全相同 Change Stream 触发器 触发方式 异步 同步(事务保证)...
    99+
    2015-04-25
    MongoDB学习7:Change Strean 数据库入门 数据库基础教程 数据库 mysql
  • mongodb的学习过程
        近段时间感觉有点迷茫了,不知道该做什么,今天上班看看自己的监控数据,想想能不能为了读写速度我把数据写入到mongodb里面这种非关系型数据库里面呢,下面开始学习mong...
    99+
    2024-04-02
  • Python学习-----随机数篇
    目录  一.随机数字 1.随机整数 (1)包含上下限(闭区间) (2)包含下限,不包含上限(下闭上开) (3)设置步长(间隔) randint与randrange区别 2.随机浮点数 (1)0~1之间的浮点数 (2)随机浮点数[a,b] 二...
    99+
    2023-09-03
    学习 python 开发语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作