1. 环境(MongoDB的版本是3.2.16)

[root@xxx-mongodb-primary ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@xxx-mongodb-primary ~]# getenforce
Disabled
[root@xxx-mongodb-primary ~]# systemctl is-active firewalld.service
unknown
[root@xxx-mongodb-primary ~]# systemctl is-enabled firewalld.service
disabled

2. 从库恢复

由于某种原因需要恢复MongoDB复制集的从库,使用了一主一从一ab的结构,主从配置文件是一致的,我本次恢复从库使用的官网的初始同步更新的办法(https://docs.mongodb.com/manual/tutorial/restore-replica-set-from-backup/#shut-down-the-mongod-instance-that-you-restored):

1. 停止从库后,从主库移除从库节点
2. 从库删除dbpath下的所有文件
3. 启动从库
4. 主库加入从库节点,复制开始

主库配置文件

[root@xxx-mongodb-primary conf]# cat mongo.conf
systemLog:
destination: file
path: /mongodb/27017/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongodb/27017/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 5
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
port: 27017
bindIp: 0.0.0.0
replication:
oplogSizeMB: 4096
replSetName: my_repl
security:
authorization: enabled
keyFile: /mongodb/27017/conf/keyfile

3. 发现主从库数据显示大小不一致

但是主从完成同步后,发现从库显示的prd_market_history库的数据的大小和主库相差了1G左右(主库数据才4G大小),但是使用mongodump备份出来的数据的文件大小几乎一致,都是3.6GB,只相差十多K。

备份MongoDB库的命令:mongodump   -uroot -pxxx --port 27017 --authenticationDatabase admin -d prd_market_history -o /mongodb/backup/

主库信息:

从库信息:

4. 原因

https://segmentfault.com/q/1010000015112464?tdsourcetag=s_pcqq_aiomsg

题外话,MongoDB历史上出现过master/slave复制(其实现在也还存在)。严格地说,主备通常指的是那个东西。而我们现在用的基本上是复制集(replica set)。

再说你这种情况,其实是正常的。原理跟你的磁盘用久了会有碎片是一个道理。特别是你曾经大规模删除过数据的情况下。简单地解释下,假设你的表中有doc1/doc2/doc3/doc4一共4个文档,在磁盘上的存储顺序是:
doc1|doc2|doc3|doc4
现在你删除了doc2,磁盘上的空间使用情况变成:
doc1|(空白)|doc3|doc4
系统是没有办法释放这个空白空间的,除非你进行磁盘整理,把空白空间移到最后:
doc1|doc3|doc4|(空白)
然后系统才可以截断文件尾部的空白,释放掉这个空间。可以看出来,要把空白移动到文件尾是个相当费时费力的操作,最简单的办法是:把后面所有的文档顺序前移来填补doc2留下的空白(如上所示doc3/doc4被前移)。但是这样涉及到大量的磁盘I/O,会对性能造成严重影响。当然不乏其他整理磁盘碎片的方法,但是无论哪一个,都会造成比较严重的I/O影响,因此一般我们是不会进行这样的整理的。进行碎片整理的方式就是:compact命令。如前所述,因为它会对性能造成严重的影响,因此一般只会在维护时间进行这个操作。而就算你不进行这个操作,系统也知道哪些地方是空白的,在有新文档进来的时候,会尝试重新使用这些空白的部分从而最大化空间利用率。只是,无论再好的算法,空间重复利用一定不可能是100%的,因为新进来的文档永远没有办法正好跟之前被删除的文档一样大,所以只能找一个比新文档更大的空间来利用,这样就会留下一个更小的、更难重复利用的碎片。
另外一种变通的方案是把节点内容删除,重新进行一次同步。因为同步时相当于把所有文档全部抓取一遍,并一个接一个重新写到磁盘上,因此同步完成之后文档在磁盘上是紧凑排列的,相当于进行了碎片整理。而且在这个过程中,受影响的是从节点,它在同步过程中并不对外提供服务,所以对线上的影响是最小的。但是注意,它同样会对主节点造成影响,因为它要把主节点上的全部数据都读一遍,主节点I/O升高是无法避免的。

为什么从节点比主节点小,上面已经很清楚的说明了。

MongoDB主库和从库的数据大小不一致原因判断的更多相关文章

  1. rem在三星s5部分机型情况下 设置的字体大小与手机实际字体大小不一致问题

    rem在三星s5部分机型情况下 设置的字体大小与手机实际字体大小不一致问题 判断是特殊机型,做特殊处理. var u=navigator.userAgent; if($(window).width() ...

  2. mongodb可以通过profile来监控数据 (mongodb性能优化)

    mongodb可以通过profile来监控数据 (mongodb性能优化)   开启 Profiling  功能 ,对慢查询进行优化: mongodb可以通过profile来监控数据,进行优化. 查看 ...

  3. DG之主库、备库切换(物理备库)

    DG之主库.备库切换 一.开库与关库顺序 开库顺序 先启备库,再启主库(启动监听.打开告警日志) 关库顺序 先关主库,再关备库 二.主备库切换 1.操作过程一览 步骤1:启动备库.监听.告警: 步骤2 ...

  4. dataguard从库移动数据文件

    ------------方法1从库移动数据文件路径方法1--------------将表空间offline的方法不行 1.退出日志应用alter database recover managed st ...

  5. MySQL查看库表的大小

    MySQL数据库空间使用情况查询 如果想知道MySQL数据库中每个表占用的空间.表记录的行数的话,可以打开MySQL的 information_schema 数据库.在该库中有一个 TABLES 表, ...

  6. MongoDB,还有一个角度看数据

    传智-玄痛(传智播客北京校区C/C++学院技术指导老师) MongoDB的起源 几年前 10gen 公司做了 SaaS 方面的研发,由于公司一个 MongoDB 产品存储接口的易用性,用户评价很好,公 ...

  7. 003-mysql查询表的数据大小

    在需要备份数据库里面的数据时,我们需要知道数据库占用了多少磁盘大小,可以通过一些sql语句查询到整个数据库的容量,也可以单独查看表所占容量. 1.查看数据库表结构大小,要查询表所占的容量,就是把表的数 ...

  8. 不同平台下int类型、指针类型的数据大小

    不同平台下int类型.指针类型的数据大小 对于int类型数据和指针类型数据的大小,是非常基础的问题. 在一个具体的平台上,确定他们最好的办法就是使用sizeof(type)对其进行判断,返回当前数据类 ...

  9. 分享一个Python脚本--统计redis key类型数据大小分布

    概述 今天主要介绍怎么统计redis key类型数据大小分布. 原理:使用redis命令: scan.pipline.type 和 debug object 来得到 redis key 信息. 脚本 ...

随机推荐

  1. LeetCode 929. Unique Email Addresses (独特的电子邮件地址)

    题目标签:String 题目说明 有两个规则针对于 local name. 所以先把local name 和 domain name 分开. 两个规则是: rule 1:'.' 会被去除. (利用re ...

  2. android中ping命令的实现

    /** * 推断Ping 网址是否返回成功 *  * @param netAddress * @return */ public static String isPingSuccess(int pin ...

  3. android学习笔记:adb更换端口后成功启动

    搭建手机开发环境,android ADT,android SDK,然后按照PhoneGap官网的指引,拷贝文件,修改代码,运行,进度条到了某个位置后就停止不动了. 停止不动,又是停止不动.你都不知道问 ...

  4. MODULE_DEVICE_TABLE的理解【转】

    本文转载自:http://blog.csdn.net/sidely/article/details/39666471 在Linux IIC驱动中看到一段代码: static struct platfo ...

  5. VS2010 使用TeeChart绘图控件 - 之一 - 控件和类的导入

    vs2010的用法和vc6有很大的不同,特别是在一些函数调用那里,当然.控件导入也是很不一样的 安装好控件后就可以在工程里加入teechart控件了 加入方法有如下几种: 1.添加Teechart控件 ...

  6. 交换排序(2)——冒泡排序(bubble sort)

    冒泡排序算法的运作如下:(从后往前) 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所 ...

  7. hdu 6198(矩阵快速幂)

    number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  8. Notepad++ - 通过语言格式设置自定义语法高亮颜色

    http://blog.csdn.net/onceing/article/details/51554399 Global Styles Indent guideline style  缩进参考线的颜色 ...

  9. web安全:防止浏览器记住或自动填写用户名和密码(表单)的终极解决方案

    最近项目上要求做到这一点,在网上搜了一圈,发现都是不完美的,不兼容全部的浏览器,于是只能自己摸索了,最终得出了终极解决方案: 涉及: disabled 或 readonly display:none; ...

  10. 344 Reverse String 反转字符串

    请编写一个函数,其功能是将输入的字符串反转过来.示例:输入:s = "hello"返回:"olleh"详见:https://leetcode.com/probl ...