目录
一.搭建MySQL高可用集群(pxc+HA-Proxy)
参考链接:https://hub.docker.com/r/percona/percona-xtradb-cluster/
通过pxc(MySQL高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了数据复制延迟问题,基本上可以达到实时同步)搭建
(1) 拉取pxc镜像
docker pull percona/percona-xtradb-cluster:5.7.21
(2) 给pxc镜像重命名(打tag) 并删除原来的镜像
docker tag percona/percona-xtradb-cluster:5.7.21 pxc
docker rmi percona/percona-xtradb-cluster:5.7.21
(3) 创建自定义的bridge网络 用于MySQL集群
删除网络:docker network rm XXX
docker network create --subnet=172.18.0.0/24 pxc-net
(4) 创建volume 用于持久化数据
docker volume create --name pxc-volume1
(5)创建单个PXC容器
命令详解:
-e MYSQL_ROOT_PASSWORD=123456 指定数据库密码
-e CLUSTER_NAME=PXC 指定集群名称
-e XTRABACKUP_PASSWORD=123456 指定集群之间数据同步的密码
--net=pxc-net 指定网段
--ip=172.18.0.2 指定ip
[root@10 ~]# docker run -d -p 3301:3306 -v pxc-volume1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 --privileged --name=node1 --net=pxc-net --ip 172.18.0.2 pxc
(6) 搭建PXC集群
通过-e CLUSTER_JOIN将该数据库加入到某个节点上组成集群
docker run -d -p 3302:3306 -v pxc-volume2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node2 --net=pxc-net --ip 172.18.0.3 pxc
docker run -d -p 3303:3306 -v pxc-volume3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node3 --net=pxc-net --ip 172.18.0.4 pxc
在Navicat for MySQL里可以看到三个集群的数据库
数据库的负载均衡
(1)拉取haproxy镜像,并创建haproxy配置文件(/usr/local/docker/haproxy/haproxy.cfg)
docker pull haproxy
cd /usr/local/ & mkdir -p docker/haproxy/
cd docker/haproxy
vi haproxy.cfg
global
#工作目录 要和创建容器指定的目录对应
chroot /usr/local/etc/haproxy
#日志文件,等级info
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:123456
#数据库负载均衡
listen proxy-mysql
#访问的IP和端口
#假如有人访问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 172.18.0.2:3306 check weight 1 maxconn 2000
server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000
server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
(2)创建haproxy容器
docker run -it -d -p 8888:8888 -p 3306:3306 -v /usr/local/docker/haproxy:/usr/local/etc/haproxy --name haproxy01 --privileged --net=pxc-net haproxy
(3) 根据haproxy配置文件启动haproxy
docker exec -it haproxy01 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
(4) 在mysql数据库上创建用户,用于心跳检测
CREATE USER 'haproxy'@'%' IDENTIFIED BY '';
##如果创建失败,可以先输入一下命令: 删除用户并清空权限后再次创建
drop user 'haproxy'@'%';
flush privileges;
数据库连接成功:
http://192.168.56.10:8888/dbs_monitor
二.Nginx+Spring Boot+MySQL
(1)定义自己的Bridge网络
docker network create --subnet=172.16.0.0/24 boot-net
(2)创建mysql容器
docker run -d --name cpp-mysql -v v1:/var/lib/mysql -p 3304:3306 -e MYSQL_ROOT_PASSWORD=123456 --net=boot-net
--ip 172.16.0.8 mysql
(3)mysql创建数据库,表等
create schema db_springboot collate utf8mb4_0900_ai_ci;
use db_springboot ;
create table user (
id int not null primary key,
username varchar(50) not null,
password varchar(50) not null,
number varchar(100) not null
);
insert into user values (1,"chenpp","123456","1101");
insert into user values (2,"tom","123456","1102");
(4) 根据dockerfile将springboot项目打包成镜像
FROM openjdk:8-jre-alpine
MAINTAINER chenpp
LABEL name="springboot" version="1.0" author="chenpp"
COPY springboot-mybatis-0.0.1-SNAPSHOT.jar springboot.jar
CMD ["java","-jar","springboot.jar"]
#build命令生成镜像文件
docker build -t springboot-image
(5) 创建容器
docker run -d --name boot01 -p 8081:8080 --net=boot-net --ip 172.16.0.10 springboot-image
因为boot01和cpp-mysql在同一个bridge的网段上,相互之间可以通过ip和容器名ping通,故springboot项目中的mysql配置文件的ip地址可以改成对应的容器名cpp-mysql
docker run -d --name boot02 -p 8082:8080 --net=boot-net --ip 172.16.0.11 springboot-image
docker run -d --name boot03 -p 8083:8080 --net=boot-net --ip 172.16.0.12 springboot-image
(6)配置nginx.conf(宿主机的/tmp/nginx/nginx.conf)
worker_processes 1;
events{
worker_connections 1024;
}
http{
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server{
listen 80;
location /{
proxy_pass http://balance;
}
}
upstream balance{
server 172.16.0.10:8080;
server 172.16.0.11:8080;
server 172.16.0.12:8080;
}
}
(7)创建并启动nginx容器
通过bind mount将宿主机上的nginx.conf挂载到容器内
docker run -d --name cpp-nginx -p 80:80 -v /tmp/nginx/nginx.conf:/etc/nginx/nginx.conf --network=boot-net
--ip 172.16.0.6 nginx
通过浏览器可以正常请求到数据库数据
在centos上请求getIp,可以看到路由到不同的container
[root@10 ~]# curl localhost:80/user/listall
[{"id":1,"username":"chenpp","password":"123456","number":"1101"},{"id":2,"username":"tom","password":"123456","number":"1102"}][root@10 ~]# ^C
[root@10 ~]# curl localhost:80/user/getIp
ip:172.16.0.12
[root@10 ~]#
[root@10 ~]# curl localhost:80/user/getIp
ip:172.16.0.10
[root@10 ~]# curl localhost:80/user/getIp
ip:172.16.0.11
[root@10 ~]# curl localhost:80/user/getIp
ip:172.16.0.12