在2023年新年的第二周,美国东部时间1月11日上午,6点29分,美国航空监管机构(FAA)发布了一条仅40字的通告,随后不久,很快就宣布停飞全美所有国内航班。通告内容是,FAA正在对NOTAM(Notice to Air Missions)系统进行验证和恢复,在第一条通知之后的50分钟,FAA就宣布停飞所有国内航班。
这应该是自2001年911袭击以来首次出现如此大规模的禁飞。
在两个小时之后,也就是8点50分,FAA宣布NOTAM系统已经恢复,并彻底取消了之前的“禁飞令”。
FAA在当天的晚上18点31分,宣布这次系统宕机是由数据库文件受损导致的,并还将持续跟进并改进。
这次数据库故障影响的是NOTAM系统。具体的,NOTAM是“Notice to Air Missions”的缩写,该系统是用于向飞行员和其机组人员提供实时的潜在风行信息,包括了关闭的跑道、设备状态以及起降过程中相关航班信息等,是一个机场正常运行依赖的基础服务。
据一位ABC news(美国广播公司旗下的新闻事业部)的人员透露,根据内部的复盘信息,可能是由于在一次计划维护操作过程中,一位工程师进行了一次文件(数据库文件?)替换操作,之后就出现了故障,最终导致整个美国国内航空瘫痪。
所以,难道运维人员又要被背锅了?不过,目前为止,FAA仅表示该次事件应该与网络攻击没有关系,暂时还没有透露任何更加详细的信息。
相比互联网行业,航空业务是更加关键的。互联网很多系统出现故障,虽然影响面很大,但大多数都是在经济层面(虽然这个数额可能很大),而很多基础设施行业,如航空,其系统如果故障则可能导致性命攸关的灾难,这次FAA的处理与通知过程,是很多行业学习的典范。
对于FAA,这应该是一次p0级别的故障了,我们来看FAA主要的故障通知时间线吧:
完整的FAA消息记录:参考
由经验的技术人员一定都明白,系统一定会出故障,数据库也一定会出问题的,只是何时的问题。背后的原因有很多,例如,系统老旧年久失修,以致于当前的技术人员只能去修修补补,而且无法了解系统全貌,那么就会在某个角落踩到某个“坑”。也有可能是,人为失误、硬件故障、软件故障,还有可能是一些不可抗力。而一个大故障,还有可能是多个潜在问题,组合而成。总得来说,是防不胜防。
那么,构建合适的备份与容灾方案,已经成为当代系统可用性建设的重要组成部分。在软件设计过程中,以及实施和运维中,都需要考虑。但是,备份与容灾的投入有如下特点:
在很多的行业标准中都有对容灾规范的描述,例如ISO 22300、ISO 27001:2022、国内等级保护(等保)等。由IBM的SHARE用户组在1992年提出的“7 tiers of disaster recovery”,依旧是一个非常简洁、直白的划分。并在2012年,该等级划分新增到了八个等级:
这种情况下,系统是没有任何灾难恢复方案的,没有备份,没有文档,没有高可用计划。通常这种情况下,在发生故障时,系统的恢复时间(RTO)是完全不可预计的,事实上,很有可能系统就恢复不了。
这种情况下,系统有一份安全的、离线备份数据(通常是磁带)。根据备份的间隔,系统需要接受故障时一定程度的数据丢失,RPO可能是数小时或数天。根据数据量大小,存储设备的效率等,数据的恢复时间(RTO)则可能达数小时或数天。
在前面方案的基础上,还会时刻保障充足的资源和基础设施来进行灾难恢复,这时候,通常RTO是可以预期的。
在前面方案的基础上,对于业务中的关键系统的数据使用一个在线的、安全的存储系统保存,从而达到更快的数据/业务恢复。
该等级则要求基于在线的存储系统,实现按时间的数据备份规划。虽然,这种模式下,还是可能会有数小时数据丢失,但是,可以通过增加时间点的密度来减少数据丢失。
对于数据一致性非常高的系统,则需要达到这个等级,这种方案已经很接近于零数据丢失了,但,依旧需要依赖于上层的应用系统做一定的处理的。
这个等级下,无需依赖任何的上层业务系统,就可以达到零数据丢失或者极其少量的数据丢失。
在方案6的基础上,进一步实现了与业务系统的集成,可以实现自动化的灾难恢复,相比手动的恢复,可以实现更低的RTO。
在实际的场景中,我们看看有哪些对应的情况吧:
数据库作为企业数据最重要的持久层,通常,这份数据是最准确、最实时的数据,当其他系统出现数据不一致的时候,都需要依赖数据库中的数据。如果这份数据出现故障,则可能意味着企业的数据资产受损。
因此,数据库的备份也异常重要,而,相比其他数据的备份,数据库的备份也是更加复杂的。这也是为什么企业通常都需要专业的数据库管理人员的原因之一。
具体的,数据库种类繁多,版本也很多,而不同的数据库备份方案可能是完全不同的。例如,MySQL可能是使用外部工具备份、SQL Server则是使用内部命令等。对于增量备份,不同的数据库,差异则更大,有的需要通过归档日志实现、有的则可以通过实时的增量日志实现。另外,数据库备份时,除了备份数据文件之外,通常还需要备份配置文件、增量日志、数据库版本、甚至可能还需要保持部分的系统目录和文件,否则,则可能会出现恢复失败。数据库通常数据量非常大,备份时间很长,网络稳定性、磁盘故障率、OS稳定性等都可能会影响数据库备份效率与有效性。
而这些因素,都增加了数据库备份与恢复的复杂度。
数据库的备份方案有很多种。
如果使用的是云数据库RDS,那么,云厂商都会提供默认的数据库备份,不过作为企业依旧需要关注,这个备份的具体情况:例如是否是一个实时备份方案(RPO是否为分钟级),备份数据保存时间,备份数据恢复限制等。
如果使用的是自建数据库,无论是IDC自建还是EC2/ECS自建,则都需要企业中的专业人员(通常为DBA)来构建专门的数据库备份与恢复方案。根据业务系统的属性不同,可能选择使用不同的方案,例如如果业务连续和数据一致性要求并不高,则可以考虑使用EC2/ECS的快照备份,对于更多场景,则需要使用数据库自身的备份工具,构建一个更加实时的备份方案(通常RPO要求接近于分钟)。另外,通常还需要进行定期的恢复演练,避免在一些“角落”出现故障,导致看似正常运转的备份,其实是无效的。
总得来说,数据库备份与恢复是复杂的,需要专业的人员(通常是DBA)持续的维护与建设,并定期的进行演练以保障其确实有效。否则,就可能出现,靠天吃饭,人在家中坐,锅从天上来的情况。
orczhou是来自NineData(https://ninedata.cloud)的工程师。NineData向企业、开发者提供高效、安全的数据库SQL开发、数据库备份、数据复制/迁移/集成、数据对比等功能,是一个SaaS服务开箱即用,可以快速提升企业SQL开发效率,保障企业数据安全。