数据密集型系统的基石

为什么是数据密集型系统?

在这里插入图片描述

  一般我们把计算机系统分为数据密集型系统和计算密集型系统,而偏向业务工程一般都属于数据密集型系统。对于这些系统,CPU往往不是系统瓶颈,关键在于数据大、数据复杂度以及数据快速多变性。数据密集型系统也由各个模块组成,每个模块负责单一职责,一般的数据密集型系统包含以下模块:

  • 数据库:用于存储数据,具有持久性,通常用作主存
  • 高速缓存:内存读取,提高部分数据读取速度
  • 索引:根据关键字搜索过滤
  • 流式处理:持续发送消息到另一个进程,采用异步方式
  • 批处理:定时处理大量数据

  实际上,目前的模块界限已经不是那么明确,例如数据库也会使用一些高速缓存策略来提高访问效率,高速缓存也会有持久化的策略。

一 数据密集型系统的目标

在这里插入图片描述

  系统设计的目的是为了完成需求,有些需求是功能性的,也有些需求是非功能性的。

1、可靠性

  当出现意外的硬件故障、软件故障、人为失误等,系统可以正常运转。

  • 硬件故障通常是无法避免的,例如硬盘崩溃、内存故障、电网停电等。特别是随着数据量和计算需求的增加,硬件故障率会有线性增长,依靠硬件的冗余通常只对少量的关键应用更有意义。因此,我们通常还是使用软件容错的方式来保证系统的可靠性。
  • 软件故障引发的问题往往比硬件更为严重,一个节点的故障通常会影响上下游的服务,这类的故障通常更加难以察觉,只能触发了特定条件问题才会暴露。软件故障预防需要充分考虑上下游服务的异常情况,软件故障的排查需要详细的系统指标监控以及完善的报警机制。
  • 人为的错误是影响系统可靠性的首要原因,线上的异常大部分是由于系统配置问题或者程序逻辑为完全覆盖导致的。预防人为的错误的方式:分离容易出错的地方;充分的测试;完善的故障预案;清晰的监控系统。
2、可拓展

  随着规模增长,如数据量、流量或复杂性,系统应以合理的方式来匹配增长。应对可扩展的方式取决于系统的特征,取决于系统的数据读取量、写入量、数据复杂程度、响应时间的要求、访问模式。

  • 描述负载,讨论系统增长需要先用简洁的方式描述系统的负载,系统负载的指标包括日活用户量、接口QPS、数据库使用量、缓存命中次数等。
  • 描述性能,描述完负载之后要考虑负载增加的情况下系统会发生什么。第一个问题是负载增加性能会发生什么变化,第二个问题是如果要保证系统性能需要增加多少资源。在不同的系统中,我们关注的性能指标可能不同,例如C端的接口会侧重接口RT时间,批处理系统会侧重系统吞吐量。另外描述系统的指标包括服务的RT百分位数(95Line、99Line、999Line),系统吞吐量。
3、可维护性

  随着时间推移,许多新人员参与到系统开发和运维,或者适配新场景,系统都应该高效运转。

  • 提供系统运行行为和内部的可观测性
  • 自动化标准工具集成
  • 分区容错性
  • 完善、易于理解的文档(设计文档、接入文档、FAQ文档)
  • 良好的默认配置
  • 有一定的自我修复能力
二 数据模型与查询语言

在这里插入图片描述
  复杂的应用程序可能会有很多中间层,每层都会提供一个简洁的数据模型来隐藏下层的复杂性。

1、关系模型与文档模型

  关系模型算是目前最常见的一种数据模型,因为其出色的事务特性与批处理能力通常被选做主数据库类型,典型的应用就是SQL。在关系模型中,数据被组织成关系,在SQL中称为表,每个关系都是元组的无序集合。
  尽管关系型数据库有很多优点,但是在实际的使用过程中,关系型数据库模型与现实的模型还有一些差距,在关系型数据库的设计规范里关系的描述粒度往往更小。例如查询一个用户的信息可能需要查询用户基础信息表和用户地址信息表,然后聚合两条数据返回完整的用户信息数据,这就意味着关系模型和现实模型并不是完全一致,这种模型不一致的情况被称为阻抗失谐。尽管一些关系型数据库(Hibernate)提供了ORM(对象-关系映射)框架减少了自动构建的模块代码,但是并没有完全隐藏模型之间的差异。
在这里插入图片描述
  为了解决阻抗失谐的问题,NoSQL语言应运而生。NoSQL意为不仅仅是SQL,包含以下特性:

  • 更好的拓展性需求,支持超大数据集以及超高读写吞吐量
  • 支持一些特定查询操作
  • 动态的的数据模型

  目前NoSQL的典型代表是Redis,NoSQL的出现并不是为了取代关系型数据,更像是关系型数据库的增强和补充。例如,上述的用户信息查询就可以在消息聚合之后以JSON的格式存放在Redis中,这样查询就避免数据库多次检索和聚合,关系型数据库提供了事务特性管理,NoSQL提供了更好的扩展性以及更高的吞吐。

2、数据查询语言

  命令式查询语言类似于我们的代码原因,命令式语言告诉计算机以特定的顺序执行某些逻辑,程序员可以推断整个执行过程,根据执行情况决定下一步操作。
  声明式查询语言则更贴近自然语言,更加关注查询的结构和查询的条件,查询优化器会决定采用哪些索引和使用哪些顺序获得查询结果。
  MapReduce是一种编程模型,用于处理海量数据。Map阶段主要做数据的分组通常以key-value形式保存分组,根据Map分组的结果将同类的数据发射到分布式系统中同一个节点上,Reduce阶段对同组的数据进行汇总。

3、图状数据模型

  关系模型和文档模型处理的大多是一对多的关系,在关系模型中多对多的关系被描述为模型之间的关系,但是当数据关联变得复杂时维护关系的成本也会线程的提高。在基础的数据结构中,图通常被用来描述多对多的关系,图的顶点表示数据,顶点之间的连线就可以表示关系。图状模型的典型应用是社交关系网络以及交通网络。

三 数据存储与检索

  存储和检索是数据库的主要功能,数据的存储结构决定了数据的插入和查询效率。那么一个好的存储结构有哪些特点呢?

  • 高效 存储和查询的低耗时是必要条件
  • 稳定 每次存储和查询的效率要尽可能的平均,才能保证每次请求的时间都是可预测的
  • 节约 不能为了提高时间效率牺牲太多的空间
1、索引

在这里插入图片描述

  数组存储是最简单的方式,所有的数据都的存储在连续的空间上,这样的结构空间复杂度是N,查询的时间复杂度是O(n),插入值添加在末尾复杂度为O(1)。因为在计算机中数据也是以连续的结构存储,这样插入的效率是最高的。另一方面,如果这个数组足够大,遍历整个数组的开销是我们无法接受的。
  为了高效的查询特定的值,我们需要引入特殊的数据结构索引。索引是一个典型的用空间换时间的思路,在原有数据存储结构上额外维护一些数据字典来提高查询的效率。索引提高了查询的效率,但是我们在插入数据的时候也需要更新索引,这样会带来一些额外的开销。

Hash

在这里插入图片描述
  Hash索引是以键值对的形式存放数据,Hash索引的实现这里不再讨论,仅仅聊聊它的使用场景。例如查询一个名称为安迪的用户的所有信息,在我们需要查询一个确定的值的记录时,使用Hash索引查询的复杂度可以近似为O(1)。
  看上去我们好像找到了一种完美的解决办法,现在我们插入和查找的效率都是O(1),实现的代价仅仅是维护必要的Hash结构。也许有人注意到了,我们的查询是有条件的,必须是确定值的查询。在实际的查询场景中,不仅有等值查询还有区间查询,比如我想查看按名字字母排序Andi和TOM之间用户,Hash索引这时候就挨个去查找比较记录。

SSTables与LSM-Tree

在这里插入图片描述
  基于LSM-Tree存储引擎的基本流程如下

  • 当写入时,将其添加到内存中的平衡树数据结构中(例如红黑树)。这个内存中的树有时被称为内存表。
  • 当内存表大于某个阈值(通常为几兆字节)时,将其作为SSTable文件写入磁盘。由于树已经维护了按键值对排序的key-value对,写磁盘可以比较高效。新的SSTable文件称为数据库的最新部分。当SSTable写磁盘的同时,可以继续添加另一个新的内存实例。
  • 为了处理读请求,首先尝试在内存表中查找键,然后是最新的磁盘段文件,接下来是次新的磁盘段文件,以此类推,直到找到目标。
  • 后台进程周期性地执行段合并与压缩过程,以合并多个段文件,并丢弃哪些已被覆盖或删除的值。
B-Tree

在这里插入图片描述
  B树索引是按键排序的kv对,将数据库分解成固定大小的块或页(4kb),页是读写的最小单元,几乎所有关系型数据库的索引都是B树索引。

B-TreeLSM-Tree
读写特性读取更快写入更快读取较慢
缺点至少写入两次数据:预写日志,写入树的页本身
简单写入带来整个页的开销
不同段中具有相同键多个副本
压缩过程会影响正在进行的读写操作
查询响应时间有时很高
压缩会占用磁盘带宽,进而影响到写入速率
优点每个键恰好唯一对应索引中的某个位置
提供事务语义
事务隔离通过键范围加锁实现
查询响应时间更具有确定性
更低的写放大
更好的压缩,减少磁盘碎片
2、事务处理与分析处理

在这里插入图片描述

在这里插入图片描述

四 数据编码与演化
编码格式特点问题应用场景
JSON、XML与二进制变体文本格式,可读性强
web浏览器内置支持
XML无法区分数字和由数字组成的字符串
JSON无法区分整型和浮点型,不能指定精度
JSON和XML支持Unicode,不支持二进制字符串
Thrift和Protocol Buffers基于相同原理的二进制编码库
通过模式来编码任意数据
均有代码生成工具,且支持多种语言
手动维护标签号会导致兼容问题rpc通信和数据序列化
AVRO同样是通过模式来指定编码的数据结构
IDL和基于JSON描述模式的方式等价
编码最紧凑
不包含任何标签号
Hadoop用例
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 数据密集型应用系统设计涉及处理大量数据系统,其中包括数据的存储、检索和处理。设计这种系统时需要考虑到数据的可靠性、可扩展性和性能。 在设计数据密集型应用系统时,首先需要选择合适的数据存储技术,例如关系型数据库、NoSQL数据库或分布式文件系统等。这些技术各有优势和适用场景,需要根据系统需求来选择。 其次,需要对数据进行分片和复制,以提高系统的可扩展性和可用性。分片将数据划分成多个部分,每个部分由不同的节点负责存储和处理;而复制则是将数据副本存储在不同的节点上,以防止单点故障。 此外,对于数据密集型应用系统数据的一致性也是一个重要的考虑因素。可以通过使用分布式一致性协议(如Paxos或Raft)来确保数据的一致性。 在系统性能方面,可以采用多种技术来提高系统的吞吐量和响应时间。例如,可以使用缓存来减轻数据库的压力,使用异步消息队列来实现解耦和扩展,以及使用分布式计算框架来并行处理数据。 最后,在设计数据密集型应用系统时,还需要关注系统的监控和调优。通过监控系统的负载、资源使用情况和性能指标,可以及时发现问题并进行调优,以保证系统的稳定性和高效性。 综上所述,设计数据密集型应用系统需要考虑数据存储、分片和复制、一致性、性能优化以及监控和调优等方面。只有综合考虑这些因素,才能设计出满足系统需求的高效可靠的系统。 ### 回答2: 数据密集型应用系统设计是指设计和构建大量、复杂和敏感数据的应用系统。这些系统通常需要高效地处理和存储大量数据,并能够提供快速的查询和分析功能。 在设计数据密集型应用系统时,需要考虑以下几个关键因素: 1. 数据需求分析:首先要理解应用系统数据需求,包括数据类型、数据量和数据的使用频率等。这将有助于确定适合的数据库管理系统和存储架构。 2. 数据模型设计:根据数据需求,设计合适的数据模型,包括定义数据结构、关系和约束等。这将影响后续的数据库设计和查询性能。 3. 数据库选择:选择适合的数据库管理系统,如关系型数据库、NoSQL数据库或分布式数据库。根据数据量和访问模式来选择合适的存储方案,如磁盘存储、内存存储或混合存储。 4. 数据库优化:对数据库进行性能优化,包括索引设计、查询优化和缓存机制等。通过合理的数据库设计和优化,可提高系统的响应速度和负载能力。 5. 并发控制:数据密集型应用系统通常需要支持大量并发用户操作,因此需要实施有效的并发控制机制,如锁机制、事务管理和分布式事务处理。 6. 安全性设计:由于数据密集型应用系统通常处理敏感数据,因此需要对数据进行有效的安全保护。这包括数据加密、身份验证、访问控制和安全审计等。 设计数据密集型应用系统时,需综合考虑以上因素,并根据实际需求进行合理选择和设计。通过科学合理的架构和设计,可以提高系统的可靠性、性能和安全性,满足用户的数据处理和分析需求。 ### 回答3: 数据密集型应用系统的设计涉及到大量的数据的处理和管理。在设计这样的系统时,一个重要的方面是确定如何将数据存储和访问进行优化,以便在系统运行时能够快速高效地处理大量的数据。 对于数据的存储,可以考虑使用分布式存储系统,如Hadoop或Cassandra。这些系统能够将大量数据分散存储在多个节点上,以提高数据的可靠性和可扩展性。此外,还可以采用数据分片和数据复制的策略,以增加系统的容错能力和性能。 对于数据的访问,可以采用分布式计算框架,如MapReduce或Spark。这些框架能够将数据的计算任务分布到多个节点上,并通过数据并行的方式,提高系统的计算能力。同时,还可以使用缓存技术,如Redis或Memcached,来加快数据的访问速度。 另外,在数据密集型应用系统设计中,需要注意数据的安全性和隐私保护。可以采用数据加密和访问控制的措施,确保敏感数据不会被未经授权的人访问到。 最后,在设计数据密集型应用系统时,还要考虑系统的扩展性和可伸缩性。可以采用水平扩展的方式,通过增加服务器节点来增加系统的处理能力。同时,还要考虑系统的负载均衡和容灾机制,以防止单点故障和系统的不可用。 综上所述,数据密集型应用系统设计需要考虑多方面的因素,包括数据存储和访问的优化,数据的安全性和隐私保护,以及系统的扩展性和可伸缩性。只有综合考虑这些因素,才能设计出高效可靠的数据密集型应用系统

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值