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. ffplay.c函数结构简单分析(绘图)

    近期重温了一下FFplay的源码. FFplay是FFmpeg项目提供的播放器演示样例.虽然FFplay不过一个简单的播放器演示样例,它的源码的量也是不少的. 之前看代码,主要是集中于某一个" ...

  2. LeetCode 953. Verifying an Alien Dictionary (验证外星语词典)

    题目标签:HashMap 题目给了我们一个 order 和 words array,让我们依照order 来判断 words array 是否排序. 利用hashmap 把order 存入 map, ...

  3. 【OI】向量&矩阵乘法

    何为向量? 在初中课本中,我们知道: 向量是有大小和方向的量. 这样解释太笼统了,现在我们只讨论平面上的向量. 那么,我们约定:在平面上的向量,由一个二元组组成:如α(c1,c2). 在此平面上建立一 ...

  4. Linux gadget驱动分析3------复合设备驱动

    windows上面对usb复合设备的识别需要下面条件. “ 如果设备满足下列要求,则总线驱动程序还会报告 USB\COMPOSITE 的兼容标识符: 设备描述符的设备类字段 (bDeviceClass ...

  5. CSS里面position:relative与position:absolute 区别

    position:absolute这个是绝对定位:是相对于浏览器的定位.比如:position:absolute:left:20px;top:80px; 这个容器始终位于距离浏览器左20px,距离浏览 ...

  6. java异步编程

    异步编程提供了一个非阻塞事件驱动的模型.通过异步消除阻塞,可以让web服务响应更多请求.可以让系统更高效的执行.比如log框架,记录日志或异常时异步执行可避免影响正常业务流程的执行. 异步变成如何把线 ...

  7. linux 条件测试 ******

    文件状态测试 -b filename 当filename 存在并且是块文件时返回真(返回0) -c filename 当filename 存在并且是字符文件时返回真 -d pathname 当path ...

  8. bzoj3771

    http://www.lydsy.com/JudgeOnline/problem.php?id=3771 生成函数... 其实就是多项式乘法...lrj书上有一个通俗的解释... 然后就是这个样子,我 ...

  9. windows下 redis/tomcat 服务自启动

    //设置redis服务自启动 //根据个人配置执行语句.   redis-server --service-install redis.windows.conf --loglevel verbose ...

  10. akka设计模式系列-Chain模式

    链式调用在很多框架和系统中经常存在,算不得上是我自己总结的设计模式,此处只是简单介绍在Akka中的两种实现方式.我在这边博客中简化了链式调用的场景,简化后也更符合Akka的设计哲学. trait Ch ...