MongoDB复制
概念
复制是跨多个服务器数据同步的过程。
复制的特点
- 保障数据的安全性
- 数据高可用性
- 灾难恢复
- 无需停机维护(如备份,重建索引,压缩)
- 分布式读取数据(提高读取能力)
mongodb支持副本集和主从复制,主从复制官方已不再推荐(不支持自动故障切换)。
主从复制(Master-Slave)
主从复制是可用于备份,故障恢复和读扩展等。基本就是搭建一个主节点和一个或多个从节点,在数据库集群中要明确的知道谁是主服务器,主服务器只有一台。从服务器要知道自己的数据源也就是对应的主服务是谁。
运行mongod --master
启动主服务器。
运行mongod --slave --source master_address
启动从服务器。
调整配置
主要是指定了一下 dbPath 和 log path,master配置如下:
$ cat master.conf
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: /home/work/mongo/master
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /home/work/mongo/master/mongod.log
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1
启动mongo实例
mongod -f master.conf --logappend --master --fork
mongod -f slave-1.conf --logappend --slave --fork --source localhost:27017
mongod -f slave-2.conf --logappend --slave --fork --source localhost:27017
所有的从节点都是从主节点复制信息,目前还不能从节点到从节点复制机制,原因是从节点没有自己的oplog。
一个集群中从节点没有明确的限制,但是多个节点对单点主机发起的查询也是吃不消的,不超过12个节点的集群可以良好运转。
功能测试
在主库中向user集合插入一条数据。
> use test
switched to db test
> db.user.insert({
'u':'test', 'p':'pwd'})
WriteResult({ "nInserted" : 1 })
> db.user.find()
{ "_id" : ObjectId("59c8d10c836ac6ec4e425fc5"), "u" : "test", "p" : "pwd" }
登录从库,可以看到user集合插入的记录已经同步过来了。
> rs.slaveOk()
> show dbs
admin 0.000GB
local 0.000GB
test 0.000GB
> use test
switched to db test
> show collections;
user
> db.user.find()
{ "_id" : ObjectId("59c8d10c836ac6ec4e425fc5"), "u" : "test", "p" : "pwd" }
其他配置项
- –only 从节点指定复制某个数据库,默认是复制全部数据库
- –slavedelay 从节点设置主数据库同步数据的延迟(单位是秒)
- –fastsync 从节点以主数据库的节点快照为节点启动从数据库
- –autoresync 从节点如果不同步则从新同步数据库(即选择当通过热添加了一台从服务器之后,从服务器选择是否更新主服务器之间的数据)
- –o