《设计数据密集型应用/DDIA》精要翻译(一) :reliability, sca
这是第一章第一节的读书笔记,介绍了reliability,scalability,maintainability这样的常见术语,以及我们如何能够实现这些目标。 一、Reliablity, 可靠性先看一下对可靠性的定义:就算系统出现了例如硬件损坏或者人为错误之类的情况,它依然能够按我们所预期的那样运行。一个系统可能发生的错误分为以下3类: 1.硬件错误包括磁盘损坏、内存损坏、机房断电、网线被挖等等。(磁盘的平均寿命是10到50年, 也就是说, 如果一个存储集群有10000块硬盘,平均每天都会坏一块。) 要应对硬件错误,我们的第一反应是对硬件做冗余,比如对磁盘用RAID阵列,机房双电源、热插拔CPU。 但是,由于很多应用的数据量和计算量相较以前都已经增长了很多,它们都用上了更多的机器,也因此增大了硬件故障的速率。此外,像AWS这样的云平台上的虚拟机常常会没有任何报警就挂掉,因为它们的设计是灵活性的优先级高于单机可靠性。所以现在的很多系统还会通过软件层面的容错方法来让自己变得更稳定。 2.软件错误软件错误不像硬件错误那样。 对硬件错误而言,一台机器的硬盘坏了,不意味着另一台的也会坏。 但是对于软件错误, 如果一个实例上的软件有问题,那每个都是有问题的。而且它会引发瀑布式的后果,一个组件的错误会引起另一个的错误。 对于软件错误,没有快速的解决方案,我们只能从一些小地方着手:
3.人的错误人是不可靠的, 根据统计,大部分的错误都来自于运营配错了配置项。因此,也需要一系列的手段来对各种人为错误进行预防和快速恢复:
二、Scalability 可伸缩性对于一个系统而言, 就算它今天是能够可靠地运行的, 那也不意味着它将来也是可靠的。这种情况可能是因为: 系统的用户数从1W增长到了100W。 可拓展性是我们现在用来衡量一个系统应付增长的负载的能力的一个标准。 那么,什么是负载拿推特举例,发推文的平均qps是4.6k, 获取自己的timeline的平均qps是300k, 要支持几十k的写请求和几百k的读请求可以说是很简单的。对于推特而言, 它的可拓展性的挑战来源于它的用户关注系统: 用户在拉自己的timeline时, 需要获取自己关注的用户发的推文。 推特的timeline系统经历过以下几个阶段:
什么是“性能好”不同的系统,评价它性能的指标是不一样的:
如何对增长的负载保持好的性能有以下几点需要注意:
三、可维护性众所周知,一个软件的主要成本不是开发的费用,而是后期维护的费用:修bug、适应新平台、改功能等等。 而维护一个老系统是痛苦的,大多数人都不想干这个。每个老系统都有各自令人讨厌的地方,难以给出通用的建议去处理它们。但是我们在设计系统的时候,可以参考以下3个原则: 1.可操作性, 让运维人员能够方便让这个系统良好的运行下去可操作性意味着让监控系统健康、追踪问题根因等常规工作变的简单,让运维团队能够专注在有更高价值的事情上。对于一个数据系统而言,可以做以下事情:
2.简单性,让新工程师能够很快理解这个系统一个复杂的系统通常有以下这些症状:
减少系统额外复杂性的一个好工具是抽象,好的抽象把复杂的实现隐藏起来,只暴露一个简单易懂的接口。本书之后会讨论如何做好抽象,创建可复用的、良好定义的组件。 3.可进化性/可拓展性,让工程师在未来能够容易的对这个系统进行变更敏捷开发模型提供了处理快速变更的需求的一个框架,但大多数的敏捷方法论的关注点都是相对小一些的项目。本书之后会讨论对于大项目,如何提升它的“敏捷性”。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |