k8s下MySQL完美的备份方案
前言 此前一直在使用 mysqlshell 来备份部署在 k8s 上的 MySQL,虽然这个工具比起 mysqlpump 来说要快很多,支持多线程、可以直接备份到远程 s3 等,但是后面使用过程中也陆陆续续发现了一些问题: CPU 占用过高 由于开启了多个核来并行执行提升速度,所以每次执行备份的时候 CPU 只能在凌晨时间,这样极端情况下可能会导致丢失一天的数据。 无法增量备份 每次备份的时候都是全量备份,这样也会导致备份的数据占用空间过大。 恢复数据慢 由于 mysqlshell 备份的数据是逻辑备份,所以恢复数据的时候会很慢。如果另外两个问题还是可以忍受的话,这个问题是无法忍受的。比如在进行服务器迁移的时候,系统恢复的时间就会很长。 使用 xtrabackup 之前也曾调研过 xtrabackup,xtrabackup,强大的 MySQL 备份工具,但是由于 k8s 下的 MySQL 是使用的 PVC,所以无法直接使用 xtrabackup 来备份。后面实在忍受不了 mysqlshell 的问题,所以又重新研究了一下,最终找到了一个比较完美的解决方案。 打包一个基础镜像 Dockerfile 这个 Dockerfile 里面安装了 xtrabackup 和 rclone,rclone 是一个支持多种对象存储的命令行工具,可以用来将备份的数据上传到对象存储等。然后启动的时候会执行 entrypoint.sh,这个脚本会启动一个 cron 定时任务,每小时执行一次 backup.sh,这个脚本会根据是否存在全量备份来执行全量备份或者增量备份,然后将备份的数据上传到对象存储。 FROM ubuntu RUN apt update && \ apt install -y wget cron lsb-release curl gnupg2 zstd unzip && \ wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb && \ dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb && \ apt update && \ percona-release enable-only tools release && \ apt update && \ apt install percona-xtrabackup-80 -y && \ rm -rf percona-release_latest.$(lsb_release -sc)_all.deb RUN curl https://rclone.org/install.sh | bash COPY backup.sh /backup.sh COPY entrypoint.sh /entrypoint.sh RUN chmod +x /backup.sh && chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] backup.sh 这个脚本执行了实际的备份操作,备份的数据会存放在 /backup 目录下,然后会将备份的数据同步到 s3 上。 ...