【读书会】Designing Data-Intensive Application 阅读分享

TUG 华南区 4月份小组活动回顾

活动背景

本周二 12:10 在 TUG 华南区微信群里面发起读书分享的倡议,很快就得到了两位小伙伴的积极响应。 经过一些演讲者的时间安排,最终在 13:11 跟张进确定了本周六上午10点就在 TUG 华南区内部分享:《Designing Data-Intensive Application》。

《Designing Data-Intensive Application》

本期分享者

  • 中国联通腾讯合作运营中心数据开发工程师
  • 目前负责腾讯王卡数据平台建设
  • 也是一名数据库和分布式系统的爱好者

这是一本什么样的书?

豆瓣评分高达 9.7 分。 分布式系统、数据库。 注定要成为经典的书

在开始之前,我们也来看看开源译作者的话。

数据是架构的中心

这句话是 TiDB 的黄东旭说的,但我觉得特别适合作为这本书的题记。

• DDIA用整本书的篇幅回答了一个问题: 如何设计一个数据系统?

• 读书之前,先读目录。

推荐大家阅读英文版,实在想读中文版的话,可以直接看 Github 上的翻译版本,我个人觉得这个翻译版本相比纸质版的翻译要好一些。

我与这本书的渊源

  • 第一次读到此书是在在知乎上看到了一个问题: 2017 年,你看了啥 很好的计算机的博客/书/视频?
  • 其实这个问题下面的书,我都看了一遍,最后只有《DDIA》成为了我的床头书。
  • 第一次读这本书时,算是自己打印的原版书,啃了大概有小半年吧。
  • 最后等到出了中文翻译版,便买了一本,就当做感谢作者对我的帮助。

左边是我的书,大家也可以看到我的书基本上快翻烂了。 右边是我当时淘宝下单。

我是如何去读的这本书?

那当然要就不得不说《如何阅读一本书》了。

这本书的主题是什么?

  • 这本书在谈论什么东西?
  • 这本书是如何讲述这个主题的?
  • 它的核心章节,或者是观点是什么?

这本书讲的有道理吗?

  • 这个章节讲的有道理吗?
  • 他说的理论有对应的开源实现吗?

反问自己一句,读完这本书收获了多少?

  • 合上眼,能对着目录讲出这个章节大概内容吗?
  • 能把这本书用自己的话讲给别人听吗?

遇到了哪些困难?

  • 最难的章节应该是“事务”这一节了吧,到现在我也不敢说我读懂了这一节。
  • 因为读的是英文,所以没有像中文那样流畅。
    • 通过写文章和阅读笔记去督促自己啃下去英文。
    • 主动进行团队分享。

我还开了一个微信公众号,这些是我当时做的一些阅读笔记

这本书带给我的收获

  • 最重要的收获,当然就是帮我找到了现在的这份工作。
  • 读完这本书,之后在读很多数据库和分布式系统相关的论文都轻松了很多。
  • 脑海中第一次有了完整的数据系统体系。
  • 比较功利的来说,这本书可以帮助你在架构选型时,知道你选择的组件有哪些合适的场景,而不至 于掉到坑里。

接下来介绍一下本书的各章节

如何评价一个数据系统?

先来看看几个指标:

  • 可靠性

    • 即使发生故障,系统也能 正常运行的能力
  • 可扩展性

    • 负载增加时,系统能有效 的保持其性能的能力
  • 可维护性

    • 简单、易操作、可演化

如何理解这个世界?

我们来看看下面这个模型:

数据该如何存储?

存储引擎的设计:

  • 事务分析处理(OLTP): hash, LSM tree, b tree
  • 联机分析处理(OLAP): 列式存储

数据该长什么样?

编码:

普通文本:CSV、JSON、XML及其二进制格式 特定协议:Thrift 与 Protocol Buffers 特定格式:Avro

分布式系统的世界

水平拓展

  • 复制与分区

同一份数据如何备份到不同机器上

数据复制

数据复制的意义

  • 高可用性
  • 容错
  • 低延迟
  • 可扩展

数据复制的方案

  • 单领导者
  • 多领导者
  • 无领导者

同一份数据如何分散到不同的机器上

数据分区

  • 分区方式

    • Hash分区
    • 范围分区
  • 分区再平衡

  • 请求路由

数据写入到一半,系统挂了怎么办?

事务

隔离级别

  • 脏读
  • 脏写
  • 不可重复读 • 更新丢失
  • 写倾斜
  • 幻读

实现可串行化隔离级别

  • 严格串行执行事务
  • 两阶段锁
  • 可串行化的快照隔离

番外:分布式系统的麻烦

  • 不可靠的网络
  • 不可靠的时钟
  • 没有统一的共识

如何让分布式系统看起来像单机系统?

一致性与共识

  • 线性一致性

    • CAS寄存器
    • 原子事务提交 • 全序广播
    • 锁和租约
    • 成员/协调服务 • 唯一性约束

派生系统

离线分析

  • 核心问题

    • 容错
    • 数据分片
  • Unix 哲学

    • MapReduce
  • Join

    • 排序合并连接
    • 广播散列连接
    • 分区散列连接

实时分析

  • 消息处理

    • AMQP/JMS风格的消息代理
    • 基于日志的消息代理
  • 流处理中的 Join

    • 流和流 join
    • 流和表 join
    • 表和表 join
  • 容错和恰好一次语义

作者对未来的畅想

数据系统的未来

  • 数据集成

    • 数据流动
  • 分拆数据库

    • 每一个组件专注于自己的事
    • 数据流:应用代码与状态变化的交互
  • 将事情做正确

    • 抑制重复

总结

  • 这本书值得每一个做软件的人去反复阅读。
  • 它类似于金庸小说里提到的武功的内力,读完此书并不会马上给你带来什么显然易见的收获,也不会直接帮助你写代码。但是,时间久了,这本书带给你的思考和认知水平的提升,也就是内力的提 升,最终会让你收获颇丰。
  • 感谢 Martin Kleppmann 教授带给我们的这部经典。

YouTube

https://youtu.be/5G_JHHSvmS0

PPT

DDIA 分享.pdf (1.6 MB)


附小福利:

阅读本文或观看视频后来谈谈你的读后感,你也可以来报名下月的读书分享。 都将有机会获得房老师赞助的《数据密集型应用系统设计》。

2赞

也可以同步分享到 开发者社区 的分布式系统 版面哈:)

感谢分享:+1::+1:

两个地方都有相同的内容,以后数据内容同步比较麻烦哦。

很棒的一次分享 打开了新视野

《Designing Data-Intensive Application》读书会分享 正文内提供链接,大家感兴趣的自行查看~

1赞