这个系列大致想跟大家分享以下篇章:

1、mongo 3.4分片集群系列之一:浅谈分片集群

2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片

3、mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全

4、mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + 安全 + 区域

5、mongo 3.4分片集群系列之五:详解平衡器

6、mongo 3.4分片集群系列之六:详解配置数据库

7、mongo 3.4分片集群系列之七:配置数据库管理

8、mongo 3.4分片集群系列之八:分片管理

 

这篇为理论篇

这篇章主要讲一下以下几个点:

1)         简要说说平衡器是啥吧

2)         平衡器在分片集群中是干什么的,也就是平衡器的作用

3)         这里还会仔细说明分片集群中迁移块的过程

4)         平衡器的定时启用和关闭

5)         怎么减少平衡器对分片集群的性能影响

6)         关于平衡器的一些命令

1、        简要说说平衡器是啥

MongoDB的平衡器是一个后台进程,监视每个分片上块的数目。当给定分片上的块数达到特定的迁移阈值时,平衡器会尝试在分片之间自动迁移块,使得每个分片达到相等数量的块。平衡器将比较多块的分片中的块迁移到块数量较少的分片中。平衡器迁移块,直到集合在分片之间的块均匀分布。

平衡器具有以下阈值:

块数

迁移阈值

少于20

2

20-79

4

多于80

8

分片集群的平衡过程对用户和应用层完全透明,尽管在执行过程中可能会有一些性能影响。

2、        平衡器在分片集群中是干什么的,也就是平衡器的作用

其中,上面已经介绍了,说得直白点,就是用来在分片集群中迁移块的。

3、        分片集群中迁移块的过程

所有块迁移使用以下过程:

  1. 平衡器进程将moveChunk命令发送到源分片。
  2. 源分片使用内部moveChunk 命令启动移动。在迁移过程中,块的操作路由到源分片。源分片负责块的写入操作。
  3. 目标分片生成目标分片所不存在的源分片所需的所有索引。
  4. 目标分片开始在块中请求文档,并开始接收数据的副本。
  5. 在块中收到最终文档后,目标分片将启动同步过程,以确保它具有对迁移过程中发生的已迁移文档的更改。
  6. 当完全同步时,源分片连接到 配置数据库,并使用块的新位置更新集群元数据。
  7. 源分片完成元数据的更新后,一旦块上没有打开光标,源分片将删除其文档副本。

注意: 如果平衡器需要从源分片执行其他的块迁移,则平衡器可以启动下一个块迁移,而不必等待当前的迁移过程来完成此删除步骤。

注意:不能移动的块:如果块中的文档数超过了250000个文档,或者配置的块大小除以平均文档大小的1.3倍,则MongoDB不能移动块  db.collection.stats() avgObjSize字段,表示集合中平均文档的大小。

在大多数情况下,应该让平衡器在分片之间 自动迁移块。但是,mongoDB也允许手动迁移块:

迁移单个块

下面的示例假定在一个myapp 数据库有users集合,分片键是字段username

为smith的块 。在mongoshell中使用以下命令迁移该块 。

db.adminCommand( { moveChunk : "myapp.users",

find : {username : "smith"},

to : "mongodb-shard3.example.net" } )

此命令将包含分片键值“smith”的块迁移到分片名为mongodb-shard3.example.net。

4、        平衡器的定时启用和关闭

利用计划平衡窗口,可以达到让平衡器定时启用和关闭。

4.1. 启用一个计划平衡窗口

以下过程指定了activeWindow,使得平衡器能够在特定的时间范围迁移块:

1)     使用mongo shell连接到群集中的任何一个mongos

2)     切换到配置数据库

use config

3)     确保平衡器的状态不是stopped

sh.setBalancerState( true )

如果在activeWindow时间范围之外,平衡器将无法启动。

4)     修改平衡器的窗口。

使用update()设置activeWindow,如下所示:

db.settings.update(
   { _id: "balancer" },
   { $set: { activeWindow : { start : "<start-time>", stop : "<stop-time>" } } },
   { upsert: true }
)

使用两位数小时和分钟值(即HH:MM)指定平衡窗口的开始和结束边界时间来替换<start-time>和<end-time>。

    • 对于HH值,使用小时值范围00- 23。
    • 对于MM值,使用分钟值范围00- 59。

注意:平衡器窗口必须足以完成上次禁用平衡器时插入的所有数据的迁移。

以上过程设置之后,平衡器则会在平衡窗口规定的时间start—stop之间运行,在这段时间之外平衡器是被禁用的。

4.2. 移除一个平衡计划窗口

那么当这个平衡窗口不用时,怎么移除它呢?

如果设置了平衡窗口并希望删除计划,以使平衡器始终运行,请使用$unset以清除activeWindow,如下所示:

use config
db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } })

5、        怎么减少平衡器对分片集群的性能影响

5.1. 系统自带机制减少平衡器对分片集群性能的影响

块的迁移在带宽和工作负载方面带来一些开销,这两者都可能影响数据库性能。平衡器 试图最小化的该影响:

    • 在任何给定的时间将分片限制在最多一个迁移; 即分片不能同时参与多个块迁移。要从分片中迁移多个块,平衡器一次移动一个块。

版本3.4更改:从MongoDB 3.4开始,MongoDB可以执行并行块迁移。观察分片一次可以参与多达一个迁移的限制,对于具有n个分 片的分片集群,MongoDB可以同时执行最多n / 2(四舍五入)进行的块迁移。

    • 只有当分片数量最多的分片和分片数量最少的分片之间的块数差异达到迁移阈值时才开始平衡。

5.2. 我们可以采取的措施

临时禁用平衡器进行维护(可以看第6点)。

可以设置计划平衡窗口(可以看第4点),以限制平衡器运行的窗口,以防止其影响生产流量。平衡窗口的规范是相对于配置服务器副本集的主节点本地时区。

6、        关于平衡器的一些命令

检查平衡器是否启用(即平衡器被允许运行)  sh.getBalancerState()

检查平衡器是否在运行           sh.isBalancerRunning()

禁用平衡器                sh.stopBalancer()

启用平衡器                sh.startBalancer()或sh.setBalancerState(true)

在一个集合禁用平衡器           sh.disableBalancing("databaseName.collectionName")

  sh.disableBalancing()方法接收集合的完整命名空间作为其参数。

在一个集合启用平衡器              sh.enableBalancing("students.grades")

  sh.enableBalancing()方法接收集合的完整命名空间作为其参数。

--------------------------------------- over ------------------------------------------------------

以上资料,大部分是参考官网的资料,在此表示感谢。

https://docs.mongodb.com/manual/core/sharding-balancer-administration/

mongo 3.4分片集群系列之五:详解平衡器的更多相关文章

  1. mongo 3.4分片集群系列之八:分片管理

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

  2. mongo 3.4分片集群系列之七:配置数据库管理

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

  3. mongo 3.4分片集群系列之六:详解配置数据库

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

  4. mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + 安全 + 区域

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

  5. mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

  6. mongo 3.4分片集群系列之二:搭建分片集群--哈希分片

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

  7. mongo 3.4分片集群系列之一:浅谈分片集群

    这篇为理论篇,稍后会有实践篇. 这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mong ...

  8. 深入浅出—Redis集群的相关详解

    前言: 这篇文章主要介绍了Redis集群的相关,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值. 注意!要求使用的都是redis3.0以上的版本,因为3.0以上增加了red ...

  9. t持久化与集群部署开发详解

    Quartz.net持久化与集群部署开发详解 序言 我前边有几篇文章有介绍过quartz的基本使用语法与类库.但是他的执行计划都是被写在本地的xml文件中.无法做集群部署,我让它看起来脆弱不堪,那是我 ...

随机推荐

  1. 经常使用的android设计模式

    一般来说,经常使用的android设计模式有下面8种:单例.工厂.观察者.代理.命令.适配器.合成.訪问者.   单例模式:目的是为了让系统中仅仅有一个调用对象,缺点是单例使其它程序过分依赖它,并且不 ...

  2. Android Jni Android.mk经常使用语句

    仅仅要涉及JNI开发都涉及到Android.mk编写,它也是一种makefile语言. 以上一篇博客中提供的project为例! <1> : 信息打印 : 既然是一种简易语言那么首先应该知 ...

  3. nlssort排序

    ALTER SESSION SET NLS_SORT=''; 排序影响整个会话 Oracle9i之前,中文是按照二进制编码进行排序的. 在oracle9i中新增了按照拼音.部首.笔画排序功能.设置NL ...

  4. C#字符串数组排序 C#排序算法大全 C#字符串比较方法 一个.NET通用JSON解析/构建类的实现(c#) C#处理Json文件 asp.net使用Jquery+iframe传值问题

    C#字符串数组排序   //排序只带字符的数组,不带数字的 private   string[]   aa   ={ "a ", "c ", "b & ...

  5. 使用heartbeat+monit实现主备双热备份系统

    一.使用背景 项目须要实现主备双热自己主动切换的功能,保证系统7*24小时不间断执行.现已有两台双网卡的IBM的server,为了不再添加成本採购独立外部存储设备和双机热备软件.採用了linux下开源 ...

  6. TQ2440 学习笔记—— 1、Windows平台下开发工具安装与环境建立

    板子:广州天嵌公司的TQ2440,处理器为三星的S3C2440 1.开发工具的安装与环境建立 系统:win7  64位 SecureCRT软件:该软件能够取代Windows中的超级终端,是个非常好的串 ...

  7. kafka 生产者消费者 api接口

    生产者 import java.util.Properties; import kafka.javaapi.producer.Producer; import kafka.producer.Keyed ...

  8. NSSet所有API学习。

    /****************集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址.只是NSArray是有序的集合,NSSet是无序的集合,同一时候NSSet能够保证数据 ...

  9. java poi excel导入模板设置下拉框

    import org.apache.poi.hssf.usermodel.DVConstraint; import org.apache.poi.hssf.usermodel.HSSFCell; im ...

  10. AndroidStudio更改Gradle的版本

    1.首先需要在Gradle官网上下载需要的gradle版本,对于imac需要放置到AndroidStudio的安装目录下的gradle目录下面 2.更改项目的build.gradle的gradle的版 ...