数据系统

  • 在线系统:服务等待客户的请求或指令到达。每收到一个,服务会试图尽快处理它,并发回一个响应
  • 批处理系统:大量的输入数据,跑一个作业(job)来处理它,并生成一些输出数据
  • 流处理系统:像批处理系统一样,流处理消费输入并产生输出(并不需要响应请求)。但是,流式作业在事件发生后不久就会对事件进行操作

基石

可靠性

造成错误的原因叫做故障(fault),预料并应对故障的系统特性可称为容错(fault-tolerant)。

故障(fault)不同于失效(failure),故障定义的是系统偏离正常状态,失效则是整个系统不能对用户提供服务

可伸缩性

可伸缩性(Scalability) 是用来描述系统应对负载增长能力的术语

负载可以用一些称为 负载参数(load parameters) 的数字来描述,如每秒请求数、读写请求比率等等。

为了描述性能,单个请求的响应参数是没有太多参考参考价值的,需要通过一个可测量的数值分布来描述:

202131141817

为了明确大多数用户的指标,中位数是最有价值的。

为了应对负载,可以进行垂直扩展或者水平扩展。没有一种银弹可以解决所有的应对负载需求,一个良好适配应用的可扩展架构,是围绕着假设(assumption)建立的,这就是所谓负载参数。

可维护性

可操作性:降低运维复杂度。

简单性:通过封装降低复杂度。

可演化性:简单易懂的系统通常比复杂系统更容易修改。

数据模型

不同的数据模型是为不同的应用场景而设计的。选择适合应用程序的数据模型非常重要。

应用层有各种领域概念,存储层则有JSON、XML或关系模型,数据库层则有以内存或字节来表示JSON、XML等,最底层使用电流或者脉冲来表示字节。

关系模型已经持续称霸了大约25~30年,2010年新起的NoSQL文档模型在最近一段时间内也慢慢与关系模型配合使用,随着时间的推移,关系数据库和文档数据库似乎变得越来越相似。

当前的文档模型和上世纪70年代的层次模型很像,一对多很容易支持,但多对多就抓瞎了,文档模型会不会重蹈层次模型的覆辙。

文档模型拥有较关系模型强的架构灵活性,因为我们对数据的解释是发生在我们的代码之中,这意味着一旦数据模型发生改变,修改代码就好了。

同时文档模型拥有数据局部性优势,但这只对同时需要同一文档里的大部分数据时下的场景有效。

查询语言

相较于命令式查询,声明式查询更适合并行。

对于声明式查询语言来说,在编写查询语句时,不需要指定执行细节:查询优化程序会自动选择预测效率最高的策略

存储与查询

许多数据库在内部使用了日志(log),也就是一个 仅追加(append-only) 的数据文件,这种方式对于写入的性能非常好,但读取性能很差,于是引入了索引。

索引是数据库维护的一个主数据的附加结构,根据这个附加结构可以提升查询速度,但会对写入速度造成影响。

  • 哈希索引

这种索引要求全部的索引要能放入内存,这会导致许多问题,同时哈希索引也无法进行范围查找。

  • SSTables和LSM树
  • B树

为了避免进行事务分析对在线事务的影响,通过采用同步数据到数据仓库的方式来解决这个需求,将数据存入仓库的过程称为“抽取-转换-加载(ETL)”

202133144449

对于部分的查询只需要用到少部分列,但一个事实表可能用来成百上千个列,这个时候引入列存储来提升性能

编码与演化

新旧版本的代码,以及新旧数据格式可能会在系统中同时共处。系统想要继续顺利运行,就需要保持双向兼容性:

  • 向后兼容:​新代码可以读旧数据
  • 向前兼容:旧代码可以读新数据

数据的使用形式:

  • 在内存中,数据保存在对象,结构体,列表,数组,哈希表,树等中
  • 在传输中,数据通过XML或者JSON等进行编码

相较于XML和JSON,二进制编码更加节省空间。

为了保证软件演化过程的向前向后兼容,对每个字段,通过一个唯一标签来标志,只要字段不被删除,新的代码肯定可以处理老数据,但反过来,只有添加的每个字段是可选的或者有默认值,才能向前兼容。

数据类型也对演化过程有影响,如果老数据时32位的,新数据时64位的,升级可以无缝迁移,但向前兼容时就会有问题。

使用读者跟作者模式解决差异:

20213315519

同时如果数据流经过旧代码,那么部分数据很有可能丢失:

20213315109

流处理

消息系统

  • 生产者直接到消费者
  • 使用消息代理缓存

当有多个消费者时,如何进行消息传递:

  • 负载均衡
  • 扇出

202132318324

  • 分区日志消息系统

流与数据库

  • 如何保持同步
  • 变更数据捕获
  • 事件溯源

流处理

results matching " "

No results matching " "

results matching " "

No results matching " "