首页 > 代码库 > MongoDB副本集

MongoDB副本集

在使用MongoDB的时候,为了保证数据的安全,就要考虑数据备份和故障恢复了;同时出于性能的考虑,能够进行读写分离肯定能提升数据库性能。

所以,在这篇文章中进行副本集的介绍。副本集(Replica Set),就是有自动故障恢复能力的主从集群。

副本集有一个主节点,同时有一个或多个备份节点。当主节点出现故障的时候,备份节点会通过投票的方式选择出一个新的备份节点。

 

副本集初始化

下面通过一些具体的实践感受一下副本集。

首先通过下面三个命令启动三个mongodb服务器。其中,"replSet"选项指定了副本集的名称。

mongod.exe --dbpath="c:\mongodb\db\node1" --port=11111 --replSet myReplSet --oplogSize=50mongod.exe --dbpath="c:\mongodb\db\node2" --port=22222 --replSet myReplSet --oplogSize=50mongod.exe --dbpath="c:\mongodb\db\node3" --port=33333 --replSet myReplSet --oplogSize=50

通过服务器的输出可以看到,我们现在需要"rs.initiate()"来初始化副本集。

下面我们就进行副本集的初始化工作,主要以下步骤:

  1. 首先通过一个MongoDB shell执行"mongo –port=11111"连接到"port=11111"的服务器上
  2. 然后定义配置信息"myReplSet_config"
  3. 最后通过"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:\mongodb\db\node4" --port=44444 --replSet myReplSet --oplogSize=502 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

MongoDB副本集