文章目录
部署PXC集群
拉取pxc镜像
docker pull docker pull percona/percona-xtradb-cluster:5.7
这里拉取5.7版本,当5.7版本以上后会校验SSL,生成证书,
当我们构建第二个节点的时候,报错:
"2020-05-01T13:49:21.864627Z 0 [ERROR] [MY-000000] [Galera] handshake with remote endpoint ssl://10.0.0.5:4567 failed: asio.ssl:336031996: 'unknown protocol' ( 336031996: 'error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol')"
具体情况了解见:https://www.percona.com/blog/2020/05/18/percona-xtradb-cluster-8-0-behavior-change-for-pxc-encrypt-cluster-traffic/
创建虚拟网络
docker network create --subnet=172.18.0.0/24 net1
创建docker卷
docker volume create --name v1
创建容器
集群1,第一节点
docker run -d -p 3307:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
第二节点(添加了CLUSTER_JOIN参数)
docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc
部署haproxy集群
拉取镜像
docker pull 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
# 客户端超时(ms)
timeout client 50000
# 服务器超时(ms)
timeout server 50000
# 监控界面
listen admin_stats
# 监控界面的访问的IP和端口
bind 0.0.0.0:8888
# 访问协议
mode http
# URL相对地址
stats uri /dbs
# 统计报告格式
stats realm Global\ statistics
# 登录账户信息
stats auth admin:123456
# 数据库负载均衡
listen proxy-mysql
bind 0.0.0.0:3307
mode tcp # 网络协议
balance roundrobin # 轮询算法 static-rr 权重算法 等等
# 日志格式
option tcplog
# 在mysql中创建一个没有权限的haproxy用户 密码为空 haproxy使用这个账户对muysql进行check
option mysql-check user haproxy
server MySQL_1 172.18.0.2:3306 weight 1 check maxconn 200
server MySQL_2 172.18.0.3:3306 weight 1 check maxconn 200
option tcpka # 使用keepalive监测死链
运行容器
docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/zy/haproxy:/usr/local/etc/haproxy --privileged --name h1 --net=net1 haproxy
进入容器,声明配置文件
docker exec -it haproxy_1 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
进入mysql node1,创建配置里面的haproxy用户
CREATE USER 'haproxy'@'%' IDENTIFIED BY '';
利用keepalived实现haproxy双机热备
注意:
Docker内的虚拟IP不能被外网所使用,所以需要借助宿主机Keepalived映射成外网可以访问的虚拟IP
haproxy容器安装keepalived
# 进入haproxy容器
docker exec -it xxx bash
# 更新apt(容器系统为ubuntu)
apt-get update
# 安装keepalived
apt-get install keepalived
# Keepalived配置文件
(默认没有)路径: /etc/keepalived/keeplived.conf
vim /etc/keepalived/keeplived.conf
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.18.0.201
}
}
state MASTER: #Keepalived身份(Master主服务,Backup备用服务器)主服务要抢占虚拟IP,备用服务器不会抢占ip
interface eth0: # 虚拟ip保存的网卡设备
virtual_router_id 51 # 虚拟路由标识 0~255之间
priority 100 # 权重 MASTER权重要高于Backup 数字越大优选级越大
advert_int 1 # master和backup的心跳检测时间间隔
authentication: 主从服务器验证方式,主备必须使用相同的密码才能正常通信
virtual_ipaddress:虚拟IP地址,可以设置多个虚拟IP地址 每行一个
# 启动keepalived
service keepalived start
# 如果没有启动成功,则重写配置文件检查无误,重启keepalived之后再重试
# 重启命令
service keepalived stop
service keepalived start
# ok,到到现在为止我们在h1 里面装好了keepalived
# 我们还要在h2连装keepalived,操作更上面的一样;在这里我就不在展示了
宿主机中安装keepalived
# 安装keepalived
apt-get install -y keepalived
# 编辑配置文件
vim /etc/keepalived/keepalived.conf
"""
! Configuration File for keepalived
vrrp_instance VI_1 {
state MASTER
interface eth0 # 查看宿主机的网卡名称
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.16.188
}
}
virtual_server 192.168.16.188 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 192.168.16.188 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在查看其状态
systemctl start keepalived
systemctl status keepalived
到这里我们就做完了双机热备。
数据库热备份
冷备份
冷备份是关闭数据库时候的备份方式,通常做法是拷贝数据文件
冷备份是最简单最安全的一种备份方式
sqldump:冷备份命令,不能在数据库运行中备份
热备份简介
热备份是在系统运行的状态下备份数据,MySQL常见的热备份有LVM和XtraBackup两种方案
建议使用Xtrabackup热备MySQL
Xtrabackup介绍
XtraBackup是一款基于InnoDB的在线热备工具,开源免费。占用磁盘空间小,能快速的备份和回复mysql数据库
Xtrabackup优势
1、Xtrabackup备份过程不锁表,快速可靠
2、XtraBackup备份过程不会打断正在执行的事务
3、XtraBackup备份数据是经过压缩的,占用空间小
全量备份和增量备份
全量备份是备份所有数据。备份过程时间长,占用空间大
增量备份是只备份变化的部分数据,备份时间短,占用空间大
第一次备份数据库采用全量备份,之后采用增量备份
热备份流程
# 安装Xtrabackup
1、node1节点映射宿主机目录,目的为了方便导出备份数据
docker volume create backup
docker stop node1 && docker rm node1
docker run -d -p 3307:3306 -v v1:/var/lib/mysql -v backup:/data -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node2 --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
"""新增backup卷映射,重新将入PXC集群:CLUSTER_JOIN=node2"""
docker exec -itu 0 node1 bash
docker exec -it --user root node1 bash
1、yum install percona-xtrabackup-24
https://blog.csdn.net/kadwf123/article/details/80786139
2、
apt-get update
apt-fet install percona-xtrabackup-24
# 全量备份
innobackupex --user=root --password=123456 /data/backup/full
冷还原流程
数据库可以热备份,但是没有热还原
1、采用空白的Mysql还原数据库,然后建立PXC集群
2、还原数据前将未提交的事务回滚,还原数据之后重启Mysql
操作步骤
1、删除所有pxc节点
docker stop node1 node2
docker rm node1 node2
2、删除所有的docker卷
docker volume rm v1 v2
3、创建一个docker卷v1
docker volume create v1
4、创建一个pxc节点
docker run -d -p 3307:3306 -v v1:/var/lib/mysql -v backup:/data -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
5、进入node1容器
docker exec -it node1 bash
6、删除原有mysql的所有数据
rm -rf /var/lib/mysql/*
7、将备份数据未提交的事务回滚
innobackupex --user=root --password=123456 --apply-back /data/backup/full/2021-03-04_11-11-11/
8、还原备份的数据
innobackupex --user=root --password=123456 --copy-back /data/backup/full/2021-03-04_11-11-11/
9、重启下node1节点
docker stop node1
docker start node1
10、还原成功
增量备份自行百度