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

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

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

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

大部分的数据类系统设计如此,有 数据库、缓存、全文,再加一个消息队列推出消息。其实在数据库内部也是如此,有磁盘、有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是一种编程模型,不是命令式,也不是声明式,是介于两者之间的编程模型。

目录
相关文章
|
6月前
|
存储 NoSQL 关系型数据库
《数据密集型应用系统设计》 - 数据模型和查询语言
《数据密集型应用系统设计》 - 数据模型和查询语言
41 0
|
缓存 负载均衡 算法
“软件系统三高问题”高并发、高性能、高可用系统设计经验
​ 总的来说解决三高问题核心就是 “分字诀” 业务分层、系统分级、服务分布、数据库分库/表、动静分离、同步拆分成异步、单线程分解成多线程、原数据缓存分离、分流等等。。。。 直观的表述就是:从前端用的CDN、动静分离,到后台服务拆分成微服务、分布式、负载均衡、缓存、池化、多线程、IO、分库表、搜索引擎等等。都是强调一个“分”字。
2704 0
“软件系统三高问题”高并发、高性能、高可用系统设计经验
|
6天前
|
存储 数据建模 大数据
设计和构建健壮的数据系统26数据建模
【11月更文挑战第2天】数据建模是设计健壮数据系统的关键步骤,通过绘制数据系统的蓝图,帮助我们理解数据结构、关系及业务规则。常见的数据建模方法有实体-关系模型(E-R模型)和面向对象的数据建模。数据建模的步骤包括需求收集、概念建模、逻辑建模和物理建模。在整个过程中,需要不断验证和更新模型,确保其符合实际业务需求。
|
5月前
|
SQL 缓存 负载均衡
数据库设计优化:性能提升与扩展性的技术探讨
【6月更文挑战第28天】数据库设计优化聚焦性能与扩展性:SQL优化、索引策略、缓存利用及分库分表、集群技术,旨在平衡处理速度与系统稳定性。通过智能SQL、复合索引、查询缓存减少数据库压力,垂直/水平拆分与集群实现数据分布式处理,提升并发能力。
|
6月前
|
存储 监控 安全
关系型数据库管理和维护复杂性
【5月更文挑战第3天】关系型数据库管理和维护复杂性
61 7
关系型数据库管理和维护复杂性
|
6月前
|
分布式计算 负载均衡 关系型数据库
关系型数据库设计集群架构需求分析
【5月更文挑战第6天】关系型数据库设计集群架构的需求分析是一个综合考虑业务需求、性能、可用性、可扩展性、数据一致性、安全性、成本效益和技术选型等多个方面的过程。通过深入分析和评估,可以设计出满足业务需求且高效可靠的数据库集群架构。
67 3
关系型数据库设计集群架构需求分析
|
6月前
|
运维 负载均衡 监控
软件体系结构 - 关系数据库(3)主从架构
【4月更文挑战第26天】软件体系结构 - 关系数据库(3)主从架构
87 0
|
存储 SQL 缓存
系统架构设计(3)-可扩展性
即使系统现在可靠,不代表将来一定可靠。发生退化的最常见原因是负载增加:并发用户从最初的10,000 增长到 100,000或系统目前处理数据量超出之前很多倍。
292 0
|
存储 SQL 缓存
读书笔记《数据密集型应用系统设计》- 数据存储与检索
《数据密集型应用系统设计》是一本很好的介绍数据密集类系统设计原理的纲要性书籍,笔者再次阅读下,记录一些读书笔记,也写一些自己的思考穿插其中,以做备忘。
158 0
|
存储 运维 监控
读书笔记之数据密集型应用的可维护性
前面两篇文章分别介绍了可靠性和可扩展性,本篇文章将介绍了第三个特性:可维护性。