我尝试了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 }
广告
将在 10 秒后关闭
bannerAds