Docker搭建MongoDB5.0集群

1、mongodb 集群

首先我们需要了解 mongodb 的集群模式,mongodb 安装分为单机安装和集群安装。集群安装分为:主从复制(Master-Slaver)集群、副本集(Replica Set)集群和分片集群(Sharded Cluster)。MongoDB 的主从复制(Master-Slave Replication)已不再是官方推荐的特性,并且在未来的版本中可能会被移除。MongoDB 官方推荐使用副本集(Replica Set)作为高可用性的解决方案。

1.1 主从复制存在的问题

  • • 单点故障:Master 节点故障时,没有自动故障转移机制。

  • • 数据量有限:Slave 节点数据通常不可写,限制了数据总量的增长。

  • • 延迟和同步问题:Slave 节点可能会落后于 Master,导致数据延迟。

  • • 资源利用率低:需要额外资源来运行 Slave 节点。

1.2 副本集的优点

  • • 自动故障转移。

  • • 读写分离,能提供更好的读扩展能力。

  • • 副本集成员可配置为 arbiter(仲裁),提供投票决定谁是主节点。

1.3 分片集群

  • • 用于跨多个服务器分布数据的方法,用于支持非常大的数据集和高吞吐量的操作

2、副本集节点选择

一个副本集最多有 50 个节点并且最多支持 7 个投票节点,其余节点必须是没有投票权的节点。副本集通过设置 priority 决定优先级,默认优先级为 1,priority 值是 0 到 100 之间的数字,数字越大优先级越高,priority=0,则此节点永远不能成为主节点 primay。

副本集的最小推荐配置是三个节点:

  • • 一个主节点和两个从节点

  • • 一个主节点、一个从节点和仲裁节点

如果可能,尽可能在副本集中使用奇数个数据成员,而不要使用仲裁者。所以推荐使用的最低配置为:一个主节点和两个从节点。副本集在部署时如果当节点数目为偶数个时,需要部署一个仲裁节点,否则偶数个节点,当主节点挂了后,其他节点会变为只读。不会去选举其他主节点。

关于仲裁者说明:

仲裁者可随意部署在网络通的任何地方,不会占用什么系统资源,它只提供投票选举的功能,不存储数据。

3、拉取 mongodb 镜像

docker pull mongo:5.0
Docker 搭建 MongoDB5.0 集群

4、创建 mongodb 文件夹

首先在宿主机里面创建 mongodb 的存储数据文件夹

mkdir mongo01 && cd mongo01

进入 mongo01 创建 conf、data、logs、tmp 文件夹

mkdir conf data logs tmp
Docker 搭建 MongoDB5.0 集群

进入 conf 文件夹编写 mongod.conf 文件

# 数据库文件存储位置
dbpath = /data/db
# log 文件存储位置
logpath = /data/log/mongod.log
# 使用追加的方式写日志
logappend = true
# 是否以守护进程方式运行
# fork = true
# 全部 ip 可以访问
bind_ip = 0.0.0.0
# 端口号
port = 27017
# 是否启用认证
auth = true
# 设置 oplog 的大小(MB)
oplogSize=2048
#指定秘钥文件
keyFile = /data/key/mongo.key
#指定副本集名称
replSet = rs

MongoDB 的 mongod.conf 文件从版本 3.2 开始支持 YAML 格式。可以使用更加简洁和结构化的语法来配置 MongoDB

# mongod.conf
# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
  dbPath: /data/db
  journal:
    enabled: true
#  engine:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1
# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /tmp/mongod.log
# network interfaces
net:
  port: 27017
  #bindIp: 127.0.0.1
  bindIp: 0.0.0.0
# how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo
#开启认证
security:
  keyFile: /data/key/mongo.key
  authorization: enabled

#operationProfiling:

#replication:  配副本集名
replication:
  replSetName: rs

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:

后面使用 YAML 格式进行配置说明。由于搭建副本集服务器,开启认证的同时,必须指定 keyFile 参数,节点之间的通讯基于该 keyFile 进行的。否则会启动失败。我们通过 docker logs 容器 ID 查看 docker 日志可以发现启动的时候会报错:

BadValue: security.keyFile is required when authorization is enabled with replica sets

所以开始之前我们先把开启认证给注释掉,集群搭建成功后在开启认证。配置如下:

#开启认证
#security:
#  keyFile: /data/key/mongo.key
#  authorization: enabled

然后把配置好的 mongo01 文件夹拷贝两份

cp -r mongo01 mongo02
cp -r mongo01 mongo03
Docker 搭建 MongoDB5.0 集群

5、启动 mongodb 容器实例

Linux 路径:

docker run ---name mongo01 -27017:27017 --privileged=true -~/config/mongodb/mongo01/data:/data/db -~/config/mongodb/mongo01/conf:/data/configdb -~/config/mongodb/mongo01/logs:/data/log/  -~/config/mongodb/mongo01/tmp:/tmp  mongo:5.0   -/data/configdb/mongod.conf 
docker run ---name mongo02 -27018:27017 --privileged=true -~/config/mongodb/mongo02/data:/data/db -~/config/mongodb/mongo02/conf:/data/configdb -~/config/mongodb/mongo02/logs:/data/log/  -~/config/mongodb/mongo02/tmp:/tmp  mongo:5.0   -/data/configdb/mongod.conf 
docker run ---name mongo03 -27019:27017 --privileged=true -~/config/mongodb/mongo03/data:/data/db -~/config/mongodb/mongo03/conf:/data/configdb -~/config/mongodb/mongo03/logs:/data/log/  -~/config/mongodb/mongo03/tmp:/tmp  mongo:5.0   -/data/configdb/mongod.conf 

如果为 Windows 系统把容器卷路径改为磁盘地址即可:

docker run ---name mongo01 -27017:27017 --privileged=true -v D:/mongo/mongo01/data:/data/db -v D:/mongo/mongo01/conf:/data/configdb -v D:/mongo/mongo01/logs:/data/log/  -v D:/mongo/mongo01/tmp:/tmp  mongo:5.0   -/data/configdb/mongod.conf 

启动成功后通过 docker ps 查看容器是否运行成功。

Docker 搭建 MongoDB5.0 集群

6、配置集群

随便进入一个容器节点进行集群配置。

docker exec -it mongo01 bash

进入容器后,登录 mongodb 命令行

mongo

执行配置副本集命令配置集群:

rs.initiate({_id: "rs",members: [{ _id: 0, host: "192.168.1.9:27017" },{ _id: 1, host: "192.168.1.9:27018" },{ _id: 2, host: "192.168.1.9:27019" }]})

_id: “rs” 副本集名要和配置文件中的一致。如果配置仲裁节点需要在改节点里面加上 arbiterOnly: true 属性 如:

{ _id: 2, host: "192.168.1.9:27019", arbiterOnly: true}

也可以指定其 priority( 优先级)。如果不指定,默认优先级为 1。如指定第一个节点优先级为 90:

{"_id":0,"host":"192.168.1.9:27017",priority:90}

执行上面 rs.initiate(config)命令后,集群就搭建成功了。系统会选择一个节点当主节点。

Docker 搭建 MongoDB5.0 集群

配置成功后,目前不需要账号密码就能够登录。下面我们需要开启安全认证以保证数据库的安全。

7、集群后开启安全认证

7.1 创建 root 权限用户

由于我们的副本集已经搭建成功了。我们可以看到有一个 PRIMAY 节点和两个 SECONDARY 节点,进入主节点容器创建用户信息。

切到 admin 库

use admin

创建用户,用户名 root,密码 1234qwer,权限 root,所属库 admin

db.createUser({user:"root",pwd:"1234qwer",roles:[{role:'root',db:'admin'}]})

执行上面命令后用户就创建成功了,我们先退出容器。

7.2 创建密钥文件

使用 openssl 生成 key 文件,由于上面已经提到了想要在副本集中开启认证,必须指定 keyFile 参数,所有节点使用相同的 key。所以我们需要使用 openssl 生成一个 mongo.key 文件,并把文件拷贝到容器内部。

首先确保 Linux 系统安装了 openssl,查看是否安装命令:

openssl version

如果没有输出软件包信息,执行下面命令安装 openssl

yum install openssl

安装成功后执行命令生成 mongo.key 文件。

openssl rand -base64 753 > mongo.key

执行成功后,会生成一个 mongo.key 文件。我们使用 docker cp 命令把文件拷贝到容器中。

docker cp ./mongo.key mongo01:/data/key/mongo.key

拷贝成功后,进入容器内部给文件授权。

docker exec -it mongo01 bash

进入/data/key 命令给文件授权。

chown 999 mongo.key #设置文件归属权
chmod 400 mongo.key #设置文件为只读

上面的授权命令必须要执行,不然容器会启动失败。一定要注意!!!

7.3 开启认证

上面的步骤操作成功后,接下来我们就可以把配置文件中注释掉的开启认证参数给打开了。
#开启认证
security:
  keyFile: /data/key/mongo.key
  authorization: enabled

keyFile 指定的路径为拷贝到 docker 容器内部文件存放的路径。

7.4 重启容器

把 mongo.key 文件也按照相同的方式拷贝到另外两个节点容器内。以上操作都成功后,就可以重新启动容器了。首先退出容器关闭所有容器副本集节点
docker stop mongo01
docker stop mongo02
docker stop mongo03

在启动容器

docker start mongo01 mongo02 mongo03

查看容器是否启动成功

docker ps

8、副本集相关命令

初始化副本集

rs.initiate(config)

查看状态

rs.status()

查看配置信息

rs.conf()

查看是否为主节点

rs.isMaster()

添加从节点

rs.add("192.168.1.9:27020" )

添加仲裁节点

rs.addArb("ip:27017")

删除节点

rs.remove("192.168.1.9:27020")

降级节点,主节点降级为从节点,并重新选举新的主节点

rs.stepDown(stepDownSecs, secondaryCatchUpPeriodSecs)

查看备份节点的复制信息

db.printSlaveReplicationInfo()

开启从节点为只读权限

rs.secondaryOk()

如果是 4.0 以下的版本,则是

rs.slaveOk()

每次宕机重连之后都需要执行方法,不然在从节点数据库中无法读取数据。

测试服务宕机

use admin;

db.shutdownServer();

9、可视化工具连接

我们可以使用 mongodb 可视化工具连接副本集,这里使用 Studio 3T 进行连接。

选择新建连接:

Docker 搭建 MongoDB5.0 集群

配置连接信息

Docker 搭建 MongoDB5.0 集群

指定连接类型、节点地址、副本集名称。输入账号密码:

Docker 搭建 MongoDB5.0 集群

点击连接

Docker 搭建 MongoDB5.0 集群

通过以上步骤 MongoDB 高可用集群就搭建成功了,接下来我们就可以愉快的进行开发工作了。

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
图片正在生成中,请稍后...