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

一、写在前面的话

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.csdn.net/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
        }
    ]
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值