Linux下mongodb数据库主从复制配置
Mongodb的三种集群搭建的方式:
Master-Slaver:主从[目前被副本集取代]。
Replica Set:副本集。
Sharding:切片。
Mongodb单实例缺点:
适合简易开发时使用,生产使用不行,因为单节点挂掉整个数据业务全挂。
主从复制:
MongoDB常用的复制方式,也是一个简单的数据库同步备份的集群技术,这种方式很灵活。可用于备份,故障恢复等等。
最基本的设置方式是建立一个主节点和一个/多个从节点,当主节点挂掉了后从节点可以接替主机继续服务。
主从复制缺点[见文章结尾]
原理:
主从结构中,主节点的操作记录oplog[operation log]。
oplog存储在一个系统数据库local的集合oplog.$main中,这个集合的每个文档都代表主节点上执行的一个操作。
从服务器会定期从主服务器中获取oplog记录,然后在本机上执行。
对于存储oplog的集合,MongoDB采用的是固定集合,随着操作过多,新的操作会覆盖旧的操作。
准备:
192.168.102.111 master
192.168.102.112 slave
关于mongodb的安装详见:
第四篇:linux系统中mongodb的配置
提示:
建议两台机器都关闭防火墙
1、 修改master配置文件
192.168.102.111 master
vi ~
port=27017
bind_ip=192.168.102.111
dbpath=/home/odysee
logpath=/home/odysee
logappend=true
journal=true
fork=true
#主服务器
master=true
#同步复制的日志大小设置,单位MB
oplogSize=2048
2、修改slave配置文件
192.168.102.112 slave
vi ~
port=27017
bind_ip=192.168.102.112
dbpath=/home/odysee
logpath=/home/odysee
logappend=true
journal=true
fork=true
#主数据库端口
source=192.168.102.111:27017
#从服务器
slave=true
#设置从库同步主库的延迟时间,秒
slavedelay=10
#主从库数据不一致时,自动同步
autoresync=true
3、开启master的mongod服务
bin/mongod --config ~
开启mongo客户端
bin/mongo 192.168.102.111
4、 开启slave的mongod服务
bin/mongod --config ~
开启mongo客户端
bin/mongo 192.168.102.112
5、 测试数据同步
在master中新建demo库插入测试数据
> use demo;
switched to db demo
> db.demo.insert({"name":"odysee1"})
WriteResult({ "nInserted" : 1 })
> db.demo.insert({"name":"odysee2"})
WriteResult({ "nInserted" : 1 })
> db.demo.insert({"name":"odysee3"})
WriteResult({ "nInserted" : 1 })
> db.demo.find()
{ "_id" : ObjectId("5c37b2780ecf620bd11f14c8"), "name" : "odysee1" }
{ "_id" : ObjectId("5c37b27b0ecf620bd11f14c9"), "name" : "odysee2" }
{ "_id" : ObjectId("5c37b27e0ecf620bd11f14ca"), "name" : "odysee3" }
在slave中查看
Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not mast
er" }
解释:
slave[默认是不可读]是不允许读写的,可以通过在连接时指定或者在主库指定slaveOk,由slave来分担读的压力。
解决方案:
在slave节点数据库中执行rs.slaveOk()命令即可
执行rs.slaveOk()
> rs.slaveOk()
> show dbs
demo 0.078GB
local 0.078GB
> use demo
switched to db demo
> db.demo.find()
{ "_id" : ObjectId("5c38f77633430bbc2fe4fd82"), "name" : "odysee1" }
{ "_id" : ObjectId("5c38f77933430bbc2fe4fd83"), "name" : "odysee2" }
{ "_id" : ObjectId("5c38f77c33430bbc2fe4fd84"), "name" : "odysee3" }
6、 补充
主从复制的其他参数:
--only 从节点指定复制某个数据库,默认是复制全部数据库
--fastsync 从节点以主数据库的节点快照为节点启动从数据库
从节点的local数据库中,存在一个集合sources。
这个集合保存了这个服务器的主服务器的信息。
> rs.slaveOk()
> show dbs
demo 0.078GB
local 0.078GB
> use local
switched to db local
> db.()
{ "_id" : ObjectId("5c38f7396c5e678d05336ca9"), "host" : "192.168.102.111:27017", "source" : "main", "syncedTo" : Timestamp(15472
38614, 1) }
测试完成
缺点:
主节点挂了不能自动切换连接到从节点,需要手工切换,比较致命。
目前主从复制已经被副本集所代替,关于副本集的优缺点我们下篇分晓。
欢迎大家给予宝贵的意见或者建议。
欢迎大家补充或者共享一些其他的方法。
感谢支持。