本文使用docker-compose + shell 实现 MySQL集群负载均衡 自动化部署
实现效果: 执行 sh install.sh 可以部署一个haproxy节点分发器+5个PXC mysql数据库节点,实现数据库负载均衡
总流程
(1)启动 pxc 容器集群
(2)启动 haproxy 容器
(3)向 pxc容器中添加 haproxy用户
总入口:/home/2.DockerProjs/2.haproxy+pxc/install.sh
目录说明:
config # 放置配置文件
docker-compose.yml # docker-compose 的yml文件
install_scripts # 放置启动相关脚本
install.sh # 总的启动脚本
1.编写启动脚本
1.1入口脚本install.sh
#!/bin/bash
# 1.清理现有容器
echo "\n******* 1.clear all containers start***************\n"
sh ./install_scripts/clear_all.sh
echo "\n******* 1.clear all containers finished***************\n"
# 2.docker-compose 全量部署
echo "\n******* 2.docker-compose start***************\n"
docker-compose up -d
echo "\n******* 2.docker-compose finished***************\n"
# 3.进入pxc节点创建haproxy用户(docker exec container_name 命令 可以在容器外执行命令)
echo "\n******* 3.add user haproxy to pxc start***************\n"
docker cp ./install_scripts/add_user_haproxy_to_pxc.sh node2:/home
docker exec node2 sh /home/add_user_haproxy_to_pxc.sh
echo "\n******* 3.add user haproxy to pxc finished***************\n"
1.2 清理现有容器脚本:clear_all.sh
cd /home/2.DockerProjs/2.haproxy+pxc/install_scripts
vi clear_all.sh
#!/bin/bash
echo 'clear all containers start'
docker rm -f node1 node2 node3 node4 node5 h1
docker volume rm v1 v2 v3 v4 v5
docker network rm net1
echo 'clear all containers over'
1.3 向 pxc容器中添加 haproxy用户脚本:add_user_haproxy_to_pxc.sh
cd /home/2.DockerProjs/2.haproxy+pxc/install_scripts
vi add_user_haproxy_to_pxc.sh
#!/bin/bash
echo "start create user haproxy ...please wait 60s"
sleep 60
mysql -u root -pabc123456 <<EOF
CREATE USER "haproxy"@"%" IDENTIFIED BY "";
EOF
while [ $? -ne 0 ]; do
echo "create user haproxy failed ...please wait"
sleep 5
mysql -u root -pabc123456 <<EOF
CREATE USER "haproxy"@"%" IDENTIFIED BY "";
EOF
done
echo "create user haproxy success!"
exit
2.编写配置文件
进入路径: cd /home/2.DockerProjs/2.haproxy+pxc
(1)haproxy.cfg
cd /home/2.DockerProjs/2.haproxy+pxc/config/haproxy1
vi haproxy.cfg
global
#工作目录
chroot /usr/local/etc/haproxy
#日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级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
#统计报告格式
stats realm Global\ statistics
#登陆帐户信息
stats auth admin:abc123456
#数据库负载均衡
listen proxy-mysql
#访问的IP和端口
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
# 配置负载均衡的数据库节点: 自定义节点名字,容器ip,容器端口,心跳检测,权重为1,最大连接数2000
server MySQL_1 172.20.0.2:3306 check weight 1 maxconn 2000
server MySQL_2 172.20.0.3:3306 check weight 1 maxconn 2000
server MySQL_3 172.20.0.4:3306 check weight 1 maxconn 2000
server MySQL_4 172.20.0.5:3306 check weight 1 maxconn 2000
server MySQL_5 172.20.0.6:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
3.编写docker-compose.yml
cd /home/2.DockerProjs/2.haproxy+pxc
version: '3.5'
services:
pxc1:
image: percona/percona-xtradb-cluster:5.7.21 # 使用的镜像
container_name: node1
ports: # 表示宿主机33061映射到容器3306端口
- 33061:3306/tcp
volumes: # 表示宿主机v1 映射到容器目录
- v1:/var/lib/mysql
networks:
net1: # 使用内部网段net1
ipv4_address: 172.20.0.2 # 内部网段的ip地址
environment:
- MYSQL_ROOT_PASSWORD=abc123456 # MySQL root用户的密码
- CLUSTER_NAME=PXC # 集群名
- XTRABACKUP_PASSWORD=abc123456 # 数据库同步密码
pxc2:
image: percona/percona-xtradb-cluster:5.7.21 # 使用的镜像
container_name: node2
ports:
- 33062:3306/tcp
volumes:
- v2:/var/lib/mysql
networks:
net1:
ipv4_address: 172.20.0.3
environment:
- MYSQL_ROOT_PASSWORD=abc123456 # MySQL root用户的密码
- CLUSTER_NAME=PXC # 集群名
- XTRABACKUP_PASSWORD=abc123456 # 数据库同步密码
- CLUSTER_JOIN=node1 # 加入node1集群
depends_on:
- pxc1
pxc3:
image: percona/percona-xtradb-cluster:5.7.21
container_name: node3
ports:
- 33063:3306/tcp
volumes:
- v3:/var/lib/mysql
networks:
net1:
ipv4_address: 172.20.0.4
environment:
- MYSQL_ROOT_PASSWORD=abc123456 # MySQL root用户的密码
- CLUSTER_NAME=PXC # 集群名
- XTRABACKUP_PASSWORD=abc123456 # 数据库同步密码
- CLUSTER_JOIN=node1 # 加入node1集群
depends_on:
- pxc1
pxc4:
image: percona/percona-xtradb-cluster:5.7.21
container_name: node4
ports:
- 33064:3306/tcp
volumes:
- v4:/var/lib/mysql
networks:
net1:
ipv4_address: 172.20.0.5
environment:
- MYSQL_ROOT_PASSWORD=abc123456 # MySQL root用户的密码
- CLUSTER_NAME=PXC # 集群名
- XTRABACKUP_PASSWORD=abc123456 # 数据库同步密码
- CLUSTER_JOIN=node1 # 加入node1集群
depends_on:
- pxc1
pxc5:
image: percona/percona-xtradb-cluster:5.7.21
container_name: node5
ports:
- 33065:3306/tcp
volumes:
- v5:/var/lib/mysql
networks:
net1:
ipv4_address: 172.20.0.6
environment:
- MYSQL_ROOT_PASSWORD=abc123456 # MySQL root用户的密码
- CLUSTER_NAME=PXC # 集群名
- XTRABACKUP_PASSWORD=abc123456 # 数据库同步密码
- CLUSTER_JOIN=node1 # 加入node1集群
depends_on:
- pxc1
haproxy1: # haproxy1节点分发器
image: haproxy:latest # 镜像名
container_name: h1 # 容器名
ports:
- 4001:8888 # 宿主机4001端口映射 Haproxy的监控画面端口
- 4002:3306 # 宿主机4002端口映射 Haproxy的数据库访问端口
volumes:
- ./config/haproxy1:/usr/local/etc/haproxy # haproxy的配置文件路径,存放haproxy.cfg
networks:
net1:
ipv4_address: 172.20.0.11 # 为Haproxy自定义网段
privileged: true
command: haproxy -f /usr/local/etc/haproxy/haproxy.cfg # h1容器运行时启动脚本,启动Haproxy服务
depends_on: # Haproxy容器依赖于pxc容器启动
- pxc1
- pxc2
- pxc3
- pxc4
- pxc5
networks:
net1:
external: false
name: net1
ipam:
config:
- subnet: 172.20.0.0/24
volumes:
v1:
name: v1
v2:
name: v2
v3:
name: v3
v4:
name: v4
v5:
name: v5
4.执行 sh install.sh,检查启动项