在云端采用云数据库能够保证高可用,进一步提升云数据库实例和数据的可靠性,还要对数据库采用多重备份机制,云平台提供了手动备份和自动备份的接口备份数据,并且支持将备份文件进行二次转存。备份的数据库可随时恢复或拉起新的实例投入使用。
不同于其他数据存储,关系型数据库有特定的备份方式,在采用高可用的云数据库的基础之上,仍需重视数据库的备份机制,以便在数据损坏、污染、丢失等情况下恢复数据库的数据和服务。
概要信息
- 设计模式:数据库备份回档机制
- 解决问题:需要对数据库实例进行多种方式的备份,对实时数据流进行备份,以便提升关系型数据存储的可靠性。
- 解决方案:通过云数据库提供的备份机制进行手动备份和自动备份,通过备份文件进行回档或重新创建数据库。将实时数据流备份到对象存储中。
- 使用时机:架构设计之初
- 关联模式:可靠性——采用高可用的云数据库,扩展——数据库层扩展
解决方案——云数据库备份回档机制
关系型数据库MySQL提供binlog及vardump方式对数据进行备份,云数据库对备份进行封装,可通过界面控制台、API或CLI来管理备份,通过云数据库自身提供的备份回档机制来保障数据的安全性和可靠性。
在云端构建的数据库方案中,建议采用原生的云数据库服务,而不是在云主机上自建数据库。如果是基于云主机的自建数据库,则可以通过MySQL的binlog机制自行定期备份。如果选用“原生”的云数据库服务,则可以采用数据库提供的备份回档机制,包括自动快照、手动快照、主从数据库实例、高可用版本的数据库服务等。
一直在运行的数据库实例支持回档操作,回档操作支持将数据恢复到指定时间段,这种方式相当于处于运行状态的数据库实例自身的备份,一旦发生数据库误操作、被污染等状况,回档操作可以恢复到指定时刻的数据。备份文件可以作为数据文件另行备份,特别是对于手动备份文件,云平台只能同时保存3份,适合将备份文件下载到本地或上传到对象存储中。云数据库备份回档机制如图所示。
图 云数据库备份回档机制
数据库备份
如下图所示,云数据库提供自动备份和手动备份两种快照备份方式,自动备份包括选择一周中备份的日期、备份时间段(建议选择业务低谷时间段)、逻辑备份或物理备份、配置无须备份的数据表。配置备份周期时采用与crontab相同的时间格式,通过界面配置最高每天一次备份的频率即可满足大部分自动备份需求,对于定制自动备份可以创建crontab定时执行基于API的备份脚本。手动备份是在界面控制台上通过按钮操作来进行备份。手动备份操作完成即可得到一份备份文件,云平台对手动备份文件的数量有限制,通常为3份。云数据库快照方式的备份为冷备份,备份后的文件并不能直接使用,需要基于备份创建新的数据库实例。
如下图所示,数据库备份分为自动备份和手动备份,系统按照用户设定的备份周期自动生成备份文件,云数据库提供备份检查告警功能,以确保自动备份有效执行,如果没有有效自动备份,该模块将会触发告警。手动备份的数量有限,同时可保留3份手动备份文件,在已经有3份手动备份时再进行手动备份会删除最早创建的手动备份文件。手动备份适合对一些不在自动备份时间范围内的重要时间节点的数据进行备份。
云数据库提供自动备份,备份间隔周期为一天,即每天备份一次。数据库备份属于非核心业务,应选择业务非繁忙时间段,在数据库读写压力最小的时间点进行备份,不同行业、不同用户的业务非繁忙时间段互有差异,因此每次备份的时间点支持自定义选择,如果凌晨2~4点属于业务低谷期,则适合选择这个时间段进行备份。
图 云数据库自动备份策略配置
自动备份的数据在云端存储的时长有限,自动备份数据可保存7天;虽然手动备份没有时间限制,但只能同时存储3份,为了延长数据备份的周期及数据可恢复的时间,可将备份文件和日志进行下载转存,长期保存备份文件,如下载到本地、文件存储中等,或直接转存到对象存储的标准存储中。及时将手动备份文件保存在对象存储中之后,在云数据库平台中将其删除,重复以上操作可以突破“3份”的限制而实现“任意”多份手动备份文件,但是系统运维和管理应该是自动化流程,有大量手动操作介入则会产生新的坏味道。
最佳实践
每天自动备份的文件和手动备份的文件应定期上传到对象存储作为二次备份,建议直接选择对象存储的低频存储并设置7天后转为归档存储,这是因为云数据库平台已经保留了7天的备份文件,能够满足正常的恢复数据的需求,如果需要恢复超过7天的数据或拉取7天前的数据作为沙箱环境,则从对象存储的归档库中“解冻”再恢复备份文件,导入云数据库平台后即可恢复数据。
云数据库的备份支持两种形式:逻辑备份和物理备份,如表所示。
表 云数据库的逻辑备份和物理备份
数据库回档及备份恢复
对于数据库实例,系统自动进行了备份,用户可选择需要恢复的时间点的数据进行回档。数据库回档会根据所选的时间点重新创建一个数据库实例,不会影响原有数据库的使用,在回档过程中新数据库的内存、硬盘、数据库类型(普通版本或高可用版本)、数据库版本(如MySQL 5.7、MySQL 8.0)等信息不可修改,应与原数据库相同。
除此之外,还有数据库的手动备份文件和自动备份文件,可以查看到数据库备份链。在备份链中可以选择自动备份和手动备份的文件,从备份链创建新的数据库实例,根据备份链中的数据记录时间实现数据恢复,如上图所示。
解决方案——流式实时备份数据
对象存储提供CLI工具对数据库数据进行流式备份及恢复,数据不落地,即不必在中间状态保存为备份文件。如下图所示,将流式数据库数据备份到存储有逻辑备份和物理备份两种方式。
图 流式数据实时备份
通过工具能够实时捕获日志内存并转存到对象存储中,逻辑备份使用mysqldump来导出数据库SQL语句并传递到filemgr的CLI工具中,按照stdin流式数据来上传,将收集到的SQL语句存储到对象存储的存储桶的文件中,该文件的文件类型不像普通文本是“text/plain”,流式文件的类型为“application/octet-stream”。mysqldump -A用于备份所有数据库,mysqldump -B用于备份多个数据库。物理备份基于xtrabackup来实现,支持全量备份和增量备份。
数据库备份机制对数据库的版本和来源没有要求,适用于MySQL、SQL Server、MongoDB等多种数据库,无论是自建数据库还是云平台提供的云数据库,均可以实现备份。备份到对象存储的文件类型为STORAGECLASS,包括标准存储(STANDARD)、低频存储(IA)、归档存储(ARCHIVE),其使用方式和普通文件相同。
# CLI命令
# 将所有数据库的日志内存逻辑备份到对象存储中
mysqldump -A | ./filemgr-linux64 --action stream-upload --bucket <bucketName> --key <backupKey> --file stdin --threads <threads> --retrycount <retry> --storageclass <storage-class>
数据库逻辑备份到对象存储中的文件如下图所示。
图 数据库逻辑备份到对象存储中的文件
恢复逻辑备份的数据时采用filemgr工具来下载文件,并将数据按照stream方式传输给MySQL来执行SQL语句。恢复物理备份的数据时需要先转移原来的数据库,备份恢复后再重启服务。
# CLI命令
# 逻辑备份全库数据
./filemgr-li
nux64 --action stream-download --bucket <bucketName> --key <backupKey> --threads <threads> --retrycount <retry> 2>./error.log | mysql