环境准备
1台服务器,CentOS 7.2 及以上,1G内存以上,1核处理器以上,40G存储以上
percona使用pxc协议,同步使用wsrep,备份使用xtrabackup
这里为了方便演示,我们只在同一台宿主机上启用两个容器,一个是master,一个是node
配置环境
#安装docker
yum install -y docker
#启动docker
systemctl enable docker && systemctl start docker
#如果启动docker失败,请修改如下值
#重新编辑docker配置文件:
sed -i 's/--selinux-enabled/--selinux-enabled=false/' /etc/sysconfig/docker
#下载percona-xtradb-cluster镜像
docker pull percona/percona-xtradb-cluster
docker tag percona/percona-xtradb-cluster pxc #更改镜像标签
#添加一个专用的网络用于pxc
docker network create --subnet=172.19.0.0/24 pxc_net
docker network inspect pxc_net
#添加本地数据持久化目录,这里也可选择使用nfs挂载文件服务器的目录或者使用ceph分工化文件集群
mkdir /home/pxc/backup -p
mkdir /home/pxc/master.data /home/pxc/master.log /home/pxc/node.data /home/pxc/node.data
chmod -R 777 /home/pxc/* #或者chmod -R mysql:mysql /home/pxc/*
启动容器
#创建master容器
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root \
-e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root --net pxc_net \
-v /home/pxc/master.data/:/var/lib/mysql -v /home/pxc/master.log/:/logs \
-v /home/pxc/backup/:/backup --privileged --name master pxc
#创建node容器
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root \
-e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=master \
--net pxc_net \
-v /home/pxc/slave.data/:/var/lib/mysql -v /home/pxc/slave.log/:/logs \
-v /home/pxc/backup/:/backup --privileged --name node1 pxc
测试
docker exec -it master /bin/bash
mysql -u root -p
#输入密码
show databases;
#在master上创建一个新库test
create database test default character set utf8;
quit;
exit;
#连接到node上
docker exec -it node1 /bin/sh
mysql -u root -p
show databases;
#这里我们会看到新刚创建的test数据库
全备份与恢复
docker exec -it master /bin/sh
#开始全备份
innobackupex --user root --password root -- /backup/
#查看全备份
ls -l /backup
#结果可以看到新产生一个文件夹,如:2020-03-27_01-09-09
#尝试在这里将test数据库删除
mysql -u root -p
drop database test; #此步删除,会将集群所有的test数据库同步删除
#然后通过恢复备份,找回数据
#首先需要apply全备份
innobackupex --apply-log /backup/2020-03-27_01-09-09/
#看到completed OK!说明成功了
#然后清空data
rm -rf /var/lib/mysql/*
#恢复数据
innobackupex --copy-back /backup/2020-03-27_01-09-09/
#测试
mysql -u root -p
show databases;
#这里可以看到被删除的test恢复了。
#请注意,这里恢复之后,需要重启docker容器,因我们使用了集群,所以需要将所有的容器都重启一次。
#重启后,node节点会自动从master节点同步
docker restart master node1
增量备份与恢复
#在test里,添加一个表并插入数据
docker exec -it master /bin/sh
mysql -u root -p
use test;
CREATE TABLE t (
id int(11) NOT NULL,
PRIMARY KEY (id)
) DEFAULT CHARSET=utf8;
insert into t values(1);
#开始基于上次的全备份做一次增量备份
innobackupex --user root --password root --incremental /backup/increment/ --incremental-basedir /backup/all_db/2020-03-27_01-37-58/
#删除表t
mysql -uroot -proot test
drop table t;
#恢复增量
rm -rf /var/lib/mysql/*
innobackupex --apply-log --redo-only /backup/all_db/2020-03-27_01-37-58/
innobackupex --apply-log --redo-only /backup/all_db/2020-03-27_01-37-58/ --incremental-dir=/backup/increment/2020-03-27_02-23-13/
innobackupex --copy-back /backup/all_db/2020-03-27_01-37-58/
#完成。
#请注意,这里恢复之后,需要重启docker容器,因我们使用了集群,所以需要将所有的容器都重启一次。
#重启后,node节点会自动从master节点同步
docker restart master node1