瞎折腾建站为了节省成本,只能买些小品牌服务商的 VPS. 小品牌不放心,数据得自己好好备份.

MySQL 备份方式有很多,比如直接 Dump ,但小 VPS 空间少,带宽少,拉到本地速度慢.除非是数据库数据比较小,不然不推荐用 Dump 来备份.
增量备份还可以考虑 XtraBackup ,但维护起来比较麻烦,而且也占用本地空间.

个人看来,使用从库应该是备份 VPS 的 MySQL 的最佳方案.

  • 占用空间小(binlog 需要占用一些空间)
  • 增量同步,比较实时(只要网络与IO跟的上,从库基本上没有延迟.个人测试,国外主库,国内从库,有1小时的延迟的样子)
  • 稳定,搭建后维护成本低.

为什么选择 Docker 来搭建从库,而不是直接安装 MySQL 到主机上?
有时机器上面已经安装了 MySQL ,再搭建一个 MySQL 做从库,需要改 MySQL 配置文件,添加开机自启脚本,麻烦,容易出错.而 Docker 可以完美的解决这些问题.

使用 Docker ,你可以在两台不同的 VPS 互相做主从备份,或在家里的电脑,自己的工作电脑建立从库(不是 24 小时开机的话, 主库的 binlog 保存久一点), 而不影响主机上原有的 MySQL 的使用.

本教程基于 Percona 编译的 MySQL 版本, 主从库版本请一致.
本文对于 Docker 和 MySQL 的主从配置写的不是很详细,需要自己有一定的基础.

参考链接:

  • https://www.percona.com/blog/2016/03/30/docker-mysql-replication-101/
  • https://hub.docker.com/_/percona
  • https://www.percona.com/doc/percona-xtrabackup/LATEST/backup_scenarios/full_backup.html

1 安装 Docker

请参考官网链接 https://docs.docker.com/install/

2 拉镜像

请根据自己的版本需求修改 tag .

docker pull percona:8.0

3 备份主库数据库

使用 XtraBackup 备份主库数据(不用停机), 然后把备份文件打包,下载到从库机器上面 (速度慢就套层 CF CDN).

xtrabackup --backup --target-dir=/data/backups/

具体教程 https://www.percona.com/doc/percona-xtrabackup/LATEST/backup_scenarios/full_backup.html

4 准备从库数据库文件

在从库机器上面解压数据库备份文件,然后执行准备命令. 执行了 prepare ,这个时候 MySQL 就可以直接基于此目录的数据文件启动了.

xtrabackup --prepare --target-dir=/data/backups/

6 创建从库数据库配置文件

vi /data/confs/slavedb.cnf
# Config Settings:
[mysqld]
server-id=2

注意主库也要配置一个不同的 server-id , 并开启 binlog .

5 修改数据库文件用户 ID

sudo chown -R 1001:1001 /data/backups/
sudo chown -R 1001:1001 /data/confs/

之所以改成 1001 ,是因为 Percona 的 MySQL Docker 镜像启动 MySQL 用的用户 mysql 的 id 是 1001 . 而 archlinux 的 mysql user id 是 89 .所以只能直接改 user id .

其它 MySQL 镜像的 user id 也许不一样, 可以先启动一个 MySQL Docker 实例,然后再使用 docker exec -it mysql-slave bash 启动一个 shell, 再在 shell 执行 id 命令,即可找到正确的 user id .

如果文件权限不改对,启动 MySQL 会报错的. 可以使用 docker logs mysql-slave 查看报错信息.

6 创建主库 MySQL 用户

CREATE USER 'repl'@'%' IDENTIFIED BY 'mysqlpass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

把密码修改成你的复杂密码,在 mysql 8, 这密码的复杂度是创建不了用户的.

7 启动从库

docker run --name mysql-slave -d -v /data/confs:/etc/mysql/conf.d -v /data/backups:/var/lib/mysql -e MYSQL_ROOT_PASSWORD='your_master_root_password' -d percona:8.0
docker logs mysql-slave # 查看是否有报错,有报错解决报错
docker exec -it mysql-slave bash # 启动 shell, 之前输入 mysql -uroot -pyour_master_root_password 连接 mysql 进行管理.

不同的 Docker 镜像, -v 参数有可能不同,请以自己的镜像文档为准. https://hub.docker.com/_/percona

8 配置从库

在上个步骤已经启动一个 MySQL shell ,现在我们需要配置从库连接到主库即可.

change master to master_host="mysql master ip",master_port=3306,master_user="repl",master_password="mysqlpass",master_log_file="mysql-bin.000007",master_log_pos=155;

start slave;

show slave status;

master_log_file 与 master_log_pos 查看数据库备份文件夹的 xtrabackup_info 的 binlog_pos 即可.

到这一步,整个从库已经配置成功,可以使用 show slave status 查看从库状态. 在主库上面使用 show master status 与从库对比,查看同步延迟.

最后,记得设置 docker 服务为开机自启.