数据密集型应用系统设计笔记

深入解析数据密集型应用系统设计的核心概念,包括系统的基本准则、数据模型、存储结构和检索方法等内容。

数据密集型应用系统设计

部分一 Data-Intensive的若干基本准则

第一章 可靠性、可扩展性和可维护性

  • 可靠性
  • 可扩展性
    • 描述负载, 延迟时间与响应时间不一样, 一个是客户端等待时间, 一个是服务端处理时间.延迟时间包括响应时间+网络传输时间
    • 描述性能, 一般根据中位数(p50)描述, 还有根据p95, p99, p999描述
    • 水平拓展盒垂直拓展
      • 水平拓展: 通过增加机器数量来提高性能(微服务架构maybe?)
      • 垂直拓展: 通过增加单机的CPU, 内存, 硬盘等来提高性能
  • 可维护性
    • 书中认为, 企业大部分成本不在于开发软件, 而在整个生命周期的后续的维护

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

数据模型很重要, 关系到软件编写方式, 对于如何思考待解决问题都有深远影响

  • 数据模型
    • 文档模型
      • 通过建立文档来描述数据, 例如JSON, XML等
      • 缺点是, 无法建立关系, 无法建立索引, 无法进行复杂查询
      • 优点是, 灵活, 可以随时添加字段, 无需修改表结构
    • 关系模型
      • 通过一定的标准和关系来储存数据
      • 优点是, 可以建立关系, 可以建立索引, 可以进行复杂快速查询
      • 缺点是, 无法灵活, 一旦表结构确定, 无法随意添加字段
    • 图模型
      • 通过节点和边来描述数据
      • 优点是, 可以描述复杂关系
      • 缺点是, 无法进行复杂查询
    • 查询语言
      • SQL
      • MapReduce
      • Cypher
      • GraphQL

第三章 数据存储与检索

  • 从最简单的数据库(bash函数)开始
    • 设置键值对
    • set 123456 {“name”: “zhangsan”, “age”: 18}
    • set 42 {“name”: “lisi”, “age”: 20}
    • get 123456 得到 {“name”: “zhangsan”, “age”: 18}
    • 这种方式是遍历后, 看看符合与否, 速度很慢
  • 哈希索引(底层数据, 也叫哈希桶)
    • 底层是数组, 外加然后有一张表, 记录着key与数组的索引
    • 数组:123456,{"name": "zhangsan", "age": 18}\n42,{"name": "lisi", "age": 20}
    • 索引表:
      • 123456, 0
      • 42, 64
  • SSTable / LSM-Tree
    • 特点:
      • 键值对按键排序
      • 针对大量数据的高效存储和检索
      • 段的写入是增加, 不是覆盖, 多个段合成一个后, 会删除旧的段
    • 工作原理
      • 通过平衡树结构(红黑树等), 保持排序
      • 如果到达一定数量, 会写入磁盘, 变成一个段
      • 读取时, 会先读取内存中的键, 再读取磁盘中的最近的段, 然后是次新的段
      • 后台会有一个线程, 会将多个段合并成一个段(根据时间)
  • B Tree
    • 底层也是平衡树, 但是是多叉树, 有一个页的概念(通常16KB), 页里面存储多个键值对, 并且是有序的
    • 同时键与键之间有指针指向下一个页.
    • 读取时, 会先读取根节点, 然后根据键值大小, 区分是选择键还是键与键中间的指针
  • B+ Tree
    • 又b树演变而来, 但是只有叶子节点存储数据, 非叶子节点只存储键, 并且叶子节点之间有指针指向
    • 优点, 树变矮了, 读取速度更快, 并且可以范围查找
  • 其他索引
    • 索引储存值(非聚集索引)
      • 利用整个特点可以减少回表次数, 二次索引是包括了主键的索引, 索引一般都是找到了设置索引的键, 然后通过键找到主键(primary key), 然后通过主键找到数据
      • 索引储存值的意思是, 建立联合索引, 就不用回表了
    • 多列索引
    • 全文索引 模糊索引
      • 通过倒排索引实现
      • 模糊索引通过分词器实现
  • 事务
  • 列式存储
    • 列压缩
      • 把列存储在一起, 通过压缩算法(bitmap)压缩.
      • 可以很简单的通过&&, ||来进行查询与或的关系数据
    • 列排序

部分二

使用 Hugo 构建
主题 StackJimmy 设计