MongoDB系列之三(副本集配置)

时间:2021-07-14 10:20:52

今天我测试了一下MongoDB的副本集的配置。

首先从概念上说一下MongoDB副本集和主从复制的区别。其实副本集(Replica Set)是主从复制的高级形式。高级在哪里呢?主动复制实现了数据备份+读扩展,但是master一旦down掉,需要手动启动slave。副本集在此基础上实现了备份自动重启的功能,也就是某一台slave会挺身而出,担当起master的职责。所以有三个角色,master(Primary),slave(Secondary),还有仲裁服务器(这哥们指定哪台slave应该挺身而出)。

我的测试环境和上次基本相同:

一台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的客户端,进行一下很简单的设置。

rsconf = {
_id: "rs0",
members: [
{
_id: 0,
host: "<hostname>:27017"
}
]
}
rs.initiate( rsconf )

这是构建一个配置的对象,然后初始化一下。第一个ID是副本集的名字,member里面是指定了成员机器的id和网络位置。这里先把master添加进来就好了,下面可以一台一台的添加其他的成员。注意要稍等一段时间,MongoDB需要时间来转换他的状态。该机器被默认为了master(primary)。

4 再把slave加进我们的副本集里面。现在master里面add一个slave

rs.add("<hostname>:27017")

然后到这台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的资料做的还是很准确的,所以建议大家看这个,很快可以上手。

最后上个图,可以看到我的副本集状态:MongoDB系列之三(副本集配置)