MongoDB高级应用(一):主从复制
1.架构模型
Paste_Image.png从架构上看,主从复制有什么好处:
数据备份
数据恢复
读写分离
一般的数据库都会有主从模式,为了平衡负载,主库写,从库读。
说的再多,实践下吧。
2.主从复制
拿2台数据库为例,10.11.1.58和10.11..1.66
10.11.1.58 主
10.11.1.66 从
创建数据库路径
主:mkdir -p /data/master
从:mkdir -p /data/slave
创建日志文件路径
主:mkdir -p /data/log
从:mkdir -p /data/log
创建配置文件路径
主:mkdir -p /data/conf
从:mkdir -p /data/conf
创建主数据启动配置文件
port=27017
logpath=/data/log/mongod.log
dbpath=/data/master
pidfilepath=/data/master/mongod.pid
fork=true
master=true
oplogSize=2048
命名为master.conf,存放在/data/conf/下
创建从数据启动配置文件
port=27017
logpath=/data/log/mongod.log
dbpath=/data/slave
pidfilepath=/data/slave/mongod.pid
fork=true
slave=true
source=10.11.1.58:27017 #主数据库的IP和端口
autoresync=true
命名为slave.conf,存放在/data/conf/下
这样就配置好了master-slave
干掉已存在的mongod进程
ps -ef|grep mongo
Paste_Image.png
有就干掉
kill pid
启动服务
master
/usr/local/mongodb/bin/mongod --config /data/conf/master.conf
Paste_Image.png
显示启动成功!
slave
/usr/local/mongodb/bin/mongod --config /data/conf/slave.conf
Paste_Image.png
显示启动成功!
3.验证部署
主从验证主要是验证主写入数据,从读取数据
master写数据
登录master
/usr/local/mongodb/bin/mongo
Paste_Image.png
写数据
创建数据库
> use testdb
switched to db testdb
写入数据
> db.col.save({a:1})
WriteResult({ "nInserted" : 1 })
查看数据
> db.col.find()
{ "_id" : ObjectId("58ddc0b2dcb436ef0cd97835"), "a" : 1 }
>
Paste_Image.png
slave读数据
登录slave
/usr/local/mongodb/bin/mongo
Paste_Image.png
读数据
查看数据库
> show dbs
Paste_Image.png
怎么回事?"not master and slaveOk=false"
初始状态下,slave是没有读的权限?
为什么?
因为不知道用户需要将那个slave设置成读,故需要用户设置slave为可读
rs.slaveOk()
Paste_Image.png
可以看到数据库了
查看数据是否已同步
Paste_Image.png
可以看到数据已同步过来了
至此主从同步已完成!
大功告成!
顺便查看下slave能不能写
Paste_Image.png
果然,还是不能写!
4.存在不足
主从复制虽然可以承载一定的负载压力,但仍然存在一个很大的不足,如果主库挂了,那么写入就有危险。如果有这么一种模式,当主库挂了,在IP不变的模式下,从库充当主库,这样是不是就可以规避写入的风险?
当然可以,这就是MongoDB集群复制要干的事。