mysql高可用-基于docker容器下的pxc集群方案

mysql单机性能测试

mysqlslap -h192.168.1.16 -uroot -p123456 -P3306 --concurrency=5000 --iterations=1 --auto-generate-sql --auto-generate-sql-load-type=mixed --auto-generate-sql-add-autoincrement --engine=innodb --number-of-queries=5000 --debug-info

关于这个测试命令呢,我简单讲一下几个关键参数

--concurrency=5000 表示启动5000个线程连接数据库

--iterations=1 测试执行次数

--number-of-queries=5000 总的执行次数

这个mysqlslap是mysql自带的测试工具,大家可以试一下。

我分别在物理机和虚拟机上做了两次测试,物理机在10000的测试下出现了大量的失败信息,虚拟机5000的测试就导致mysql服务挂掉了,已经无法自动回复!大家可以自行测试,说道这里,大家肯定不会忘记大学校园网选课或者查成绩的时候,基本上都是登录不上去,实际上也验证了这个问题。

docker 基础

关于docker的介绍,我这里不做重点,大家自行查阅相关资料。

docker 安装也有很多种方式,包括docker镜像加速器,我推荐使用阿里云相关产品,不要问我为什么,因为我用的很爽!

  1. 先更新软件包

    yum -y update-y update
  2. 安装Docker虚拟机

    yum install -y docker-y docker
  3. 运行、重启、关闭Docker虚拟机

    service docker start docker start
    service docker start docker start
    service docker stop docker stop
  4. 搜索镜像

    docker search 镜像名称
  5. 下载镜像

    docker pull 镜像名称
  6. 查看镜像

    docker images
  7. 删除镜像

    docker rmi 镜像名称
  8. 运行容器

    docker run 启动参数  镜像名称
  9. 查看容器列表

    docker ps -aps -a
  10. 停止、挂起、恢复容器

    docker stop 容器IDstop 容器ID
    docker pause 容器ID
    docker unpase 容器ID
  11. 查看容器信息

    docker inspect 容器ID
  12. 删除容器

    docker rm 容器IDrm 容器ID
  13. 数据卷管理

    docker volume create 数据卷名称  #创建数据卷#创建数据卷
    docker volume rm 数据卷名称  #删除数据卷rm 数据卷名称  #删除数据卷
    docker volume inspect 数据卷名称  #查看数据卷#查看数据卷
  14. 网络管理

    docker network ls 查看网络信息ls 查看网络信息
    docker network create --subnet=网段 网络名称--subnet=网段 网络名称
    docker network rm 网络名称rm 网络名称

看过上面这些docker 命令,接下来我们就正式开始吧,对了你还需要一台linux服务器,这里我使用的vmware虚拟机

使用的centos 7.4的镜像系统。

在虚拟机中安装好docker,练习过上述命名后,我们开始进入下面主要部分。

安装PXC集群

  1. 安装PXC镜像

    docker pull percona/percona-xtradb-cluster
  2. 为PXC镜像改名

    docker tag percona/percona-xtradb-cluster pxc
  3. 创建net1网段

    docker network create --subnet=172.18.0.0/16 net1--subnet=172.18.0.0/16 net1
  4. 创建5个数据卷

    docker volume create --name v1--name v1
    docker volume create --name v2--name v2
    docker volume create --name v3--name v3
    docker volume create --name v4--name v4
    docker volume create --name v5--name v5
  5. 创建备份数据卷(用于热备份数据)

    docker volume create --name backup--name backup
  6. 创建5节点的PXC集群

    注意,每个MySQL容器创建之后,因为要执行PXC的初始化和加入集群等工作,耐心等待1分钟左右再用客户端连接MySQL。另外,必须第1个MySQL节点启动成功,用MySQL客户端能连接上之后,再去创建其他MySQL节点。

    <span style="color:#aa5500">#创建第1个MySQL节点</span>
    docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc-d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
    <span style="color:#aa5500">#创建第2个MySQL节点</span>
    docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql -v backup:/data --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc-d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql -v backup:/data --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc
    <span style="color:#aa5500">#创建第3个MySQL节点</span>
    docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc-d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc
    <span style="color:#aa5500">#创建第4个MySQL节点</span>
    docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc-d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc
    <span style="color:#aa5500">#创建第5个MySQL节点</span>
    docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc-d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc
     
     

至此我们的5节点pxc集群已经搭建完成,大家可以通过navicat等mysql客户端工具连接。测试在任何一个数据库节点创建或修改数据,其它节点均会自动同步数据。

5节点pxc集群已经搭建完毕,实际上我们可以连接任何一个节点操作数据库,其它节点均会同步该节点数据。

但上述集群仍然存在问题,假如我们连接的那个节点挂掉了,那么集群就不可以用了,因此

仅仅完成以上集群还是远远不够的,实际后台应用仍然无法达到高性能高可用的目的。

Haproxy实现负载均衡

关于负载均衡,相信大家都不陌生,例如web应用使用的nginx,这里我选择的是老牌的haproxy,至于原因,请大家自行查阅资料。

  1. 安装Haproxy镜像

    docker pull haproxy
     
     
  2. 宿主机上编写Haproxy配置文件

    vi /home/soft/haproxy.cfg /home/soft/haproxy.cfg
     
     

    配置文件如下:

    <span style="color:#0000ff">global</span>
    <span style="color:#aa5500">    #工作目录</span>
    <span style="color:#0000ff">    chroot /usr/local/etc/haproxy</span>
    <span style="color:#aa5500">    #日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info</span>
    <span style="color:#0000ff">    log 127.0.0.1 local5 info</span>
    <span style="color:#aa5500">    #守护进程运行</span>
    <span style="color:#0000ff">    daemon</span>
    <span style="color:#0000ff">defaults</span>
    <span style="color:#0000ff">    log global</span>
    <span style="color:#0000ff">    mode    http</span>
    <span style="color:#aa5500">    #日志格式</span>
    <span style="color:#0000ff">    option  httplog</span>
    <span style="color:#aa5500">    #日志中不记录负载均衡的心跳检测记录</span>
    <span style="color:#0000ff">    option  dontlognull</span>
    <span style="color:#aa5500">    #连接超时(毫秒)</span>
    <span style="color:#0000ff">    timeout connect 5000</span>
    <span style="color:#aa5500">    #客户端超时(毫秒)</span>
    <span style="color:#0000ff">    timeout client  50000</span>
    <span style="color:#aa5500">    #服务器超时(毫秒)</span>
    <span style="color:#0000ff">    timeout server  50000</span>
    <span style="color:#aa5500">#监控界面   </span>
    <span style="color:#0000ff">listen  admin_stats</span>
    <span style="color:#aa5500">    #监控界面的访问的IP和端口</span>
        bind  0.0.0.0:8888:8888
    <span style="color:#aa5500">    #访问协议</span>
    <span style="color:#0000ff">    mode        http</span>
    <span style="color:#aa5500">    #URI相对地址</span>
    <span style="color:#0000ff">    stats uri   /dbs</span>
    <span style="color:#aa5500">    #统计报告格式</span>
    <span style="color:#0000ff">    stats realm     Global\ statistics</span>
    <span style="color:#aa5500">    #登陆帐户信息</span>
        stats auth  admin:abc123456:abc123456
    <span style="color:#aa5500">#数据库负载均衡</span>
    <span style="color:#0000ff">listen  proxy-mysql</span>
    <span style="color:#aa5500">    #访问的IP和端口</span>
        bind  0.0.0.0:3306  :3306  
    <span style="color:#aa5500">    #网络协议</span>
    <span style="color:#0000ff">    mode  tcp</span>
    <span style="color:#aa5500">    #负载均衡算法(轮询算法)</span>
    <span style="color:#aa5500">    #轮询算法:roundrobin</span>
    <span style="color:#aa5500">    #权重算法:static-rr</span>
    <span style="color:#aa5500">    #最少连接算法:leastconn</span>
    <span style="color:#aa5500">    #请求源IP算法:source </span>
    <span style="color:#0000ff">    balance  roundrobin</span>
    <span style="color:#aa5500">    #日志格式</span>
    <span style="color:#0000ff">    option  tcplog</span>
    <span style="color:#aa5500">    #在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测</span>
    <span style="color:#0000ff">    option  mysql-check user haproxy</span>
        server  MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000  :3306 check weight 1 maxconn 2000  
        server  MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000  :3306 check weight 1 maxconn 2000  
        server  MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000 :3306 check weight 1 maxconn 2000 
        server  MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000:3306 check weight 1 maxconn 2000
        server  MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000:3306 check weight 1 maxconn 2000
    <span style="color:#aa5500">    #使用keepalive检测死链</span>
    <span style="color:#0000ff">    option  tcpka  </span>
     
  3. 创建两个Haproxy容器

     
    <span style="color:#aa5500">#创建第1个Haproxy负载均衡服务器</span>
    docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy-it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy
    <span style="color:#aa5500">#进入h1容器,启动Haproxy</span>
    docker exec -it h1 bash-it h1 bash
    haproxy -f /usr/local/etc/haproxy/haproxy.cfg-f /usr/local/etc/haproxy/haproxy.cfg
    <span style="color:#aa5500">#创建第2个Haproxy负载均衡服务器</span>
    docker run -it -d -p 4003:8888 -p 4004:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.8 haproxy-it -d -p 4003:8888 -p 4004:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.8 haproxy
    <span style="color:#aa5500">#进入h2容器,启动Haproxy</span>
    docker exec -it h2 bash-it h2 bash
    haproxy -f /usr/local/etc/haproxy/haproxy.cfg-f /usr/local/etc/haproxy/haproxy.cfg
     
     
     

到这里,大家肯定会问,为什么创建两个haproxy呀,怎么用的啊,别急,让我慢慢讲。请看下面!

keepalived实现双机热备

  1. Haproxy容器内安装Keepalived,设置虚拟IP

    <span style="color:#aa5500">#进入h1容器</span>
    docker exec -it h1 bash-it h1 bash
    <span style="color:#aa5500">#更新软件包</span>
    apt-get update
    <span style="color:#aa5500">#安装VIM</span>
    apt-get install vimvim
    <span style="color:#aa5500">#安装Keepalived</span>
    apt-get install keepalived
    <span style="color:#aa5500">#编辑Keepalived配置文件(参考下方配置文件)</span>
    vim /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
    <span style="color:#aa5500">#启动Keepalived</span>
    service keepalived start keepalived start
    <span style="color:#aa5500">#宿主机执行ping命令</span>
    ping 172.18.0.201 172.18.0.201
     
     

    配置文件内容如下:

    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.0.201
        }
    }
    <span style="color:#aa5500">#进入h2容器</span>
    docker exec -it h2 bash-it h2 bash
    <span style="color:#aa5500">#更新软件包</span>
    apt-get update
    <span style="color:#aa5500">#安装VIM</span>
    apt-get install vimvim
    <span style="color:#aa5500">#安装Keepalived</span>
    apt-get install keepalived
    <span style="color:#aa5500">#编辑Keepalived配置文件</span>
    vim /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
    <span style="color:#aa5500">#启动Keepalived</span>
    service keepalived start keepalived start
    <span style="color:#aa5500">#宿主机执行ping命令</span>
    ping 172.18.0.201 172.18.0.201
     
     

    配置文件内容如下:

    vrrp_instance  VI_1 {
        state  MASTER
        interface  eth0
        virtual_router_id  5151
        priority  100100
        advert_int  11
        authentication {
            auth_type  PASS
            auth_pass  123456123456
        }
        virtual_ipaddress {
            172.18.0.201172.18.0.201
        }
    }
     
     
  2. 宿主机安装Keepalived,实现双击热备

    <span style="color:#aa5500">#宿主机执行安装Keepalived</span>
    yum -y install keepalived-y install keepalived
    <span style="color:#aa5500">#修改Keepalived配置文件</span>
    vi /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
    <span style="color:#aa5500">#启动Keepalived</span>
    service keepalived start keepalived start
     
     

    Keepalived配置文件如下:

    vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 5151
        priority 100100
        advert_int 11
        authentication {
            auth_type PASS
            auth_pass 11111111
        }
        virtual_ipaddress {
            192.168.99.150 192.168.99.150
        }
    }
    virtual_server 192.168.99.150 8888 {192.168.99.150 8888 {
        delay_loop 33
        lb_algo rr 
        lb_kind NAT
        persistence_timeout 5050
        protocol TCP
        real_server 172.18.0.201 8888 {172.18.0.201 8888 {
            weight 11
        }
    }
    virtual_server 192.168.99.150 3306 {192.168.99.150 3306 {
        delay_loop 33
        lb_algo rr 
        lb_kind NAT
        persistence_timeout 5050
        protocol TCP
        real_server 172.18.0.201 3306 {172.18.0.201 3306 {
            weight 11
        }
    }
     
     

终于搞定了!到这里,一个5节点的pxc集群已经实现了真正意义上的高可用。任何一个数据库节点挂掉,没有问题,业务任然可以访问其他数据库,一个haproxy挂掉,也没问题,还有另一个提供负载均衡。

结束!

等等,说好的高性能,高可用呢,高性能去哪里了?补充说明,pxc集群只能保证节点之间数据同步,而且保证数据一致性,也就是说node1节点中有2000万条数据,其它节点同样有这么多数据,说以高性能无法保证,pxc集群的性能取决于集群中性能最差的节点,而不是最好的节点。有没有既有高性能,又有高可用的解决方案呢?我说有!在哪里?。。。。

好困啊,凌晨1点了,睡觉吧,后续我会介绍如何结合mycat达到高性能的目的,以及后端、前端项目的高可用方案。

晚安!

这里有个很重要的事情忘记讲了,pxc集群停掉之后,直接通过docker start node1 或者任何一个节点是启动不了的,原因是集群之前的同步机制造成的,启动任何一个节点,该节点都会去其它节点同步数据,其它节点仍处于宕机状态,所以该节点启动失败,这也是pxc集群的强一致性的表现,解决方式是,删除所有节点docker rm node1 node2 node3 node4 node 5

和数据卷中的grastate.dat文件

rm -rf /var/lib/docker/volumes/v1/_data/grastate.dat

rm -rf /var/lib/docker/volumes/v2/_data/grastate.dat

rm -rf /var/lib/docker/volumes/v3/_data/grastate.dat

rm -rf /var/lib/docker/volumes/v4/_data/grastate.dat

rm -rf /var/lib/docker/volumes/v5/_data/grastate.dat

重新执行集群创建的命令即可,因为数据都在数据卷中,所有放心,集群重新启动都数据仍然都在.。

 对于初学者操作可能不熟练,容易出错,因此我把docker下载安装(用的阿里云的docker-ce),镜像加速(阿里云的 镜像加速),网络配置,镜像下载,创建数据卷,创建pxc5个节点的命令整理好了脚本,初学者只需要在centos虚拟机内执行./deploy-pxc-create.sh脚本即可等待整个docker环境和后续集群搭建完毕,直接用mysql客户端连接使用,测试,十分方便。首次将脚本文件放到虚拟机内,先授权 chmod 777 deploy-pxc-create.sh 之后执行脚本即可。无需自己安装docker环境。

一键搭建docker环境下的pxc集群

发布了34 篇原创文章 · 获赞 46 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/u013218587/article/details/80863054