数据库与存储系统
1.存储&数据库简介
1.1 存储系统
概览
什么是存储系统?一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件,就可以称为存储系统。
特点
- 作为后端软件的底座,性能敏感。
- 存储系统代码需要更加简洁,但同时也要考虑复杂的外界情况。
- 存储系统软件架构容易受硬件影响。
存储器层级结构
金字塔模型,从塔尖到塔底依次为寄存器、高速缓存、RAM、(Persistent Memory、)闪存/USB、硬盘、磁带。
数据如何从应用到存储介质
- 缓存:很重要,贯穿整个存储体系
- 拷贝:很昂贵,应该尽量减少 硬件设备五花八门,需要有抽象统一的接入层。
RAID技术
单机存储系统怎么做到高性能/高性价比/高可靠性?R(edundant) A(rray) of I(nexpensive) D(isks)
RAID出现的背景:
- 单块大容量磁盘的价格>多块小容量磁盘
- 单块磁盘的写入能力<多块磁盘的并发写入性能
- 单块磁盘的容错能力有限,不够安全
RAID0:
- 多块磁盘简单组合。
- 数据条带化存储,提高磁盘带宽。将写入的数据划分为多块,分别存入不同磁盘的相同偏置位置处。
- 没有额外的容错设计。任何一块磁盘坏掉都会导致数据不可用。
RAID1:
- 一块磁盘对应一块额外镜像盘。
- 真实空间利用率仅50%。
- 容错能力强。
RAID0+1:
- 结合RAID0和RAID1,将4块磁盘分为两组,一组为另一组的镜像,组内多路读写。
- 真实空间利用率仅50%。
- 容错能力强、读写带宽大。
1.2 数据库
关系型数据库是存储系统,但在存储之外又发展出其他能力:
- 结构化数据友好
- 支持事务(ACID)
- 支持复杂查询语言(SQL)
非关系型数据库也是存储系统,但是一般不要求严格的结构化:
- 半结构化数据友好
- 可能支持事务
- 可能支持复杂查询语言
1.3 数据库与经典存储的比较
结构化数据管理
一条用户注册数据如果用经典的存储方法写入文件,需要自行定义管理结构,如第1-4个bytes存数据长度,第2-4个bytes存id......而若使用关系型数据库则可以用表形式管理。
事务能力
事务具有ACID的特性。
复杂查询能力
经典存储要使用代码循环查找,判断偏置等。关系型数据库提供SQL实现。
2.主流产品剖析
存储>>>>>数据库;单机>>>>>分布式。
2.1 单机存储
单机存储=单个计算机节点上的存储软件系统,一般不涉及网络交互。
本地文件系统
文件系统的管理单元:文件
文件系统接口:文件系统繁多,如Ext2/3/4,sysfs,rootfs等,但都遵循VFS的统一抽象接口。
Linux文件系统的两大数据结构:Index Node & Directory Entry。
Index Node记录文件的元数据,如id,大小,权限,磁盘位置等。inode是一个文件的唯一标识,会被存储到磁盘上。inode的总数在格式化文件系统时就固定了。
Directory Entry记录文件名、inode指针,层级关系(parent)等。dentry是内存结构,与inode的关系是多对一(硬链接hardlink)。
key-value存储
常见使用方式:put(k,v)&get(k)。
常见数据结构:LSM-Tree,某种程度上牺牲读性能,追求写性能。
产品:LevelDB、RocksDB。
LSM-Tree分为两部分,内存与磁盘。两部分都遵循顺序写入的模式,不断追加key-value。内存中包含两部分:内存表和不可变内存表。每次追加向内存表中写数据,当内存表满了的时候,将数据刷新到不可变内存表中。不可变内存表的数据满了以后将数据写入磁盘的level0有序表,level1有序表,level2有序表(level值越大,层级越深,空间越大)。读取数据时需要合并多层的的数据,因此读效率低。
2.2 分布式存储
分布式存储=在单机存储基础上实现了分布式协议,涉及大量网络交互。
分布式文件系统-HDFS
HDFS堪称大数据时代的基石。当时高级硬件很贵,同时数据存量很大,要求超高吞吐。
HDFS核心特点:
- 支持海量数据存储
- 高容错性
- 弱POSIX语义
- 使用普通x86服务器,性价比高
内部包含管控节点(记录文件的位置)和存储节点。计算等交互尽量在相近的存储节点甚至同一个存储节点上进行,以提高效率。
分布式对象存储系统-Ceph
Ceph的核心特点:
- 一套系统支持对象接口、块接口、文件接口,且一切皆对象。
- 数据写入采用主备复制模型。
- 数据分布模型采用CRUSH算法(hash+权重+随机抽签)。
2.3 单机关系型数据库
单机数据库=单个计算机节点上的数据库系统
事务在单机内执行,也可能通过网络交互实现分布式事务。
商业产品oracle。开源产品MySQL,PostgreSQL
关系型数据库的通用组件:
- Query Engine:负责解析查询,生成查询计划
- Txn Manager:负责事务并发控制
- Lock Manager:负责锁相关的策略
- Storage Engine:负责组织内存、磁盘数据结构
- Replication:负责主备同步
关键内存数据结构:B-Tree、B+Tree、LRU List等。
关键磁盘数据结构:WriteAheadLog(RedoLog)、Page。
2.4 单机非关系型数据库
MongoDB、Redis、Elasticsearch。
关系型数据库一般直接使用SQL交互,而非关系型数据库交互方式各不相同。
非关系型数据库的数据结构千奇百怪,没有关系约束后,schema相对灵活。
不管是否是关系型数据库,大家都在尝试支持SQL(子集)和事务。
Elasticsearch:
- 面向文档存储
- 文档可序列化成json,支持嵌套
- 存储在index,index=文档的集合
- 存储和构建索引能力以来Lucene引擎
- 实现了大量搜索数据结构&算法(支持模糊搜索、关联搜索等,能自动算出关联程度)
- 支持RESTFUL API,也支持弱SQL交互
MongoDB:
- 面向文档存储
- 文档可序列化成JSON/BSON,支持嵌套
- 存在collection。collection=文档的集合
- 存储和构建索引能力依赖wiredTiger引擎
- 4.0后开始支持事务(多文档、跨分片多文档等)
- 常用client/SDK交互,可通过插件转义支持弱SQL
Redis:
- 数据结构丰富(hash表,set,zset,list)
- C语言实现,超高性能
- 主要基于内存,但支持AOF/RDB持久化
- 常用redis-cli/多语言SDK交互
2.5 分布式数据库
单机数据库的问题:容量有限,受硬件影响。没有弹性,资源扩缩容需要物理搬迁数据,费时费力。性价比低,计算资源和存储资源往往不匹配。
分布式数据库:存储节点池化,动态扩缩容,动态分配资源。
分布式数据库发展趋势:
- 多写的效率高于单写
- 从磁盘弹性到内存弹性
- 分布式事务优化
3.新技术演进
3.1 概览
- 软件架构变更:Bypass OS kernel
- AI增强:智能存储格式转换
- 新硬件革命:存储介质变更、计算单元变更、网络硬件变更
3.2 SPDK(Storage Performance Development Kit)
Bypass OS kernel已经称为一种趋势,SPDK使用了这种技术。
- 避开OS的内核空间,避免系统调用带来的性能损耗。直接从用户态IO访问磁盘。
- 用轮询替代中断:磁盘性能提高后中断次数随之上升(以前访问外设速度慢,所以cpu不能等待,而是中断并切换线程),不利于IO性能。SPDK poller可以绑定特定的cpu不断轮询,减少cs(content switch,上下文切换),提高性能。
- 使用很多无锁数据结构,如使用Lock-free Queue,降低并发时的同步开销。
3.3 AI & Storage
AI领域相关技术,如机器学习在很多领域,如推荐、风控、视觉领域证明了有效性。
在Storage领域,AI可以进行数据存储格式的转换:如数据的行存、列存各有优势,可以由AI决策进行行列混存(对数据贴行存或列存的标签)。
3.4 高性能硬件
- RDMA网络:传统的网络协议栈需要基于多层网络协议处理数据包,存在用户态与内核态的切换,足够通用但性能不是最佳。RDMA是kernel bypass的流派,不经过传统的网络协议栈,可以把用户态虚拟内存映射给网卡,减少拷贝开销,减少cpu开销。
- Persistent Memory:是在NVMe SSD和Main Memory间的一种全新的存储产品。IO时延介于SSD和Memory之间,约百纳秒量级。可以用作易失性内存(Memory mode),也可以用作持久化介质(app-direct)。
- 可编程交换机:P4 Switch,配有编译器、计算单元、DRMA,可以在交换机层对网络包做计算逻辑。在数据库场景下可以实现缓存一致性协议等。
- CPU/GPU/DPU:CPU从multi-core走向many-core,核心数量指数增长。GPU算力越来越强,显存空间越来越大。DPU异构计算,减轻CPU的workload(cpu用于通用计算,dpu用于特定计算)
引用