CentOS7下MongoDB3.6的三节点副本集keyfile+auth方式测试
(1). 安装MongoDB
[root@10-12-167-31 ~]# tar xf mongodb-linux-x86_64-rhel70-v3.6-latest.tgz
[root@10-12-167-31 ~]# ln -s /usr/local/mongodb-linux-x86_64-rhel70-3.6.6-92-gc692662/ /usr/local/mongodb
(2). 创建普通用户和相关目录
[root@10-12-167-31 ~]# mkdir /data/mongodb
[root@10-12-167-31 ~]# useradd keung
[root@10-12-167-31 ~]# chown keung.keung /data/mongodb
[root@10-12-167-31 ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@10-12-167-31 ~]# echo never > /sys/kernel/mm/transparent_hugepage/defrag
[root@10-12-167-31 ~]# su - keung
[keung@10-12-167-31 ~]$ mkdir /data/mongodb/2701{7,8,9}/{data,logs} -p
(3). 配置mongod.conf
#mongod.conf
systemLog:
destination: file
path: "/data/mongodb/27017/logs/mongod.log"
logAppend: true
storage:
dbPath: "/data/mongodb/27017/data"
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 1
replication:
replSetName: "myReplSet"
processManagement:
fork: true
pidFilePath: "/data/mongodb/27017/mongodb.pid"
net:
bindIp: 127.0.0.1,10.12.167.31
port: 27017
setParameter:
enableLocalhostAuthBypass: false
27018节点和27019节点配置类似,只需把端口改一下
(4). 启动三个节点
[keung@10-12-167-31 ~]$ /usr/local/mongodb/bin/mongod --config /data/mongodb/27017/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 9517
child process started successfully, parent exiting
[keung@10-12-167-31 ~]$ /usr/local/mongodb/bin/mongod --config /data/mongodb/27018/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 9545
child process started successfully, parent exiting
[keung@10-12-167-31 ~]$ /usr/local/mongodb/bin/mongod --config /data/mongodb/27019/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 9573
child process started successfully, parent exiting
(5). 连接任一节点,配置副本集
keung@10-12-167-31 ~]$ /usr/local/mongodb/bin/mongo --port=27017
MongoDB shell version v3.6.6-92-gc692662
connecting to: mongodb://127.0.0.1:27017/
MongoDB server version: 3.6.6-92-gc692662
Server has startup warnings:
2018-08-14T23:52:44.606+0800 I CONTROL [initandlisten]
2018-08-14T23:52:44.606+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-08-14T23:52:44.606+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2018-08-14T23:52:44.606+0800 I CONTROL [initandlisten]
> config = {_id: "myReplSet", members: [{_id: 0, host: "10.12.167.31:27017"}, {_id: 1, host: "10.12.167.31:27018"}, {_id: 2, host: "10.12.167.31:27019"}]}
{
"_id" : "myReplSet",
"members" : [
{
"_id" : 0,
"host" : "10.12.167.31:27017"
},
{
"_id" : 1,
"host" : "10.12.167.31:27018"
},
{
"_id" : 2,
"host" : "10.12.167.31:27019"
}
]
}
> rs.initiate(config)
{
"ok" : 1,
"operationTime" : Timestamp(1534262137, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1534262137, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
myReplSet:SECONDARY> rs.status()
{
"set" : "myReplSet",
"date" : ISODate("2018-08-14T15:56:03.242Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1534262150, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1534262150, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1534262150, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1534262150, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "10.12.167.31:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 200,
"optime" : {
"ts" : Timestamp(1534262150, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-08-14T15:55:50Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1534262148, 1),
"electionDate" : ISODate("2018-08-14T15:55:48Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "10.12.167.31:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 25,
"optime" : {
"ts" : Timestamp(1534262150, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1534262150, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-08-14T15:55:50Z"),
"optimeDurableDate" : ISODate("2018-08-14T15:55:50Z"),
"lastHeartbeat" : ISODate("2018-08-14T15:56:02.481Z"),
"lastHeartbeatRecv" : ISODate("2018-08-14T15:56:02.630Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "10.12.167.31:27017",
"syncSourceHost" : "10.12.167.31:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "10.12.167.31:27019",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 25,
"optime" : {
"ts" : Timestamp(1534262150, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1534262150, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-08-14T15:55:50Z"),
"optimeDurableDate" : ISODate("2018-08-14T15:55:50Z"),
"lastHeartbeat" : ISODate("2018-08-14T15:56:02.481Z"),
"lastHeartbeatRecv" : ISODate("2018-08-14T15:56:02.634Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "10.12.167.31:27017",
"syncSourceHost" : "10.12.167.31:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1534262150, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1534262150, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
(6). 连接主节点创建账号密码
[keung@10-12-167-31 ~]$ /usr/local/mongodb/bin/mongo --host=10.12.167.31 --port=27017
MongoDB shell version v3.6.6-92-gc692662
connecting to: mongodb://10.12.167.31:27017/
MongoDB server version: 3.6.6-92-gc692662
Server has startup warnings:
2018-08-14T23:52:44.606+0800 I CONTROL [initandlisten]
2018-08-14T23:52:44.606+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-08-14T23:52:44.606+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2018-08-14T23:52:44.606+0800 I CONTROL [initandlisten]
myReplSet:PRIMARY> use admin
switched to db admin
# 创建管理员
myReplSet:PRIMARY> db.createUser({user: "admin",pwd: "p@ssw0rd4admin",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]})
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
#创建集群管理员
myReplSet:PRIMARY> db.createUser({"user" : "cluster","pwd" : "changeme2",roles: [ { "role" : "clusterAdmin", "db" : "admin" } ]})
Successfully added user: {
"user" : "cluster",
"roles" : [
{
"role" : "clusterAdmin",
"db" : "admin"
}
]
}
#创建普通用户
myReplSet:PRIMARY> use db1;
switched to db db1
myReplSet:PRIMARY> db.createUser({user:"keung",pwd:"pass4keung",roles:[{role:"dbOwner",db:"db1"}]})
Successfully added user: {
"user" : "keung",
"roles" : [
{
"role" : "dbOwner",
"db" : "db1"
}
]
}
(7). 关闭副本集
[keung@10-12-167-31 ~]$ /usr/local/mongodb/bin/mongod --config /data/mongodb/27019/mongodb.conf --shutdown
killing process with pid: 9573
[keung@10-12-167-31 ~]$ /usr/local/mongodb/bin/mongod --config /data/mongodb/27018/mongodb.conf --shutdown
killing process with pid: 9545
[keung@10-12-167-31 ~]$ /usr/local/mongodb/bin/mongod --config /data/mongodb/27017/mongodb.conf --shutdown
killing process with pid: 9517
(8). 修改配置文件,开启认证方式和keyFile鉴权
#27017节点配置为
security:
keyFile: "/data/mongodb/27017/keyfile"
authorization: enabled
#27018节点配置为
security:
keyFile: "/data/mongodb/27018/keyfile"
authorization: enabled
#27018节点配置为
(9). 生成keyfile文件, 权限为400, 并拷贝到相应节点下
[keung@10-12-167-31 ~]$ openssl rand -base64 756 -out keyfile
[keung@10-12-167-31 ~]$ chmod 400 keyfile
[keung@10-12-167-31 ~]$ cp -a keyfile /data/mongodb/27017/
[keung@10-12-167-31 ~]$ cp -a keyfile /data/mongodb/27018/
[keung@10-12-167-31 ~]$ cp -a keyfile /data/mongodb/27019/
(10). 重新启动各个节点
[keung@10-12-167-31 ~]$ /usr/local/mongodb/bin/mongod --config /data/mongodb/27017/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 9868
child process started successfully, parent exiting
[keung@10-12-167-31 ~]$ /usr/local/mongodb/bin/mongod --config /data/mongodb/27018/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 9944
child process started successfully, parent exiting
[keung@10-12-167-31 ~]$ /usr/local/mongodb/bin/mongod --config /data/mongodb/27019/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 10023
child process started successfully, parent exiting
(11). 在主节点测试写入
[keung@10-12-167-31 ~]$ /usr/local/mongodb/bin/mongo --port=27017
MongoDB shell version v3.6.6-92-gc692662
connecting to: mongodb://127.0.0.1:27017/
MongoDB server version: 3.6.6-92-gc692662
myReplSet:PRIMARY> use db1;
switched to db db1
myReplSet:PRIMARY> db.auth('keung','pass4keung')
1
myReplSet:PRIMARY> db.t_user.insert({"user": "mongodb"});
WriteResult({ "nInserted" : 1 })
myReplSet:PRIMARY> db.t_user.find();
{ "_id" : ObjectId("5b72ff6e8363f501cd9e7323"), "user" : "mongodb" }
(12). 在secondary节点测试查询是否有数据同步
[keung@10-12-167-31 ~]$ /usr/local/mongodb/bin/mongo --port=27018
MongoDB shell version v3.6.6-92-gc692662
connecting to: mongodb://127.0.0.1:27018/
MongoDB server version: 3.6.6-92-gc692662
myReplSet:SECONDARY> use db1;
switched to db db1
myReplSet:SECONDARY> db.auth('keung','pass4keung')
1
myReplSet:SECONDARY> rs.slaveOk() #默认情况下secondary是不可以读写的,需要执行rs.slaveOk()才可以执行查看命令
myReplSet:SECONDARY> db.t_user.find();
{ "_id" : ObjectId("5b72ff6e8363f501cd9e7323"), "user" : "mongodb" }