今天我测试了一下MongoDB的副本集的配置。
首先从概念上说一下MongoDB副本集和主从复制的区别。其实副本集(Replica Set)是主从复制的高级形式。高级在哪里呢?主动复制实现了数据备份+读扩展,但是master一旦down掉,需要手动启动slave。副本集在此基础上实现了备份自动重启的功能,也就是某一台slave会挺身而出,担当起master的职责。所以有三个角色,master(Primary),slave(Secondary),还有仲裁服务器。
我的测试环境和上次基本相同:
一台master(primary):mmaster 192.168.42.132
两台slave(secondary):mslave1 192.168.42.134 mslave2 192.168.42.135
全是ubuntu 12.10 server 版 OS, MongoDB 2.4.3
配置和实现方法:
1 配置/etc/hosts,把上面三台虚拟机的DNS信息写到里面
2 配置/etc/mongodb.conf,需要修改的东西真是不多,最主要的是屏蔽掉master slave这部分东西,也就是主从复制里面的修改,然后配置replSet=true,有没有空格无所谓,三台虚拟机都只这么配置,可见我们并没有指定谁是master。
3 先把master跑起来。进入你想成为master的那台机器,重启mongod,然后进入该机器mongo的客户端,进行一下很简单的设置。
这是构建一个配置的对象,然后初始化一下。第一个ID是副本集的名字,member里面是指定了成员机器的id和网络位置。这里先把master添加进来就好了,下面可以一台一台的添加其他的成员。注意要稍等一段时间,MongoDB需要时间来转换他的状态。该机器被默认为了master(primary)。4 再把slave加进我们的副本集里面。现在master里面add一个slave
然后到这台slave所在的虚拟机上面去,重启MongoDB,进入Mongo客户端,一分钟后你会发现slave变成了Secondary,并且同步了数据。但是,事情还没有完。你测试会发现,不能读取数据,虽然数据同步了。没关系,这这MongoDB slave还需要你确认一下,只要输入rs.slaveOk()
在测试你就会发现可以读取数据了。
5 添加仲裁服务器。这个我是删除了一种一台slave2,然后通过命令rs.addArb("host:port")添加上仲裁服务器,然后测试的,不需要其他配置。当master被关掉后,能够实现转换,测试成功。注意,根据我看到的资料,没有仲裁是不能实现自动转换的,仲裁服务器参考资料:http://docs.mongodb.org/manual/tutorial/add-replica-set-arbiter/
以上就是我的测试过程,发现网上很多资料都不靠谱,所以大家谨慎使用资料。我的参考资料是
http://docs.mongodb.org/manual/tutorial/deploy-replica-set/
也就是英文的官方网站资料,10gen的资料做的还是很准确的,所以建议大家看这个,很快可以上手。
最后上个图,可以看到我的副本集状态:
PS1:有人可能会问建立Replica Set之后,万一出现Primary宕机,IP地址的问题如何解决。没有问题,读者可以查阅下资料,MongoDB的API已经提供了解决的方法。我使用的libmongo-client是c语言的API,里面提供的mongo_sync_reconnect()函数,自动找到新的Primary的IP,进行重连。
PS2:注意配置oplogSize这个参数,以M为单位,否则可能出现oplog.rs预分配空间过大的问题。