我在第7.1.1Spring操作mongodb之mongodb4.x集群搭建中已经描述了mongodb4.x集群的搭建,为什么再描述mongo3.0.x主从复制,是因为我们有两台其他人搭建的mongo3.0.x,他是主从模式,现在磁盘空间快慢了,我需要想办法处理一下
既然是主从模式,那么主库可以读写,而从库只能读。参考MongoDB 3.0 常见集群的搭建(主从复制,副本集,分片…)
一主一从模式的集群很简单,但是[MongDB] 主从架构–官方极力不推荐
主节点的mongodb.conf
#数据文件存放目录
#dbpath = /app/data/db/
dbpath = /appnew/data/db/
#日志文件存放目录
logpath = /application/mongodb/logs/mongodb.log
bind_ip= 10.101.3.197
#端口
port = 27017
#以守护程序的方式启用,即在后台运行
fork = true
nohttpinterface = true
##副本配置
replSet=mongoTest
从节点的mongodb.conf
#数据文件存放目录
#dbpath = /app/data/db/
dbpath = /appnew/data/db/
#日志文件存放目录
logpath = /application/mongodb/logs/mongodb.log
bind_ip=10.101.3.198
#端口
port = 27017
#以守护程序的方式启用,即在后台运行
fork = true
nohttpinterface = true
##副本配置
replSet=mongoTest
在主和从节点,执行命令mongod -f ./mongodb.conf --replSet mongoTest
就可以了。
这样的主从复制模式,劣势很明显。数据严重冗余,单台500G的磁盘,另外一台也会有500G的磁盘空间的消耗,水平扩展就比较困难了。如果有多块磁盘,能够垂直扩展呢?
这里仿照MongoDB解决磁盘不足使用软连接的方式,来解决这个问题
红色方框中磁盘使用90%,而蓝色磁盘只使用了35%。
创建软链接,接着修改mongodb.conf,重启mongodb。
ln -s /application/mongodb-linux-x86_64-4.0.4/data /application/mongo/data
ln -s /app/data /application/mongo/data
那么这样是否问题就解决了?文章指出要开启directoryperdb
,这个参数怎么起作用呢?
mogodb之directoryperdb作用,根据数据库划分磁盘,需要事先规划好,如果没有规划好,就只能备份再再做迁移了。
执行db.my_col.stats()
,可以看到主从模式是没有分片的
删除数据,mongo的空间并不会释放,必须执行db.repairDatabase()
,注意要留2G的空间
在主库中执行db.my_col.remove({})
,并不会释放从库的空间,从库无法执行remove操作,但可以执行db.repairDatabase()
操作,空间才可以释放
如果执行db.dropDatabase()
,空间会立即释放,但是删除集合或者集合中的数据,却不会。
我在生产环境执行提示了下面的错误,这是为什么呢?
{
"message" : "no such cmd: repairDatabase",
"ok" : 0,
"code" : 59,
"codeName" : "CommandNotFound",
"operationTime" : "Timestamp(1559005119, 1)",
"$clusterTime" : {
"clusterTime" : "Timestamp(1559005119, 1)",
"signature" : {
"hash" : "AAAAAAAAAAAAAAAAAAAAAAAAAAA=",
"keyId" : 0
}
},
"name" : "MongoError"
}