基础规划
软件环境
#mongodb下载
# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.4.10.tgz
#mongodb解压
# tar -zxvf mongodb-linux-x86_64-rhel70-3.4.10.tgz
#mongodb安装
# mv mv mongodb-linux-x86_64-rhel70-3.4.10 /usr/local/mongodb
#mongodb环境配置
# echo 'export PATH=/usr/local/mongodb/bin:$PATH' >> /etc/profile
#使配置生效
# source /etc/profile
# 查看是否安装成功
# mongo --version
环境规划–单机器部署多节点
节点名 | 节点用途 | 节点IP | 节点端口 | 集群名 |
---|---|---|---|---|
node1 | 主节点(PRIMARY) | 10.0.2.11 | 27017 | mgset |
node2 | 从节点(SECONDARY) | 10.0.2.11 | 27018 | |
node3 | 仲裁节点(ARBITER) | 10.0.2.11 | 27019 |
目录 | 用途 | 备注 |
---|---|---|
/data/mongodb/node[x]/data | Mongo集群数据文件目录 | |
/data/mongodb/node[x]/logs | Mongo集群系统日志目录 | |
/data/mongodb/node[x]/conf | Mongo集群配置文件目录 |
搭建步骤
配置文件
node1的配置文件/data/mongodb/node1/conf/mongod.conf (其他节点根据情况修改)
systemLog:
destination: file
path: "/data/mongodb/node1/logs/mongod.log"
logAppend: true
storage:
dbPath: "/data/mongodb/node1/data"
journal:
enabled: true
processManagement:
fork: true
pidFilePath: "/data/mongodb/node1/mongod.pid"
net:
bindIp: 10.0.2.11
port: 27017
#security: # 认证配置,开启认证后取消注释
# keyFile: "/data/mongodb/node1/conf/access.key"
# authorization: enabled
replication:
oplogSizeMB: 500
replSetName: mgset
启动服务
# mongod -f /data/mongodb/node1/conf/mongod.conf
# mongod -f /data/mongodb/node2/conf/mongod.conf
# mongod -f /data/mongodb/node3/conf/mongod.conf
配置集群
进入其中一个节点(主节点)的mongo控制台, 配置集群(务必保证节点防火墙关闭或开放mongo服务端口).
# 仅在一个节点执行
# mongo 10.0.2.11:27017 #进入mongo控制台
> cfg = {_id: 'mgset', members: []} #生成集群配置变量
> cfg.members.push({_id: 1, host: '10.0.2.11:27017'}) #变量中加入节点1
> cfg.members.push({_id: 2, host: '10.0.2.11:27018'}) #变量中加入节点2
> cfg.members.push({_id: 3, host: '10.0.2.11:27019', arbiterOnly: true}) #变量中加入节点3(仲裁节点)
> rs.initiate(cfg) #根据变量配置集群
> rs.isMaster() #查看集群是否配置成功
> rs.status()
#健康状态 1表示正常 0表示故障
"health" : 1,
#表示状态 1是主库 2是从库 3表示恢复数据中 7表示投票者 8表示down机
"state" : 1,
#标注是主库还是从库
"stateStr" : "PRIMARY",
#集群启动时间
"uptime" : 579,
#另一种格式的时间
"optime" : {
"ts" : Timestamp(1590593779, 1),
"t" : NumberLong(1)
},
#上一次心跳传过来数据的时间
"optimeDate" : ISODate("2020-05-27T15:36:19Z"),
#检测上一次心跳时间
"lastHeartbeat" : ISODate("2020-05-27T15:36:25.815Z"),
> rs.printReplicationInfo() #oplog信息
configured oplog size: 1024MB
log length start to end: 1543secs (0.43hrs)
oplog first event time: Wed May 27 2020 23:26:46 GMT+0800 (CST)
oplog last event time: Wed May 27 2020 23:52:29 GMT+0800 (CST)
now: Wed May 27 2020 23:52:38 GMT+0800 (CST)
> rs.printSlaveReplicationInfo() #查看延时从库信息
source: 10.0.0.93:28018
syncedTo: Wed May 27 2020 23:54:19 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
source: 10.0.0.93:28019
syncedTo: Wed May 27 2020 23:54:19 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
> rs.config() #打印副本集配置文件
添加用户
集群配置完成后, 仍然在主节点的mongo控制台中添加数据库管理员
# 仅在一个节点执行
# mongo 10.0.2.11:27017 #进入mongo控制台
> use admin #使用内置的admin库
> db.createUser( #创建数据库管理员
{
user:"root",
pwd:"root",
roles:[{role:"readWriteAnyDatabase",db:"admin"},{role:"dbAdminAnyDatabase",db:"admin"},{role:"userAdminAnyDatabase",db:"admin"}]
}
)
# 其他用户创建
> db.createUser( #创建集群管理员
{
user:"suroot",
pwd:"suroot",
roles:[{role:"clusterAdmin",db:"admin"},{role:"clusterManager",db:"admin"},{role:"clusterMonitor",db:"admin"}]
}
)
> use testdb #切换到testdb数据库,不用事先创建
> db.createUser( #创建特定库的特定用户
{
user:"test",
pwd:"test",
roles:[{role:"readWrite",db:"testdb"},{role:"dbAdmin",db:"testdb"},{role:"userAdmin",db:"testdb"}]
}
)
> use admin
> db.system.users.find() #查看创建的用户
[注]:
1. MongoDB的用户和数据库是绑定的, 必须指定某个用户归属于哪个数据库, 即在roles字段的每个role中指定db字段.
2. 数据库管理员通常需要具有读写,管理任意数据库和管理任意用户的role, 后续可以登录此用户进行数据库和用户的增删改查.
3. 集群管理员通常需要具有集群管理和集群监控的role, 只有集群管理员可以关闭集群.
4. 普通用户根据用途不同可以对特定或者多个数据库拥有各种不同的role, 本例中的test用户既可以读写testdb库, 同时也是testdb库的管理员.
5. 主节点上添加的用户应该能够在从节点上查询到(需要先键入rs.slaveOk()命令).
开启用户认证
用户添加完成后需要关闭所有节点:
killall mongod
生成keyFile(keyFile的用途是作为所有mongod后台进程允许加入集群的凭证, 所有集群中的节点共用一个keyFile, 避免其他mongod非法加入集群):
# 仅在一个节点执行
# openssl rand -base64 756 > /data/mongodb/node1/conf/access.key #生成keyFile, keyFile的长度必须在6-1024个字符之间
# chmod 400 /data/mongodb/node1/conf/access.key #设置keyFile文件为只读
# cp /data/mongodb/node1/conf/access.key /data/mongodb/node2/conf/ #将keyFile复制到其他节点
# cp /data/mongodb/node1/conf/access.key /data/mongodb/node3/conf/
取消三个节点mongod.conf文件中security部分的注释:
systemLog:
destination: file
path: "/data/mongodb/node1/logs/mongod.log"
logAppend: true
storage:
dbPath: "/data/mongodb/node1/data"
journal:
enabled: true
processManagement:
fork: true
pidFilePath: "/data/mongodb/node1/mongod.pid"
net:
bindIp: 10.0.2.11
port: 27017
security: # 认证配置,开启认证后取消注释
keyFile: "/data/mongodb/node1/conf/access.key"
authorization: enabled
replication:
oplogSizeMB: 500
replSetName: mgset
依次启动主节点, 从节点和仲裁节点的mongod后台进程:
# mongod -f /data/mongodb/node1/conf/mongod.conf
# mongod -f /data/mongodb/node2/conf/mongod.conf
# mongod -f /data/mongodb/node3/conf/mongod.conf
使用认证用户登录:
# mongo 10.0.2.11:27017
> use admin
> db.auth('root', 'root') #使用数据库管理员认证
> rs.slaveOk() #默认读写操作均在主节点执行, 从节点上需要执行此命令才能读取数据库数据
> db.system.users.find()
> use testdb
> db.auth('test', 'test') #切换到test用户
> db.getCollectionNames()
> use admin #切换到集群管理员用户, 关闭mongo服务
> db.auth('suroot', 'suroot')
至此, 基于用户认证的MongoDB3.4三节点副本集集群环境已经搭建完成.
常用命令:
https://www.runoob.com/mongodb/mongodb-create-collection.html
本文参考: