从各“瘫痪”事件,看如何安全备份数据库到云存储


近几周互联网企业频繁暴出各类“瘫痪”事件,网易、支付宝也身负重伤,而5月28日携程网站服务及App全站瘫痪,从事故发生至恢复长达近12小时,造成的损失不言而喻。在对携程事件感到惋惜的同时,让大家不由感叹,对数据安全问题的重视已迫在眉睫。

随着数据价值的不断提升,数据安全问题里面,最常见的棘手问题为因黑客攻击而造成的用户数据泄密和丢失。纵观互联网高速发展的这些年,黑客攻击事件频发,光用户数据泄密就已有如下九大惨案载入互联网史册。


由以上数据统计可以看出,每次黑客攻击涉及的用户数量巨大。另有数据称,近4年的互联网安全事故导致11.3亿用户信息泄露。而在福布斯上榜的中国企业中,大多都曾经遭受过攻击或出现信息泄露,特别是一些掌握大量民众个人信息的企业成为黑客攻击的“重灾区”,其中不乏国内知名大公司,中国移动、淘宝、腾讯、小米以及12306。

当网站受到攻击,数据库会被破坏,这时需要从备份里面恢复数据库。防止黑客在入侵了以后,循着网站的备份脚本将备份删除掉,或者备份设备被入侵,数据库被破坏造成的备份丢失、泄露,是常规的备份手段难以解决的问题。因此,将数据库安全地备份到云存储实际上是一个比较简单且成本很低的手段。

那么,如何安全地备份数据库到云存储?牛小七将分三个步骤为大家详解。

如何导出数据

对于小数据库或者低压力数据库就很简单了,比如MySQL有mysqldump ,其它数据库也有相对应的dump工具,这些都能很好地解决问题。高压力数据库一般会做一个主从结构,如果从数据库能够停机就很方便,因为从数据库停机了以后不管是用dump还是直接用拷备文件,都能够快速方便地把数据库给导出来;如果从数据库不能停机,建议在从数据库下面的LVM磁盘层来处理。首先把从数据库设为只读并且同步所有数据到磁盘(比如 MySQL中的 FLUSHTABLES WITH READ LOCK),这种情况下数据库的读操作可以继续,但磁盘上的文件不再更改。

这时,在LVM层执行snapshot操作,完成之后,释放掉数据库中的锁。再从LVM的snapshot中拷贝文件,就得到一个很完整的数据库,并且不用担心备份了事务中间的状态。整个流程也很快,通常可以做到亚秒级的,而且在备份过程中从数据库一直是可读的,主从同步的延迟也影响很小,所以这个方案比较容易被接受,应用也比较广。

如何安全地加密数据

黑客入侵了之后,所有的脚本和很多加密机制都暴露在黑客面前。那么,怎样才能完成加密又能避免黑客拿到相关信息来解密你的数据呢?一个简单的方法是用非对称密钥,比如gpg就支持非对称加密,即gpg这边生成一对公私钥,私钥放在自己的电脑好好保存,公钥可以放在你的服务器上,用来加密你的数据,需要从备份恢复时才需要动用你的私钥来解密数据。

如何安全地上传数据到云存储

防止客户顺着备份脚本把你的备份删除或者覆盖是两个需要避免的问题。七牛云存储有上传凭证的概念,它是是七牛上传时用来鉴权的一个工具,它能很好地帮助你解决这个问题:

上传凭证中的路径支持通配符,如 /backup/*,前后多次备份都可以使用同一个上传凭证,不用每次准备一个新的通配符;

上传凭证具备有效期的概念,比如设一个一年的有效期,那么这一年的数据备份操作都可以用这个uptoken操作实现;

上传凭证还可以指定是否允许覆盖原始文件。

例如,指定key的名字是 /backup/*,每次备份都可以用这个上传凭证来上传,指定有效期一年且不允许覆盖,那么就可以做到方便地把你的数据备份放到云存储,不用担心黑客删除或者覆盖掉你的文件。

此外,七牛还额外做了些事情简化提高整个备份的健壮性,比如上传时支持分片上传的操作,当你的数据库比较大,100G或者更大的一个数据,想要一次性上传成功,即使机房到机房上传也是比较痛苦的,那么引入分片上传的操作就可以提高上传成功率。

备注:

上传凭证的细节可以参考:

http://developer.qiniu.com/docs/v6/api/reference/security/upload-token.html

有一些开源项目也是关于如何备份数据库到七牛的,比如:

* Ruby: https://github.com/lidaobing/backup2qiniu

* C#: https://github.com/abelyao/qiniu-backup

* Python: https://github.com/chitosai/backup2qiniu

大家也可以参考七牛的合作伙伴多备份的技术方案,也能为大家提供备份服务。