Docker搭建MySQL的PXC方案集群

搭建5个MySQL节点

  1. 拉取镜像到本地
docker pull percona/percona‐xtradb‐cluster
  1. 镜像名称太长不方便使用,进行一下改名,改名后删除原来的镜像
docker tag percona/percona‐xtradb‐cluster pxc
docker rmi percona/percona‐xtradb‐cluster
  1. 创建内网网段net1
创建网段:docker network create --subnet=172.18.0.0/24 net1
查询网段信息: docker inspect net1
删除网段:docker network rm net1
  1. 创建docker数据卷
创建:docker volume create --name v1
查看数据卷信息:docker inspect v1
删除:docker volume rm v1

 重复操作创建v1-v5共5个数据卷
 
创建备份数据卷:docker volume create --name backup
  1. 创建容器
    • node1启动后一段时间再启动其他节点没如果node1没初始化完成就启动其他节点就会报错
    • node如果启动几秒就挂掉了,删除对应的数据卷之后再重新创建数据卷再启动
    • 参数说明:
      • -d 后台运行
      • -p 3307:3306 将容器内的3306端口映射到宿主机3307端口
      • -e 初始化MySQL的基本参数
      • -v 映射宿主机数据卷和容器目录
      • –name 指定容器名
      • –net 指定容器的网关
      • –ip 指定容器的IP,如果不指定会自动生成
#创建第1个MySQL节点
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
#创建第2个MySQL节点
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
#创建第3个MySQL节点
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
#创建第4个MySQL节点
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
#创建第5个MySQL节点
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
  1. 外部尝试连接5个MySQL节点,通过navicat进行连接
    • ip为宿主机公网IP
    • 端口为只设置到暴露到公网的端口
    • 用户名root
    • 密码abc123456

在这里插入图片描述
在这里插入图片描述

使用Haproxy实现负载均衡

MySQL各个节点之间通过TCP/IP协议进行交互,而使用较为广泛的负载均衡中间件nginx(适用于HTTP)就不太适合了,适用于TCP/IP协议的负载均衡中间件有Haproxy和LVS。这里采用Haproxy来实现负载均衡

  1. 安装Haproxy

拉取镜像到本地

 docker pull haproxy

在宿主机创建haproxy.cfg的配置文件,放置在自定义目录,如/root/docker/haproxy/

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:abc123456
#数据库负载均衡
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数据库心跳检测
    option  mysql-check user haproxy
    server  MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000  
    server  MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000  
    server  MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000
    server  MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000
    server  MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000
    #使用keepalive检测死链
    option  tcpka  
  1. 启动第一个Haproxy容器
docker run -it -d -p 4001:8888 -p 4002:3306 -v /root/docker/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy

参数说明

  • 4001:8888 :将haproxy暴露在8888的监控端口映射到宿主机
  • 4002:3306:将haproxy的3306端口映射到宿主机4002端口
  • 将haproxy的/usr/local/etc/haproxy目录映射到宿主机的/root/docker/haproxy目录,用于设置配置文件
  • haproxy取名为h1
  • 使用网段net1
  • 手动设置一个ip为172.18.0.7
  1. 启动第一个Haproxy
    以界面交互方式进入容器:
docker exec -it h1 bash

加上配置文件启动

haproxy -f /usr/local/etc/haproxy/haproxy.cfg
  1. 启动第二个Haproxy容器
docker run -it -d -p 4003:8888 -p 4004:3306 -v /root/docker/haproxy:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.8 haproxy
  1. 启动第一个Haproxy
    以界面交互方式进入容器:
docker exec -it h2 bash

加上配置文件启动

haproxy -f /usr/local/etc/haproxy/haproxy.cfg
  1. 配置连接账号

先任意登录一个MySQL节点
在MySQL中创建一个没有权限的haproxy用户,密码为空。
Haproxy使用这个账户对MySQL数据库心跳检测

CREATE USER 'haproxy' @'%' IDENTIFIED BY '';
  1. 访问Haproxy监控
    url可以是任意一个节点的监控端口
公网ip:4001/dbs
公网ip:4003/dbs

访问界面如图所示
在这里插入图片描述
使用的时候就可以直接向haproxy节点发起请求,haproxy只是对请求进行转发,并不会进行存储
用navicat连接一个节点方便使用
在这里插入图片描述

Keepalived实现高可用方案

PXC集群的目的是保证单节点MySQL故障时的高可用
引入Haproxy做负载均衡后,所有的请求都需要Haproxy进行转发
如果Haproxy宕机了,同样不能做到集群高可用
所以需要对Haproxy也进行高可用配置

方案如下
在这里插入图片描述
现在已经配置好了数据库集群和两个节点的Haproxy
还需要在两个Haproxy上各配置一个Keepalived
然后在宿主机上配置一个Keepalived用于为外提供服务

  1. 在haproxy上安装keepalived(haproxy镜像使用的是unbuntu,所以以下操作使用apt-get)

进入haproxy

docker exec -it h1 bash

更新apt-get

apt-get update

下载keepalived

apt-get install keepalived

修改keepalived配置文件

因为keepalived镜像装载ubuntu上,如果直接修改还需要装vim等工具,所以可以在宿主机写好了复制进来或者设置目录映射

编写keepalived.conf文件

vrrp_instance  VI_1 {
    state  MASTER    #keepalived的身份:MASTER主服务,会抢占虚拟ip;BACKUP备用服务
    interface  eth0  #网卡配置较:etho是docker虚拟机的网卡,宿主机能访问但是局域网不能访问,宿主机的keepalived上将网卡映射到局域网
    virtual_router_id  51   #id:0-255间随便取
    priority  100    #权重,根据硬件配置调整数字
    advert_int  1    # 心跳检测的时间间隔  1s
    authentication {   #心跳检测需要开放的密码
        auth_type  PASS
        auth_pass  123456
    } 
    virtual_ipaddress {  #eth0开放的虚拟ip
        172.18.0.201
    }
}

采用宿主机写好再复制的操作:

docker cp 宿主机文件路径  镜像名称:镜像中文件存放路径
docker cp /root/keepalived.conf h1:/etc/keepalived/

启动keepalived

service keepalived start

返回宿主机测试是否启动成功

ping 172.18.0.201

同理修改h2中的配置,其中所有的配置包括ip设置都一模一样

  1. 宿主机安装keepalived
yum ‐y install keepalived

修改配置文件

vi /etc/keepalived/keepalived.conf

配置文件如下
其中:

  • 172.26.0.288表示本地网关下的任意一个IP
  • 查看本地网关可以通过:ip addr / ifconfig / ip a 查看
  • 172.18.0.201表示Haproxy的IP
  • 8888是Haproxy监控的端口
  • 3306是MySQL的端口
	virtual_server 172.26.0.228 8888 {
        delay_loop 3
        lb_algo rr
        lb_kind NAT
        persistence_timeout 50
        protocol TCP


        real_server 172.18.0.201 8888 {
            weight 1
        }
    }


    virtual_server 172.26.0.228 3306 {
        delay_loop 3
        lb_algo rr
        lb_kind NAT
        persistence_timeout 50
        protocol TCP


        real_server 172.18.0.201 3306 {
            weight 1
        }
    }

启动keepalived

service keepalived start

启动完成之后可以通过ping自定义的IP来查看是否连接成功

ping 172.26.0.228
  1. 数据热备份

进入node1

docker exec ‐it node1 bash 

更新apt-get

apt‐get update 

安装热备份工具

apt‐get install percona‐xtrabackup‐24

进行全量热备份

innobackupex ‐‐user=root ‐‐password=abc123456 /data/backup/full
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章