Mongodb副本集配置

##MongoDB副本集

测试配置MongoDB副本集,首先找3台测试服务器,或者一台服务器上,跑3个MongoDB实例也可以。我这里以3台服务器来做实验。

3台服务器IP

192.168.56.8

192.168.56.9

192.168.56.10

每台服务器上的MongoDB启动使用--replSet test 或者在mongodb.conf里面配置

例如:

mongodb.conf

1
2
3
4
5

dbpath=/export/data/mongodb # 数据存放位置
logpath=/export/data/mongodb/mongod.log # 日志存放位置
replSet=jdcmofe #副本集名称
fork=true # 以后台模式运行

然后每台服务器按照这个命令启动

mongod -f mongodb.conf

然后在任意一台服务器上执行如下操作:

我这里是在192.168.56.8服务器上操作

使用mongo shell登录mongodb,执行如下操作

1
2
3
4
5
6
7
8
config={
_id:"test",
members:[
{_id:0,host:"192.168.56.8:27017"},
{_id:1,host:"192.168.56.9:27017"},
{_id:2,host:"192.168.56.10:27017"}
]
};

_id是副本集名称

members是3台服务器的Ip

然后执行

1
2
3
rs.initiate(config)

rs.status() // 查看集群节点

测试副本集的数据复制功能

此时在我的机器上192.168.56.8是主节点,使用mongo shell登录mongodb

1
2
3
use test  #切换到test数据库

db.testdb.insert({"age":1}); #插入数据

我们用副本节点登录shell,我这里是192.168.56.9

1
2
3
use test

show collections

此时会报错

1
2
3
4
5
6
[thread1] Error: listCollections failed: {
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk"
}

因为mongodb默认是从主节点读写数据的,副本节点上不允许读,需要设置副本节点可以读。

test:SECONDARY> rs.slaveOk();

此时就可以读取数据了

test:SECONDARY> db.test.find();

控制台输出

{ “_id” : ObjectId(“59676d711881041abab44477”), “age” : 1 }

所以,数据复制的功能是可用的。

MongoDB权限设置

默认MongoDB启动是不带权限校验的,所以都是在裸奔,需要加上权限校验。

首先使用mongo shell登录MongoDB数据库

1
2
3
4
5
6
7
8
9
use admin;

db.createUser(
{
user: "jiangli",
pwd: "123",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)

然后重新启动MongoDB

mongod -f mongodb.conf –auth

–auth表示打开权限校验

我们刚才是在给admin数据库创建了用户,如果想给特定的数据库创建特定的用户可以按照下面的步骤

mongo shell登录数据库

1
2
3
4
5
6
7
8
9
use admin

db.auth('jiangli', '123')

#切换到目标数据库上,比如test

use test;

db.createUser({user:"second",pwd:"second",roles: [ { role: "readWrite", db: "test" } ]})

打开权限校验以后,副本集的启动也需要修改下。

Replica Set要使用keyFile的校验方式

首先在192.168.56.8服务器上生成key

1
2
3
openssl rand -base64 756 > <path-to-keyfile>

chmod 400 <path-to-keyfile>

然后把生成key拷贝到其它两台服务器上去,然后更改下读取权限

chmod 400

然后重启MongoDB数据库

mongod -f mongodb.conf –auth –keyFile=/export/data/mongodb/test-key

ps:

程序连接开启副本集,权限校验的MongoDB数据库方法

使用mongoose

方法一:

1
2
3
const mongoose = require('mongoose');
mongoose.connect(
'second:second@192.168.56.8:27017,192.168.56.9:27017,192.168.56.10:27017/test?replicaSet=test'

方法二:

如果你的数据库密码里面包含@ %等字符,如果使用方法一的方式,会报

URIError: URI malformed
at decodeURIComponent ()

使用这种方式解决

1
mongoose.connect('192.168.56.8:27017,192.168.56.9:27017,192.168.56.10:27017/test?replicaSet=test',{user:'second',pass:'second',useMongoClient:true})