【DDIA笔记】【ch1】 可靠性、可扩展性和可维护性 -- part1 可靠性

简介: 【6月更文挑战第2天】本书探讨现代数据系统,阐述其在信息社会中的关键作用,包括数据库、缓存、搜索引擎、流处理、批处理和消息队列等组成部分。随着技术发展,工具如Kafka、Spark和Redis等多功能组件使得系统设计更为复杂。面对可靠性、可扩展性和可维护性的挑战,书中强调了容错和韧性的重要性,区分了硬件故障、软件错误和人为错误,并提出了应对措施。可靠性关乎用户数据、企业声誉和生存,因此是系统设计的核心考量。

本书为什么以数据系统为主题

数据系统是一种模糊的统称,在信息社会中,一切皆可信息化,或者,某种程度上来说--数字化。这些数据的采集、存储和使用,是构成信息社会的基础。

因此作为IT从业人员,有必要系统性地了解一下现代的、分布式地数据系统。学习本书,能够学习到数据系统地背后的原理、了解其常见的实践,进而将其应用到我们工作的系统设计中。

常见的数据系统有哪些?

  • 数据库:存储数据,以便之后再次使用

  • 缓存:记录一些非常重地操作结果,方便之后加快读取速度

  • 搜索引擎:允许用户以各种关键字搜索、以各种条件过滤数据

  • 流式处理:源源不断地产生数据,并发送给其他进程进行处理

  • 批处理:定时处理累积地大量数据

  • 消息队列:进行消息地传送与分发

数据系统的日益复杂化

这些年来,出现了许多新的数据存储工具与数据处理工具,它们针对不同的应用场景进行优化,因此不再适合生硬地归入传统类别。

  1. Kafka:可以持久化存储一段时间日志数据,可以作为消息队列对数据进行分发,可以作为流式处理组件对数据反复蒸馏

  2. Spark:可以对数据进行批处理,也可以化小批为流,对数据进行流式处理

  3. Redis:可以作为缓存加速对数据库的访问,也可以作为事件中心对消息的发布订阅

我们面临一个新的场景,以某种组合使用这些组件的时候,在某种程度上,便是创建了一个新的数据系统。

下图是一个常见的对用户数据进行采集、存储、查询、旁路等操作的数据系统实例,从其示意图中可以看到各种web services的影子。
2024-06-03-20-44-43-image.png

这样的系统在设计的时候可以有很多取舍:

  1. 采用哪种缓存策略,是旁路还是写穿透

  2. 部分组件机器出现问题时,是保证可用性还是保证一致性

  3. 当机器一时难以恢复,如何保证数据的正确性和完整性

  4. 当负载增加时,是增加机器还是提升单机性能

  5. 设计对外API时,是力求简洁还是追求强大。

  6. 当部分系统降级时,如何为用户提供始终如一的良好性能

因此,有必要从根本上思考下如何评价一个好数据系统,如何构建一个好的数据系统,有哪些可以遵循的设计模式,有哪些通常需要考虑的方面。

用三个词来回答就是:可靠性、可扩展性、可维护性

可靠性

如何衡量可靠性呢?

  1. 功能上:

    • 正常情况下,应用行为满足API给出的行为

    • 在用户误输入/误操作时,能够正常处理

  2. 性能上:能够在给定硬件和数据量下满足承诺的性能指标

  3. 安全上:能够阻止未授权、恶意破坏

如果所有这些在一起意味着“正确工作”,那么可以把可靠性粗略理解为“即使出现问题,也能继续正确工作”。

造成这种错误的原因叫故障,能够预料并应对故障的系统特性可称为“容错”或“韧性”。

注意:故障(fault) 不同于 失效(failure)

故障定义为系统的一部分状态偏离标准

失效是系统作为一个整体停止向用户提供服务。

故障的概率不可能降低到0,因此需要设计容错机制来防止因故障而导致失效。

在这类容错系统里,通过故意触发来提高故障率是有意义的,因为这种方法可以确保容错机制不断运行并接受考验,比如Netflix公司的Chaos Monkey)

硬件故障

在一个大型数据中心中,以下现象是常态:

  1. 网络抖动、不通

  2. 硬盘老化坏道

  3. 内存故障

  4. 机器过热导致CPU出问题

  5. 机房断电

这些都是硬件故障,磁盘的平均无故障时间约为10-15年,因此从数学期望上来讲,在拥有1w个磁盘的存储集群上,平均每天都会有一个磁盘出故障。

那么如何解决系统的故障率呢? 第一反应通常是增加单个硬件的冗余度,例如磁盘可以组件RAID,服务器可能有双路电源和热插拔CPU,数据中心可能有电池和柴油发电机作为后备电源,某个组件挂掉时冗余组件可以立刻接管。

软件错误

我们通常认为硬件故障是随机的、相互独立的,大量硬件组件之间同时发生故障是极其罕见的。另一类错误是内部的系统性错误,这类错误难以预料,而且是跨节点相关的可能会比硬件故障造成更多的系统失效。

以下列举了几个例子:

  1. 不能处理特定输入,导致系统崩溃。

  2. 失控进程(如循环未释放资源)耗尽CPU、内存、磁盘空间和网络资源

  3. 系统依赖的服务变慢,无响应或是开始返回错误的响应

  4. 级联故障

在设计软件时,我们通常有一些环境假设,和一些隐性约束。随着时间的推移、系统的持续运行,如果这些假设不能够继续被满足;如果这些约束被后面维护者增加功能时所破坏;都有可能让一开始正常运行的系统,突然崩溃。

人为错误

系统中最不稳定的是人,因此要在设计层面尽可能消除人对系统影响。根据软件的生命周期,分几个阶段来考虑:

  1. 设计编码

    • 尽量消除所有不必要的假设,提供合理的抽象,仔细设计API

    • 进程间进行隔离,对尤其容易出错的模块使用沙箱机制

    • 对服务依赖进行熔断设计

  2. 测试阶段

    • 尽可能引入第三方成员测试,将测试平台自动化

    • 单元测试、集成测试、e2e测试、混沌测试

  3. 运行阶段

    • 详细的仪表盘、看板

    • 持续自检

    • 报警机制

    • 问题预案

  4. 针对组织

    • 科学的培训和管理

可靠性有多重要

事关用户数据安全、企业声誉,企业存活和做大的基石

目录
相关文章
|
6月前
|
存储 关系型数据库 数据库
【DDIA笔记】【ch2】 数据模型和查询语言 -- 多对一和多对多
【6月更文挑战第7天】该文探讨数据模型,比较了“多对一”和“多对多”关系。通过使用ID而不是纯文本(如region_id代替"Greater Seattle Area"),可以实现统一、避免歧义、简化修改、支持本地化及优化搜索。在数据库设计中,需权衡冗余和范式。文档型数据库适合一对多但处理多对多复杂,若无Join,需应用程序处理。关系型数据库则通过外键和JOIN处理这些关系。文章还提及文档模型与70年代层次模型的相似性,层次模型以树形结构限制了多对多关系处理。为克服层次模型局限,发展出了关系模型和网状模型。
61 6
|
6月前
|
XML NoSQL 数据库
【DDIA笔记】【ch2】 数据模型和查询语言 -- 概念 + 数据模型
【6月更文挑战第5天】本文探讨了数据模型的分析,关注点包括数据元素、关系及不同类型的模型(关系、文档、图)与Schema模式。查询语言的考量涉及与数据模型的关联及声明式与命令式编程。数据模型从应用开发者到硬件工程师的各抽象层次中起着简化复杂性的关键作用,理想模型应具备简洁直观和可组合性。
43 2
|
6月前
|
SQL 人工智能 关系型数据库
【DDIA笔记】【ch2】 数据模型和查询语言 -- 文档模型中Schema的灵活性
【6月更文挑战第8天】网状模型是层次模型的扩展,允许节点有多重父节点,但导航复杂,需要预知数据库结构。关系模型将数据组织为元组和关系,强调声明式查询,解耦查询语句与执行路径,简化了访问并通过查询优化器提高效率。文档型数据库适合树形结构数据,提供弱模式灵活性,但在Join支持和访问局部性上不如关系型。关系型数据库通过外键和Join处理多对多关系,适合高度关联数据。文档型数据库的模式灵活性体现在schema-on-read,写入时不校验,读取时解析,牺牲性能换取灵活性。适用于不同类型或结构变化的数据场景。
53 0
|
6月前
|
SQL JSON NoSQL
【DDIA笔记】【ch2】 数据模型和查询语言 -- 关系模型与文档模型
【6月更文挑战第6天】关系模型是主流数据库模型,以二维表形式展示数据,支持关系算子。分为事务型、分析型和混合型。尽管有其他模型挑战,如网状和层次模型,但关系模型仍占主导。然而,随着大数据增长和NoSQL的出现(如MongoDB、Redis),强调伸缩性、专业化查询和表达力,关系模型的局限性显现。面向对象编程与SQL的不匹配导致“阻抗不匹配”问题,ORM框架缓解但未完全解决。文档模型(如JSON)提供更自然的嵌套结构,适合表示复杂关系,具备模式灵活性和更好的数据局部性。
55 0
|
6月前
|
敏捷开发 存储 缓存
【DDIA笔记】【ch1】 可靠性、可扩展性和可维护性 -- 可维护性
【6月更文挑战第4天】本文探讨了Twitter面临的一次发推文引发的巨大写入压力问题,指出用户粉丝数分布是决定系统扩展性的关键因素。为解决此问题,Twitter采用混合策略,大部分用户推文扇出至粉丝主页时间线,而少数名人推文则单独处理。性能指标包括吞吐量、响应时间和延迟,其中高百分位响应时间对用户体验至关重要。应对负载的方法分为纵向和横向扩展,以及自动和手动调整。文章强调了可维护性的重要性,包括可操作性、简单性和可演化性,以减轻维护负担和适应变化。此外,良好设计应减少复杂性,提供预测性行为,并支持未来改动。
63 0
|
6月前
|
缓存 关系型数据库 数据库
【DDIA笔记】【ch1】 可靠性、可扩展性和可维护性 -- 可扩展性
【6月更文挑战第3天】可扩展性关乎系统应对负载增长的能力,但在产品初期过度设计可能导致失败。理解基本概念以应对可能的负载增长是必要的。衡量负载的关键指标包括日活、请求频率、数据库读写比例等。推特的扩展性挑战在于"扇出",即用户关注网络的广度。两种策略包括拉取(按需查询数据库)和推送(预计算feed流)。推送方法在推特案例中更为有效,因为它减少了高流量时的实时计算压力。
59 0
硬件开发笔记(十): 硬件开发基本流程,制作一个USB转RS232的模块(九):创建CH340G/MAX232封装库sop-16并关联原理图元器件
有了原理图,可以设计硬件PCB,在设计PCB之间还有一个协同优先动作,就是映射封装,原理图库的元器件我们是自己设计的。为了更好的表述封装设计过程,本文描述了CH340G和MAX232芯片封装创建(SOP-16),并将原理图的元器件关联引脚封装。
硬件开发笔记(十): 硬件开发基本流程,制作一个USB转RS232的模块(九):创建CH340G/MAX232封装库sop-16并关联原理图元器件
|
2月前
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较