公司有一部分安全性要求不是十分高的数据使用的mongodb,其查询和插入性能确实较ACID理论的数据库来说要好的多。不过数据安全性上确实不如ACID型。为了补冲这点不足,做了replica sets(复制)。但由于操作时,没有进行优先级设置。所以想将某台性能略好的机器设置为主。

最早由于受王文龙的《mongodb权威指南》的影响,有了先入为主的意识。其有关于replica sets有这么一段话:“{_id: 0, host: ‘localhost:28010’, priority:1}, 成员 IP 及端口,priority=1 指 PRIMARY ”,我当时以为priority设为1就是主。后来看到官方的相关文档并测试过以后。发现这个地方是有错误的。

闲话说了一堆,具体还是看操作。两种方法可以让mongodb指定的replica sets成员成为主。

方法一(官方介绍的):

 1> config = rs.conf()
 2{
 3    "_id" : "foo",
 4    "version" : 1,
 5    "members" : [
 6        {
 7            "_id" : 0,
 8            "host" : "A",
 9        },
10        {
11            "_id" : 1,
12            "host" : "B",
13        },
14        {
15            "_id" : 2,
16            "host" : "C",
17        }
18    ]
19}
20> config.version++
21> // the default priority is 1
22> config.members[1].priority = 2
23> rs.reconfig(config)

其中显示版本的那句config.version++可以省略掉。这段官方说明,已经说的很明白了,默认的优先级是1,priority的值设的越大,就优化成为主。这个可能和路由上的一些东西是相反的。一些路由设备上是这个值越小越为主。

注:还有一个需要注意的地方是members大括号里面的成员号和_id号是没有关系的。比如我用的查看到的结果是下面的。这个成员号是默认从0开始的,还用官方的那示例来说的话,members[0]=/span>

 1SECONDARY> rs.conf();
 2 {
 3        "_id" : "shard1",
 4        "version" : 4,
 5        "members" : [
 6                {
 7                        "_id" : 1,
 8                        "host" : "192.168.10.170:20000"
 9                },
10                {
11                        "_id" : 2,
12                        "host" : "192.168.10.26:20000"
13                },
14                {
15                        "_id" : 3,
16                        "host" : "192.168.10.168:20000",
17                        "priority" : 2
18                }
19        ]
20}

以上操作需要在primary上进行操作。

方法二:

1primary>config = {_id:'myset',members: [
2 {_id:0,host:"192.168.10.170:20000",priority:1},
3{_id:1,host:"192.168.10.168:20000",priority:2},
4{_id:2,host:"192.168.10.26:20000",priority:1,arbiterOnly:true}]
5}
6primary>rs.reconfig(config)
7secondary>(显示为secondary,则证明切换成功。) 

上面的方法也可以(都是利用rs.reconfig更新system.replset collections的内容实现的),上面是配置一主一从一仲裁。在局域网结构中官方还是推荐一主两从的结构。而仲裁多用在广域网或跨网的环境中。因为受到网络距离的限制,不便于选出primary时,通过仲裁机主动选出primary是个不错的方法。

注:以上测试在mongodb2.0+版本上有效。低于2.0版本的方法在官网上也有介绍,点此处看官网介绍