构建带安全验证的Mongo复制集(Windows环境下NT服务方式)
首先到Mongo官网下载Windows版ZIP包https://www.mongodb.com/download-center/community,释放到D:\MongoDB\bin,可能需要安装VC2015运行环境,嫌麻烦可以装MSI版本。
1、在MongoDB下新建data目录,以及其下的目录结构
D:\MongoDB
|-bin
|-data
|-cfg
|-db
|-rs1
|-rs2
|-rs3
|-log
2、在MongoDB\data\cfg下新建3个配置文件,内容如下
dbpath=D:\MongoDB\data\db\rs1
logpath=D:\MongoDB\data\log\rs1.log
journal=true
port=20010 #另外两个分别改为20020,20030
replSet=rs0
#keyFile=D:\MongoDB\data\cfg\keyfile
#可以用openssl命令生成keyfile,例如openssl rand -base64 -out d:\MongoDB\data\cfg\keyFile 765
#openssl下载地址http://gnuwin32.sourceforge.net/packages/openssl.htm
#openssl更多用法参与https://www.cnblogs.com/pluslius/p/9936327.html
3、注册3个NT服务,分别使用3个不同配置
D:\MongoDB\bin\mongod --config "D:\MongoDB\data\cfg\rs1.cfg" --serviceName "MongoDB_01" --serviceDisplayName "MongoDB_01" --install
D:\MongoDB\bin\mongod --config "D:\MongoDB\data\cfg\rs2.cfg" --serviceName "MongoDB_02" --serviceDisplayName "MongoDB_02" --install
D:\MongoDB\bin\mongod --config "D:\MongoDB\data\cfg\rs3.cfg" --serviceName "MongoDB_03" --serviceDisplayName "MongoDB_03" --install
4、从客户端进入并设置主从节点
mongo --port 20010
rs.initiate()
rs.conf()
rs.add("localhost:20020") #从节点
rs.addArb("localhost:20030") #仲裁节点
#查看状态
rs.status()
#退出主节点,进从节点
mongo --port 20020
#同步,允许从节点读写
rs.slaveOk()
5、建立验证
#在主节点创建用户名
mongo --port 20010
#创建用户(MongoDB中内置了很多角色)
#role:表示角色,db:表示当前角色针对哪个数据库有效。
#比如设置了admin 那么这个用户的权限范围只在admin数据库有效。
use admin
db.createUser(
{
user: "admin",
pwd: "admin",
roles: [ { role: "root", db: "admin" } ]
}
)
#然后我们可以给具体的数据里设置授权用户了(用户名密码可以自己搞个复杂点的)
use vad_db
db.createUser({
"user" : "mydbuser",
"pwd": "abc123",
"roles" : [
{role: "readWrite", db: "mydb" }
]},
{ w: "majority" , wtimeout: 5000 }
)
#停止所有的服务,注意顺序,防止主库变更
net stop MongoDB_03
net stop MongoDB_02
net stop MongoDB_01
#修改配置文件中的keyFile项去注释,再重启服务
net start MongoDB_01
net start MongoDB_02
net start MongoDB_03
6、使用KeyFile开启复制集验证(自动开启安全验证)
#连接到主节点(mongo --port 20010 -u admin -p admin)
show dbs #不带用户密码参数启动时应该无反应,或提示无权限
use admin #不带用户密码参数启动时用db.auth验证
db.auth("admin", "admin")
show dbs #这时应该正常显示库列表