概览
存储系统
作为后端软件的底座,性能敏感,需要高的读写速度,缓存在整个存储系统体系都有使用。
由于要与操作系统甚至更底层打交道,容易受硬件影响。并且需要对上层应用系统提供抽象统一的接口。
数据库
数据库也是一种存储系统。但是对用户提供了结构化或者半结构化的管理方式,而不是直接管理文件、字节。同时数据库会提供SQL、事务、复杂查询等便于管理的功能。
主流存储产品
-
单机KV存储:LSM-Tree(某种程度牺牲读追求写,),RocksDB、LevelDB。
-
分布式存储:
- 分布式文件系统。
- HDFS,多个便宜机器分布式存储海量数据。
- Ceph:支持对象、块、文件接口,一切皆对象。数据写入采用主备复制。数据分布采用CRUSH算法(hash+权重+随机抽签)。
- HDFS,多个便宜机器分布式存储海量数据。
- 分布式文件系统。
-
单机数据库:单个计算机节点上的数据库系统。事务在单机内执行,也可通过网络交互与业务服务一起实现分布式事务。
- 关系数据库。数据以页帧的方式存储在磁盘,同时还有redolog、undolog、临时数据等文件。
- 非关系数据库。MongoDB、Redis、ES。
- 关系数据库。数据以页帧的方式存储在磁盘,同时还有redolog、undolog、临时数据等文件。
-
分布式数据库。对于单机磁盘空间有限的存储问题,如果使用升级机器的方式,因为CPU和磁盘容量一般是一起升级的,两者肯定有一个会被浪费许多。可以将存储节点池化,将数据库逻辑层和存储层分离。只需要动态扩缩容存储节点就能实现存储容量的伸缩。而CPU的升级只能通过升级机器实现了。
存储与数据库新技术的演进
现有的大部分存储系统都是沿用早期实现的内核进行扩展,而新时代、新硬件、新业务场景需要新架构。
- Bypass OS Kernel(内核旁路),绕过Linux内核(TCP/IP协议栈),不使用Linux内核子系统的功能,采用自己实现的相同功能的代码来处理,从用户空间直接访问和控制设备内存,减少数据拷贝。如SPDK。
- 基于AI进行实时分析和动态变更,如智能存储格式转换、动态分库分表。
- 根据新硬件进行变更,包括存储单元、计算单元、网络硬件等。
在存储&数据库领域,硬件反推软件变革十分常见!
DBMS的数据模型
- 网状模型。根据现实世界中的对象和关系模型,所有关系都是多对多。
- 层次模型。把网状关系图变成树状图,
- 关系模型。将对象和关系用二维表进行表示。
SQL语言。
SQL关键技术
Parser
Optimizer
优化执行策略
- 基于规则的优化:按照某些固定规则进行优化,如先连接小表再连接大表、先用唯一索引、再普通索引再全表扫描等。也会对一些条件做符号求解,如a>b and b>a可以求解成false。太死板,基于经验编写的规则不一定真的好。
- 基于代价的优化。即选择耗时最短的策略,这里的耗时是整体耗时而不是单次执行的耗时。实现较为复杂。
Executor
最经典的是火山模型,将处理过程分为多个算子,一条一条的传递数据进行处理。
进一步的,将一条数据改为一批数据,即一次传递多次数据,并结合一些并行计算相关API同时处理多条数据。(SIMD用的是真多,哪都有,就是学校不教......)
还进一步。算子是要被共享复用的,每个算子都是独立且预先写好的,为了完成各式各样的执行计划需要对多个算子进行排列组合,所以,他们之间的互动需要通过Next和传数据,这就耗时了。通过LLVM技术,动态的生成算子,将多个算子整合进一个大算子中,数据就不需要跨算子传递了,效率大大提高了。
InnoDB存储引擎
InnoDB有BufferPool、Redolog、Undolog几个很重要的部分。在BufferPool
中对页帧进行page_id->block的映射,同时使用LRU进行页面置换。
事务引擎
原子性通过UndoLog实现,通过UndoLog进行事务的rollback,同时undolog也是MVCC的一部分,多个undolog就是多个版本,不同的readview能看到不同的版本,实现隔离性。
一致性:通过redolog,保证故障后仍能根据redolog重做事务,实现一致性。
miniob
因为最近玩过一会,所以在笔记里提一嘴。miniob这个项目挺有意思的,没有商用数据库的复杂特性,很方便初学者入门数据库的具体实现和原理。 oceanbase/miniob
企业级实践
数据水平拆分。
通过两步操作扩容。这是老的方式,在云原生数据库中所有的数据只有一份,只需要更改拓扑就行。
将连接池化和缓存。
异地机房容灾保证高可用。
服务监控。
对象存储
适合存静态、不可变的数据。