最近,公司业务数据存储量增多导致mongo数据库数据增长!
因为是集群状态(PRIMARY + SECONDARY + SECONDARY)
查看了各个db的大小,发现除了业务db之外,mongo自带的localdb也在占用着很多的磁盘空间
PRIMARY> show dbs;
News 0.203125GB
lo 50.0537109375GB
s 335.7900390625GB
s (empty)
sn 0.203125GB
tst 0.203125GB
如上!除了s(业务db)之外,lo(我改了下local名字)也占用了50G空间!
细致查看了各个表,发现local库中有一个oplog.rs占着51G空间
PRIMARY> use lo
switched to db lo
PRIMARY> show tables;
me
oplog.rs
replset.minvalid
slaves
startup_log
system.indexes
system.replset
PRIMARY> db.oplog.rs.stats(1024*1024)
{
"ns" : "local.oplog.rs",
"count" : 5955015,
"size" : 51108,
"avgObjSize" : 0.008582346140186044,
"storageSize" : 51200,
"numExtents" : 26,
"nindexes" : 0,
"lastExtentSize" : 25,
"paddingFactor" : 1,
"systemFlags" : 0,
"userFlags" : 0,
"totalIndexSize" : 0,
"indexSizes" : {
},
"capped" : true,
"max" : NumberLong("9223372036854775807"),
"ok" : 1
}
如上!查了下资料,mongo安装时会默认分配给oplog.rs 整个磁盘5%的空间!
例如:本地磁盘是500G,默认会分配25G空间给这个oplog使用,上面之所以是50G是因为做过调整的!在配置文件中定义了大小!下面是mongodb的配置文件!
$ cat /etc/mongod.conf |grep -v "^#" |grep -v "^$"
logpath=/var/log/mongo/mongod.log #log路径
logappend=true #log是否为追加
fork = true
dbpath=/var/lib/mongo #数据目录
pidfilepath = /var/run/mongodb/mongod.pid #pid文件路径
replSet=sns_replset
oplogSize=51200 #oplog的Size.单位:<MB>
rest=true
shardsvr=true
port = 27017
oplog主要是用于副本同步Primary时使用的,类似于mysql的binlog!不能轻易删除!如果大小超过了设定的大小,会采用覆盖的方式继续更新oplog!
修改oplog的大小
一,查看现在oplog的大小!
PRIMARY> db.oplog.rs.stats().maxSize
NumberLong(1970031616)
注意,mongo 2.4.10版本执行上面的命令会没有任何输出,其他版本没测!解决这种问题,把末尾的masSize去掉就好了!查看"max" : NumberLong("9223372036854775807"),即可!
PRIMARY> db.oplog.rs.stats()
NumberLong(1970031616)
二,修改副本集节点oplog的大小
注意,oplog必须大于990MB,所以修改oplog的大小时要考虑可调整的范围!
PRIMARY> db.adminCommand({replSetResizeOplog:1,size:1000})
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1593527768, 1),
"signature" : {
"hash" : BinData(0,"7fw3+0veB35tVTFl83c57kvM0OI="),
"keyId" : NumberLong("6841443127941660675")
}
},
"operationTime" : Timestamp(1593527768, 1)
}
size:要调整的Size
三,下面的步骤并不是调整oplog的Size后必须执行的!请合理执行!请谨慎使用!尤其是在集群状态下!
默认执行完第二步之后,如果是减小oplog的Size,空间并不会真正被释放出来!直到手动压缩oplog以后!
use local
db.runCommand({"compact" : "oplog.rs"})
注意,请谨慎使用该操作,因为集群状态下,副本依赖oplog同步Primary!如果副本没有来及同步,可能会导致主副数据不一样!所以建议关闭mongodb使用,生产中,如果数据量不大,建议副本重新同步Primary的数据!
至此!关于这篇文档的解说就结束了!
最后
还是那句话:
⚠:我依旧是那个不懂技术的小白!
当MongoDB集群的数据增长时,oplog占用大量空间。oplog是用于副本集同步的关键,类似MySQL的binlog,不能随意删除。本文介绍了如何查看和调整oplog大小,以及调整后可能对集群的影响,提醒在操作时需谨慎,特别是在生产环境中。
1436

被折叠的 条评论
为什么被折叠?



