一、实验目的
1、了解MongoDB数据库;
2、掌握MongoDB的安装与基本配置;
3、掌握MongoDB数据库集群的实现;
4、掌握使用MongoDB Compass管理MongoDB数据库集群。
二、实验学时
2学时
三、实验类型
综合性
实验需求
1、硬件
每个人配备计算机1台。
2、软件
Windows操作系统,安装Oracle VM VirtualBox软件,安装MobaXterm软件。
安装MongoDB Compass软件。
3、网络
本地主机与虚拟机能够访问互联网,不使用DHCP服务。
4、工具
无。
五、实验任务
1、完成MongoDB的安装;
2、完成使用MongoDB实现副本集;
3、完成使用MongoDB Compass管理MongoDB数据库集群,并进行副本集测试。
六、实验环境
1、本实验需要VM 3台;
2、本实验VM配置信息如下表所示;

3、本实验拓扑图,如图9-1所示。

图 9-1 实验拓扑图
4、本实验操作演示视频。
本实验为视频集的第6集:网页链接
七、实验内容步骤
1、完成MongoDB的安装
1.1 在主机Lab-09-Task-01上操作
(1)查看防火墙Firewalld服务状态(CentOS操作系统默认安装Firewalld防火墙,并创建firewalld服务,该服务已开启且已配置为开机自启动)。
(2)使用firewall-cmd命令添加本地客户端允许远程连接MongoDB数据库,以及其余两台主机允许联通该主机的MongoDB数据库,并重新载入防火墙配置使其生效。
(3)使用配置yum源的方式完成MongoDB的安装,安装前需先更新软件包缓存。
(4)启动mongod服务,设置mongod服务为开机自启动并查看mongod服务运行状态。
# 查看防火墙Firewalld服务状态
[root@Lab-09-Task-01 ~]# systemctl status firewalld
# 添加本地客户端允许远程连接MongoDB数据库防火墙规则
[root@Lab-09-Task-01 ~]# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.20.1.134 port port=27017 protocol=tcp accept'
# 添加其余两台主机允许联通当前主机的MongoDB数据库防火墙规则
[root@Lab-09-Task-01 ~]# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.20.1.21 port port=27017 protocol=tcp accept'
[root@Lab-09-Task-01 ~]# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.20.1.22 port port=27017 protocol=tcp accept'
# 重新载入防火墙配置使其生效
[root@Lab-09-Task-01 ~]# firewall-cmd --reload
# 使用vi命令编辑/etc/yum.repos.d/mongodb.repo文件
[root@Lab-09-Task-01 ~]# vi /etc/yum.repos.d/mongodb.repo
# --------------------/etc/yum.repos.d/mongodb.repo文件--------------------
[mongodb-org-4.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/8/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
# --------------------/etc/yum.repos.d/mongodb.repo文件--------------------
# 更新软件包缓存
[root@Lab-09-Task-01 ~]# dnf update
# 使用dnf命令安装MongoDB
[root@Lab-09-Task-01 ~]# dnf install -y mongodb-org
# 启动mongod服务
[root@Lab-09-Task-01 ~]# systemctl start mongod
# 设置mongod服务为开机自启动
[root@Lab-09-Task-01 ~]# systemctl enable mongod
# 查看mongod服务运行状态
[root@Lab-09-Task-01 ~]# systemctl status mongod
1、如果Firewalld防火墙未启动,请使用命令systemctl start firewalld启动防火墙;如果Firewalld防火墙未设置为开机自启动,请使用命令systemctl enable firewalld设置为开机启动。
2、上述命令中“172.20.1.134”为本机IP地址,请根据实际情况替换为IP地址。
3、当前主机IP地址为172.20.1.20,那么需要添加其余主机(172.20.1.21、172.20.1.22)允许联通当前主机的MongoDB数据库防火墙规则;同理,当前主机IP地址为172.20.1.21,那么需要添加其余主机(172.20.1.20、172.20.1.22)允许联通当前主机的MongoDB数据库防火墙规则;当前主机IP地址为172.20.1.22,那么需要添加其余主机(172.20.1.20、172.20.1.21)允许联通当前主机的MongoDB数据库防火墙规则。上述命令中仅为主机172.20.1.20的防火墙配置规则,当配置其他主机时,请修改配置防火墙规则中的IP地址为其余两台主机,保证3台主机的MongoDB数据库可以相互联通。 1.2 在主机Lab-09-Task-02上操作
主机Lab-09-Task-02安装MongoDB的方法和过程,请参考步骤1.1完成。
1.3在主机Lab-09-Task-03上操作
主机Lab-09-Task-03安装MongoDB的方法和过程,请参考步骤1.1完成。
2、配置副本集
2.1 在主机Lab-09-Task-01上操作
具体过程如下。
(1)生成MongoDB的副本集密钥。
(2)设置上述创建的密钥文件(keyfile.key)的读写权限为400,所有者和所属组均为mongod。
(3)使用scp命令将主机Lab-09-Task-01上的副本集密钥文件分发到主机Lab-09-Task-02,并按照操作提示完成文件的传输。
(4)使用scp命令将主机Lab-09-Task-01上的副本集密钥文件分发到主机Lab-09-Task-03,并按照操作提示完成文件的传输。
(5)修改/etc/mongod.conf文件配置MongoDB支持副本集,修改完成后重启mongod服务,确保配置生效。
# 生成MongoDB的副本集密钥
[root@Lab-09-Task-01 ~]# openssl rand -base64 756 > /var/lib/mongo/keyfile.key
# 设置副本集密钥文件(keyfile.key)的读写权限为400,所有者和所属组均为mongod
[root@Lab-09-Task-01 ~]# chmod 400 /var/lib/mongo/keyfile.key
[root@Lab-09-Task-01 ~]# chown mongod:mongod /var/lib/mongo/keyfile.key
# 将主机Lab-09-Task-01上的副本集密钥文件分发到主机Lab-09-Task-02
[root@Lab-09-Task-01 ~]# scp /var/lib/mongo/keyfile.key root@172.20.1.21:/var/lib/mongo/
# 将主机Lab-09-Task-01上的副本集密钥文件分发到主机Lab-09-Task-03
[root@Lab-09-Task-01 ~]# scp /var/lib/mongo/keyfile.key root@172.20.1.22:/var/lib/mongo/
# 使用vi命令编辑/etc/mongod.conf数据库配置文件
[root@Lab-09-Task-01 ~]# vi /etc/mongod.conf
# --------------------/etc/mongod.conf文件--------------------
net:
port: 27017
bindIp: 0.0.0.0
security:
keyFile: /var/lib/mongo/keyfile.key
replication:
replSetName: "mongodb-cluster"
# --------------------/etc/mongod.conf文件--------------------
# 重启mongod服务
[root@Lab-09-Task-01 ~]# systemctl restart mongod 2.2 在主机Lab-09-Task-02上操作
(1)将从主机Lab-09-Task-01传输过来的副本集密钥文件(keyfile.key)的读写权限设置为400,所有者和所属组均设置为mongod。
(2)修改/etc/mongod.conf文件配置MongoDB支持副本集,修改完成后重启mongod服务,确保配置生效。
# 设置副本集密钥文件(keyfile.key)的读写权限为400,所有者和所属组均为mongod
[root@Lab-09-Task-02 ~]# chmod 400 /var/lib/mongo/keyfile.key
[root@Lab-09-Task-02 ~]# chown mongod:mongod /var/lib/mongo/keyfile.key
# 使用vi命令编辑/etc/mongod.conf数据库配置文件
[root@Lab-09-Task-02 ~]# vi /etc/mongod.conf
# --------------------/etc/mongod.conf文件--------------------
net:
port: 27017
bindIp: 0.0.0.0
security:
keyFile: /var/lib/mongo/keyfile.key
replication:
replSetName: "mongodb-cluster"
# --------------------/etc/mongod.conf文件--------------------
# 重启mongod服务
[root@Lab-09-Task-02 ~]# systemctl restart mongod 2.3 在主机Lab-09-Task-03上操作
主机Lab-09-Task-03配置副本集的方法和过程,请参考步骤2.2完成。
3、初始化副本集
在主机Lab-09-Task-01上进行操作,进行副本集的初始化,具体步骤如下。
(1)使用mongo命令连接MongoDB客户端,初始化副本集,并退出当前连接。
(2)使用mongo命令连接MongoDB客户端,查看副本集状态,并退出当前连接。
(3)使用mongo命令连接MongoDB客户端,为副本集创建用户,并退出当前连接。
# 使用mongo命令连接MongoDB客户端
[root@Lab-09-Task-01 ~]# mongo
# 初始化副本集
> rs.initiate( {
_id : "mongodb-cluster",
members: [
{ _id:0, priority:2, host:"172.20.1.20:27017"},
{ _id:1, host:"172.20.1.21:27017"},
{ _id:2, host:"172.20.1.22:27017"}
]
})
# 退出当前连接
mongodb-cluster:PRIMARY> quit()
# 使用mongo命令连接MongoDB客户端
[root@Lab-09-Task-01 ~]# mongo
#查看副本集状态
mongodb-cluster:PRIMARY> rs.status()
# 退出当前连接
mongodb-cluster:PRIMARY> quit()
# 使用mongo命令连接MongoDB客户端
[root@Lab-09-Task-01 ~]# mongo
# 为副本集创建用户
mongodb-cluster:PRIMARY> use admin
mongodb-cluster:PRIMARY> db.createUser(
{
user: "mongodblab1",
pwd: "mongodblab1#PWD",
roles: [{ role: "userAdminAnyDatabase",db: "admin"} ,"readWriteAnyDatabase"]
}
)
mongodb-cluster:PRIMARY> db.getSiblingDB("admin").auth("mongodblab1",passwordPrompt())
Enter password:这里输入mongodblab1用户密码(mongodblab1#PWD)
mongodb-cluster:PRIMARY> db.getSiblingDB("admin").createUser(
{
user: "mongodblab2",
pwd: "mongodblab2#PWD",
roles: [{role: "clusterAdmin",db: "admin"},"readWriteAnyDatabase"]
}
)
# 退出当前连接
mongodb-cluster:PRIMARY> quit()
通过上述rs.status()命令查看副本集状态,当前主机Lab-09-Task-01为主节点,主机Lab-09-Task-02、主机Lab-09-Task-03为副本节点。 4、使用MongoDB Compass管理MongoDB数据库集群
(1)从MongoDB Compass的官方网站(https://www.mongodb.com)获取可执行程序,并进行安装。
(2)运行MongoDB Compass,依据向导添加3台MongoDB服务器,并进行连接。
点击“New connection”按钮,在右侧的URI输入框中通过标准连接字符串格式连接MongoDB数据库,如图9-1所示。

图 9-2 MongoDB Compass的主界面
连接格式如下。
# URI连接格式:
mongodb://数据库用户名:数据库用户密码@IP地址:端口号
# 以连接主机Lab-09-Task-01中的MongoDB数据库为例:
mongodb://mongodblab2:mongodblab2%23PWD@172.20.1.20:27017
# 首次连接成功后,点击左上角“connect”-“New Window”新建连接窗口,并依次连接剩余两个MongoDB数据库,连接格式如下:
# 连接主机Lab-09-Task-02中的MongoDB数据库
mongodb://mongodblab2:mongodblab2%23PWD@172.20.1.21:27017
# 连接主机Lab-09-Task-03中的MongoDB数据库:
mongodb://mongodblab2:mongodblab2%23PWD@172.20.1.22:27017 (3)连接到数据库服务器后,可点击“Databases”查看MongoDB数据库列表,如图9-2所示。

图 9-3 MongoDB Compass进行数据库管理
5、测试MongoDB集群的可用性
场景1:主节点增加数据,从节点同步增加
(1)使用MongoDB Compass通过用户“mongodblab2”连接到副本集主节点Lab-09-Task-01,创建数据库、集合,并添加数据。
(2)使用MongoDB Compass通过用户“mongodblab2”连接到副本集从节点-1(Lab-09-Task-02),查看在主节点上创建的数据库、集合以及添加的数据,是否存在。
(3)使用MongoDB Compass通过用户“mongodblab2”连接到副本集从节点-2(Lab-09-Task-03),查看在主节点上创建的数据库、集合以及添加的数据,是否存在。
场景2:主节点删除数据,从节点同步删除
(1)使用MongoDB Compass通过用户“mongodblab2”连接到副本集主节点Lab-09-Task-01,删除数据。
(2)使用MongoDB Compass通过用户“mongodblab2”连接到副本集从节点-1(Lab-09-Task-02),查看在主节点上删除的数据,是否已不存在。
(3)使用MongoDB Compass通过用户“mongodblab2”连接到副本集从节点-2(Lab-09-Task-03),查看在主节点上删除的数据,是否已不存在。
场景3:主节点宕机,业务不受影响
(1)在主节点Lab-09-Task-01上执行systemctl stop命令,关闭mangod服务,以模拟主节点宕机故障。
(2)在从节点Lab-09-Task-02上使用mongo -umongodblab2 -pmongodblab2#PWD命令连接MongoDB客户端,查看当前主节点所在的主机。
# 停止mangod服务
[root@Lab-09-Task-01 ~]# systemctl stop mongod
# 通过用户mongodblab2连接MongoDB客户端
[root@Lab-09-Task-02 ~]# mongo -umongodblab2 -pmongodblab2#PWD
# 查看当前主节点所在的主机
mongodb-cluster:PRIMARY> rs.status() 场景4:原主节点恢复正常,业务不受影响
(1)在原主节点Lab-09-Task-01上执行systemctl start命令,启动mangod服务,以模拟原主节点恢复正常,连接MongoDB客户端并查看副本集状态。
(2)使用MongoDB Compass通过用户“mongodblab2”连接到副本集原主节点Lab-09-Task-01,查看宕机期间未同步的数据是否已同步。
# 启动mangod服务
[root@Lab-09-Task-01 ~]# systemctl start mongod
[root@Lab-09-Task-01 ~]# mongo -umongodblab2 -pmongodblab2#PWD
# 查看副本集状态
mongodb-cluster:SECONDARY> rs.status()