mongodb复本集配置

副本集具有故 障自动切换和自动修复成员节点,各个DB之间数据完全一
致等特点。与主从复制相比,最为显著的区别在于,副本集没有固定的主节点,它是 整个集群选举出得一个主节点,当其不工作时变更其他节点

部署Replica Sets

正常情况下,mongodb是应该部署在多台服务器上的,我这里只是测试,就部署一台服务器上了,下面启动了三个实例进行实验

1)、创建数据文件日志文件存储路径
mongodb副本集

2)、启动2个实例

mongod --replSet rs1  --port 27017  --dbpath=/mongodb/data/data1/ --logpath=/mongodb/log/dblog1 --logappend --fork

mongod --replSet rs1  --port 27018  --dbpath=/mongodb/data/data2/ --logpath=/mongodb/log/dblog2 --logappend --fork

–replSet rs1副本集的名字

3)、配置及初始化Replica Sets

mongo -port 27017

>config_rs1 = {_id: 'rs1', members: 
    [
        {_id: 0, host: 'localhost:27018', priority:1}, 
        {_id: 1, host: 'localhost:27017'}, 
    ]
}
> rs.initiate(config_rs1); --初始化配置
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}

priority=1 优先级,优先级高的被选举为PRIMARY

4)、测试数据同步

mongo --port 27018
db.c1.insert({name:"user1"})
db.c1.insert({name:"user2"})

此时primary的提示符已经变成rs1:PRIMARY
mongodb副本集

mongo --port 27017
rs.slaveOk();
db.c1.find()

mongodb副本集

5)、查看复制集状态

rs.status()

  • “health” : 1, –1表明正常; 0表明异常
  • “state” : 1, — 1表明是Primary; 2 表明是Secondary;
  • “stateStr” : “PRIMARY”, –表明此机器是主库

主从操作日志oplog

MongoDB 的 Replica Set 架构是通过一个日
志来存储写操作的,这个日志就叫做”oplog”。
oplog.rs是一个固定长度的 capped collection,
它存在于”local”数据库中,用于记录Replica Sets
操作日志。oplog的大小是可以通过mongod的参数”
–oplogSize”来改变oplog的日志大小

rs1:PRIMARY> use local
switched to db local
rs1:PRIMARY> show collections
oplog.rs
system.replset
rs1:PRIMARY> db.oplog.rs.find()
{ "ts" : { "t" : 1338457763000, "i" : 1 }, "h" : NumberLong(0), "op" : "n", "ns" : "", "o" : { "msg" :
"initiating set" } }
{ "ts" : { "t" : 1338459114000, "i" : 1 }, "h" : NumberLong("5493127699725549585"), "op" : "i",
"ns" : "test.c1", "o" : { "_id" : ObjectId("4fc743e9aea289af709ac6b5"), "age" : 29, "name" :
"Tony" } }
rs1:PRIMARY>

Oplog 字段说明

  • ts: 某个操作的时间戳
  • op: 操作类型,如下:
  • i: insert d: delete u: update
  • ns: 命名空间,也就是操作的collection name
  • o: document的内容

查看master 的oplog 元数据信息:
mongodb副本集
字段说明

  • configured oplog size: 配置的oplog文件大小
  • log length start to end: oplog日志的启用时间段
  • oplog first event time: 产生时间
  • oplog last event time: 最后一个事务日志的产生时间
  • now: 现在的时间

查看slave
mongodb副本集
字段说明
source: 从库的IP及端口
syncedTo: 目前的同步情况,延迟了多久等信息

主从配置信息
在local库中不仅有主从日志oplog集合还有一个集合用
于记录主从配置信息system.replset

rs1:PRIMARY> use local
switched to db local
rs1:PRIMARY> show tables
me
oplog.rs
replset.minvalid
startup_log
system.indexes
system.replset
rs1:PRIMARY> db.system.replset.find()

故障转移

副本集比传统的Master-Slave 有改进的地方就是它可以进
行故障的自动转移,如果我们停掉复制集中的一个成员,那
么剩余成员会再自动选举出一个成员,做为主库。

我们将27018这个主库停掉,然后再看一下复制集的状态

netstat -tunpl | grep 27018

kill 进程号
mongo --port 27017
rs.status()

可以看到28018这个端口的MongoDB出现了异常,而系统自动
选举了28017这个端口为主,
所以这样的故障处理机制,能将系统的稳定性大大提高

增加删除节点

登录到任意一台已经部署的mongodb上,使用rs.add(“ip+端口号”)增加节点

mongod --replSet rs1  --port 27019  --dbpath=/mongodb/data/data3/ --logpath=/mongodb/log/dblog3 --logappend --fork

mongo --port 27017
rs.add("127.0.0.7:21019")
rs.status()

使用命令rs.remove(“IP+端口”)即可移除该节点


参考资料

http://docs.mongodb.org/manual/tutorial/deploy-replica-set/
http://www.cnblogs.com/spnt/archive/2012/07/25/2608420.html