【数据密集型系统设计】软件系统的可靠性、可伸缩性、可维护性

本文讨论了软件系统的可靠性,可伸缩性和可维护性。

  • 可靠性(Reliability) 指高可用:及时发生故障(人为、bug、硬件服务)也能提供服务。一般高可用通过主备的概念去实现;

  • 可伸缩性(Scalability) 负载增加的情况下也有保持性能的策略,一般进行横向拓展;

  • 可维护性(Maintainability):这里强调抽象降低复杂度,并易于修改和适应新的应用场景。

 

一. 数据密集型程序的特点以及遇到的问题

现今很多应用程序都是 数据密集型(data-intensive) 的,而非 计算密集型(compute-intensive) 的。因此 CPU 很少成为这类应用的瓶颈,更大的问题(是内存)通常来自数据量、数据复杂性、以及数据的变更速度。

 

标准组件提供了应用的能力
数据密集型应用通常由标准组件构建而成,标准组件提供了很多通用的功能。例如,许多应用程序都需要:

  1. 存储数据,以便自己或其他应用程序之后能再次找到 (数据库,即 databases
  2. 加快读取速度(缓存,即 caches
  3. 允许用户按关键字搜索数据,或以各种方式对数据进行过滤(搜索索引,即 search indexes
  4. 向其他进程发送消息,进行异步处理(流处理,即 stream processing
  5. 定期处理累积的大批量数据(批处理,即 batch processing

 

使用多个组件的数据系统架构

应用代码将不同功能的工具缝合起来来一起服务,服务的接口想客户端隐藏这些实现细节。这个复合系统会有特定的保证:例如:缓存在写入时会作废或更新,以便外部客户端获取一致的结果。

应用架构的样子:

在这里插入图片描述

 

设计数据系统或服务时会遇到如下通用的问题:

  1. 当系统出问题时,如何确保数据的正确性和完整性?
  2. 当部分系统退化降级时,如何为客户提供始终如一的良好性能?
  3. 当负载增加时,如何扩容应对?
  4. 什么样的 API 才是好的 API?

 

这里我们讨论大多数系统中遇到的共性问题:

  • 可靠性(Reliability):

  • 可伸缩性(Scalability):面对数据、流量导致的内存增长,复杂性导致的可伸缩性变差有合理的办法应对系统的增长(数据量、流量、复杂性)。

  • 可维护性(Maintainability):

 

二. 可靠性 : 即使出现问题,也能继续正确工作

人们对可靠软件的典型期望包括

允许用户犯错、系统能防止未经授权的访问和滥用、在预期的负载和数据量下,性能满足要求。

1 硬件故障

硬盘的 平均无故障时间(MTTF, mean time to failure) 约为 10 到 50 年。因此从数学期望上讲,在拥有 10000 个磁盘的存储集群上,平均每天会有 1 个磁盘出故障。
 

增加单个硬件的冗余度来减少系统故障率:

为了减少系统的故障率,第

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

roman_日积跬步-终至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值