Linux操作系统实验指导-实验05:基于Docker部署MongoDB集群

343 阅读12分钟

一、实验目的

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容器。

# 创建并启动第1MongoDB容器,将容器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

# 创建并启动第2MongoDB容器,将容器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

# 创建并启动第2MongoDB容器,将容器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题。