开发背景
数据备份本来就是很常用的操作。
网站数据库记录已超百万,以前用的备份工具效果不理想,自带的数据备份早因数据过多而失效。多年来一直手工操作备份、打包,操作似乎有点太繁琐,而且有些时候因工作太忙,难免会延误备份。
近年来的开发项目多与数据库相关,随着项目的增加,数据库的增加,备份越来越复杂。
之前有考虑过用PHP做一个备份工具,但始终是不适合,因而一直没有落实。
之前所学的编程语言大都是Windows下的,在Linux下无法很有效地使用。所以,在学习了Go后,发现用来做此项目实在是非常适合,终于可以把之前的想法实现出来。
开发限制
MySQL的备份工具普遍是PHP做的,但是我网站也是用PHP做的。在进行备份时,因为数据量大,备份时间比较长,导致PHP进程一直卡住,进而影响到网站的正常访问。
由于PHP有在线运行这一特性。虽然可以取消,但是需要高权限,而且一旦设置就全局启用,一旦其中一个脚本卡住就很容易导致全部当机,非常不安全。
PHP还有被动运行的特性,不适合做定时任务,尤其是空闲期运行的定时任务。
PHP的开源特性,用于加密解密数据库,实在是不适合。
综上所述,PHP不适合本项目。
定时备份
由于数据备份涉及到大量数据库读取操作,会影响到网站的响应速度。
定时备份有2个方面,一方面是指以固定的周期,对数据库进行备份。
另一方面,是指在固定的时间,对数据库进行备份。
而这个时间,必须是网站访客较少的时间,既能加快备份的速度,又可以减少对网站的影响。
分卷备份
数据库备份工具普遍都有分卷备份功能。
开发的想法是好的,可是,对于大数据的网站,反而不适用。
首先是分卷备份会导致备份时间大幅延长,尤其是对于PHP做的备份工具,会导致整个PHP进程卡住,影响到其他PHP进程,特别是网站的正常运行。
更重要的是,分卷备份对导致大量重复的数据库分页操作,增加数据库负载。而且在备份过期中,不可避免地产生表锁。重复地分页,不断重复的表锁,极大地影响到相关项目的正常运行。也是因为重复地分页操作,导致备份会越来越慢。
在之前的一个企业项目中,就有一个1G多的数据库,开始的时候1秒一个分卷,10个分卷后就1分钟一个,到后面几个小时都备份不了一个分卷。
参数加密
为了方便安装使用,所有配置都是通过命令行参数设置的。
然而要备份数据库,不可避免地需要数据库的账号密码。
但是把相关资料明文放出来,始终有所不妥。最后的解决方法就是加密参数了。
加密算法是通过正反向乱序四次加密的,所以,无论是增、删、篡改密文或部分密文,都无法得到原始数据。
压缩备份
数据库大多数是文本内容,所以有非常可观的压缩率。
经过压缩后,既可以减少空间占用,又加快了传输速度。
这里特意使用了7z压缩,既不需要像RAR一样需要商业授权,也有着比ZIP、RAR更高的压缩率。唯一不足就是压缩时间稍长,但毕竟是在服务器空闲时间处理的,不会影响到其他项目的正常运行。
加密备份
为了数据安全,导出的数据库备份会被加密处理(可选)。
远端备份
数据库备份完成后,会被发送到远端统一处理。
然后用户就可以到远端定时管理、下载数据库备份。
操作流程
1. 准备好相关参数
示例参数
-mysqldump=/usr/mysql/bin/mysqldump -7z=/usr/7z/p7zip
-password=123 -dbhost=localhost -dbuser=root -dbpass=root -dbport=3306
-url=http://127.0.0.1:8080/
2. 在服务端生成密文
3. 在数据库服务器上安装客户端,并添加crontab任务
运行效果