docker部署高可用MySQL集群
发表于:2022-09-16 |
学习笔记: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;
    }
}
上一篇:
jenkins使用mavent构建报错集聚
下一篇:
docker自定义网络指定ip启动redis失败