两周前阿里云的事,动静大到几乎我在的每一个基础设施群都在吃瓜,甚至有和技术无关的群,例如足球游戏群,都在聊这事,足以见影响之广。据微博一位大佬说最后排查是因为鉴权问题导致。但是看到公有云大面积服务瘫痪,早上上班路上又看了白鳝老师的文章《云上的可用性依旧是有依然是有代价的》,仍然还是唤醒了我一些过往的记忆。本篇文章我想围绕着两个点展开说说:云上数据库要不要备份以及云数据库怎么设计备份。
云上数据库要不要备份
这个问题如果是老dba估计会说”这还用问吗“。
之所以要强调这一点,是因为真有过一个号称20年数据库从业经验的大聪明跟我说,云上数据库不需要备份,也不需要做备份功能。到客户那就跟他们说”美国xx银行就跑在公有云上从来不备份blabla”,如果真跑到中国的企业那里说,估计就是左脚被踢出去还是右脚被踢出去二选一。
这里的云上数据库,既有公有云,也有私有云。我的观点是,云上数据库仍然需要备份,因为任何基础设施或者系统,都有崩溃的可能性。只要不是100%可用的系统,都需要备份。上dba课第一天,老师就一再强调过,永远不要让你的数据库处于不可恢复的状态,永远要保留一份数据冗余。后来十年的工作经历中,也确确实实在有一次又一次的紧要关头,备份集救了我也救了系统。而这些年来,我也亲身经历过认识的朋友在求助,数据没有备份怎么恢复的事。都是血泪的教训。
云上的基础设施,仍然还是由各个基础设施软件与人进行维护,这中间永远无法避免出现各类错误,软件的、人的、人力不可抗拒的。所以仍然要做好最坏的打算,用流浪地球里的话说——饱和式救援。无论从哪个角度,一份冗余的备份集,都是我们恢复数据成本最低的方式。有时候越是原始简单的东西,在救命的时候就越可靠。
再延伸一步,共有云上要不要灾备?这个就丰俭由人了。因为每个企业的成本支出以及规划都不尽相同。有的系统仅仅是保持可用不丢数据即可,有的系统则需要按照监管要求的n级建设。如果是有明确要求或者系统等级非常重要的情况下,我建议做灾备。而在2023年11月中旬的节点,我甚至觉得,一些重要的系统,有必要考虑跨云备份以及跨云的灾备环境。就如同我们以前运维团队常说的一句话,出过一次问题的环境,一定就会再有下一次。
扯句题外话,之前工作过的一家公司,我们也把一些数据库放到公有云。要不要备份这件事,领导说的很具体形象:“你和xxx每天见面,一起工作一起吃饭,在他负责的操作系统和服务器上的库你都得每天备份。公有云的运维你都不认识,怎么就敢完全相信他们?”想想确实是,每天看得见的同事,摸得着的服务器都要备份,放在云上看不见摸不着的系统怎么就不备份了?
云数据库怎么设计备份
我们日常的数据库备份,按照备份方式备份物理备份和逻辑备份,按照备份的数据量分为增量备份和全量备份。这些过往经典的数据库备份理论,放在云数据库上仍旧有用,万变不离其宗,最经典的理论部分亘古恒新。
物理备份和逻辑备份各自有各自的优点,物理备份在于备份的效率。用过rman的朋友都知道,rman的多通道备份效率非常高,比逻辑备份的数据泵快很多。而且在12c之后,rman也做到了不同层级不同粒度的备份,这使得物理备份的手段和灵活性都有了极大补充,不再需要像以往那样动辄全库备份。对于日常的生产备份来说,物理备份是首选。数据库体量越大,物理备份的效果就越明显。所以无论怎么样,我都建议去设计并开发物理备份。而且要做到不同表之间的时间戳在同一个备份集中保持一致,至于是用快照的方式还是用日志追平的方式,根据自己的实际开发情况来定。
逻辑备份是不是就不做了?尤其是mysqldump在8.1已经被废弃的情况下。我的观点是,仍然有必要,但优先级可能没那么高。逻辑备份最大的好处是,导出的是sql。在不同异构数据库之间传递迁移数据,是一个常用的场景。另一个就是逻辑备份的灵活性。逻辑备份可以精确到表级别,甚至有的逻辑备份可以按照过滤条件去备份。这些都是物理备份可能不具备的优势,这种灵活性在实际生产中仍然有需要。但是什么时候开发,开发到什么程度,取决于实际客户的场景。有需要就做,没需要就暂缓。
而全量备份做不做,没有什么异议,更多的在于增量备份。现在国产数据库的增量备份,很多是用全量 归档日志的方式来实现。这也是一个比较合适的办法。这样做的好处是可以通过归档日志来控制,到底将数据库还原到哪个时间点。也有一些基于对象存储开发的数据库,实现了基于快照开发的branch备份。这个的好处是备份速度更快,既有全量备份又可以做到增量。本身对象存储的低成本优势同样可以发挥出来。
永远不会有dba嫌数据库备份的方式多,甚至直到今天,我仍然还有使用oracle的0级1级2级备份的习惯。按照自己的需求,把备份粒度做到最细,也是对自己的一个保障。云存储成本日渐低廉的今天,云数据库更应该发挥这方面的优势,把备份做好,而不是认为云技术可以不用备份。从dba的角度,没有备份功能的数据库,验证出不需要备份说明厂商厉害,一旦出了问题就是自己背锅,典型的高风险零回报。而且节约的那点存储成本,真到了业务损失的时候,可能是忽略不计的。甚至把自己过往的工作都给抹掉了。
不知道10年后,公有云上的数据库会进化成什么样子,但是只要基础设施还没有出现100%可用,我一定是坚持备份的那个。