一、什么算是“数据密集型应用”
对于一个应用系统,如果“数据”是其成败决定性因素,包括数据的规模、数据的复杂度或者数据产生与变化的速率等,我们就可以称为“数据密集型应用系统”;与之对应的是计算密集型,CPU主频往往是后者最大的制约瓶颈。
例如:使用了以下组件的应用系统:关系型数据库、NoSql、消息队列、缓存、搜索引擎、批处理与流处理框架
二、可靠、可扩展与可维护的应用系统
1、可靠性
意味着即使发生故障,系统也可以正常工作。故障包括:
1)硬件故障。如硬盘崩溃、内存故障、电网停电。硬盘的平均无故障时间约为10-50年。因此,在一个包括10000个磁盘的存储集群中,我们应该预期平均每天有一个磁盘发生故障。硬件故障通常是随机的,不相干的。减少硬盘故障率的策略有:
- 针对单机系统
磁盘配置RAID,服务器配备双电源,热插拔CPU,数据中心添加备用电源、发单机等
- 分布式系统
通过软件容错的方式来容忍多机失效,例如当需要重启计算机为操作系统打安全补丁,可以每次给一个节点打补丁然后重启,而不需要同时下线整个系统。
2)软件错误。软件问题通常是系统的,更难以处理
3)人为失误。总是很难避免,时不时会出错。以下多种方法可以帮助减少人为错误:
- 以最小出错的方式来设计系统。例如,精心设计的抽象层、API以及管理界面,使“做正确的事情”很轻松,但搞坏很复杂。
- 想办法分离最容易错误的地方、容易引发故障的接口。特别是,提供一个功能齐全但非生产用的沙箱环境。
- 充分的测试:单元测试、全系统集成测试、手动测试、自动化测试。
- 当出现人为失误时,提供快速的恢复机制以尽量减少故障影响。
- 设置详细而清晰的监控子系统,包括性能指标和错误率。
- 推行管理流程并加以培训。
2、可扩展性
是指负载增加时,有效保持系统性能的相关技术策略。
负载:Web服务器的每秒请求处理次数,数据库中写入的比例,聊天室的同时活动用户数量,缓存命中率等。有时平均值很重要,有时系统瓶颈来自于少数峰值。
性能:批处理系统中,通常关心吞吐量,即每秒可处理的记录条数,或者在指定数据集上运行作业所需的总时间;而在线系统通常更看重服务的响应时间,即客户端从发送请求到接收响应之间的间隔。
响应时间:平均值并不是合适的指标,因为它掩盖了一些信息,无法告诉有多少用户实际经历了多少延迟。最好使用百分位数。中位数表示列表中间的响应时间,缩写为p50,如果中位数响应时间为200ms,意味着一半的请求响应不到200ms。想要弄清楚异常的响应数据有多糟糕,需要关注p95、p99、p999
3、可维护性
本质上是为了让工程和运营团队更为轻松。包括:
- 可运维性:运维更轻松。
- 简单性:简化复杂度。
- 可演化性:易于改变。
良好的抽象可以帮助降低复杂性,并使系统更易于修改和适配新场景。良好的操纵性意味着系统健康状况有良好的可预测性和有效的管理方法。