字节跳动青训营讲师非常用心给大家整理了课前、中、后的学习内容,同学们自我评估,选择性查漏补缺,便于大家更好的跟上讲师们的节奏,祝大家学习愉快,多多提问交流~
课程:带你认识存储的本质 - 状态
课程概述
存储系统和数据库系统往往是后端服务的最后一环,提供数据存储、查询能力。本课程会先用模拟案例导入,向学员介绍存储系统、数据库系统的特点,然后解析多个主流产品,最后分享存储和数据库结合新技术演进的方向。本节课程主要包含以下内容:
-
模拟案例
-
存储 & 数据库简介
-
主流产品剖析
-
新技术演进
课前材料 (必须)
跟存储 & 数据库系统相关的材料很多,涵盖开源项目、博客、论文等。下面提供部分资料作为参考
- The Google File System
static.googleusercontent.com/media/resea…
作为各种开源分布式文件系统的鼻祖,GFS论文里面提到的架构非常经典,值得一学。
- 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
-
人工智能
-
新硬件加速
课后思考
- 写入存储系统的粒度太大,会不会导致数据原子性问题?例如一次性写100MB,如果系统突然crash,会不会只有一部分数据持久化了,另一部分丢失了?如果要解决原子性问题,一般会设计什么机制?
- 在从应用程序到存储介质的链路上,无论读还是写,数据可能要被拷贝好几次,这几次拷贝能不能去掉?如果我们去掉大部分拷贝操作,会有什么副作用,要怎么缓解副作用?
- 一个关系型数据库大概率是会被并发访问的,如果要保证并发安全,除了在行数据上加悲观锁还有其他方式吗?
- 在数据库领域,把数据按行存和按列存各有好处,你能从性能优先的角度设计出一种混合存储格式吗?
课程:MySQL - 深入理解 RDBMS
课程概述
RDBMS(关系型数据库)是目前使用最为广泛的数据库之一,同时也是整个信息化时代的基石。本节课程通过生活中常见的场景向大家介绍RDBMS的作用、发展历程及其核心技术,最后以字节为例,展示了RDBMS的企业级实践。本节课程主要包含以下内容:
-
经典案例
-
发展历史
-
关键技术
-
企业实践
课前材料
RDBMS有相关的数据和材料都非常多,这里主要给大家提供几篇经典论文,从经典的论文中,能够更有效的帮助大家理解RDBMS。
- A Relational Model of Data for Large Shared Data Banks
暂时无法在飞书文档外展示此内容
这篇论文是RDBMS的奠基之作,由RDBMS之父E.F.Codd博士于1970年发表。在这篇论文中,E.F.Codd首次提出了用于管理数据的关系模型,并将数据独立于硬件来存储,用户使用一个非过程语言来访问数据。
- 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系统。这一章节还是以红包雨为案例,展示了字节是如何解决大流量、流量突增、高可靠等问题的。
课后大作业
- WAL 日志到底是如何保证数据的持久化,宕机后数据不丢失的?相比于其他方案,WAL 日志都有什么优势?
- 除了 Undo Log 之外,是否还有其他方案可以实现 MVCC?
- 基于代价的优化器一般需要考虑哪些代价?
- 执行器的执行模型,除了本课中提到的火山模型是否还有其他模型?相比于火山模型有什么优劣势?
- InnoDB 的 B+ Tree 是怎么实现的?
- InnoDB 的 buffer pool 是怎么实现页面管理和淘汰的?