环境要求

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

关注我的公众号SpaceObj 领取idea系列激活码

posted on 2023-05-10 18:05  张伯灵  阅读(173)  评论(0编辑  收藏  举报