【编者按】作者Todd Hoff是High Scalability创始人,为我们解读Google数据保密和数据安全负责人Raymond Blum的演讲。数据安全的一个重要工作就是备份,备份的容量扩展、存储备份的媒介、备份的效率......通过对互联网中庞大数据多样化、复杂的备份, 使数据在任何情况下都能简单地还原、恢复。数据安全不仅仅是一个技术问题,它还受到现实的种种限制,做好数据安全,是任何一个企业都要考虑的问题。
以下为译文:
Raymond Blum带领Site Reliability Engineers团队负责谷歌的数据保密和数据安全。当然Google从来都不会如实说有多少数据,但从评论上看目前还没到yottabyte级(1YB=280B),不过也有很多exabyte级(1EB=260B)的数据了。仅Gmail就有接近exabyte的数据。
Blum先生在名为“谷歌如何备份互联网”的视频中解释,常见的备份策略对谷歌无效,原因听起来让人吃惊:它们大多是在努力用容量实现扩展。 如果备份两倍多的数据,那时间、能源、空间也会消耗两倍,如果不这么做,就不能进行扩展。要让容量比支持容量的能力扩充更快,必须要有效率。从备份 1exabyte数据转变到备份2exabyte数据,需要一个不同的计划。演讲的内容的主要关于Google是如何实现容量扩展的。
演讲的一些主要议题:
从无数据丢失。甚至影响颇为不好的GMail停电事件也没有丢失数据,这远比备份许多磁带要复杂的多。数据从整个堆栈检索,每一层都需要管理,包括对人的管理。备份无用。还原你想要的部分,这是指还原系统而不是备份系统。备份是你要为还原付出的高昂代价。将工作转移到到备份上并使备份适当的复杂,是为了让还原尽可能的简单。不可以线性扩展。不可能有100倍的数据,你就能得到100倍的人力和机器资源。你只能去寻找使能力倍增的方法。自动化是提高利用率和效率的主要途径。冗余。谷歌的存储设备一直在老化。这当然不用说都知道,就像我们身体的细胞会死一样,Google并没有幻想着事物不会消亡,它只是为事物的消亡做好准备。多样性。如果你担心某个站点的位置不安全,那就把数据放在多个站点。如果你是担心用户错误,那就将用户交互与数据隔离。如果你想要避免软件bug的损害,那就把数据放在不同的软件上。从不同的供应商获取存储设备,以减少供应商的bug影响存储的数据。将人从繁琐的劳动中解放出来。通过GMail保留一封电子邮件有多少备份?这不应该是人关心的事情。通过GMail配置一些参数,系统会具体安排。这是不变的主题,高级别策略设置和系统实现了它。只有规范之外的事情发生才会需要人的参与。证明。如果你不试用它,那它就不会起作用。备份和还原就是不断的测试,以验证它们的工作的过程。
无论组织大小,都有很多要学习的东西。Blum先生的演讲很风趣、信息量大、很值得一看。看起来他真的很喜欢工作中的挑战。
以下是我对这个演讲的注释,从中我们可以了解到许多不为人知的秘密:
数据可用性必须是100%,不能有数据丢失统计学上,2GB文件中如果丢失了200K数据,似乎没什么大不了,但这个文件或许就不能用了,比如说可执行文件或报税表。数据的可用性比可访问性更重要。如果系统关闭,后果并不特别严重。但如果数据丢失,那就不是小事了。谷歌保证用以下所有可能组合保证数据安全:位置隔离隔离应用层问题隔离存储层问题隔离媒介故障想象一下移动滑块的情形。让软件像纵向滑块那样,让地址像横向滑块那样。如果你想要包含一切,你需要不同地址的软件层备份。你可以在不同的地址使用虚拟机。冗余不等于可恢复性制作多个备份不能保证数据不会丢失。多个备份对某些种类的停机是有效的。例如一颗小行星击中一个数据中心,而在一个很远的地方,你有这个数据中心的备份。如果你在存储堆栈中有一个bug,那把它复制到N个地方也没有用,因为bug破坏了所有备份。示例:请参阅GMail停机。相比小行星,代码中的bug、用户错误或已损坏缓冲区的写入,这些故障发生要多得多了。冗余对访问局部性有帮助。当你想要所有的数据引用与正在使用位置的数据尽可能接近时,备份是个不错的选择。因为这么多的备份,整个系统非常稳健谷歌的设备一直在老化。这不用说也知道,我们身体的细胞也同样会死。我们并没有幻想事物不会消亡,我们只是在为消亡做准备。机器也一直在损耗。冗余就是答案。合计一下,这要比单一的高质量机器更加可靠。单一机器可能会被一颗小行星摧毁。想要摧毁放在50个不同地点的机器就难说了。大规模并行系统的数据丢失几率更大MapReduce在30000台机器上运行得很好,当然是在没有bug的前提下。一旦有bug出现,造成的影响也是成倍的。 本地备份不能防止站点停机如果你的服务器机房中发生灾难性的破坏,那RAID也帮不了你。Google文件系统(GFS),大约一年前,整个Google都在使用这个文件系统,它将RAID的概念又升级了一次。使用编码技术将数据写入不同城市的多个数据中心,只需要N-1个数据片段,即可还原完整的数据。所以即使3个数据中心中一个停机了,也不会影响数据可用性。可用性和完整性是组织广泛的特点谷歌的工程师们,BigTable,GFS,Colossus都知道数据持久性和完整性是第一任务。很多系统需要检查并更正在数据可用性和完整性上的错误。多样性如果你担心某个站点的位置安全,那就把数据放在多个站点。如果你担心用户错误,那就把用户交互和数据隔离。如果你想要避免软件bug的破坏,那就把数据放在不同的软件上。从不同的供应商获取设备,以减少供应商的bug影响存储的数据。磁带备份真的很不错磁带好是因为它不像磁盘那样。如果可能他们甚至会使用打孔卡。想象一下假如你SATA磁盘的设备驱动程序里有一个bug。磁带就避免了这一问题。因为不同的媒介意味着不同的软件,这就增加多样性。磁带容量遵循摩尔定律,所以他们对磁带作为备份介质都很满意,虽然他们还在寻找替代品,现在很难说这些替代品是什么。磁带加密意味着有着不良企图的家伙们将很难从磁带中得到有用的东西。备份是无用的,真正需要关心的是还原在有人需要数据之前发现数据是否存在问题,你确定需要数据时再还原。持续还原。不断随机选择5%的备份,还原并对它们进行比较。为什么呢?因为需要在数据丢失之前查明数据是否还能用,找出存在的问题。自动比较。因为原始文件已更改,所以不能与原始进行比较。所以将校验码和校验码进行比较。把它带到源媒介、磁盘或闪存,或者其它的媒介。请确保数据可以做一次往返,自动比较是一直都在做的事情。故障率变化的警报你可能想要知道是不是有什么发生了变化。如果一切运行正常,那就没有必要告诉我了。预期会有一些失败,但别第一次尝试还原的文件失败就发出警报。假设首次尝试的失败率是N,第二次尝试的失败率为Y。如果故障率发生变化那一定是哪里出问题了。损坏磁盘随时都有可能中断,但因为你监视它,所以你能及时的了解到。要是磁带的话,只有你使用它的时候,才知道是不是坏了。虽然磁带保存的时间很长,但是你想在用它之前检测它是不现实的。磁带上的RAID4不要将数据仅写到一盘磁带上。他们是墨盒,随时会有意外发生。向磁带写入数据时,编写器要保持数据不变,直到数据被完全写入。建立4盘完整磁带,然后通过XOR(逻辑运算)生成第五盘代码磁带。你可以失去5磁带的任何一个,也能恢复数据。现在告诉编写器它们可以更改源数据,因为数据已经到了到最终的物理位置,有冗余了。谷歌备份的每一bit数据都要经历这个过程。数以百计的磁带每个月都将丢失,并没有造成数据的丢失,就是得益于这个过程。假设当检测到一盘磁带丢失,通过使用连续还原和同级磁带重新生成另一个磁带,一切都没问题。在那种两个磁带都被损坏的罕见情况下,如果磁带上的受损的两个点相同,那数据就只好丢失了,只能在subtape一级完成重建。实现这些技术的成本很高,但是为了不丢失数据,很值得。备份是你为奢侈的还原付出的代价它是指还原系统而不是备份系统。还原是一个不可屏蔽的中断,他们胜过一切。让备份变得复杂而且只要需要就这样做。让还原变得快捷而且越自动化越好。恢复应该是傻瓜式、快速和简单。就算是一只猫也能完成还原操作。无论你休息得很好还是累的很惨,还原时才不会问你是不是准备好了。所以不要让人为因素决定服务数据还原的成功与否。大部分的系统都是这样工作的。数据源或许能够将数据存储一段时间,也许是在它备份之前的几天。但一旦备份完成,它随时都可以还原,而且还原得很快。为了使还原速度更快,不能将全部资源用于备份。花两个小时来读取磁带是不可行的。只写一半磁带,并行读取它们,这样你仅用一半的时间就可以获取数据。扩展是个问题当你有exabyte级的数据时,也会有现实世界的限制。如果你要复制10exabyte数据,然后它会花10周时间备份每一天的数据。考虑到分布在世界各地的数据中心,可供选择的方案并不多。你能给每个站点无限的备份容量吗?你会按区域划分所有备份吗?转移数据的带宽呢?你难道不需要带宽来为挣钱的流量服务吗?看看有关的费用。也有一些妥协方案,比如不是每个网站都有备份设施。必须平衡网络中的可用容量。怎样才能最划算?例如,只在有足够带宽的站点中进行备份。不能线性扩展你不能只是说想要更多的网络带宽和更多的磁带驱动器。驱动器中断的情况,如果你有10000个驱动器坏了,你需要10000个运算器来替换它们。你有10000个装卸码头来放磁带驱动器,直到一辆卡车把它们运走。这一切都不可以是线性的。虽然磁带库的数量提高了一个数量级,但参与其中的人并没有随之线性增长。比如早期曾有人预测,随着电话的增多,30%的美国人会被雇佣为电话接线员。显然他们没预见到未来的自动接线。自动化调度被自动化。如果你有一个服务,你说:我有一个数据存储,每N天我需要一个备份,在M时必须还原。内部系统完成这些事情:计划备份、运行还原测试和运行完整性测试等等。并且磁带故障的处理也是全自动的。人是无法看到这些的。也许有一天,你可能会问平均多少个磁带损坏了。或如果磁带破损率从每天100盒磁带变成每天300盒磁带时,就会发出警报。但在那之前不要问我:如果一天100盒磁带损坏是不是在正常水平内?人不应参与稳态操作装载和运输驱动器仍然是人类的活动。自动化的接口准备装运标签,得到RMA号码,检查已经出来的软件包,拿回执,如果出现故障,人才会进行干涉。库软件维护也类似。例如固件更新时,人不会将这些更新运行在每一个系统中,系统会自动下载这些更新,并进行验证、运行。这些常规的操作不需要人的干预。自动处理死机事件机器平均一分钟死两台。如果一台机器在进行MapReduce作业期间使用30,000机器,有一台机器死机了,那就不要告诉我了,处理完它,继续工作。找到另一台机器,转移任务,重新启动。如果有依赖关系那就先等待。如果你等得太久,就让我知道。你处理你自己的计划。这是算法的工作,不需要人为的操作。保持效率正向提高大幅提高利用率和效率。不能有100倍的数据就需要100倍的人或机器资源。2011年Gmail停机和还原,谷歌如何丢失数据又找回