环境要求
CentOS7
安装前必读
Linux 内核:官方建议 3.10 以上,3.8以上貌似也可。
注意:本文的命令使用的是 root 用户登录执行,不是 root 的话所有命令前面要加 sudo
1.查看当前的内核版本
uname -r
2.使用 root 权限更新 yum 包(生产环境中此步操作需慎重,看自己情况,学习的话随便搞)
yum -y update
这个命令不是必须执行的,看个人情况,后面出现不兼容的情况的话就必须update了
注意 yum -y update:升级所有包同时也升级软件和系统内核; yum -y upgrade:只升级所有包,不升级软件和系统内核
3.卸载旧版本(如果之前没有安装过的话 跳过)
yum remove docker docker-common docker-selinux docker-engine
安装docker
1.安装需要的软件包, yum-util 提供yum-config-manager功能,另两个是devicemapper驱动依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
2.设置 yum 源
设置一个yum源,下面两个都可用
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo(中央仓库) yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库)
3.选择docker版本并安装
(1)查看可用版本有哪些
yum list docker-ce --showduplicates | sort -r
(2)选择一个版本并安装:yum install docker-ce-版本号
yum -y install docker-ce-18.03.1.ce
到这里说明安装成功
4.启动 Docker 并设置开机自启
systemctl start docker systemctl enable docker
通过docker拉取MongoDB镜像
docker pull mongo:latest
配置桥接网络
使用 Docker 创建一个 network bridge
docker network create test-net
启动三个 docker 容器
创建三个 mongdb 服务,一主俩从(采用 docker-compose 更加便捷,这里不做介绍)
docker run --rm --network test-net --name mongo1 -d -v /data/mongo1/db:/data/db -p 27021:27017 mongo:latest --replSet replSet1 docker run --rm --network test-net --name mongo2 -d -v /data/mongo2/db:/data/db -p 27022:27017 mongo:latest --replSet replSet1 docker run --rm --network test-net --name mongo3 -d -v /data/mongo3/db:/data/db -p 27023:27017 mongo:latest --replSet replSet1
说明:
-v 参数:将 docker 容器内部 /data/db 目录挂载在宿主机 /data/mongo4/db 目录,防止容器重启时,数据丢失
--network: 将 docker 容器划入 test-net 网桥;
--replSet: 命名副本集名称为 replSet1;
在主节点添加从节点
1、进入 mongo01 客户端
docker exec -it mongo01 mongo
2、启动一个副本集(即采用 mongo01 作为主节点)
rs.initiate()
3、为副本集添加新成员 mongo02
rs.add('mongo02:27017')
注意:
由于本篇采用的是 Docker 启动的 mongondb 服务, 在这里需要了解 Docker 容器之间通讯模式,前文也提醒大家了,因为目前我们启动的三个 mongo 服务是在同一个 bridge (test-net), 这个 bridge 是我们自定义的。换句话说,如果前文我们启动容器不指定 --network test-net,采用 Docker 默认的 bridge, 那么使用 rs.add('mongo2:27017') 添加新成员,响应就会超时。
4、为副本集添加新成员 mongo03
rs.add('mongo03:27017')
5、查看副本集状态
rs.status()
6、验证操作
在主节点 mongo01 添加一条数据:
replSet1:PRIMARY> db.foods.insert({"name":"西红柿"}) WriteResult({ "nInserted" : 1 })
在从节点 mongo02 mongo03 查看数据是否同步:
退出mongo01
exit
进入mongo02查询数据,发现已经自动同步过来啦
docker exec -it mongo02 mongo
replSet1:SECONDARY> rs.secondaryOk() // 先允许读取操作在从节点执行 replSet1:SECONDARY> db.foods.find() { "_id" : ObjectId("605ca97350221c02825ceaa7"), "name" : "西红柿" }
主节点配置主机以及端口号
经过上面的配置发现在java代码中调试的话,还是会有一些问题的,它会出现这种错误:
Canonical address IP does not match server address...
翻译过来就是服务器不匹配,服务端在配置的时候配置的是主机名+端口号,虽然在yml中配置的是ip+端口号,但是在spring查询的时候是根据主机名字(mongo01,mongo02,mongo03)来查询和配置的,这就有些操蛋啦!!!别急!慢慢来
重新进入主节点
docker exec -it mongo01 mongo
执行如下操作
cfg = rs.conf() cfg.members[0].host = "119.91.94.36:27021" cfg.members[1].host = "119.91.94.36:27022" cfg.members[2].host = "119.91.94.36:27023" rs.reconfig(cfg) rs.status()
本地代码重新启动,查询数据发现可以在从节点数据库查询数据啦
Navicat测试连接
java端yml配置以及代码实现
# 应用名称,集群搭建 spring: application: name: mongodbStudy data: mongodb: uri: mongodb://119.91.94.36:27021,119.91.94.36:27022,119.91.94.36:27023/user?slaveOk=true&replicaSet=replSet1&readPreference=secondaryPreferred&connectTimeoutMS=300000 #web端口号 server: port: 8080
源码:https://github.com/zhrgithub/springbootStudy
参考文献:
https://cloud.tencent.com/developer/article/1701451
https://juejin.cn/post/6953636274389385246#comment
https://www.cnblogs.com/vipsoft/p/14750118.html
https://blog.csdn.net/qq_34497272/article/details/106038830
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)