在實(shí)際開發(fā)中MySQL集群搭建利用percona-xtradb-cluster
,有了docker
后會(huì)方便很多,SpringBoot項(xiàng)目部署則只需要JDK環(huán)境即可,打包運(yùn)行jar
,就可以啟動(dòng)服務(wù)了
一、MySQL集群
percona-xtradb-cluster
是為了mysql集群而推出的解決方案,實(shí)現(xiàn)mysql集群的強(qiáng)一致性
1.PXC容器創(chuàng)建
1.1 拉取鏡像
使用docker拉取鏡像:
-bash-4.2# docker pull percona/percona-xtradb-cluster:5.7.21
1.2 創(chuàng)建容器
mysql需要數(shù)據(jù)卷,先創(chuàng)建一個(gè)數(shù)據(jù)卷,當(dāng)然也可以指定絕對(duì)路徑:
-bash-4.2# docker volume create --name mysql
mysql
創(chuàng)建并啟動(dòng)容器,這邊指定集群名為PXC
,網(wǎng)絡(luò)使用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 創(chuàng)建集群其他節(jié)點(diǎn)容器
集群名相同,并使用CLUSTER_JOIN
指定加入上面創(chuàng)建的集群節(jié)點(diǎn)的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
完成后就可以自己使用數(shù)據(jù)庫(kù)測(cè)試下了
嘗試創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),刷新后發(fā)現(xiàn)其他的節(jié)點(diǎn)都同步了:
二、MySQL集群負(fù)載均衡
上面只是搭建了MySQL集群,想要對(duì)外提供統(tǒng)一的訪問,則需要負(fù)載均衡的中間件:haprox
1.haprox鏡像拉取
-bash-4.2# docker pull haproxy
2.配置文件
-bash-4.2# mkdir /tmp/haproxy
-bash-4.2# vi /tmp/haproxy/haproxy.cfg
內(nèi)容為:
global
#工作目錄,這邊要和創(chuàng)建容器指定的目錄對(duì)應(yīng)
# chroot /usr/local/etc/haproxy
#日志文件
log 127.0.0.1 local5 info
#守護(hù)進(jìn)程運(yùn)行
daemon
defaults
log global
mode http
#日志格式
option httplog
#日志中不記錄負(fù)載均衡的心跳檢測(cè)記錄
option dontlognull
#連接超時(shí)(毫秒)
timeout connect 5000
#客戶端超時(shí)(毫秒)
timeout client 50000
#服務(wù)器超時(shí)(毫秒)
timeout server 50000
#監(jiān)控界面
listen admin_stats
#監(jiān)控界面的訪問的IP和端口
bind 0.0.0.0:8888
#訪問協(xié)議
mode http
#URI相對(duì)地址
stats uri /dbs_monitor
#統(tǒng)計(jì)報(bào)告格式
stats realm Global\ statistics
#登陸帳戶信息
stats auth admin:admin
#數(shù)據(jù)庫(kù)負(fù)載均衡
listen proxy-mysql
#訪問的IP和端口,haproxy開發(fā)的端口為3306
#假如有人訪問haproxy的3306端口,則將請(qǐng)求轉(zhuǎn)發(fā)給下面的數(shù)據(jù)庫(kù)實(shí)例
bind 0.0.0.0:3306
#網(wǎng)絡(luò)協(xié)議
mode tcp
#負(fù)載均衡算法(輪詢算法)
#輪詢算法:roundrobin
#權(quán)重算法:static-rr
#最少連接算法:leastconn
#請(qǐng)求源IP算法:source
balance roundrobin
#日志格式
option tcplog
#在MySQL中創(chuàng)建一個(gè)沒有權(quán)限的haproxy用戶,密碼為空。
#Haproxy使用這個(gè)賬戶對(duì)MySQL數(shù)據(jù)庫(kù)心跳檢測(cè)
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檢測(cè)死鏈
option tcpka
3.創(chuàng)建容器
-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新建賬號(hào)
mysql中執(zhí)行下面的sql,該賬號(hào)用于心跳檢測(cè):
CREATE USER 'haproxy'@'%' IDENTIFIED BY '';
5.訪問儀表盤
訪問:http://IP:8888/dbs_monitor
賬號(hào)密碼均為:admin
根據(jù)容器創(chuàng)建參數(shù)配置,我們對(duì)外使用3307
端口,其他服務(wù)想要訪問數(shù)據(jù)庫(kù),就可以直接使用該端口,并帶有負(fù)載均衡效果:
三、SpringBoot項(xiàng)目部署
MySQL上創(chuàng)建數(shù)據(jù)庫(kù)表如下:
新建一個(gè)SpringBoot項(xiàng)目,使用MyBatis針對(duì)該表進(jìn)行新增操作
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.打包傳入服務(wù)器
打包后,將jar
傳入服務(wù)器:
3.基于JDK鏡像制作鏡像
創(chuàng)建Dockerfile:
-bash-4.2# vi Dockerfile
內(nèi)容為:
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"]
構(gòu)建鏡像:
-bash-4.2# docker build -t sbm-image .
創(chuàng)建并啟動(dòng)容器:
-bash-4.2# docker run -d -p 8081:8001 sbm-image
cc8755dac172f3ca351df1f628cd008124734b7f1b5296e47e4f6c4328e203da
瀏覽器訪問接口:
數(shù)據(jù)也成功加入數(shù)據(jù)庫(kù)中了: