基础规划

软件环境

#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

本文参考:

https://www.itq168.com/article/3470

https://xpbag.com/503.html