您的位置:首页 > 数据库 > Mongodb

Ubuntu下Mongodb集群搭建:relica sets(副本集配置)

2015-03-27 19:45 771 查看

一、写在前面的话

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、参照上一篇博文(/article/9604077.html),将三个节点中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
}
]
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: