文章目录
本文讨论了软件系统的可靠性,可伸缩性和可维护性。
可靠性(Reliability) 指高可用:及时发生故障(人为、bug、硬件服务)也能提供服务。一般高可用通过主备的概念去实现;
可伸缩性(Scalability) 负载增加的情况下
也有保持性能的策略
,一般进行横向拓展;可维护性(Maintainability):这里强调抽象降低复杂度,并易于修改和适应新的应用场景。
一. 数据密集型程序的特点以及遇到的问题
现今很多应用程序都是 数据密集型(data-intensive) 的,而非 计算密集型(compute-intensive) 的。因此 CPU 很少成为这类应用的瓶颈,更大的问题(是内存)通常来自数据量、数据复杂性、以及数据的变更速度。
标准组件提供了应用的能力
数据密集型应用通常由标准组件构建而成,标准组件提供了很多通用的功能。例如,许多应用程序都需要:
存储数据
,以便自己或其他应用程序之后能再次找到 (数据库,即 databases)- 加快读取速度(缓存,即 caches)
- 允许用户按关键字搜索数据,或以各种方式对数据进行过滤(搜索索引,即 search indexes)
- 向其他进程发送消息,进行异步处理(流处理,即 stream processing)
- 定期处理累积的大批量数据(批处理,即 batch processing)
使用多个组件的数据系统架构
应用代码将不同功能的工具缝合起来来一起服务,服务的接口想客户端隐藏这些实现细节。这个复合系统会有特定的保证:例如:缓存在写入时会作废或更新,以便外部客户端获取一致的结果。
应用架构的样子:
设计数据系统或服务时会遇到如下通用的问题:
- 当系统出问题时,如何确保数据的正确性和完整性?
- 当部分系统退化降级时,如何为客户提供始终如一的良好性能?
- 当负载增加时,如何扩容应对?
- 什么样的 API 才是好的 API?
这里我们讨论大多数系统中遇到的共性问题:
可靠性(Reliability):
可伸缩性(Scalability):面对数据、流量导致的内存增长,复杂性导致的可伸缩性变差有合理的办法应对系统的增长(数据量、流量、复杂性)。
可维护性(Maintainability):
二. 可靠性 : 即使出现问题,也能继续正确工作
人们对可靠软件的典型期望包括
允许用户犯错、系统能防止未经授权的访问和滥用、在预期的负载和数据量下,性能满足要求。
1 硬件故障
硬盘的 平均无故障时间(MTTF, mean time to failure) 约为 10 到 50 年。因此从数学期望上讲,在拥有 10000 个磁盘的存储集群上,平均每天会有 1 个磁盘出故障。
增加单个硬件的冗余度来减少系统故障率:
为了减少系统的故障率,第