目前我们的MongoDB复制集,模式大概如下:

1
Mongo-Pri => Mongo-Sec (Master => Slave)

###滚动升级
MongoDB的升级非常简单,大概遵循以下步骤

1
2
3
添加repo到/etc/yum.repos.d/mongodb-org-3.0.repo
#yum update
#yum install -y mongodb-org

复制集升级则需要主从滚动更换,遵循以下步骤逐个升级

1
2
3
4
先安全停掉Primary,权重高的slave将会变成master
> rs.stepDown()
> rs.status() //查看状态
// 然后开始升级操作,升级完成后重新开启mongod进程

###复制集操作”Not Master”
在复制集升级到MongoDB 3.0后,当我们访问数据库时,执行查询会发现”not master”错误:

1
2
> show dbs;
> Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" }

解决方法,在mongoshell里执行:

1
SECONDARY> rs.slaveOk()

然后便可以进行正常操作.

###Mongoose
Mongoose Schema对复制集进行操作时,也会遇到”not master”,有两种解决方法:

  • schema后添加{read: ‘secondaryPreferred’}, 如果是完全面向复制集的操作,推荐此方法
1
2
3
4
5
var testSchema = new Schema({
icon: String,
desc: String,
guideVideo: { type: ObjectId, ref: 'Video' }
}, { read: 'secondaryPreferred'} );
  • 涉及查询的代码中执行read().exec(), 在read()中声明read(‘secondary’)
1
2
3
4
5
6
7
8
9
Point.distinct('user', queryObj)
.read('secondary')
.exec(function (err, result) {
if (err) {
console.error(err.stack);
return callBack(err);
}
return callBack(null, result);
});

参考链接:
mongoose issuse2927