MongoDB分片集群由三个模块组成

  • shard: 分片(或者分区)模块, 每个分片分别存储一部分数据, 从MongoDB 3.6开始, 分片必须是replica set(副本集)
  • mongos: mongos是一个请求路由, 提供给客户端使用, 将请求分配到分片集群.
  • config servers: 配置模块存储的是集群的配置信息和元数据, MongoDB 3.4之后配置模块也必须是replica set(CSRS).

一个副本集只能有一个主节点, 可以有多个从节点. 主节点可以读写, 从节点只能读. 主节点将数据修改操作保存至oplog中. 一个副本集需要奇数个节点, 心跳信息每两秒传递一次, 通过选举实现自动故障转移. 主节点宕机后会进行自动选举.

生产环境配置

在生产环境为了保证数据冗余以及系统的高可用, 建议使用以下的分片集群配置

  • Config Servers使用3节点副本集
  • Shard使用3节点副本集
  • Mongos部署1个或多个

副本集分布式部署

如果可能的话, 建议将每个副本集中的一个节点部署至适合灾备恢复的机房

分片的个数

分片机制需要至少两个分片, 如果不是很快就要开始分片, 不要使用单个分片的集群.

Mongos的个数和部署

部署多个mongos支持高可用性和扩展性, 大多情况下会在每个应用服务器上部署一个mongos, 这样可以减小客户端应用和mongos之间的网络延迟. 对于大型的项目, 可以将mongos部署在专用的服务器上, 避免mongos的数量随应用而增长, 并且使得mongos可以使用更大的内存. mongos和mongod的内存是不共享的, 如果部署在同一个服务器上要留意内存是否充足. 在部署数量上, mongos没有限制, 但是mongos会频繁与配置服务器通信, 在增加mongos数量后要密切监视配置服务器的负载, 如果导致性能下降, 就要减小mongos的数量.

开发环境配置

对于测试和开发, 你可以按最小数量来部署.

  • Config Server使用1节点副本集
  • Shard使用1节点副本集
  • Mongos部署1个

分片

在分片集群中, 每个分片会包含全部数据的一个子集. 用户,客户端和应用应当直接连接到分片来进行本地管理和维护操作.

在单个分片上进行查询, 只会返回这个子集中的数据. 集群级别的读写操作应当连接到mongos进行.

主分片

在分片集群中, 每个db都有一个主分片, 用来存储这个db中所有未分片的collection. 每个db都有各自的主分片. 主分片与副本集中的主副本无关.
mongos在创建新db时, 会选择集群中数据量最小的那个分片, 在其上创建主分片. 使用listDatabase命令返回的totalSize也是判断的一个因素.
要修改db的主分片, 使用movePrimary命令. 迁移主分片的过程会明显耗时, 迁移的过程中不应该去访问对应的数据.

分片状态

在mongo shell用 sh.status() 方法查看集群状态. 报告包含那些分片是db主分片以及在分片上的chunk分布情况.

分片集群安全

使用Internal/Membership验证来保证集群内的安全, 防止未授权的模块连入或访问集群, 在启动每个mongod的时候, 要设置好对应的安全配置, 对应的是

集群内模块间的安全, 使用Internal Authentication, 例如keyfile
客户端和集群间的安全, 使用User Access Controls, 客户端必须使用用户账户进行连接

分片本地用户

各个分片都支持基于角色的访问控制Role-Based Access Control (RBAC), 在mongod启动时使用 --auth 参数启用RBAC. 另外, 启用 Internal/Membership Authentication 时也会通过RBAC启用用户访问控制.
每个分片都有自己的本地用户, 这些用户不能用在其他分片上, 也不能用于通过mongos连接集群

分片主键

分片主键决定了collection数据在集群中各个分片如何分布, 分片主键可以是一个索引字段, 也可以是一个索引组合字段, 只要它存在于collection中的每一个记录. MongoDB使用主键值的区间对数据进行分区, 每个区间定义了数据块, 对应一个不会与其他数据块交叠的主键值范围. MongoDB会尽量保持数据块在集群的分片中均匀分布, 分片主键的选择和分布的效率有直接联系.

数据块

MongoDB在数据块尺寸超过限制后, 会将数据块进行拆分. 在insert和update操作后都有可能发生拆分. 数据块能对应的最小的区间就是一个单个的分片主键值, 如果数据块只对应了一个主键值, 那就不能再拆分了.

数据块初始化

填充Collection
分片操作会用完整的主键值区间创建初始数据块, 数据块的数量取决于配置的数据块尺寸. 在初始数据块创建后, balancer会在分片之间迁移这些数据块.

空Collection
如果你定义了zone, 并且zone区间定义在了一个空的或不存在的collection上, 分片操作会创建空数据块. 如果未在空collection上设置zone,
对于hashed sharding: 分片操作会创建空数据块, 默认情况下每个分片会创建两个数据块, 可以通过numInitialChunks选项来调整数量.
对于ranged sharding: 分片操作会创建一个空数据块, 然后进行迁移.

数据块尺寸

MongoDB中的默认数据块尺寸是64MB, 大小可以在配置中修改.

  • 小数据块可以让数据分布更均匀, 但是迁移会更频繁, 增加mongos查询开销.
  • 大数据块可以减小迁移频率, 从网络角度看更高效, 但是数据存储分布会更不均匀.
  • 数据块尺寸会影响每个数据块的最大记录数, 影响分片的最大collection尺寸.
  • 大部分场景下, 需要允许轻微的数据不均匀, 来避免频繁的数据块迁移.

修改数据块尺寸的影响说明:

自动拆分只会在insert和update时发生, 如果你减小了数据块尺寸, 会需要等一段时间才能看到所有数据块拆分为新的尺寸.
拆分是不能回退的, 如果你增加数据块尺寸, 现有的数据块要在insert和update过程中增长到新的尺寸

数据块拆分

拆分是为了避免数据块增长得过大, 当一个数据块增长到超过预设的尺寸或者记录数超过每个数据块允许迁移的最大记录数时, MongoDB会基于分片主键值将数据块进行拆分. 必要的时候一个数据块会被拆分成多个数据块. 拆分是元数据修改, MongoDB并不会迁移任何数据或影响分片.
拆分会导致分片之间的数据块存储分布的不均衡, 这时候balancer会将数据块在分片之间进行调整. Balancer是一个后台进程, 用于管理数据块迁移. 如果集群中分片的最大数据块数量和最小数据块数量超过了阈值, balancer就会进行迁移以保证数据的均匀分布.

在某些情况下, 例如对应的分片主键已经缩减为单值, 数据块增长超过了限制但是又不能进行拆分, 会使得数据块增长得越来越大, 这就会成为性能瓶颈, 特别是当这个主键被频繁使用的时候.

MongoDB笔记: 分片集群的更多相关文章

  1. 【MongoDB】在windows平台下mongodb的分片集群(五)

    本篇接着上面的四篇继续讲述在window平台下mongodb的分片集群搭建. 在分片集群中也照样能够创建索引,创建索引的方式与在单独数据库中创建索引的方式一样.因此这不再多说.本篇主要聚焦在分片键的选 ...

  2. MongoDB之分片集群(Sharding)

    MongoDB之分片集群(Sharding) 一.基本概念 分片(sharding)是一个通过多台机器分配数据的方法.MongoDB使用分片支持大数据集和高吞吐量的操作.大数据集和高吞吐量的数据库系统 ...

  3. MongoDB 搭建分片集群

    在MongoDB(版本 3.2.9)中,分片是指将collection分散存储到不同的Server中,每个Server只存储collection的一部分,服务分片的所有服务器组成分片集群.分片集群(S ...

  4. MongoDB之分片集群与复制集

    分片集群 1.1.概念 分片集群是将数据存储在多台机器上的操作,主要由查询路由mongos.分片.配置服务器组成. ●查询路由根据配置服务器上的元数据将请求分发到相应的分片上,本身不存储集群的元数据, ...

  5. 【MongoDB】在windows平台下搭建mongodb的分片集群(二)

    在上一片博客中我们讲了Mongodb数据库中分片集群的主要原理. 在本篇博客中我们主要讲描写叙述分片集群的搭建过程.配置分片集群主要有两个步骤.第一启动全部须要的mongod和mongos进程. 第二 ...

  6. 【MongoDB】在windows平台下mongodb的分片集群(六)

    在本篇博客中我们主要讨论下博客的管理.因为已经在前面五篇中写了具体的实例,因此这里就不再举例说明. 一.监控 分片集群是整个体系中比較复杂的一块,因此更应该须要监控. 主要命令: serverstat ...

  7. MongoDB的分片集群搭建

    MongoDB的最为自豪的一个特色之一,分片. 参考官方文档: https://docs.mongodb.com/manual/sharding/  单机压力,高频查询CPU,IO 单表压力,百万千万 ...

  8. Mongodb分片集群技术+用户验证

    随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而mongodb主打的就是海量数据架构,“分片”就用这个来解决这个问题. 从图中可以看到有四个组件:mongos.config server. ...

  9. MongoDB 分片集群技术

    在了解分片集群之前,务必要先了解复制集技术! 1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这 ...

随机推荐

  1. iOS UILanel 一些小实用

    UILabel *lab=[[UILabel alloc]initWithFrame:self.view.bounds]; //合并 lab.text=[NSString stringWithForm ...

  2. Go语言入门——interface

    1.Go如何定义interface Go通过type声明一个接口,形如 type geometry interface { area() float64 perim() float64 } 和声明一个 ...

  3. socket系统化入门

    1.简单socket完成消息发送与接收 服务端: package com.wfd360.com.socket; import java.io.*; import java.net.ServerSock ...

  4. OSI&TCP/IP模型

    OSI模型 OSI协议 基于OSI模型异构网络主机之间通信的协议 1. 应用层 不同的应用程序所在层,如邮件程序,web程序 2. 表示层 不同的文件类型如图片,视频等 3. 会话层 决定是否建立与其 ...

  5. Httpd服务入门知识-Httpd服务常见配置案例之显示服务器版本信息

    Httpd服务入门知识-Httpd服务常见配置案例之显示服务器版本信息 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.httpd配置文件的组成 1>.主要组成 Globa ...

  6. CentOS7 开机提示Initial setup of CentOS Linux 7 (Core)

    一.开机以后提示信息如下 二.解决方法 . 输入1,按Enter同意许可协议 . 输入2,按Enter同意许可协议 . 输入q,按Enter退出 . 输入yes,按Enter确定 . 完成重启后即可正 ...

  7. 关于PID控制的一点资料搜集

    CMU做的控制教程 <动态系统的反馈控制> MATLAB&Simulink的PID控制(官方)

  8. 如何获取gitee上的项目?

    对于没有使用过github/gitee的朋友来说,估计是有点懵. 下面举个例子,比如获取我的gitee上的python接口自动化测试框架 访问主页:https://gitee.com/uncleyon ...

  9. Mybatis技术一数据库连接池配置(druid)

    只简单叙述,网上相关的内容很多,这里只是给出参考: 数据库连接池druid配置列表: 配置 缺省值 说明 name   配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来.如 ...

  10. CF379C-New Year Ratings Change

    https://www.luogu.org/problemnew/show/CF379C 一道水题,折腾了我好久! 解题: 先排序,从小到大挨个满足客户,把最终rating放进集合里,判断是否已经给出 ...