环境介绍

  • Ubuntu 16.4_64
  • docker 18.06.1-ce

准备阶段

安装docker

  • 使用apt安装docker环境
1
2
apt update
apt install docker.io
  • 配置docker加速器

由于docker的主服务器架设在国外,我们在国内下载镜像的时候速度比较慢,所以最好配置一个国内的加速器。

1
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh  sh -s http://f1361db2.m.daocloud.io

这里使用的是DaoCloud提供的加速器。

  • 创建docker网络

docker内部默认使用的网络是172.17.0.xxx,如果我们要使用172.18.0.0网段的信息,则需要我们自己创建,命令如下:

1
docker network create --subnet=172.18.0.0/24 net1
  • 创建docker卷

我们要使用docker创建mysql数据库的集群,数据库运行在docker容器中,由于容器经常会被我们删除重构,为了避免删除容器的时候,数据不会被删除掉,所以我们需要把数据文件保存在宿主机上。这样,即使我删除了某个容器,数据文件还在,只需要重建容器的时候,指定数据库文件的路径,就可以还原数据库了。这时我们需要使用到docker的卷来实现此功能。 创建数据卷的命令如下:

1
docker volume create v1

使用docker inspect v1可以查看刚刚创建的v1卷信息。

下载PXC镜像

关于PXC的介绍,此处不再赘述,可以自行百度了解。(选举机制)

  • 使用docker的search命令搜索percona,然后找到percona/percona-xtradb-cluster镜像,下载该镜像。

说明: 下载PXC镜像并不需要先使用search命令,这里使用search命令,主要目的是为了演示该命令的使用,毕竟我们不能100%的记住某个镜像的名字,当我们记不住的时候,search命令就可以帮我们查询了。

1
2
3
docker search percona
docker pull percona/percona-xtradb-cluster
docker images

percona-xtradb-cluster的名字比较长,为了方便我们后面实验的使用,我们可以重命名这个镜像的名字:

1
2
3
docker tag percona/percona-xtradb-cluster pxc
docker rmi percona/percona-xtradb-cluster
docker images

配置阶段

创建并启动单实例MySQL

1
docker run -d -p 3306:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc

说明: 创建的第一个节点,由于数据库需要初始化等原因,速度可能会稍微慢一些,大约需要1分钟左右,通过客户端尝试去链接这个数据库,连接成功,说明数据库已经创建完毕。 新建test数据库,然后新建student表。

配置MySQL高可用集群

单节点node1已经创建成功,接下来我们准备创建node2,node3,node4,node5节点。

1
2
3
4
5
6
7
8
docker volume create --name v2
docker volume create --name v3
docker volume create --name v4
docker volume create --name v5
docker run -d -p 3307:3306 -v v2:/var/lib/mysql -e CLUSTER_JOIN=node1 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc
docker run -d -p 3308:3306 -v v3:/var/lib/mysql -e CLUSTER_JOIN=node1 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc
docker run -d -p 3309:3306 -v v4:/var/lib/mysql -e CLUSTER_JOIN=node1 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc
docker run -d -p 3310:3306 -v v5:/var/lib/mysql -e CLUSTER_JOIN=node1 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc

创建另外4个节点的截图如下所示: 其他节点创建成功之后,数据库已经自动同步了node1的信息(自动创建了test库,自动创建了student表),如下图说是。有兴趣的话,还可以选择任意一个节点写入数据和删除数据,观察其他几个节点是否实时同步了数据。

MySQL热备份测试

mysql备份有两个方案可以选择:LVM和xtrabackup。LVM是Linux系统自带的备份方案,唯一的缺点是备份mysql时,需要对mysql加锁,这个是不太好的。使用xtrabackup就没有这样的问题,直接可以热备份。 为了进行mysql热备份实验,我们创建node6节点,具体命令如下:

1
2
3
docker volume create v6
docker volume create node6_backup
docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v6:/var/lib/mysql -v node6_backup:/data --privileged --name=node6 --net=net1 --ip 172.18.0.7 pxc

如果要使用xtrabackup,则需要在容器内部进行安装。具体的指令如下:

1
2
3
docker exec -it node6 bash
apt update
apt install percona-xtrabackup-24

注意: 如果进入容器后,执行apt update提示权限不够,则需要使用root用户登陆容器,具体命令为:

1
docker exec -it -u 0 node1 bash 

安装完毕之后,我们进行一次全量备份:

1
innobackupex --user=root --password=abc123456 /data/backup/full

备份成功之后,我们可以看到以下提示信息: 由于备份的数据库文件目录被映射到了宿主机上,所以可以在宿主机上查询备份的文件:

MySQL还原测试

mysql的还原只能使用冷还原,原因很简单,如果程序一边在写入,另一边在还原,这样就会造成数据之间的互相覆盖。使用xtrabackup还原的时候,需要进行以下几步:

  1. 解散mysql集群,删除所有容器已经数据卷(备份卷不能删除)。
  2. 重新建立容器,并登陆,删除容器内的数据文件
  3. 执行还原命令
  4. 重建其他节点,形成集群环境。
1
2
3
4
5
6
7
8
docker stop node1 node2 node3 node4 node5 node6
docker rm node1 node2 node3 node4 node5 node6
docker volume rm v1 v2 v3 v4 v5 v6
docker volume create v1
docker run -d -p 3306:3306 -v v1:/var/lib/mysql -v node6_backup:/data --privileged -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 --name=node1 --net=net1 --ip 172.18.0.2 pxc
rm -rf /var/lib/mysql/*
innobackupex --user=root --password=abc123456 --apply-back /data/backup/full/日期
innobackupex --user=root --password=abc123456 --copy-back /data/backup/full/日期

说明: apply-back是回滚所有未提交的使用。copy-back是复制备份的数据库文件。