1、mongodb 集群
1.1 主从复制存在的问题
-
• 单点故障:Master 节点故障时,没有自动故障转移机制。
-
• 数据量有限:Slave 节点数据通常不可写,限制了数据总量的增长。
-
• 延迟和同步问题:Slave 节点可能会落后于 Master,导致数据延迟。
-
• 资源利用率低:需要额外资源来运行 Slave 节点。
1.2 副本集的优点
-
• 自动故障转移。
-
• 读写分离,能提供更好的读扩展能力。
-
• 副本集成员可配置为 arbiter(仲裁),提供投票决定谁是主节点。
1.3 分片集群
-
• 用于跨多个服务器分布数据的方法,用于支持非常大的数据集和高吞吐量的操作
2、副本集节点选择
副本集的最小推荐配置是三个节点:
-
• 一个主节点和两个从节点
-
• 一个主节点、一个从节点和仲裁节点
关于仲裁者说明:
3、拉取 mongodb 镜像
docker pull mongo:5.0

4、创建 mongodb 文件夹
首先在宿主机里面创建 mongodb 的存储数据文件夹
mkdir mongo01 && cd mongo01
进入 mongo01 创建 conf、data、logs、tmp 文件夹
mkdir conf data logs tmp

进入 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

5、启动 mongodb 容器实例
Linux 路径:
docker run -d --name mongo01 -p 27017:27017 --privileged=true -v ~/config/mongodb/mongo01/data:/data/db -v ~/config/mongodb/mongo01/conf:/data/configdb -v ~/config/mongodb/mongo01/logs:/data/log/ -v ~/config/mongodb/mongo01/tmp:/tmp mongo:5.0 -f /data/configdb/mongod.conf
docker run -d --name mongo02 -p 27018:27017 --privileged=true -v ~/config/mongodb/mongo02/data:/data/db -v ~/config/mongodb/mongo02/conf:/data/configdb -v ~/config/mongodb/mongo02/logs:/data/log/ -v ~/config/mongodb/mongo02/tmp:/tmp mongo:5.0 -f /data/configdb/mongod.conf
docker run -d --name mongo03 -p 27019:27017 --privileged=true -v ~/config/mongodb/mongo03/data:/data/db -v ~/config/mongodb/mongo03/conf:/data/configdb -v ~/config/mongodb/mongo03/logs:/data/log/ -v ~/config/mongodb/mongo03/tmp:/tmp mongo:5.0 -f /data/configdb/mongod.conf
如果为 Windows 系统把容器卷路径改为磁盘地址即可:
docker run -d --name mongo01 -p 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 -f /data/configdb/mongod.conf
启动成功后通过 docker ps
查看容器是否运行成功。

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)命令后,集群就搭建成功了。系统会选择一个节点当主节点。

配置成功后,目前不需要账号密码就能够登录。下面我们需要开启安全认证以保证数据库的安全。
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 重启容器
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 进行连接。
选择新建连接:

配置连接信息

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

点击连接

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