DreamBackup

开发背景

数据备份本来就是很常用的操作。

网站数据库记录已超百万,以前用的备份工具效果不理想,自带的数据备份早因数据过多而失效。多年来一直手工操作备份、打包,操作似乎有点太繁琐,而且有些时候因工作太忙,难免会延误备份。

近年来的开发项目多与数据库相关,随着项目的增加,数据库的增加,备份越来越复杂。

之前有考虑过用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任务

运行效果

发表评论

邮箱地址不会被公开。