mongodb配置副本集(多台服务器间的副本集搭建) replica[ˈrɛplɪkə]
副本集具有多个副本保证了容错性,就算一个副本挂掉了还有很多副本存在,并且解决了“主节点挂掉了,整个集群内会自动切换”的问题。我们来看看mongoDB副本集的架构图:
由图可以看到客户端连接到整个副本集,不关心具体哪一台机器是否挂掉。主服务器负责整个副本集的读写,副本集定期同步数据备份,一但主节点挂掉,副本节点就会选举一个新的主服务器,这一切对于应用服务器不需要关心。我们看一下主服务器挂掉后的架构:
副本集中的副本节点在主节点挂掉后通过心跳机制检测到后,就会在集群内发起主节点的选举机制,自动选举一位新的主服务器。看起来很牛X的样子,我们赶紧操作部署一下!
官方推荐的副本集机器数量为至少3个,那我们也按照这个数量配置测试。
官方推荐的副本集机器数量为至少3个,那我们也按照这个数量配置测试。
配置三台机器 ip地址 237.130和237.131 237.132
1、分别在每台机器上启动mongodb
每台机器都启动副本集 命令 mongod --replSet spock -f conf/mongd.conf
关闭防火墙 service iptables stop
2、初始化副本集
启动成功以后 连接任意一台机器 启动mongo shell
config = { _id:"spock", members:[ {_id:0,host:"192.168.237.130:12345"}, {_id:1,host:"192.168.237.131:12345"}, {_id:2,host:"192.168.237.132:12345"}] }
db = (new Mongo("192.168.237.131:12345")).getDB("test")
rs.initiate(config)
结果如图所示:
![](https://images2015.cnblogs.com/blog/939719/201611/939719-20161117102006545-1752873957.png)
![](https://images2015.cnblogs.com/blog/939719/201611/939719-20161117102050826-1397702232.png)
整个副本集已经搭建成功了。
可以看到 131的机器是 主节点 其他都是备份节点,
3、测试副本集数据复制功能
连接主节点:131的mongo
![](https://images2015.cnblogs.com/blog/939719/201611/939719-20161117102119201-1777280136.png)
想test集合插入 文档
![](https://images2015.cnblogs.com/blog/939719/201611/939719-20161117102133842-1365363947.png)
连接其他任意一台备份节点的机器
![](https://images2015.cnblogs.com/blog/939719/201611/939719-20161117102155920-921211263.png)
发现查看数据报错了 原因:备份节点会落后于主节点,可能没有最新写入的数据 所以备份节点默认情况下会拒绝读取请求,以防止应用程序意外拿到过期的数据,因此,如果在备份节点上做查询,会得到上述错误 意思是当前节点不是主节点
为了保护应用程序 以免意外连接到备份节点 读取到过期的数据.如果希望从备份节点读取数据 需要设置从备份节点读取数据没有问题的标识 如下图
![](https://images2015.cnblogs.com/blog/939719/201611/939719-20161117102238482-1681496886.png)
注意:slaveOk是对连接的设置的不是数据库设置的,可以看到 我们在主节点插入的数据在 备份节点已经能查到了.
4 测试副本集故障转移功能
先停掉主节点mongodb 131,连接任意其余的机器 执行如下命令: db.shutdownServer()
![](https://images2015.cnblogs.com/blog/939719/201611/939719-20161117102252248-1954270643.png)
可以看到 主节点已经 自动换成了130
关闭 副本集 replicaSet.stopSet()