Percona XtraDB Cluster(简称PXC集群)提供了MySQL高可用的一种实现方法。
PXC最大的优势:强一致性、无同步延迟
docker pull percona/percona-xtradb-cluster:5.7
集群的数据库都连接这个网络,通过它通信
docker network create --subnet=172.20.0.0/24 net1
docker volume create v1
docker volume create v2
docker volume create v3
docker volume create backup
docker run -d -p 3311:3306 -v v1:/var/lib/mysql -v backup:/data -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 --privileged --name=mysql_node1 --net=net1 --ip 172.20.0.2 percona/percona-xtradb-cluster:5.7
第二三台需要加入配置-e CLUSTER_JOIN=mysql_node1 加入mysql_node1集群
docker run -d -p 3312:3306 -v v2:/var/lib/mysql -v backup:/data -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=mysql_node1 --privileged --name=mysql_node2 --net=net1 --ip 172.20.0.3 percona/percona-xtradb-cluster:5.7
docker run -d -p 3312:3306 -v v2:/var/lib/mysql -v backup:/data -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=mysql_node1 --privileged --name=mysql_node2 --net=net1 --ip 172.20.0.3 percona/percona-xtradb-cluster:5.7
这样集群就建好了,可以在任意数据库进行测试
cd /var/lib/docker/volumes/v1/_data
docker start mysql_node1
软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现。
LVS(Linux虚拟服务器)就是基于Linux操作系统实现的一种软负载,
基于第三方应用的软负载实现就很多了:
HAProxy、Nginx、Apache都是这类软件。
对数据库做负载均衡,采用HAProxy来做,成熟一些。
docker pull haproxy:2.3-dev3
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:123456
#数据库负载均衡
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.20.0.2:3306 check weight 1 maxconn 2000
server MySQL_2 172.20.0.3:3306 check weight 1 maxconn 2000
server MySQL_3 172.20.0.4:3306 check weight 1 maxconn 2000
#使用keepalive检测死链,是在TCP中一个可以检测死连接的机制
option tcpka
CREATE USER 'haproxy'@'%' IDENTIFIED BY '';
docker run -itd -p 4001:8888 -p 3306:3306 -v /opt/docker/haproxy:/usr/local/etc/haproxy --name haproxy1 --privileged --net=net1 --ip 172.20.0.5 haproxy:2.3-dev3 haproxy -f /usr/local/etc/haproxy/haproxy.cfg
到这里负载均衡就实现完成了,可以用navicat测试连接haproxy
也可以通过浏览器输入ip:4001/dbs查看 账号:admin 密码:123456
前面实现了负载均衡,所有的容器收到的请求都在一个haproxy容器转发的,所以haproxy容器完蛋,所有容器也都会完蛋,不存在高可用的特性,想要高可用,一个haproxy容器挂了,对外的服务不能挂,所以必须至少还得有一台备份的一个haproxy容器待命。
1. 虚拟IP
就是一块网卡上边可以有多个ip,然后无论到哪个ip的流量都会经过物理网卡。
大部分虚拟ip基本上都用于高可用的架构上边。主机启用虚拟ip,所有访问的请求都会到主机。
当主机宕机的时候,高可用软件会将主机的虚拟ip down掉,然后在备机上启用虚拟ip。
这样就完成了主备切换。从而保证业务的可用性。
2. Keepalived
Keepalived就是一个具体的上面说的一款高可用软件,它的作用是检测服务器的状态,
如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,
同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,
这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
根据上面的总体架,创建第二个hapoxy容器h2:
docker run -itd -p 4002:8888 -p 3307:3306 -v /opt/docker/haproxy:/usr/local/etc/haproxy --name haproxy2 --privileged --net=net1 --ip 172.20.0.6 haproxy:2.3-dev3 haproxy -f /usr/local/etc/haproxy/haproxy.cfg
docker exec -it -u root haproxy1 bash
mv /etc/apt/sources.list /etc/apt/sources.list.bak
echo "">> /etc/apt/sources.list
echo "deb http://mirrors.ustc.edu.cn/debian stable main contrib non-free" >> /etc/apt/sources.list
echo "deb http://mirrors.ustc.edu.cn/debian stable-updates main contrib non-free" >>/etc/apt/sources.list
安装所需工具
apt-get update
apt-get install -y iproute2 #安装ip工具
apt-get install -y vim #安装vim
apt-get install -y procps #ps命令
apt-get install -y keepalived #安装Keepalived,配置虚拟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.20.0.15
}
}
下面说明:
vrrp_instance VI_1 { vrrp_instance用来定义对外提供服务的VIP区域及其相关属性,Virtual Router Redundancy Protocol一般指虚拟路由器冗余协议。
state MASTER 实例初始状态可以是MASTER 或 BACKUP
interface eth0 实例节点固有IP(非VIP)的网卡,用来发VRRP包
virtual_router_id 51 虚拟路由标识即VRID 相同的VRID为一个组 他将决定多播的MAC地址
priority 100 定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER 的优先级必须大于BACKUP。
advert_int 1 检查间隔默认为1秒
authentication { 设置认证
auth_type PASS 认证方式可以是PASS或AH两种认证方式
auth_pass 123456 认证密码
}
virtual_ipaddress { 设置虚拟IP 可以设置多个
172.20.0.15
}
}
service keepalived start
yum -y install keepalived
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.175.150
}
}
virtual_server 192.168.175.150 8889 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.20.0.15 8889 {
weight 1
}
}
virtual_server 192.168.175.150 4306 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.20.0.15 3306 {
weight 1
}
}
下面是说明:
virtual_server 192.168.175.150 4306 { #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
delay_loop 6 #每隔6秒查询realserver状态
lb_algo rr #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
lb_kind NAT #负载均衡转发规则NAT|DR|RUN
#persistence_timeout 60 #会话保持时间
protocol TCP #用TCP协议检查realserver状态
real_server 172.20.0.15 3306 {
weight 1 #权重,最大越高,lvs就越优先访问
}
}
systemctl start keepalived
docker exec -it -u root mysql_node1 bash
xtrabackup -v
yum install percona-xtrabackup-24
innobackupex --user=xtrabackup --password=123456 /data/backup/full
docker stop mysql_node1 mysql_node2 mysql_node3 #关闭所有容器
docker rm mysql_node1 mysql_node2 mysql_node3 #移除所有容器
docker volume rm v1 v2 v3 #删掉所有数据卷
docker volume create v1 #创建新的数据卷
cd /var/lib/docker/volumes/backup/_data/backup/full #进入数据卷backup目录
可以看到一个 2022-04-24_14-33-59的文件,这个就是我们的备份文件了
docker run -d -p 3306:3306 -v v1:/var/lib/mysql -v backup:/data -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 --privileged --name=mysql_node1 --net=net1 --ip 172.20.0.2 percona/percona-xtradb-cluster:5.7 #启动容器
docker exec -it -u root mysql_node1 bash #进入容器
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --apply-log /data/backup/full/2022-04-24_14-33-59/ #node1容器中删除MySQL的数据,注这里的2022-04-24_14-33-59为数据卷中的文件名
rm -fr /var/lib/mysql/*
innobackupex --user=root --password=123456 --copy-back /data/backup/full/2022-04-24_14-33-59/ #正式还原数据,注这里的2022-04-24_14-33-59为数据卷中的文件名
chown -R mysql:mysql /var/lib/mysql/*
docker restart mysql_node1 #退出容器并启动