在使用MongoDB的时候,为了保证数据的安全,就要考虑数据备份和故障恢复了;同时出于性能的考虑,能够进行读写分离肯定能提升数据库性能。
所以,在这篇文章中进行副本集的介绍。副本集(Replica Set),就是有自动故障恢复能力的主从集群。
副本集有一个主节点,同时有一个或多个备份节点。当主节点出现故障的时候,备份节点会通过投票的方式选择出一个新的备份节点。
副本集初始化
下面通过一些具体的实践感受一下副本集。
首先通过下面三个命令启动三个mongodb服务器。其中,"replSet"选项指定了副本集的名称。
mongod.exe --dbpath="c:mongodbdb ode1" --port=11111 --replSet myReplSet --oplogSize=50 mongod.exe --dbpath="c:mongodbdb ode2" --port=22222 --replSet myReplSet --oplogSize=50 mongod.exe --dbpath="c:mongodbdb ode3" --port=33333 --replSet myReplSet --oplogSize=50
通过服务器的输出可以看到,我们现在需要"rs.initiate()"来初始化副本集。
下面我们就进行副本集的初始化工作,主要以下步骤:
- 首先通过一个MongoDB shell执行"mongo –port=11111"连接到"port=11111"的服务器上
- 然后定义配置信息"myReplSet_config"
- 最后通过"rs.initiate(myReplSet)"初始化副本集
在初始化命令完成后,可以通过"rs.status()"命令查看副本集的状态。
在上面的输出中,有几个字段需要注意一下:
- "health":这个表示该节点的状态是否正常
- "state":这个字段表示该节点是什么类型的节点
- "stateStr":表示当前同步的状态,RECOVERING表示正在同步数据;SECONDARY表示已经成功同步,可以正常使用
现在,通过"Ctrl+c"命令来停止"port=11111"这个节点,然后打开一个新的cmd窗口连接到"port=22222"的服务器上。
再次使用"rs.status()"命令查看副本集的状态。可以看到"port=11111"的"health"状态变成了0,同时"port=22222"的服务器变成了主节点。
如果,我们再次启动"port=11111",那么它将成为一个备份节点,这里就不截图演示了。
动态添加删除节点
有些时候,会有需求加入新的节点,那么就可以使用下面的命令来动态添加删除节点
1 mongod.exe --dbpath="c:mongodbdb ode4" --port=44444 --replSet myReplSet --oplogSize=50 2 rs.add("127.0.0.1:44444") 3 rs.status() 4 rs.remove("127.0.0.1:44444") 5 rs.status()
读写分离
副本集不仅仅可以保证数据的安全,还可以通过读写分离来降低主节点的读数据压力。
接着上面的例子,通过主节点插入一些数据。
当我们想通过备份节点读取数据的时候,将得到以下错误,提示我们"slaveOk"属性是false。
但是,通过"rs.slaveOk()"命令,就可以设置备份节点的读操作了。
通过读写分离可以很大程度上建设主节点的读写压力,但是这种方式也有一些问题,备份节点的数据会相对滞后,所以读出的数据可能不是最新的。
总结
通过这篇文章,大概了解了副本集的使用。通过使用副本集,可以使数据得到进一步的保护,通过读写分离也可以进行读写性能的优化。
Ps:本文中所有的命令都可以参考以下链接
http://files.cnblogs.com/wilber2013/replicaSet.js