读书笔记《数据密集型应用系统设计》- 高可靠性、高可展性、可维护性 & 数据模型与查询语言

简介: 《数据密集型应用系统设计》是一本很好介绍数据密集类系统设计原理的纲要性书籍,笔者再次阅读下,记录一些读书笔记,也写一些自己的思考穿插其中,以做备忘。

第一章、高可靠性、高可展性、可维护性

笔者按:我们总是讲述系统的设计,其实大部分在可维护性上缺乏建设,导致后期系统难以维护,又不得不重新造轮子,把前人的推翻。在高可靠性上由于直接关系生而死,一般来还是做了一定的冗余建设,在扩展性上大部分由于中间件的建设及分布式理论的成熟基本没有太大的问题,就是在性价比上可以掰扯掰扯。

大部分的数据类系统设计如此,有 数据库、缓存、全文,再加一个消息队列推出消息。其实在数据库内部也是如此,有磁盘、有cache、有CDC可以订阅log,现在不少数据库也支持全文的检索,包括local的全文以及global的。

1.1 可靠性:容忍硬件、软件失败、认为错误

【硬件故障、软件故障、人为失误】

1.2 扩展性:评测负载与性能、百分位数、吞吐量

  • 如果系统以某种速度增长,我们该怎么办?
  • 什么是负载? 不同系统有不同的定义。
  • 讲述了一个以Feeds流的例子,是写放大,还是读放大? 有一些用户被关注的人有数亿,其采取写放大不显示,最后采取混合模式。大户是读放大。
  • 描述性能? SLA
  • 离线批处理更加关心 吞吐量,在线关注的是 响应时间。
  • 平均xx 往往不能衡量 真是的情况,一般采取99分为等来度量。 直接影响到体检,一般采取99.9%的时间是多少?
  • 如果解决可扩展性问题?
  • 自动检测,手工拟合
  • 未来分布式系统会成为标配
  • 对于早期创业的产品,功能快速迭代比性能的扩展性更加重要

1.3、可维护性:可运维、简单与可演化性

大部分人并不喜欢维护老的系统;但软件的生命周期里面大部分处于维护状态;

可运维性、简单性、可演化性;

  • 可运维性:良好的操作性经常可以化解软件的局限,不规范的操作最终会击垮软件。
  • 简单性:一个复杂的软件最终是一个大泥潭。降低复杂性,可以大大提高软件的可维护性。
  • 可演化性:一成不变的的系统需求基本没有。

第二章:数据模型与查询语言

笔者按:笔者在16~19年,在阿里带了3年多的HBase多模系统,后续演化为LIndorm多模,由于之前一直是范式论,在接触NoSQL后,第一的思维转变就是反范式。而今,数据库种类也日益丰富,各有侧重;从趋势看在NoSQL、NewSQL等各种边界也在融合。

1.1、关系型、文档型、图类型

  1. 关系从Edgar Codd于1970年提出,一直发展至今。进入21世纪,NoSQL兴起;
  2. NoSQL:【扩展性、开源软件、特定查询,自由的Scheme】;
  3. 对象关系不匹配:ORM  => JSON可能更加合适; JSON减少了应用程序代码和存储层之间的阻抗失配;
  4. 使用ID的好处是ID对于人类没有任何意义,所以永远都不需要更改;
  5. 关系型数据库与文档数据库也在渐渐融合;
  6. 一些其他的 全文检索、针对对撞机设计的存储查询(数白PB)、GenBank基因库软件、时序的OpenTSDB;

关系型 - 数据库&数仓

文档类型(以JSON为主)

图 - 数据库

开始时间

1970

21世纪

关系一般

关系少,ID查询较多

关系较多,图核心在于描述关系

应用场景

ERP系统

互联网

社交

SQL

JOSN

Cypher 、SPARQL和

代表数据库

MySQL

MongoDB

Neo4j

灵活性

比较强制,不灵活,加字段需要新加一列

Scheme比较灵活

比较灵活

设计模式

多对一、多对多关系,范式设计

反范式(先设计业务,再设计API)

反范式

可扩展性

一般

扩展性较好

一般

模型

写时强校验

读时校验

不是数据库强执行

读时校验

不是数据库强执行

查询局部性

相同数据放在一起,一般读一次IO或者数次IO

会分散IO

看按顶点点还是按边

1.2、数据查询语言

命令式查询语言,声明式查询语言。

命令式查询语言

声明式查询语言

含义

指定每一步怎么做

告诉系统,想要啥

代表

编程语言

SQL、CSS

优势

可以按照最高执行路径写,深入细节

简洁、容易使用、隐藏数据库细节

MapReduce是一种编程模型,不是命令式,也不是声明式,是介于两者之间的编程模型。

目录
相关文章
|
3月前
|
存储 NoSQL 关系型数据库
《数据密集型应用系统设计》 - 数据模型和查询语言
《数据密集型应用系统设计》 - 数据模型和查询语言
28 0
|
缓存 负载均衡 算法
“软件系统三高问题”高并发、高性能、高可用系统设计经验
​ 总的来说解决三高问题核心就是 “分字诀” 业务分层、系统分级、服务分布、数据库分库/表、动静分离、同步拆分成异步、单线程分解成多线程、原数据缓存分离、分流等等。。。。 直观的表述就是:从前端用的CDN、动静分离,到后台服务拆分成微服务、分布式、负载均衡、缓存、池化、多线程、IO、分库表、搜索引擎等等。都是强调一个“分”字。
2042 0
“软件系统三高问题”高并发、高性能、高可用系统设计经验
|
2月前
|
SQL 缓存 负载均衡
数据库设计优化:性能提升与扩展性的技术探讨
【6月更文挑战第28天】数据库设计优化聚焦性能与扩展性:SQL优化、索引策略、缓存利用及分库分表、集群技术,旨在平衡处理速度与系统稳定性。通过智能SQL、复合索引、查询缓存减少数据库压力,垂直/水平拆分与集群实现数据分布式处理,提升并发能力。
|
3月前
|
存储 监控 安全
关系型数据库管理和维护复杂性
【5月更文挑战第3天】关系型数据库管理和维护复杂性
39 7
关系型数据库管理和维护复杂性
|
3月前
|
分布式计算 负载均衡 关系型数据库
关系型数据库设计集群架构需求分析
【5月更文挑战第6天】关系型数据库设计集群架构的需求分析是一个综合考虑业务需求、性能、可用性、可扩展性、数据一致性、安全性、成本效益和技术选型等多个方面的过程。通过深入分析和评估,可以设计出满足业务需求且高效可靠的数据库集群架构。
47 3
关系型数据库设计集群架构需求分析
|
10月前
|
存储 文件存储 对象存储
一文读懂温冷数据存储的技术选型
在温存储或者冷存储领域,通常都是追求低成本和高密度。在满足这两个条件的情况下,性能越高越好。但不管怎么说,冷存储或者温存储,都应是绿色节能的。
491 1
|
存储 分布式计算 运维
大白话讲讲分布式存储系统的架构设计以及容错架构
分布式存储系统的架构设计旨在实现数据的分布式存储和负载均衡,通常采用数据分片和多节点存储的方式。容错架构则是为了提高系统的鲁棒性和可用性。在分布式存储系统中,容错架构常采用数据的冗余备份来应对节点故障或网络异常问题。通过复制数据到多个节点,即使某个节点发生故障,系统仍可以提供数据的可靠访问。此外,容错架构还包括故障检测和自动故障转移机制,用于及时检测节点故障,并将故障节点的任务转移给其他正常节点。这样可以保证系统在故障情况下仍能正常运行,并提供不间断的数据访问。通过合理的架构设计和有效的容错机制,分布式存储系统可以实现高可用性和数据可靠性,满足大规模数据存储和访问的需求。
870 0
大白话讲讲分布式存储系统的架构设计以及容错架构
|
存储 SQL 缓存
读书笔记《数据密集型应用系统设计》- 数据存储与检索
《数据密集型应用系统设计》是一本很好的介绍数据密集类系统设计原理的纲要性书籍,笔者再次阅读下,记录一些读书笔记,也写一些自己的思考穿插其中,以做备忘。
138 0
|
存储 JSON NoSQL
「数据密集型系统搭建」原理篇|夯实基础,灵活设计
数据建模规范、常识、技巧很多,本章从万事开头难的数据建模开始,剖析下数据选择上有哪些常见设计规则,看看这些约束或经验背后蕴含着哪些出色的项目实践总结,在数据类型的选择上如何进行合理选择和取舍方案的。
465 0
「数据密集型系统搭建」原理篇|夯实基础,灵活设计
|
网络协议 中间件 程序员
分布式技术专题-服务架构设计-带你统一认识一下系统架构及分析和总结
分布式技术专题-服务架构设计-带你统一认识一下系统架构及分析和总结
318 0