在实际开发中MySQL集群搭建利用percona-xtradb-cluster
,有了docker
后会方便很多,SpringBoot项目部署则只需要JDK环境即可,打包运行jar
,就可以启动服务了
一、MySQL集群
percona-xtradb-cluster
是为了mysql集群而推出的解决方案,实现mysql集群的强一致性
1.PXC容器创建
1.1 拉取镜像
使用docker拉取镜像:
-bash-4.2# docker pull percona/percona-xtradb-cluster:5.7.21
1.2 创建容器
mysql需要数据卷,先创建一个数据卷,当然也可以指定绝对路径:
-bash-4.2# docker volume create --name mysql
mysql
创建并启动容器,这边指定集群名为PXC
,网络使用host
模式:
-bash-4.2# docker run -d -v mysql:/var/lib/mysql \
-e CLUSTER_NAME=PXC \
-e MYSQL_ROOT_PASSWORD=123456 -e EXTRABACKUP_PASSWROD=123456 \
--privileged --name=node1 --net=host percona/percona-xtradb-cluster:5.7.21
1.3 创建集群其他节点容器
集群名相同,并使用CLUSTER_JOIN
指定加入上面创建的集群节点的IP:
-bash-4.2# docker volume create --name mysql
-bash-4.2# docker run -d -v mysql:/var/lib/mysql \
-e CLUSTER_NAME=PXC -e CLUSTER_JOIN=192.168.42.4 \
-e MYSQL_ROOT_PASSWORD=123456 -e EXTRABACKUP_PASSWROD=123456 \
--privileged --name=node2 --net=hos percona/percona-xtradb-cluster:5.7.21
-bash-4.2# docker volume create --name mysql
-bash-4.2# docker run -d -v mysql:/var/lib/mysql \
-e CLUSTER_NAME=PXC -e CLUSTER_JOIN=192.168.42.4 \
-e MYSQL_ROOT_PASSWORD=123456 -e EXTRABACKUP_PASSWROD=123456 \
--privileged --name=node3 --net=host percona/percona-xtradb-cluster:5.7.21
完成后就可以自己使用数据库测试下了
尝试创建一个数据库,刷新后发现其他的节点都同步了:
二、MySQL集群负载均衡
上面只是搭建了MySQL集群,想要对外提供统一的访问,则需要负载均衡的中间件:haprox
1.haprox镜像拉取
-bash-4.2# docker pull haproxy
2.配置文件
-bash-4.2# mkdir /tmp/haproxy
-bash-4.2# vi /tmp/haproxy/haproxy.cfg
内容为:
global
#工作目录,这边要和创建容器指定的目录对应
# chroot /usr/local/etc/haproxy
#日志文件
log 127.0.0.1 local5 info
#守护进程运行
daemon
defaults
log global
mode http
#日志格式
option httplog
#日志中不记录负载均衡的心跳检测记录
option dontlognull
#连接超时(毫秒)
timeout connect 5000
#客户端超时(毫秒)
timeout client 50000
#服务器超时(毫秒)
timeout server 50000
#监控界面
listen admin_stats
#监控界面的访问的IP和端口
bind 0.0.0.0:8888
#访问协议
mode http
#URI相对地址
stats uri /dbs_monitor
#统计报告格式
stats realm Global\ statistics
#登陆帐户信息
stats auth admin:admin
#数据库负载均衡
listen proxy-mysql
#访问的IP和端口,haproxy开发的端口为3306
#假如有人访问haproxy的3306端口,则将请求转发给下面的数据库实例
bind 0.0.0.0:3306
#网络协议
mode tcp
#负载均衡算法(轮询算法)
#轮询算法:roundrobin
#权重算法:static-rr
#最少连接算法:leastconn
#请求源IP算法:source
balance roundrobin
#日志格式
option tcplog
#在MySQL中创建一个没有权限的haproxy用户,密码为空。
#Haproxy使用这个账户对MySQL数据库心跳检测
option mysql-check user haproxy
server MySQL_1 192.168.42.4:3306 check weight 1 maxconn 2000
server MySQL_2 192.168.42.230:3306 check weight 1 maxconn 2000
server MySQL_3 192.168.42.249:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
3.创建容器
-bash-4.2# docker run -d -p 8888:8888 -p 3307:3306 -v /tmp/haproxy:/usr/local/etc/haproxy \
--name haproxy01 --privileged haproxy
4.MySQL新建账号
mysql中执行下面的sql,该账号用于心跳检测:
CREATE USER 'haproxy'@'%' IDENTIFIED BY '';
5.访问仪表盘
访问:http://IP:8888/dbs_monitor
账号密码均为:admin
根据容器创建参数配置,我们对外使用3307
端口,其他服务想要访问数据库,就可以直接使用该端口,并带有负载均衡效果:
三、SpringBoot项目部署
MySQL上创建数据库表如下:
新建一个SpringBoot项目,使用MyBatis针对该表进行新增操作
1.yml配置
yml配置为:
server:
port: 8001
spring:
datasource:
url: jdbc:mysql://192.168.42.4:3307/haproxy_test?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
mybatis:
mapper-locations: classpath:mybatis/*.xml #指定映射文件路径
type-aliases-package: com.aruba.bean
2.打包传入服务器
打包后,将jar
传入服务器:
3.基于JDK镜像制作镜像
创建Dockerfile:
-bash-4.2# vi Dockerfile
内容为:
FROM openjdk:8
LABEL name="springboot-mybatis" version="1.0" author="aruba"
COPY DockerHaproxy-0.0.1-SNAPSHOT.jar springboot-mybatis.jar
CMD ["java","-jar","springboot-mybatis.jar"]
构建镜像:
-bash-4.2# docker build -t sbm-image .
创建并启动容器:
-bash-4.2# docker run -d -p 8081:8001 sbm-image
cc8755dac172f3ca351df1f628cd008124734b7f1b5296e47e4f6c4328e203da
浏览器访问接口:
数据也成功加入数据库中了: