学习笔记:docker部署高可用MySQL集群

学习笔记: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环境下的前后端分离项目部署与运维》

你可能感兴趣的:(docker)