一、写在前面的话
MongoDB支持不同服务之间的异步数据复制,来实现failover(故障转移,故障切换,故障恢复) and redundancy(数据冗余)。同一时间,只有一个服务节点(primary或者master)支持写入。MongoDB支持两种复制的模式:
Master/Slave,主从复制,角色包括master和slave。
Replica Set,复制集复制,角色包括primary和secondary。
mongoDB官方推荐使用Replica Set模式,副本集就是有自动故障恢复功能的主从集群。主从集群和副本集最为明显的区别就是副本集没有固定的主节点:整个集群会选举出一个主节点,当其不能工作时,则变更到其它节点。副本集总会有一个活跃节点和一个或多个备份节点。副本集最好的优点就是全自动化的。
二、副本集及集群介绍
1、节点类型
standard:常规节点,它存储一份完整的数据副本,参与选举投票,有可能成为primary节点。
passive:存储了完整的数据副本,参与投票,不能成为primary节点。
arbiter:仲裁节点,只参与投票,不接收复制的数据,也不能成为primary节点。
一个repica sets节点数量最好为奇数(odd)。
2、参数
用于replica set的参数有两个:
–replSet ,复制集的名称。
–oplogSize ,操作日志的大小,单位为MB。
3、集群三节点分布
两个standard节点(这两个节点直接可以互切primary secondary)。
一个arbiter节点,它手中握着一张选票,决定上面两个standard节点中的哪一个可以成为primay。
三、配置步骤
1、参照上一篇博文(http://blog.youkuaiyun.com/u012859691/article/details/44680249),将三个节点中mongodb.conf的内容修改如下:
port=10001
dbpath=data/
logpath=log/mongodb.log
logappend=true
replSet=shard1
说明: port=10001,代表端口号,如果不指定则默认为 27017
replSet=shard1(复制集的名字),一个replica sets中的每个节点的这个参数要一致
logappend=true,日志文件自动累加,而不是覆盖
2、启动第一个standard节点 (ip:192.168.58.135)
hadoop@h1:~/mongodb$ bin/mongod -f mongodb.conf
all output going to: /home/hadoop/mongodb/log/mongodb.log
启动第一个standard节点 (ip:192.168.58.136)
hadoop@h2:~/mongodb$ bin/mongod -f mongodb.conf
all output going to: /home/hadoop/mongodb/log/mongodb.log
3、初始化副本集
在任意一个standard节点上登录mongdb,我们这里选择h1(ip:192.168.58.135)
hadoop@h1:~/mongodb$ bin/mongo localhost:10001
并执行如下命令:
cfg={_id:'shard1',members:[
{_id:0,host:'192.168.58.135:10001'},
{_id:1,host:'192.168.58.136:10001'}]
}
rs.initiate(cfg)
出现下面的提示信息就代表成功了
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
4、查看replica set的状态
hadoop@h1:~/mongodb$ bin/mongo localhost:10001
MongoDB shell version: 2.4.6
connecting to: localhost:10001/test
shard1:SECONDARY> rs.status()
{
"set" : "shard1",
"date" : ISODate("2015-03-27T11:24:23Z"),
"myState" : 2,
"syncingTo" : "192.168.58.136:10001",
"members" : [
{
"_id" : 0,
"name" : "192.168.58.135:10001",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 468,
"optime" : Timestamp(1427446232, 1),
"optimeDate" : ISODate("2015-03-27T08:50:32Z"),
"self" : true
},
{
"_id" : 1,
"name" : "192.168.58.136:10001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 258,
"optime" : Timestamp(1427446232, 1),
"optimeDate" : ISODate("2015-03-27T08:50:32Z"),
"lastHeartbeat" : ISODate("2015-03-27T11:24:23Z"),
"lastHeartbeatRecv" : ISODate("2015-03-27T11:24:22Z"),
"pingMs" : 0
}
],
"ok" : 1
}
在replica set的信息中,其中重要的是:
myState,如果是1代表当前登录的是primary;如果是2代表当前登录的是secondary。
成员信息中比较重要的是
state:1表示该host是当前可以进行读写,2:不能读写
health:1表示该host目前是正常的,0:异常
5、测试副本集数据复制功能
(1)登录primary的mongod,插入一条数据
hadoop@h2:~/mongodb$ bin/mongo localhost:10001
MongoDB shell version: 2.4.6
connecting to: localhost:10001/test
shard1:PRIMARY> db.book.insert({'title':'computer'})
(2)登录secondary查看是否有数据
shard1:SECONDARY> use test
switched to db test
shard1:SECONDARY> db.book.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
发现报错了,没有关系,在secondary读取数据还需要我们做最后的一步,在需要读取数据的secondary上执行
shard1:SECONDARY> db.getMongo().setSlaveOk()
shard1:SECONDARY> db.book.find()
{ "_id" : ObjectId("55153fd08ebbb2c6f1ad3a11"), "title" : "computer" }
ok,测试成功了!
6、增加一个仲裁节点,只负责仲裁,不做数据存储
shard1:PRIMARY> rs.addArb("192.168.58.137:10001");
{ "ok" : 1 }
7、查看现有环境
shard1:PRIMARY> rs.conf()
{
"_id" : "shard1",
"version" : 3,
"members" : [
{
"_id" : 0,
"host" : "192.168.58.135:10001"
},
{
"_id" : 1,
"host" : "192.168.58.136:10001"
},
{
"_id" : 2,
"host" : "192.168.58.137:10001",
"arbiterOnly" : true
}
]
}