构建带安全验证的Mongo复制集(Windows环境下NT服务方式)

首先到Mongo官网下载Windows版ZIP包https://www.mongodb.com/download-center/community,释放到D:\MongoDB\bin,可能需要安装VC2015运行环境,嫌麻烦可以装MSI版本。

构建带安全验证的Mongo复制集(Windows环境下NT服务方式)

1、在MongoDB下新建data目录,以及其下的目录结构
D:\MongoDB
|-bin
|-data
  |-cfg
  |-db
    |-rs1
    |-rs2
    |-rs3
  |-log

构建带安全验证的Mongo复制集(Windows环境下NT服务方式)

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    #这时应该正常显示库列表