我尝试了MongoDB ReplicaSet
环境
自然界中的一切外部条件,包括空气、水、土壤和生物等,与人类、动植物等生物的生存和发展有关的因素。
主机:mac
验证环境是在虚拟机操作系统上的vagrant。
MongoDB 2.6.3
复制集验证
启动 mongod
% mongod --replSet set01 --shardsvr --port 10001 --dbpath /data/mongodb/rs01 --logpath /var/log/mongodb/rs01.log --logappend --pidfilepath /data/mongodb/rs01.pid --directoryperdb --fork --rest --nojournal
% mongod --replSet set01 --shardsvr --port 10002 --dbpath /data/mongodb/rs02 --logpath /var/log/mongodb/rs02.log --logappend --pidfilepath /data/mongodb/rs02.pid --directoryperdb --fork --rest --nojournal
% mongod --replSet set01 --shardsvr --port 10003 --dbpath /data/mongodb/rs03 --logpath /var/log/mongodb/rs03.log --logappend --pidfilepath /data/mongodb/rs03.pid --directoryperdb --fork --rest --nojournal
在启动mongod时会生成一个2GB大小的journal文件,但是在vagrant上由于容量不足无法启动,因此需要添加–nojournal选项。
连接到被称为“master”的端口。
mongo --port=10001
3. 设置config
> config = {_id:'set01',members:[{_id:0, host:'localhost:10001'},{_id:1, host:'localhost:10002'},{_id:2, host:'localhost:10003'}]}
4. 使用预设配置进行初始化和确认。
> rs.initiate(config)
执行结果 (shí jié guǒ)
{
“info” : “配置已本地保存。大约一分钟后应可以上线。”,
“ok” : 1
}
确认状态
> set01:PRIMARY> rs.status()
执行结果
{
“集合” : “set01”,
“日期” : ISODate(“2014-07-08T07:48:35Z”),
“我的状态” : 1,
“成员” : [
{
“_id” : 0,
“名字” : “localhost:10001”,
“健康状态” : 1,
“状态” : 1,
“状态描述” : “主节点”,
“运行时间” : 2737,
“操作时间” : Timestamp(1404805494, 10),
“操作时间日期” : ISODate(“2014-07-08T07:44:54Z”),
“选举时间” : Timestamp(1404803208, 1),
“选举时间日期” : ISODate(“2014-07-08T07:06:48Z”),
“自身” : true
},
{
“_id” : 1,
“名字” : “localhost:10002”,
“健康状态” : 1,
“状态” : 2,
“状态描述” : “从节点”,
“运行时间” : 2515,
“操作时间” : Timestamp(1404805494, 10),
“操作时间日期” : ISODate(“2014-07-08T07:44:54Z”),
“最后心跳” : ISODate(“2014-07-08T07:48:34Z”),
“最后接收心跳” : ISODate(“2014-07-08T07:48:34Z”),
“pingMs” : 0,
“同步至” : “localhost:10001”
},
{
“_id” : 2,
“名字” : “localhost:10003”,
“健康状态” : 1,
“状态” : 5,
“状态描述” : “启动中2”,
“运行时间” : 2515,
“操作时间” : Timestamp(0, 0),
“操作时间日期” : ISODate(“1970-01-01T00:00:00Z”),
“最后心跳” : ISODate(“2014-07-08T07:48:34Z”),
“最后接收心跳” : ISODate(“2014-07-08T07:48:34Z”),
“pingMs” : 0,
“最后心跳信息” : “同步线程:14031 无法在磁盘空间不足时获取写入锁”
}
],
“成功” : 1
}
使用mongoose和node.js进行数据投入。
mongoose/examples/replicasets/replica-sets.jsを編集
var opts = {
replSet : { rs_name : "rs0" }
};
mongoose.connect('mongodb://127.0.0.1:10001/person,127.0.0.1:10002,127.0.0.1:10003', opts, function (err) {
~省略
prom.then(function (people) {
console.log("young people: %s", people);
});//.then(cleanup); ここコメントアウト
});
请确认数据是否存在。
将连接指向Slave
% mongo --port=10002
MongoDB shell version: 2.6.3
connecting to: 127.0.0.1:10002/test
Server has startup warnings:
2014-07-08T07:04:54.045+0000 ** WARNING: --rest is specified without --httpinterface,
2014-07-08T07:04:54.045+0000 ** enabling http interface
确认数据
set01:SECONDARY> show databases;
admin (empty)
local 1.031GB
person 0.078GB
set01:SECONDARY> use person
switched to db person
set01:SECONDARY> show collections
2014-07-08T07:51:18.438+0000 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:131
使其可通过slave进行访问
set01:SECONDARY> db.getMongo().setSlaveOk()
确认数据
set01:SECONDARY> use person
switched to db person
set01:SECONDARY> show collections
people
system.indexes
set01:SECONDARY> db.people.find()
{ "_id" : ObjectId("53bba580653ebd8b4bf35eba"), "name" : "bill", "age" : 25, "birthday" : ISODate("1989-07-08T08:02:08.637Z"), "__v" : 0 }
{ "_id" : ObjectId("53bba580653ebd8b4bf35ebb"), "name" : "mary", "age" : 30, "birthday" : ISODate("1984-07-08T08:02:08.637Z"), "__v" : 0 }
{ "_id" : ObjectId("53bba580653ebd8b4bf35ebc"), "name" : "bob", "age" : 21, "birthday" : ISODate("1993-07-08T08:02:08.637Z"), "__v" : 0 }
{ "_id" : ObjectId("53bba580653ebd8b4bf35ebd"), "name" : "lilly", "age" : 26, "birthday" : ISODate("1988-07-08T08:02:08.637Z"), "__v" : 0 }
{ "_id" : ObjectId("53bba580653ebd8b4bf35ebe"), "name" : "alucard", "age" : 1000, "birthday" : ISODate("1014-07-08T08:02:08.637Z"), "__v" : 0 }