mongo 3.4分片集群系列之五:详解平衡器
这个系列大致想跟大家分享以下篇章:
2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片
3、mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全
4、mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + 安全 + 区域
这篇为理论篇
这篇章主要讲一下以下几个点:
1) 简要说说平衡器是啥吧
2) 平衡器在分片集群中是干什么的,也就是平衡器的作用
3) 这里还会仔细说明分片集群中迁移块的过程
4) 平衡器的定时启用和关闭
5) 怎么减少平衡器对分片集群的性能影响
6) 关于平衡器的一些命令
1、 简要说说平衡器是啥
MongoDB的平衡器是一个后台进程,监视每个分片上块的数目。当给定分片上的块数达到特定的迁移阈值时,平衡器会尝试在分片之间自动迁移块,使得每个分片达到相等数量的块。平衡器将比较多块的分片中的块迁移到块数量较少的分片中。平衡器迁移块,直到集合在分片之间的块均匀分布。
平衡器具有以下阈值:
|
块数 |
迁移阈值 |
|
少于20 |
2 |
|
20-79 |
4 |
|
多于80 |
8 |
分片集群的平衡过程对用户和应用层完全透明,尽管在执行过程中可能会有一些性能影响。
2、 平衡器在分片集群中是干什么的,也就是平衡器的作用
其中,上面已经介绍了,说得直白点,就是用来在分片集群中迁移块的。
3、 分片集群中迁移块的过程
所有块迁移使用以下过程:
- 平衡器进程将moveChunk命令发送到源分片。
- 源分片使用内部moveChunk 命令启动移动。在迁移过程中,块的操作路由到源分片。源分片负责块的写入操作。
- 目标分片生成目标分片所不存在的源分片所需的所有索引。
- 目标分片开始在块中请求文档,并开始接收数据的副本。
- 在块中收到最终文档后,目标分片将启动同步过程,以确保它具有对迁移过程中发生的已迁移文档的更改。
- 当完全同步时,源分片连接到 配置数据库,并使用块的新位置更新集群元数据。
- 源分片完成元数据的更新后,一旦块上没有打开光标,源分片将删除其文档副本。
注意: 如果平衡器需要从源分片执行其他的块迁移,则平衡器可以启动下一个块迁移,而不必等待当前的迁移过程来完成此删除步骤。
注意:不能移动的块:如果块中的文档数超过了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分片集群系列之五:详解平衡器的更多相关文章
- mongo 3.4分片集群系列之八:分片管理
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- mongo 3.4分片集群系列之七:配置数据库管理
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- mongo 3.4分片集群系列之六:详解配置数据库
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + 安全 + 区域
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- mongo 3.4分片集群系列之二:搭建分片集群--哈希分片
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- mongo 3.4分片集群系列之一:浅谈分片集群
这篇为理论篇,稍后会有实践篇. 这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mong ...
- 深入浅出—Redis集群的相关详解
前言: 这篇文章主要介绍了Redis集群的相关,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值. 注意!要求使用的都是redis3.0以上的版本,因为3.0以上增加了red ...
- t持久化与集群部署开发详解
Quartz.net持久化与集群部署开发详解 序言 我前边有几篇文章有介绍过quartz的基本使用语法与类库.但是他的执行计划都是被写在本地的xml文件中.无法做集群部署,我让它看起来脆弱不堪,那是我 ...
随机推荐
- STL算法设计理念 - 函数对象和函数对象当參数和返回值
函数对象: 重载函数调用操作符的类.其对象常称为函数对象(function object),即它们是行为类似函数的对象. 一个类对象,表现出一个函数的特征,就是通过"对象名+(參数列表)&q ...
- 【转】c++中placement new操作符
new:指我们在C++里通常用到的运算符,比如A* a = new A; 对于new来说,有new和::new之分,前者位于std operator new():指对new的重载形式,它是一个函数, ...
- centos7容量扩充
新买的2T 绿盘到货了~~好开心的说~但毕竟是第一次安装,事先还是在网上搜索了很多资料才敢动手,下面就开始啦~ 环境:Centos7.dell服务器.2T容量绿盘 1.硬盘连接好之后,开机先使用fdi ...
- Linux挂载新盘
Linux 系统挂载数据盘 1.查看数据盘 使用“fdisk-l”命令查看 2. 对数据盘进行分区 执行“fdisk /dev/sdb”命令,对数据盘进行分区: 输入“n”,“p”“1”,两次回车,“ ...
- SSD硬盘安装系统后要做的事
1***cmd>fsutil behavior query DisableDeleteNotify 0如果返回值是0,则代表TRIM处于开启状态:反之如果返回值是1,则代表TRIM处于关闭状态2 ...
- javascript闭包具体解释
今天我们从内存结构上来解说下 javascript中的闭包概念. 闭包:是指有权訪问另外一个函数作用域中的变量的函数. 创建闭包的常见方式就是在一个函数内部创建另外一个函数. 在javascript中 ...
- nyoj 739 笨蛋的难题四
笨蛋难题四 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描写叙述 这些日子笨蛋一直研究股票,经过调研.最终发现xxx公司股票规律,更可喜的是 笨蛋推算出这家公司每天的股价, ...
- codeforces 552 C Vanya and Scales
这个题的意思就是给出一个数m.以及一个以1为首元素.w为比例常数的等比数列,数列长度为101,数列中每一个数字最多仅仅能用一次.问是否存在xa+wb+--=wc+wd+--+we+m. 非常显然,换句 ...
- 基于 Web 的 Go 语言 IDE - Wide 1.1.0 公布!
公布 1.1.0 这个版本号改进了非常多细节,已经全然能够用于正式项目的开发 同一时候我们上线了 Wide 在线服务 到眼下,我们提供了 Wide 和 Solo 两个在线服务,详情请看这里. Wide ...
- c# DataGridView样式设置无效
对DataGridView中的某些行设置样式时,无效,最后发现,我是先设置完样式再进行展现的this.controls.Add,应该先展现完了,再设置样式.