《数据密集型系统设计》笔记

2023-05-14  本文已影响0人  斯文遮阳

可靠、可扩展与可维护的应用系统

数据密集型系统,CPU的处理能力往往不是第一限制性因素,关键在于数据量、数据的复杂度及数据的快速多变性。

三个度量:

数据模型与查询语言

常用数据模型:

文档数据库和图数据库有一个共同点,那就是它们通常不会对存储的数据强加某个模式,这可以使应用程序更容易适应不断变化的需求。但是,应用程序很可能仍然假定数据具有一定的结构,只不过是模式是显式 (写时强制)还是隐式(读时处理)的问题。

每个数据模型都有自己的查询语言或框架,如:SQL、MapReduce、MongoDB的聚合管道、Cypher、SPARQL和Datalog。

数据存储与检索

存储引擎分为两大类:

OLTP数据存储结构:

OLAP数据存储结构:
当查询需要在大量行中顺序扫描时,索引的关联性就会显著降低。相反,最重要的是非常紧湊地编码数据,以尽量减少磁盘读取的数据量。常用优化手段:
列式存储:不是将每行、而是将每列中的所有值存储在一起。写入:首先进入内存存储区,将其添加到已排序的结构中,接着再准备写人磁盘(参考LSM-Tree)
列压缩:位图编码(bitmap)、游程编码
物化视图:针对大量读密集的数仓维度

数据复制

三种多副本方案 :

每种方法都有其优点和缺点。主从复制非常流行,主要是因为它很容易理解,也不需要担心冲突问题。而万一出现节点失效、网络中断或者延迟抖动等情况,多主节点和无主节点复制方案会更加可靠,不过背后的代价则是系统的复杂性和弱一致性保证。

处理复制滞后的三个一致性模型:

多主节点和无主节点复制方案的并发问题:即由于多个写可能同时发生,继而可能产生冲突。为此,需要算法使得数据库系统可以判定某操作是否发生在另一个操作之前,或者是同时发生。接下来,采用合并并发更新值的方法来解决冲突。

数据分区

分区的目地是通过多台机器均匀分布数据和查询负载,避免出现热点。这需要选择合适的数据分区方案,在节点添加或删除时重新动态平衡分区。两种主要的分区方法:

混合上述两种基本方法也是可行的,例如使用复合键:键的一部分来标识分区,而另一 部分来记录排序后的顺序。

分区与二级索引,二级索引也需要进行分区,有两种方法:

事务

事务隔离级别:

边界:

一致性与共识

一致性保证:

共识问题(以下问题都可以归结为共识,且彼此等价):

共识的本质:集群中大部分节点认定的“事实”,即使它并非真正的事实;提议一经确认不可撤销。

分布式事务:两阶段提交(2PC)、引入事务协调者,就像西式婚礼中的牧师。

基于ZK实现共识,是一个不错的选择,非常不建议自建。

上一篇 下一篇

猜你喜欢

热点阅读