环境要求
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