数据密集型应用系统设计

可靠,可扩展,可维护

可靠性意味着即使发生故障,系统也可以正常工作。故障包括硬件、软件以及人为方面。容错技术可以很好地隐藏某种类型故障,避免影响最终用户。

可扩展性是指负载增加时, 有效保持系统性能的相关技术策略。可以理解为当负载增加时,是否可以无脑扩机器来解决

可维护性意味 着许多方面,但究其本质是为了让工程和运营团队更为轻松。良好的抽象可以帮助降低复杂性, 井使系统更易于修改和适配新场景。

数据存储与检索

存储引擎,分为两大类,针对事务处理(OLTP)的架构和针对分析性(OLAP)的架构,他们的访问模式有很大差异。OLTP通常面对用户,会收到大量的请求,通常每个请求只涉及少量的记录,应用程序基于某种键来请求记录,通过索引来查找所请求键的数据,磁盘寻道时间往往是瓶颈。OLAP通常是面向的不是最终用户,数据仓库和类似的分析型系统主要是分析师使用,查询的请求数远低于OLTP,但是每个查询通常要求非常可可,比如短时间内扫描百万记录,磁盘带宽通常是瓶颈,面向列的存储对于这种工作负载成为了新的解决方案

OLTP(事务处理),有两个主要的存储引擎流派,日志结构流派,比如Hbase,lucene。原地更新流派,B-tree。日志结果的存储引擎关键思想是将磁盘上随机写入变成了顺序写入,极大的提高了性能

数据编码与演化

特定编程语言的编码,用的比较少,不能跨平台,兼容性也没有保障

文本格式编码,json,xml等,兼容性取决于如何使用,可以向前和向后兼容。优点是人类可读,缺点是占用内存较多,数据类型支持模糊,需要消息处理数字和二进制字符串

二进制编码,Thrift,pb等,清晰定义了向前和向后兼容语义,更加节省内存,缺点是人类不可读

数据复制

高可用性,某台机器故障,系统也能正常运行

低延迟,将数据放置在距离用户较近的地方

可扩展性,多副本读取,提供读操作吞吐量

三种多副本方案,主从复制,写操作发送到主节点,主节点将数据更改发送到从节点。多主节点复制,客户端将写请求发送到一个主节点,主节点同步到其它节点。无主节点复制,发送时发到多个节点上,读取时从多个节点读取。主从比较好理解,多主用于提高性能,比如就近接入,多人同时编辑同一文档

复制滞后,写后读一致性,用户能看到自己提交的数据。单调读,用户再某个时间点读到数据后,不会再读到比此时更早的数据。前缀一致读,先读取问题,后看到答案

数据分区

数据量太大的情况下,单机进行存储和处理就会成为瓶颈,需要引入分区机制。分区的目的是均匀分布数据,负载均衡

分区方法。基于关键字区间的分区,先对关键字进行排序,每个分区只负责一段区域,优点是支持区间查询,但是如果经常访问某一区间,就有热点风险,分区太大时分裂成两个子区间来解决这个问题。哈希分区,将哈希函数作用于每个关键字,每个分区负责一定范围的哈希值,这种方法打破了顺序,区间查询低,但负载均衡更好。

分区与二级索引,本地索引,索引存在和关键字相同的分区,更新时只更新一个分区,读取时要读取索引的分区。全局索引,基于索引值独立的分区,包含多个分区的记录,写入时更新多个分区,读取时只读取一个分区。做取舍,看业务场景是读多写少还是读少写

分布式系统的挑战

网络延时和丢包,节点的时钟不同步,时钟跳跃或者倒退,进场遭遇暂停,比如垃圾回收。

一致性与共识

线性化,使多副本看起来像是单一副本,线性化概念简单,容易理解,问题是性能低

因果顺序,

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容