学习笔记:docker部署高可用MySQL集群
环境
- CentOS 7.5 (IP:106.xx.xx.xx)
- Docker 18.06.0-ce
一、docker设置
# 定义子网
docker network create --subnet=172.18.0.0/16 net1
二、mysql集群(5台)
使用Percona-XtraDB-Cluster方案
通过mysql工具连接106.xx.xx.xx:30001~30005测试是否安装成功
- 172.18.10.11 30001:3306
- 172.18.10.12 30002:3306
- 172.18.10.13 30003:3306
- 172.18.10.14 30004:3306
- 172.18.10.15 30005:3306
# 安装镜像
docker pull percona/percona-xtradb-cluster
# 镜像改名
docker tag percona/percona-xtradb-cluster pxc
# 创建5个数据卷
docker volume create --name v1
docker volume create --name v2
docker volume create --name v3
docker volume create --name v4
docker volume create --name v5
# 创建备份数据卷(用于热备份数据)
# docker volume create --name backup
#创建第1个MySQL节点
docker run -d -p 30001:3306 -e MYSQL_ROOT_PASSWORD=db123456 -e CLUSTER_NAME=JWSPXC -e XTRABACKUP_PASSWORD=db123456 -v v1:/var/lib/mysql -v backup:/data --privileged --name=db1 --net=net1 --ip 172.18.10.11 pxc
#创建第2个MySQL节点
docker run -d -p 30002:3306 -e MYSQL_ROOT_PASSWORD=db123456 -e CLUSTER_NAME=JWSPXC -e XTRABACKUP_PASSWORD=db123456 -e CLUSTER_JOIN=db1 -v v2:/var/lib/mysql -v backup:/data --privileged --name=db2 --net=net1 --ip 172.18.10.12 pxc
#创建第3个MySQL节点
docker run -d -p 30003:3306 -e MYSQL_ROOT_PASSWORD=db123456 -e CLUSTER_NAME=JWSPXC -e XTRABACKUP_PASSWORD=db123456 -e CLUSTER_JOIN=db1 -v v3:/var/lib/mysql -v backup:/data --privileged --name=db3 --net=net1 --ip 172.18.10.13 pxc
#创建第4个MySQL节点
docker run -d -p 30004:3306 -e MYSQL_ROOT_PASSWORD=db123456 -e CLUSTER_NAME=JWSPXC -e XTRABACKUP_PASSWORD=db123456 -e CLUSTER_JOIN=db1 -v v4:/var/lib/mysql -v backup:/data --privileged --name=db4 --net=net1 --ip 172.18.10.14 pxc
#创建第5个MySQL节点
docker run -d -p 30005:3306 -e MYSQL_ROOT_PASSWORD=db123456 -e CLUSTER_NAME=JWSPXC -e XTRABACKUP_PASSWORD=db123456 -e CLUSTER_JOIN=db1 -v v5:/var/lib/mysql -v backup:/data --privileged --name=db5 --net=net1 --ip 172.18.10.15 pxc
三、haproxy(2台)
实现负载均衡
mysql中创建用户用于心跳检测create user 'haproxy'@'%' identified by ''
通过访问106.xx.xx.xx:31011|31012测试是否安装成功
通过mysql工具连接106.xx.xx.xx:31021|31022测试是否安装成功
- 172.18.10.21 31011:8888 31021:3306
- 172.18.10.22 31012:8888 31022:3306
# 拉取镜像
docker pull haproxy
# 创建第1个Haproxy负载均衡服务器
docker run -it -d -p 31011:8888 -p 31021:3306 -v /root/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.10.21 haproxy
# 进入h1容器,启动Haproxy
docker exec -it h1 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
# 创建第2个Haproxy负载均衡服务器
docker run -it -d -p 31012:8888 -p 31022:3306 -v /root/soft/haproxy:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.10.22 haproxy
# 进入h2容器,启动Haproxy
docker exec -it h2 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
配置文件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:ha123456
#数据库负载均衡
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数据库心跳检测
#create user 'haproxy'@'%' identified by ''
option mysql-check user haproxy
server MySQL_1 172.18.10.11:3306 check weight 1 maxconn 2000
server MySQL_2 172.18.10.12:3306 check weight 1 maxconn 2000
server MySQL_3 172.18.10.13:3306 check weight 1 maxconn 2000
server MySQL_4 172.18.10.14:3306 check weight 1 maxconn 2000
server MySQL_5 172.18.10.15:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
四、双机热备
1. 两台haproxy分别安装keepalived
通过ping 172.18.8.11测试是否安装成功
#进入h1容器
docker exec -it h1 bash
#更新软件包
apt-get update
#安装Keepalived
apt-get install keepalived
#宿主机拷贝配置文件到h1容器
docker cp keepalived.conf h1:/etc/keepalived/
#启动Keepalived
service keepalived start
#宿主机执行ping命令
ping 172.18.8.11
配置文件keepalived.conf
,设置虚拟IP
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.18.8.11
}
}
2.1 (方案1)宿主机安装keepalived,设置虚拟IP,转发到haproxy中设置的虚拟IP
该方式不适合在一台云主机上测试,因为本地访问不到虚拟IP(192.168.31.246)
通过访问192.168.31.246:8888测试是否安装成功
通过mysql工具连接192.168.31.246:3306测试是否安装成功
# 配置/etc/keepalived/keepalived.conf
# 启动keepalived
service keepalived start
# 通过虚拟ip(192.168.31.246)进行访问
配置文件/etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.31.246
}
}
virtual_server 192.168.31.246 8888 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.8.11 8888 {
weight 1
}
}
virtual_server 192.168.31.246 3306 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.8.11 3306 {
weight 1
}
}
2.2 (方案2)nginx直接转发到haproxy中设置的虚拟ip
nginx端口转发,configure时需要加上参数–with-stream
通过访问106.xx.xx.xx:8888测试是否安装成功
通过mysql工具连接106.xx.xx.xx:3306测试是否安装成功
配置文件/usr/local/nginx/conf/nginx.conf
中加入端口转发到指定虚拟IP
stream {
upstream ha8888 {
server 172.18.8.11:8888;
}
upstream db3306 {
server 172.18.8.11:3306;
}
server {
listen 8888;
proxy_connect_timeout 5s;
proxy_timeout 5s;
proxy_pass ha8888;
}
server {
listen 3306;
proxy_connect_timeout 5s;
proxy_timeout 5s;
proxy_pass db3306;
}
}
参考资料
慕课网《Docker环境下的前后端分离项目部署与运维》