docker pull percona/percona‐xtradb‐cluster
docker tag percona/percona‐xtradb‐cluster pxc
docker rmi percona/percona‐xtradb‐cluster
创建网段:docker network create --subnet=172.18.0.0/24 net1
查询网段信息: docker inspect net1
删除网段:docker network rm net1
创建:docker volume create --name v1
查看数据卷信息:docker inspect v1
删除:docker volume rm v1
重复操作创建v1-v5共5个数据卷
创建备份数据卷:docker volume create --name backup
#创建第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
MySQL各个节点之间通过TCP/IP协议进行交互,而使用较为广泛的负载均衡中间件nginx(适用于HTTP)就不太适合了,适用于TCP/IP协议的负载均衡中间件有Haproxy和LVS。这里采用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
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
参数说明
docker exec -it h1 bash
加上配置文件启动
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
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
docker exec -it h2 bash
加上配置文件启动
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
先任意登录一个MySQL节点
在MySQL中创建一个没有权限的haproxy用户,密码为空。
Haproxy使用这个账户对MySQL数据库心跳检测
CREATE USER 'haproxy' @'%' IDENTIFIED BY '';
公网ip:4001/dbs
公网ip:4003/dbs
访问界面如图所示
使用的时候就可以直接向haproxy节点发起请求,haproxy只是对请求进行转发,并不会进行存储
用navicat连接一个节点方便使用
PXC集群的目的是保证单节点MySQL故障时的高可用
引入Haproxy做负载均衡后,所有的请求都需要Haproxy进行转发
如果Haproxy宕机了,同样不能做到集群高可用
所以需要对Haproxy也进行高可用配置
方案如下
现在已经配置好了数据库集群和两个节点的Haproxy
还需要在两个Haproxy上各配置一个Keepalived
然后在宿主机上配置一个Keepalived用于为外提供服务
进入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设置都一模一样
yum ‐y install keepalived
修改配置文件
vi /etc/keepalived/keepalived.conf
配置文件如下
其中:
ip addr
/ ifconfig
/ ip a
查看 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
进入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