Loading... 在分布式系统中,MongoDB 的副本集(Replica Set)提供了数据高可用性和故障自动切换能力。本文将详细介绍如何使用 Docker 搭建一个三节点的 MongoDB 副本集,包括分离数据、日志和配置文件,确保环境的灵活性和可维护性。 --- ## 1. 环境准备 ### 1.1 安装 Docker 确保系统已经安装了 Docker。如果未安装,可以参考 [Docker 官方文档](https://docs.docker.com/get-docker/)。 ### 1.2 MongoDB 镜像 从 Docker Hub 拉取 MongoDB 的官方镜像。建议选择较新的版本(例如 `7.0`)以获得最新功能和修复。 ```bash docker pull mongo:7.0 ``` --- ## 2. 文件结构规划 为方便管理和持久化数据,建议将 MongoDB 的数据、日志、配置文件分开管理。以下是推荐的目录结构: ```plaintext /docker └── mongo ├── master │ ├── data # 主节点的数据目录 │ ├── conf # 主节点的配置目录 │ └── log # 主节点的日志目录 ├── slave1 │ ├── data # 从节点1的数据目录 │ ├── conf # 从节点1的配置目录 │ └── log # 从节点1的日志目录 └── slave2 ├── data # 从节点2的数据目录 ├── conf # 从节点2的配置目录 └── log # 从节点2的日志目录 ``` 创建上述目录: ```bash mkdir -p /docker/mongo/{master,slave1,slave2}/{data,conf,log} ``` 创建日志文件: ```bash touch /docker/mongo/master/log/mongod.log touch /docker/mongo/slave1/log/mongod.log touch /docker/mongo/slave2/log/mongod.log ``` 将 MongoDB 目录设置权限: ```bash chmod -R 777 /docker/mongo ``` --- ## 3. 配置文件准备 为每个节点编写配置文件。在 `/docker/mongo/{master,slave1,slave2}/conf` 目录下创建 `mongod.conf` 文件,示例如下: ### 主节点 `master/conf/mongod.conf` ```yaml storage: dbPath: /data/db systemLog: destination: file path: /data/log/mongod.log logAppend: true net: bindIp: 0.0.0.0 port: 27017 replication: replSetName: rs ``` 从节点配置相同,但 `port` 可保持默认值 27017。 快速复制配置文件: ```bash cp /docker/mongo/master/conf/mongod.conf /docker/mongo/slave1/conf/mongod.conf cp /docker/mongo/master/conf/mongod.conf /docker/mongo/slave2/conf/mongod.conf ``` --- ## 4. 创建 Docker 网络(可以忽略) 为了让容器之间可以直接通信,创建一个自定义网络。 ```bash docker network create --driver bridge mynet ``` --- ## 5. 启动 MongoDB 容器 分别启动主节点和两个从节点容器,挂载数据、配置和日志目录。 ### 启动主节点 ```bash docker run -itd --name mongodb-master \ --network mynet \ -p 10001:27017 \ -v /docker/mongo/master/data:/data/db \ -v /docker/mongo/master/conf:/data/configdb \ -v /docker/mongo/master/log:/data/log \ mongo:7.0 --config /data/configdb/mongod.conf ``` ### 启动从节点1 ```bash docker run -itd --name mongodb-slave1 \ --network mynet \ -p 10002:27017 \ -v /docker/mongo/slave1/data:/data/db \ -v /docker/mongo/slave1/conf:/data/configdb \ -v /docker/mongo/slave1/log:/data/log \ mongo:7.0 --config /data/configdb/mongod.conf ``` ### 启动从节点2 ```bash docker run -itd --name mongodb-slave2 \ --network mynet \ -p 10003:27017 \ -v /docker/mongo/slave2/data:/data/db \ -v /docker/mongo/slave2/conf:/data/configdb \ -v /docker/mongo/slave2/log:/data/log \ mongo:7.0 --config /data/configdb/mongod.conf ``` --- ## 6. 初始化副本集 进入主节点容器,启动 `mongosh`,并初始化副本集。 ```bash # 进入主节点容器 docker exec -it mongodb-master mongosh # 初始化副本集 rs.initiate({ _id: "rs", members: [ { _id: 0, host: "宿主机IP:10001" }, { _id: 1, host: "宿主机IP:10002" }, { _id: 2, host: "宿主机IP:10003" } ] }) ``` --- ## 7. 创建用户和数据库 ### 登录到主节点 ```bash docker exec -it mongodb-master mongosh ``` ### 创建管理员用户(可选) ```javascript use admin db.createUser({ user: "admin", pwd: "admin123", roles: [{ role: "root", db: "admin" }] }) ``` ### 创建应用数据库和用户 切换到目标数据库并创建用户: ```javascript use mydatabase db.createUser({ user: "appuser", pwd: "appuser123", roles: [{ role: "readWrite", db: "mydatabase" }] }) ``` --- ## 8. Spring Boot 配置 在 Spring Boot 项目中,添加以下内容到 `application.yml` 文件: ```yaml spring: data: mongodb: uri: mongodb://appuser:appuser123@mongodb-master:27017,mongodb-slave1:27017,mongodb-slave2:27017/mydatabase?replicaSet=rs ``` ### 配置说明: 1. `appuser` 和 `appuser123` 为数据库用户名和密码。 2. `mydatabase` 为目标数据库。 3. `replicaSet=rs` 指定副本集名称。 --- ## 9. 验证配置 ### 连接测试 进入 MongoDB 容器并验证用户权限: ```bash mongo --host mongodb-master --port 27017 -u "appuser" -p "appuser123" --authenticationDatabase "mydatabase" ``` 执行读写测试: ```javascript use mydatabase db.testCollection.insert({ key: "value" }) db.testCollection.find() ``` 通过这些步骤,您已经成功搭建并配置了 MongoDB 副本集,具备了高可用性和权限管理能力,能够为 Spring Boot 应用程序提供可靠的支持。 最后修改:2025 年 01 月 13 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏