栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot+docker+MongoDB集群+动态扩容+高可用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot+docker+MongoDB集群+动态扩容+高可用

环境要求

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/852244.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号