单机多服务

一.Docker设置

(单主机上运行多个mysql服务器)
定义子网
docker network create --subnet=172.18.0.0/16 net1
(多主机上)
可以参考:
https://blog.51cto.com/wzlinux/2112061

二.创建多个mysql服务

使用Percona-XtraDB-Cluster方案

假设对应的ip及其端口转发情况如下:
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

离线状态下,加载Percona-XtraDB-Cluster镜像:

docker load -i pxc.tar

外网状态下,可以使用如下命令,下载:

docker pull percona/percona-xtradb-cluster

创建数据卷:

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实现负载均衡

离线状态下可载入预先准备的haproxy镜像

docker load -i haproxy.tar

在/root/soft/haproxy下创建haproxy配置文件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负载均衡服务器h1

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

(单机条件下,记得执行exit;退出容器h1再继续执行下面的配置)

创建第2个Haproxy负载均衡服务器h2

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分别安装keepalived
这里只给出h1中的步骤,h2类似:
进入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中的内容:

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
    }
}

多机多服务

docker高可用mysql集群配置.doc