杂集:浅谈关于Mongodb数据库主从复制

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 ~/mongodb3.0/etc/mongodb.conf

port=27017

bind_ip=192.168.102.111

dbpath=/home/odysee/mongodb3.0/data/db/

logpath=/home/odysee/mongodb3.0/logs/mongodb.log

logappend=true

journal=true

fork=true

#主服务器

master=true

#同步复制的日志大小设置,单位MB

oplogSize=2048

杂集:浅谈关于Mongodb数据库主从复制

2、修改slave配置文件

192.168.102.112 slave

vi ~/mongodb3.0/etc/mongodb.conf

port=27017

bind_ip=192.168.102.112

dbpath=/home/odysee/mongodb3.0/data/db/

logpath=/home/odysee/mongodb3.0/logs/mongodb.log

logappend=true

journal=true

fork=true

#主数据库端口

source=192.168.102.111:27017

#从服务器

slave=true

#设置从库同步主库的延迟时间,秒

slavedelay=10

#主从库数据不一致时,自动同步

autoresync=true

杂集:浅谈关于Mongodb数据库主从复制

3、开启master的mongod服务

bin/mongod --config ~/mongodb3.0/etc/mongodb.conf

杂集:浅谈关于Mongodb数据库主从复制

开启mongo客户端

bin/mongo 192.168.102.111

杂集:浅谈关于Mongodb数据库主从复制

4、 开启slave的mongod服务

bin/mongod --config ~/mongodb3.0/etc/mongodb.conf

杂集:浅谈关于Mongodb数据库主从复制

开启mongo客户端

bin/mongo 192.168.102.112

杂集:浅谈关于Mongodb数据库主从复制

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" }

杂集:浅谈关于Mongodb数据库主从复制

在slave中查看

Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not mast

er" }

解释:

slave[默认是不可读]是不允许读写的,可以通过在连接时指定或者在主库指定slaveOk,由slave来分担读的压力。

解决方案:

在slave节点数据库中执行rs.slaveOk()命令即可

杂集:浅谈关于Mongodb数据库主从复制

执行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" }

杂集:浅谈关于Mongodb数据库主从复制

6、 补充

主从复制的其他参数:

--only 从节点指定复制某个数据库,默认是复制全部数据库

--fastsync 从节点以主数据库的节点快照为节点启动从数据库

从节点的local数据库中,存在一个集合sources。

这个集合保存了这个服务器的主服务器的信息。

> rs.slaveOk()

> show dbs

demo 0.078GB

local 0.078GB

> use local

switched to db local

> db.sources.find()

{ "_id" : ObjectId("5c38f7396c5e678d05336ca9"), "host" : "192.168.102.111:27017", "source" : "main", "syncedTo" : Timestamp(15472

38614, 1) }

杂集:浅谈关于Mongodb数据库主从复制

测试完成

缺点:

主节点挂了不能自动切换连接到从节点,需要手工切换,比较致命。

目前主从复制已经被副本集所代替,关于副本集的优缺点我们下篇分晓。

欢迎大家给予宝贵的意见或者建议。

欢迎大家补充或者共享一些其他的方法。

感谢支持。


分享到:


相關文章: