搭建mongodb复制集

一、基本概念

复制集(Replica set)就是有自动故障恢复功能的主从集群。

主从集群(貌似新版本不推荐使用主从集群)和复制集区别在于:

1、复制集没有固定的主节点,是靠选取产生主节点;

2、当主节点发生故障时,会自动选取出另一个节点为主节点。

复制集总会有一个活跃节点(Primary)和一个或者多个备份节点(Secondary)。

二、搭建复制集

1、创建数据目录并启动,脚本如下:

 /opt/app/mongodb/bin/mongod --dbpath=/home/admin/data/dbs/node1 --port 10000 --logpath=/home/admin/data/logs/node1.log --replSet repltest/10.37.10.60:10001

其中repltest是复制集名字,复制集启动之前,是需要为它命名的。

启动第二个节点:

/opt/app/mongodb/bin/mongod --dbpath=/home/admin/data/dbs/node2 --port 10001 --logpath=/home/admin/data/logs/node2.log --replSet repltest/10.37.10.60:10000
启动第三个节点可以有2中方式:  

/opt/app/mongodb/bin/mongod --dbpath=/home/admin/data/dbs/node3 --port 10002 --logpath=/home/admin/data/logs/node3.log --replSet repltest/10.37.10.60:10000

或者

/opt/app/mongodb/bin/mongod --dbpath=/home/admin/data/dbs/node3 --port 10002 --logpath=/home/admin/data/logs/node3.log --replSet repltest/10.37.10.60:10000,10.37.10.60:10001

2、初始化复制集

通过shell随便连接一台服务器,执行下面命令

> db.runCommand(
... {"replSetInitiate":{
...  "_id":"repltest",
... "members":[{"_id":1,"host":"10.37.10.60:10000"},
... {"_id":2,"host":"10.37.10.60:10001"},
... {"_id":3,"host":"10.37.10.60:10002"}]}})
{
        "info" : "Config now saved locally.  Should come online in about a minute.",
        "ok" : 1
}

其中"_id"是复制集的名称,member是复制集的服务器列表。

3、活跃节点选举

复制集中的节点有3种:

1、standard 常规节点,它有完整的数据副本,参与选举投票并有可能成为活跃节点;

2、passive 有完整的数据副本,参与投票,但是不能成为活跃节点;

3、arbiter 仲裁节点,只参与投票,不接收复制数据,也不能成为活跃节点。

节点除arbiter类型外,都有优先权。优先权为0的则是被动节点,不能成为活跃节点。优先权不为0的,按从大到小选出活跃节点,如果优先权一样,则比较谁的数据最新,数据新的成为活跃节点。

修改第二个节点优先权为100,第三个节点为arbiter节点。脚本如下:

conf = rs.conf()
conf.members[1].priority=100
conf.members[2].aribterOnly=true

通过rs.status()命令,看出活跃节点是id为1的。

 {
                        "_id" : 1,
                        "name" : "10.37.10.60:10000",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "optime" : {
                                "t" : 1421224406000,
                                "i" : 1
                        },
                        "optimeDate" : ISODate("2015-01-14T08:33:26Z"),
                        "self" : true
                }

杀掉这个进程,再次运行rs.ststus(),发现已经自动选举了活跃节点。

 {
                        "_id" : 2,
                        "name" : "10.37.10.60:10001",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "optime" : {
                                "t" : 1421224406000,
                                "i" : 1
                        },
                        "optimeDate" : ISODate("2015-01-14T08:33:26Z"),
                        "self" : true
                }


4、测试数据

主库插入一条数据:

PRIMARY> db.mytest.insert({"name":"xzq","age":29})
PRIMARY> db.mytest.find()
{ "_id" : ObjectId("54b62571e5dd2e4e77a3d8a6"), "name" : "xzq", "age" : 29 }

从库中查询:

SECONDARY> db.mytest.find()
error: { "$err" : "not master and slaveok=false", "code" : 13435 }
SECONDARY> db.getMongo().setSlaveOk()
not master and slaveok=false
SECONDARY> db.mytest.find()
{ "_id" : ObjectId("54b62571e5dd2e4e77a3d8a6"), "name" : "xzq", "age" : 29 }

我们发现一开始查询失败了,说明从库还不能执行查询操作,这时执行db.getMongo().setSlaveOk()命令后,就可以查询了。

从库可以读后,可以分担主库压力,做到读写分离。

5、添加节点

复制集不仅提供了高可用的解决方案,还提供了负载均衡的解决方案。当应用读压力增加时,可以增加节点;应用读压力变小时,可以减少节点。

1、通过oplog增加节点

/opt/app/mongodb/bin/mongod --dbpath=/home/admin/data/dbs/node4 --port 10003 --logpath=/home/admin/data/logs/node4.log --replSet repltest/10.37.10.60:10001
PRIMARY> rs.add("10.37.10.60:10003")

2、通过数据库快照(--fastsync)和oplog增加节点

因为oplog是capped collection,采用循环方式进行日志处理,所以采用oplog方式增加节点,有可能导致数据不一致(oplog中的信息假如已经刷新)。这时可以通过数据库快照(--fastsync)和oplog结合的方式来增加节点,先复制某个节点的数据文件,在采用oplog日志追加,来达到数据一致性。

有兴趣的朋友可以自己实验一下。

6、减少节点

rs.remove("10.37.10.60:10003")

再次执行rs.staus发现节点已经变少了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值