Docker搭建MySQL高可用集群
环境介绍
Ubuntu 16.4_64
docker 18.06.1-ce
准备阶段
安装docker
- 使用apt安装docker环境
1 | apt update |
- 配置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 | docker search percona |
percona-xtradb-cluster
的名字比较长,为了方便我们后面实验的使用,我们可以重命名这个镜像的名字:
1 | docker tag percona/percona-xtradb-cluster pxc |
配置阶段
创建并启动单实例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 | docker volume create --name v2 |
创建另外4个节点的截图如下所示: 其他节点创建成功之后,数据库已经自动同步了node1的信息(自动创建了test库,自动创建了student表),如下图说是。有兴趣的话,还可以选择任意一个节点写入数据和删除数据,观察其他几个节点是否实时同步了数据。
MySQL热备份测试
mysql备份有两个方案可以选择:LVM和xtrabackup。LVM是Linux系统自带的备份方案,唯一的缺点是备份mysql时,需要对mysql加锁,这个是不太好的。使用xtrabackup就没有这样的问题,直接可以热备份。 为了进行mysql热备份实验,我们创建node6节点,具体命令如下:
1 | docker volume create v6 |
如果要使用xtrabackup,则需要在容器内部进行安装。具体的指令如下:
1 | docker exec -it node6 bash |
注意: 如果进入容器后,执行apt update
提示权限不够,则需要使用root用户登陆容器,具体命令为:
1 | docker exec -it -u 0 node1 bash |
安装完毕之后,我们进行一次全量备份:
1 | innobackupex --user=root --password=abc123456 /data/backup/full |
备份成功之后,我们可以看到以下提示信息: 由于备份的数据库文件目录被映射到了宿主机上,所以可以在宿主机上查询备份的文件:
MySQL还原测试
mysql的还原只能使用冷还原,原因很简单,如果程序一边在写入,另一边在还原,这样就会造成数据之间的互相覆盖。使用xtrabackup还原的时候,需要进行以下几步:
- 解散mysql集群,删除所有容器已经数据卷(备份卷不能删除)。
- 重新建立容器,并登陆,删除容器内的数据文件
- 执行还原命令
- 重建其他节点,形成集群环境。
1 | docker stop node1 node2 node3 node4 node5 node6 |
说明: apply-back
是回滚所有未提交的使用。copy-back
是复制备份的数据库文件。