【存储与数据库 学习资料(上)】第三届字节跳动青训营 - 后端专场

2,317 阅读8分钟

第三届字节跳动青训营讲师非常用心给大家整理了课前、中、后的学习内容,同学们自我评估,选择性查漏补缺,便于大家更好的跟上讲师们的节奏,祝大家学习愉快,多多提问交流~

第十八节:带你认识存储 & 数据库

课程概述

存储系统和数据库系统往往是后端服务的最后一环,提供数据存储、查询能力。本课程会先用模拟案例导入,向学员介绍存储系统、数据库系统的特点,然后解析多个主流产品,最后分享存储和数据库结合新技术演进的方向。本节课程主要包含以下内容:

  1. 模拟案例
  1. 存储 & 数据库简介
  1. 主流产品剖析
  1. 新技术演进

课前材料 (必须)

跟存储 & 数据库系统相关的材料很多,涵盖开源项目、博客、论文等。下面提供部分资料作为参考

  1. The Google File System

static.googleusercontent.com/media/resea…

作为各种开源分布式文件系统的鼻祖,GFS 论文里面提到的架构非常经典,值得一学。

  1. The Linux Programming Interface(第13章 FILE I/O BUFFERING)

本书介绍了很多 Linux 内核子系统的实现,其中第13章着重讲了单机的文件 IO。学习完 Linux 中的文件 IO 栈,对单机存储系统会有更深的认识。

课程详情

经典案例

通过一个模拟案例,描述了数据是怎么产生,在后端系统里怎么流通,最后怎么写入到存储/数据库系统。

存储 & 数据库简介

  • 存储系统概览

    • 存储系统特点
    • 存储器层级结构
    • 单机存储栈
    • RAID 技术
  • 数据库系统概览

    • 关系型数据库特点
    • 非关系型数据库特点
    • 数据库 vs 经典存储
    • 数据库使用方式

主流产品剖析

  • 单机存储产品

    • 单机文件系统
    • 单机 key-value 存储
  • 分布式存储产品

    • HDFS
    • Ceph
  • 单机数据库产品

    • 关系型数据库 —— PG、MySQL
    • 非关系型数据库 —— ES、MongoDB、Redis
    • Elasticsearch 使用案例
  • 分布式数据库产品

    • 问题与挑战
    • 解决方案

新技术演进

  • SPDK
  • 人工智能
  • 新硬件加速

课后思考

  1. 写入存储系统的粒度太大,会不会导致数据原子性问题?例如一次性写100MB,如果系统突然 crash,会不会只有一部分数据持久化了,另一部分丢失了?如果要解决原子性问题,一般会设计什么机制?
  1. 在从应用程序到存储介质的链路上,无论读还是写,数据可能要被拷贝好几次,这几次拷贝能不能去掉?如果我们去掉大部分拷贝操作,会有什么副作用,要怎么缓解副作用?
  1. 一个关系型数据库大概率是会被并发访问的,如果要保证并发安全,除了在行数据上加悲观锁还有其他方式吗?
  1. 在数据库领域,把数据按行存和按列存各有好处,你能从性能优先的角度设计出一种混合存储格式吗?

课后大作业

实现一个(分布式)key-value 存储系统

作业要求:

  1. 基于本地文件系统实现,支持常用的 put(k, v)、get(k, v)、scan_by_prefix(prefix) 接口
  1. 支持存储 server 独立进程部署,支持跨进程或者网络访问
  1. IO 操作做到低时延

*可选: 支持扩展成分布式架构,多台存储 server 组成一个分布式 key-value 存储系统,并保证全局的数据一致性。

第十九节:深入理解 RDBMS

课程概述

RDBMS(关系型数据库)是目前使用最为广泛的数据库之一,同时也是整个信息化时代的基石。本节课程通过生活中常见的场景向大家介绍 RDBMS 的作用、发展历程及其核心技术,最后以字节为例,展示了 RDBMS 的企业级实践。本节课程主要包含以下内容:

  1. 经典案例
  1. 发展历史
  1. 关键技术
  1. 企业实践

课前材料

RDBMS 有相关的数据和材料都非常多,这里主要给大家提供几篇经典论文,从经典的论文中,能够更有效的帮助大家理解 RDBMS。

  1. A Relational Model of Data for Large Shared Data Banks

这篇论文是 RDBMS 的奠基之作,由 RDBMS 之父 E.F.Codd 博士于1970年发表。在这篇论文中,E.F.Codd 首次提出了用于管理数据的关系模型,并将数据独立于硬件来存储,用户使用一个非过程语言来访问数据。

  1. Readings in Database Systems(Fifth Edition)

这本书被称为数据库领域的“红宝书”,由著名的图灵奖获得者,数据库领域专家,Michael Stonebraker 撰写。其中介绍了数据库的基本概念,传统的 RDBMS 以及新的数据库架构等等,是一本非常棒的数据库领域入门文章。

课程详情

经典案例

通过抖音红包雨的案例,介绍 RDBMS 中 ACID 的概念:

  • 原子性(Atomicity):事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。
  • 一致性(Consistency):数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
  • 隔离性(Isolation):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
  • 持久性(Durability):在事务完成以后,该事务所对数据库所做的更改便持久的保存在数据库之中,并不会被回滚。

发展历史

数据库发展最初过程中,诞生过3种数据模型,最终关系型模型成为了应用最为广泛的数据库模型。

  • 网状模型:用有向图表示实体和实体之间的联系的数据结构模型称为网状数据模型。
  • 层次模型:层次数据模型是用树状<层次>结构来组织数据的数据模型。
  • 关系模型:使用表格表示实体和实体之间关系的数据模型称之为关系数据模型。
网状模型层次模型关系模型
优势能直接描述现实世界 存取效率较高结构简单 查询效率高 可以提供较好的完整性支持实体及实体间的的联系都通过二维表结构表示 可以方便的表示 M:N 关系 数据访问路径对用户透明
劣势结构复杂 用户不易使用 访问程序设计复杂无法表示 M:N 的关系 插入、删除限制多 遍历子节点必须经过父节点 访问程序设计复杂关联查询效率不够高 关系必须规范化

关键技术

SQL 执行流程

在 SQL 执行过程中,需要经历 SQL 引擎、存储引擎、以及事务引擎等模块。而其中 SQL 引擎又分为Parser、Optimizer、Executor 几个部分:

SQL 引擎

SQL 引擎包括了:

  • Paser:经过词法分析、语法分析生成语法树,然后对语法树进行合法性校验。
  • Optimizer:根据 Parser 产生的语法树,根据规则或者代价产生执行计划树。
  • Executor:根据计划树进行执行,常见的执行方式是火山模型。

存储引擎

存储引擎负责了数据的底层存储、管理和访问工作。各大 RDBMS 存储引擎的设计都有不少的差异,这里选择 MySQL 的 InnoDB 存储引擎来向大家做一个介绍:

  • Buffer Pool:存储引擎位于内存中的重要结构,用于缓存数据,减少磁盘 IO 的开销。
  • Page:数据存储的最基本单位,一般为 16KB。
  • B+u Tree:InnoDB 中最常用的索引结构。

事务引擎

事务引擎实现了数据库的 ACID 能力,这里还是以 MySQL 的 InnoDB 为例来介绍数据库内部是通过哪些技术来实现 ACID:

  • Atomicity:InnoDB 中通过 undo 日志实现了数据库的原子性,通过 Undo Log,数据库可以回滚到事务开始的状态;
  • Isolation:通过 Undo Log 实现 MVCC(多版本并发控制),降低读写冲突。
  • Durability:通过 Redo Log(一种 WAL 实现方式)来保证事务在提交后一定能持久化到磁盘中。
  • Consistency:一致性本质上是一种业务层的限制。

企业实践

字节中是国内数据规模最大的互联网公司之一,公司内部有成千上万套 RDBMS 系统。这一章节还是以红包雨为案例,展示了字节是如何解决大流量、流量突增、高可靠等问题的。

课后大作业

  1. WAL 日志到底是如何保证数据的持久化,宕机后数据不丢失的?相比于其他方案,WAL 日志都有什么优势?
  1. 除了 Undo Log 之外,是否还有其他方案可以实现 MVCC?
  1. 基于代价的优化器一般需要考虑哪些代价?
  1. 执行器的执行模型,除了本课中提到的火山模型是否还有其他模型?相比于火山模型有什么优劣势?
  1. InnoDB 的 B+ Tree 是怎么实现的?
  1. InnoDB 的 buffer pool 是怎么实现页面管理和淘汰的?