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 |
|
然后每台服务器按照这个命令启动
mongod -f mongodb.conf
然后在任意一台服务器上执行如下操作:
我这里是在192.168.56.8服务器上操作
使用mongo shell登录mongodb,执行如下操作
1 | config={ |
_id是副本集名称
members是3台服务器的Ip
然后执行
1 | rs.initiate(config) |
测试副本集的数据复制功能
此时在我的机器上192.168.56.8是主节点,使用mongo shell登录mongodb
1 | use test #切换到test数据库 |
我们用副本节点登录shell,我这里是192.168.56.9
1 | use test |
此时会报错
1 | [thread1] Error: listCollections failed: { |
因为mongodb默认是从主节点读写数据的,副本节点上不允许读,需要设置副本节点可以读。
test:SECONDARY> rs.slaveOk();
此时就可以读取数据了
test:SECONDARY> db.test.find();
控制台输出
{ “_id” : ObjectId(“59676d711881041abab44477”), “age” : 1 }
所以,数据复制的功能是可用的。
MongoDB权限设置
默认MongoDB启动是不带权限校验的,所以都是在裸奔,需要加上权限校验。
首先使用mongo shell登录MongoDB数据库
1 | use admin; |
然后重新启动MongoDB
mongod -f mongodb.conf –auth
–auth表示打开权限校验
我们刚才是在给admin数据库创建了用户,如果想给特定的数据库创建特定的用户可以按照下面的步骤
mongo shell登录数据库
1 | use admin |
打开权限校验以后,副本集的启动也需要修改下。
Replica Set要使用keyFile的校验方式
首先在192.168.56.8服务器上生成key
1 | openssl rand -base64 756 > <path-to-keyfile> |
然后把生成key拷贝到其它两台服务器上去,然后更改下读取权限
chmod 400
然后重启MongoDB数据库
mongod -f mongodb.conf –auth –keyFile=/export/data/mongodb/test-key
ps:
程序连接开启副本集,权限校验的MongoDB数据库方法
使用mongoose
方法一:
1 | const mongoose = require('mongoose'); |
方法二:
如果你的数据库密码里面包含@ %等字符,如果使用方法一的方式,会报
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}) |