一、实验目的
1、了解Docker;
2、了解MongoDB数据库;
3、掌握基于Docker部署MongoDB数据库服务;
4、掌握基于Docker实现MongoDB数据库集群;
5、掌握使用MongoDB Compass管理MongoDB数据库集群。
二、实验学时
2学时
三、实验类型
综合性
实验需求
1、硬件
每个人配备计算机1台。
2、软件
安装VMware WorkStation Pro或Oracle VM VirtualBox软件,安装Mobaxterm软件。
3、网络
本地主机与虚拟机能够访问互联网,虚拟机网络不使用DHCP服务。
Docker能够同步访问网络。
4、工具
无。
五、实验任务
1、完成MongoDB数据库的安装;
2、完成MongoDB数据库集群的部署;
3、完成使用MongoDB Compass管理MongoDB数据库集群。
六、实验环境
1、本实验需要VM 1台。
2、本实验VM配置信息如下表所示。
| 虚拟机配置 | 操作系统配置 |
|---|---|
| 虚拟机名称:VM-Lab-05-Task-01-172.31.0.51内存:4GBCPU:4颗,1核心虚拟磁盘:100GB网卡:1块 | 主机名:Lab-05-Task-01IP地址:172.31.0.51子网掩码:255.255.255.0网关:172.31.0.254DNS:172.31.0.254 |
3、本实验拓扑图。
无。
4、本实验操作演示视频。
本实验操作演示视频为视频集的第5集:www.bilibili.com/video/BV1b1…
七、实验内容步骤
1、安装Docker
(1)使用VMware WorkStation Pro创建实验所需虚拟机,并完成openEuler操作系统安装与基本配置(配置网络、开启远程连接),具体操作步骤请参考《实验01:安装与基本配置》。
(2)配置防火墙策略。
# 查看防火墙Firewalld服务状态
[root@Lab-05-Task-01 ~]# systemctl status firewalld
# 添加本地客户端允许远程连接MongoDB数据库
# mongo1数据库通过27017/tcp 连接
[root@Lab-05-Task-01 ~]# firewall-cmd --zone=public --add-port=27017/tcp --permanent
# mongo2数据库通过27018/tcp 连接
[root@Lab-05-Task-01 ~]# firewall-cmd --zone=public --add-port=27018/tcp --permanent
# mongo3数据库通过27019/tcp 连接
[root@Lab-05-Task-01 ~]# firewall-cmd --zone=public --add-port=27019/tcp --permanent
# 重新载入防火墙配置使其生效
[root@Lab-05-Task-01 ~]# firewall-cmd --reload
[root@Lab-05-Task-01 ~]# firewall-cmd --list-all
🔔提醒:
openEuler操作系统默认安装Firewalld防火墙,并创建firewalld服务,该服务已开启且已配置为开机自启动。
(3)安装Docker服务。
# 安装dokcer
[root@Lab-05-Task-01 ~]# yum install -y docker
# 查看Docker版本信息
[root@Lab-05-Task-01 ~]# docker --version
(4)开启Docker服务并设置服务开机自启。
# 启动docker服务
[root@Lab-05-Task-01 ~]# systemctl start docker
# 设置docker服务为开机自启动
[root@Lab-05-Task-01 ~]# systemctl enable docker
# 查看docker服务状态
[root@Lab-05-Task-01 ~]# systemctl status docker
2、安装MongoDB数据库
(1)使用docker pull命令拉取MongoDB镜像。
# 拉取MongoDB镜像
[root@Lab-05-Task-01 ~]# docker pull mongo
(2)使用docker run命令创建3个MongoDB容器。
# 创建并启动第1个MongoDB容器,将容器27017端口映射到宿主机的27017端口
[root@Lab-05-Task-01 ~]# docker run -d --name mongo1 -v /usr/local/mongodb/datadb1:/data/db -v /usr/local/mongodb/key:/data/key -v /etc/localtime:/etc/localtime -p 27017:27017 mongo --replSet mongodb-cluster
# 创建并启动第2个MongoDB容器,将容器27017端口映射到宿主机的27018端口
[root@Lab-05-Task-01 ~]# docker run -d --name mongo2 -v /usr/local/mongodb/datadb2:/data/db -v /usr/local/mongodb/key:/data/key -v /etc/localtime:/etc/localtime -p 27018:27017 mongo --replSet mongodb-cluster
# 创建并启动第2个MongoDB容器,将容器27017端口映射到宿主机的27019端口
[root@Lab-05-Task-01 ~]# docker run -d --name mongo3 -v /usr/local/mongodb/datadb3:/data/db -v /usr/local/mongodb/key:/data/key -v /etc/localtime:/etc/localtime -p 27019:27017 mongo --replSet mongodb-cluster
#查看容器是否创建
[root@Lab-05-Task-01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0d35ccb3c547 mongo "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 0.0.0.0:27019->27017/tcp mongo3
54d66763668b mongo "docker-entrypoint.s…" 12 seconds ago Up 11 seconds 0.0.0.0:27018->27017/tcp mongo2
632602ef0fa1 mongo "docker-entrypoint.s…" 21 seconds ago Up 20 seconds 0.0.0.0:27017->27017/tcp mongo1
🔔提醒:
若初次拉取mongo镜像失败,出现错误:
error pulling image configuration: Get "production.cloudflare.docker.com/registry-v2… 768e78f2af331869e91d13443f691080d3b93e8009a53391eeaa/data?verify=1721361822-bxHi6ad80PXuX8pRRws7gQDXVYU%3D": dial tcp 168.143.171.189:443: c onnect: connection refused
需配置Docker Hub镜像加速器,Docker 官方和国内很多云服务商都提供了国内加速器服务,具体参考配置如下:
①创建或修改 /etc/docker/daemon.json,添加或修改内容:
{ "data-root": "/data/dockerData", "registry-mirrors": [ "https://registry.docker-cn.com", "http://hub-mirror.c.163.com", "https://dockerhub.azk8s.cn", "https://mirror.ccs.tencentyun.com", "https://registry.cn-hangzhou.aliyuncs.com", "https://docker.mirrors.ustc.edu.cn", "https://docker.m.daocloud.io", "https://noohub.ru", "https://huecker.io", "https://dockerhub.timeweb.cloud" ] }②保存重载Docker配置,重启Docker服务
systemctl daemon-reload systemctl restart docker③配置完成后,重新执行拉取镜像命令即可继续实验。
3、生成副本集密钥
进入到“/usr/local/mongodb/key”目录下,生成MongoDB的副本集密钥。
[root@Lab-05-Task-01 ~]# cd /usr/local/mongodb/key
[root@Lab-05-Task-01 key]# openssl rand -base64 756 > mongodb.key
4、在容器mongo1内配置副本集
(1)使用docker exec命令进入到容器名为“mongo1”的容器内部,并在容器内部安装vim编辑器。
# 进入到容器名为“mongo1”的容器内部
[root@Lab-05-Task-01 key]# docker exec -it mongo1 bash
# 安装vim编辑器
root@50080eb44de2:/# apt-get update
root@50080eb44de2:/# apt-get install -y vim
(2)在容器名为“mongo1”的容器内部修改mongdb数据库配置文件。
root@50080eb44de2:/# cp /etc/mongod.conf.orig /etc/mongod.conf
# 使用vim命令编辑/etc/mongod.conf文件
root@50080eb44de2:/# vim /etc/mongod.conf
# --------------------/etc/mongod.conf文件--------------------
# 找到内容修改或添加
net:
port: 27017
bindIp: 0.0.0.0
security:
keyFile: /data/key/mongodb.key
replication:
replSetName: "mongodb-cluster"
# --------------------/etc/mongod.conf文件--------------------
(3)退出当前容器,使用docker restart重启容器名为“mongo1”的docker容器,确保配置生效。
# exit命令退出当前容器
root@50080eb44de2:/# exit
# 重启mongo1容器
[root@Lab-05-Task-01 key]# docker restart mongo1
5、在容器mongo2内配置副本集
(1)使用docker exec命令进入到容器名为“mongo2”的容器内部,并在容器内部安装vim编辑器。
# 进入到容器名为“mongo2”的容器内部
[root@Lab-05-Task-01 key]# docker exec -it mongo2 bash
# 安装vim编辑器
root@9710b49a6a41:/# apt-get update
root@9710b49a6a41:/# apt-get install -y vim
(2)在容器名为“mongo2”的容器内部修改mongdb数据库配置文件。
root@9710b49a6a41:/# cp /etc/mongod.conf.orig /etc/mongod.conf
# 使用vim命令编辑/etc/mongod.conf文件
root@9710b49a6a41:/# vim /etc/mongod.conf
# --------------------/etc/mongod.conf文件--------------------
# 找到内容修改或添加
net:
port: 27017
bindIp: 0.0.0.0
security:
keyFile: /data/key/mongodb.key
replication:
replSetName: "mongodb-cluster"
# --------------------/etc/mongod.conf文件--------------------
(3)退出当前容器,使用docker restart重启容器名为“mongo2”的docker容器,确保配置生效。
# exit命令退出当前容器
root@9710b49a6a41:/# exit
# 重启mongo2容器
[root@Lab-05-Task-01 key]# docker restart mongo2
6、在容器mongo3内配置副本集
(1)使用docker exec命令进入到容器名为“mongo3”的容器内部,并在容器内部安装vim编辑器。
# 进入到容器名为“mongo3”的容器内部
[root@Lab-05-Task-01 key]# docker exec -it mongo3 bash
# 安装vim编辑器
root@30cefbae3722:/# apt-get update
root@30cefbae3722:/# apt-get install -y vim
root@30cefbae3722:/# cp /etc/mongod.conf.orig /etc/mongod.conf
(2)在容器名为“mongo3”的容器内部修改mongdb数据库配置文件。
# 使用vim命令编辑/etc/mongod.conf文件
root@30cefbae3722:/# vim /etc/mongod.conf
# --------------------/etc/mongod.conf文件--------------------
# 找到内容修改或添加
net:
port: 27017
bindIp: 0.0.0.0
security:
keyFile: /data/key/mongodb.key
replication:
replSetName: "mongodb-cluster"
# --------------------/etc/mongod.conf文件--------------------
(3)退出当前容器,使用docker restart重启容器名为“mongo3”的docker容器,确保配置生效。
# exit命令退出当前容器
root@30cefbae3722:/# exit
# 重启mongo3容器
[root@Lab-05-Task-01 key]# docker restart mongo3
7、在容器mongo1内初始化副本集
(1)使用docker exec -it mongo1 mongosh命令连接到容器名为“mongo1”的MongoDB客户端,初始化副本集,查看副本集状态并退出当前连接。
# 使用docker exec -it mongo1 mongosh命令连接MongoDB客户端
[root@Lab-05-Task-01 ~]# docker exec -it mongo1 mongosh
# 初始化副本集
> rs.initiate( {
_id : "mongodb-cluster",
members: [
{ _id:0, priority:2, host:"172.31.0.51:27017"},
{ _id:1, host:"172.31.0.51:27018"},
{ _id:2, host:"172.31.0.51:27019"}
]
})
#查看副本集状态
mongodb-cluster [direct: other] test> rs.status()
# 退出当前连接(primary为主节点)
mongodb-cluster [direct: primary] test> quit()
(2)使用docker exec -it mongo1 mongosh命令连接MongoDB客户端,为副本集创建用户,并退出当前连接。
# 使用docker exec -it mongo1 mongosh命令连接MongoDB客户端
[root@Lab-05-Task-01 ~]# docker exec -it mongo1 mongosh
# 为副本集创建用户
mongodb-cluster [direct: primary] test> use admin
mongodb-cluster [direct: primary] admin> db.getSiblingDB("admin").createUser(
{
user: "mongodblab",
pwd: "mongodblab#PWD",
roles: [{role: "clusterAdmin",db: "admin"},"readWriteAnyDatabase"]
}
)
# 退出当前连接
mongodb-cluster [direct: primary] admin> quit()
🔔提醒
通过上述rs.status()命令查看副本集状态,mongo1(172.31.0.51:27017)为主节点,mongo2(172.31.0.51:27018)、mongo3(172.31.0.51:27019)为副本节点。
8、使用MongoDB Compass管理 MongoDB 数据库集群
(1)从MongoDB Compass的官方网站(www.mongodb.com)获取可执行程序。
(2)打开MongoDB Compass软件,填写数据库连接信息如:mongodb://172.31.0.51:27017,单击“connect”,依次完成3个数据库的连接,如图5-1、5-2所示。
(3)通过MongoDB Compass 监控查看3个MongoDB数据库的信息。
单击“Performance”,依次查看数据库的详细连接信息,具体监控参数本实验不再解释,可私下自主了解,监控数据如图5-3所示。
9、测试MongoDB副本集
9.1 测试方案
设计不同场景来测试MongoDB集群副本集。
场景 | 测试步骤 |
|---|---|
场景一 | 为主节点数据库添加数据,查看从节点数据库是否新增数据。 |
场景二 | 从主节点数据库删除数据,查看从节点数据库是否删除数据。 |
场景三 | 模拟主节点宕机,查看新主节点是否存在。 |
场景四 | 恢复原主节点,查看宕机期间未同步的数据是否已同步 |
9.2 测试步骤
(1)主节点增加数据,从节点同步增加。
使用MongoDB Compass通过用户“mongodblab”连接到主节点(172.31.0.51:27017)的MongoDB数据库
# 连接URL
mongodb://mongodblab:mongodblab%23PWD@172.31.0.51:27017
创建数据库“ceshi”和集合“test_collection”,如图5-4所示。
单击“ADD DATA”,选择“Insert Document”,添加默认数据(本实验不再具体解释数据添加过程,可私下自主学习),如图5-5所示。
添加完成,依次使用MongoDB Compass通过用户“mongodblab”连接到副本节点(172.31.0.51:27018 / 172.31.0.51:27019)的MongoDB数据库,查看在主节点上创建的数据库、集合以及添加的数据,是否存在。
(2)主节点删除数据,从节点同步删除。
参照上述步骤使用MongoDB Compass连接主节点数据库,选中需删除数据右侧的删除按钮,执行数据删除操作,如图5-6所示。
删除完成,依次使用MongoDB Compass通过用户“mongodblab”连接到副本节点(172.31.0.51:27018 / 172.31.0.51:27019)的MongoDB数据库,查看在主节点上删除的数据,是否在本节点已删除。
(3)主节点宕机,集群新选举主节点。
关闭主节点容器,模拟主节点宕机故障。
依次使用docker exec -it mongo2 mongosh命令连接副本节点(172.31.0.51:27018 / 172.31.0.51:27019)的MongoDB数据库客户端,查看当前主节点所在的容器
# 停止主节点对应容器
[root@Lab-05-Task-01 ~]# docker stop mongo1
# 连接MongoDB客户端
[root@Lab-05-Task-01 ~]# docker exec -it mongo2 mongosh
# 查看当前主节点所在的容器
mongodb-cluster [direct: secondary] test> rs.status()
(4)原主节点恢复正常,宕机期间的数据实现同步。
使用MongoDB Compass通过用户“mongodblab”连接到现主节点(172.31.0.51:27018),按照上述步骤添加1条数据。
启动原主节点对应容器,模拟原主节点(172.31.0.51:27017)恢复正常。
使用docker exec -it mongo1 mongosh命令连接原主节点,并查看副本集状态。
使用MongoDB Compass通过用户“mongodblab”连接到原主节点(172.31.0.51:27017),查看宕机期间未同步的数据是否已同步。
# 启动原主节点对应容器
[root@Lab-05-Task-01 ~]# docker start mongo1
# 连接MongoDB客户端
[root@Lab-05-Task-01 ~]# docker exec -it mongo1 mongosh
# 查看副本集状态
mongodb-cluster [direct: secondary] test> rs.status()
9.3 测试结果
| 场景 | 测试步骤 | 真实测试结果 |
|---|---|---|
| 场景一 | 为主节点数据库添加数据,查看从节点数据库是否新增数据。 | 从节点实现数据同步增加 |
| 场景二 | 从主节点数据库删除数据,查看从节点数据库是否删除数据。 | 从节点实现数据同步删除 |
| 场景三 | 模拟主节点宕机,查看新主节点是否存在。 | 集群重新选取主节点 |
| 场景四 | 恢复原主节点,查看宕机期间未同步的数据是否已同步。 | 数据已同步 |
八、实验考核
实验考核分为【实验随堂查】和【实验线上考】两个部分。
实验随堂查:每个实验设置5个考核点。完成实验任务后,按照考核点要求,学生提交实验成果的截图或录屏视频。通过线上考核平台(如课堂派)进行作答。依据提交成果进行评分。
实验线上考:每个实验设置5道客观题。通过线上考核平台(如课堂派)进行作答。系统自动评分。
1、实验随堂查
本实验随堂查设置提交实验成果-5个截图/视频,具体如下:
题目1[文件题]:提交成功创建3个MongoDB容器后,使用“docker ps”查看容器运行列表的截图;
题目2[文件题]:提交成功生成副本集密钥的截图;
题目3[文件题]:提交在容器mongo1内完成初始化副本集后查看副本集状态的截图;
题目4[文件题]:提交使用MongoDB Compass成功连接三个MongoDB 数据库的截图;
题目5[文件题]:提交进行“9.2、测试步骤”的录屏视频;
2、实验线上考
本实验线上考共5题。