认识储存和数据库
01经典案例
数据的产生由用户注册账号开始后端服务器就开始负责储存用户的数据
由用户注册数据到后端服务器最后到数据库(或者其它系统)
数据的持久化:校验数据的合法性到修改内存最后到写入存储介质
02存储系统
存储系统是个提供了读写、控制类接口,能够安全有效地把数据持久化的软件,就可以称为存储系统
系统特点:1.作为后端软件的底座,性能敏感;2.存储系统的软件架构容易受到硬件影响;3.存储系统代码,既“简单”(输入输出流)又“复杂”(对于错误处理要尽可能都想到)
存储系统中:缓存很重要,贯穿整个存储体系;拷贝很昂贵,应该尽量减少;硬件设备五花八门,需要有抽象统一的接入层
RAID技术
单机存储系统怎么做到高性能/高性价比/高可靠性?——RAIG技术
出现的背景:单块大容量硬盘的价格>多块小容量的硬盘
单块硬盘的写入性能<多块硬盘的并发写入性能
单块硬盘的容错能力有限,不够安全
raid 0 :多块硬盘简单结合;数据条代化储存,提高硬盘带宽;没有额外的容错设计
raid 1: 一块硬盘对应着一块二外的镜像盘,真实空间利用率仅为50%;容错能力强
raid 1+0: 结合了raid1和raid0真实空间利用率仅为50%;容错能力强,写入带宽好
数据库中的关系:关系=集合=任意元素组成的若干有序偶对反映了事物间的关系
关系代数=对关系做运算的抽象查询语言
SQL=一种DSL=方便人类阅读的关系代数表达形式
关系型数据库特点
关系型数据库是存储系统,但是在存储之外,有发展出其他的能力(例如:结构化数据友好;支持事务ACID;支持复杂查询语言)
非关系型数据库特点
非关系型数据库也是存储系统,但是一般不要求严格的结构化,(对半结构化的数据友好;可能支持事务;可能支持复杂的查询语言)
结构化数据管理
一条用户注册数据:数据库会写入关系型数据库,以表的形式来进行管理;经典存储会写入文件,自行定义管理结构;
事务能力:
事物具有A(tomicity),事务内的操作要么全做,要么不做
C(onsistency),事务执行前后,数据状态是一致的
I(solation),可以隔离多个并发事务,避免影响
D(urability),事务一旦提交成功,数据保证持久性
数据库对于经典存储复杂查询能力强
03主流产品刨析
3.1单机存储系统
单机存储=单个计算机节点上的存储软件系统,一般不涉及网络交互
单机存储系统有:本地文件系统;key-value存储;
Linux中:一切皆文件
文件系统的管理单元:文件
文件系统接口:文件系统繁多,但是都是遵循VFS的统一抽象接口
Linux的文件系统的两大数据结构:index node&directory entry
index node:记录文件元数据,如id,大小,权限,磁盘位置等;inode是一个文件的唯一标识,会被存储在磁盘上,inode的总数在格式化文件系统时就固定了
Directory Entry:记录文件名、inode:指针,层级关系(parent)等dentry:是内存结构,与inode的关系是N:I(hardlink的实现)
key-value存储
常见使用方式:put(k,v)&get(K) 常见数据结构:LSM-Tree,某种程度上牺牲读性能,追求写入性能 拳头产品:RocksDB
分布式存储
分布式存储=在单机存储基础上实现了分布式协议,涉及大量网络交互
经典的分布式存储系统分布式文件系统;分布式对象存储
分布式存储——HDFS
时代背景:专用的高级硬件很贵,同时数据存量很大,要求超高吞吐
HDFS核心特点: 支持海量数据存储 高容错性 弱POSIX语义 使用普通x86服务器,性价比高
分布式存储——ceph
Ceph:开源分布式存储系统里的「万金油」
Ceph的核心特点: 一套系统支持对象接口、块接口、文件接口,但是一切皆对象 数据写入采用主备复制模型 数据分布模型采用CRUSH算法(HASH+权重+随机抽签)
单机数据库
单机数据库=单个计算机节点上的数据库系统 事务在单机内执行,也可能通过网络交互实现分布式事务
关系型数据库
关系型数据库的通用组件 Query Engine一负责解析query,生成查询计划 Txn Manager—负责事务并发管理 Lock Manager—负责锁相关的策略 Storage Engine一负责组织内存/磁盘数据结构 Replication一负责主备同步
关键内存数据结构:B-Tree、B+-Tree、LRU List等 关键磁盘数据结构:WriteAheadLog(RedoLog)、Page
非关系型数据库
MongoDB、Redis、Elasticsearch.三足鼎立
关系型数据库一般直接使用SQL交互而非关系型数据库交互方式各不相同 非关系型数据库的数据结构千奇百怪,没有关系约束后,schema相对灵活 不管是否关系型数据库,大家都在尝试支持SQL(子集)和“事务
Elasticsearch:
面向「文档]存储 文档可序列化成SON,支持嵌套 存在「index」,index=文档的集合 存储和构建索引能力依赖Lucene引擎 实现了大量搜索数据结构&算法 支持RESTFUL API,也支持弱SQL交互
MongoDB:
面向「文档」存储 文档可序列化成SON/BSON,支持嵌套 存在「collection],collection=文档的集合 存储和构建索引能力依赖wiredTiger引擎 4.0后开始支持事务(多文档、跨分片多文档等) 常用client/SDK交互,可通过插件转译支持弱SQL
Redis:
数据结构丰言(hash表、set、Zset、ist) C语言实现,超高性能 主要基于内存,但支持AOF/RDB持久化 常用redis-d/多语言SDK交互
从单机到分布式数据库
解决容量问题
单点容量有限,受硬件限制到池化存储,存储节点池化,动态扩缩容
解决弹性问题
解决性价比问题
分布式数据库可以多写;磁盘和内存弹性,分布式事务优化
4新技术演进
1.)软件架构变更(Bypass OS kernel)
2.)AI增强(智能存储格式转换)
3.)新硬件革命(存储介质变更,计算单元变更,网络硬件变更)
4.2新技术演进(spdk)(Storage Performance Development Kit)
1.)Kernel Space -User Space 避免syscall带来的性能损耗,直接从用户态访问磁盘
2.)中断->轮询 磁盘性能提高后,中断次数随之上升,不利于IO性能 SPDK poller可以绑定特定的cpu核不断轮海,减少cs,提高性能
3.)无锁数据结构 使用Lock-free aueue,降低并发时的同步开销
4.3AI&Storage
4.4高性能硬件
01.RDMA网络
传统的网络协议栈,需要基于多层网备协议处理数据包,存在周 户态&内核态的切换,足够通用但性能不是最佳 RDMA是kernel bypass的流派,不经过传统的网络协议栈,可以把 用户态虚拟内存映射给网卡,减少拷贝开销减少cpu开销
02.Persistent Memory
在NVMe SSD和Main Memoryl间有一种全新的存储产品:Persistent Memory
IO时延介于SSD和Memory之间,约百纳秒量级 可以用作易失性内存(memory mode),也可以用作持久化介质(app-direct)
03.可编程交换机
P4 Switch,配有编译器、计算单元、DRAM,可以在交换机层对网 络包做计算逻辑。在数据库场景下,可以实现缓存一致性协议等
04.CPU/GPU/DPU
CPU:从muti-core走向mamy-core GPU:强大的算力&越来越大的显存空间 DPU:异构计算,减轻CPU的workload
存储系统 块存储:存储软件栈里的底层系统,接口过于朴素 文件存储:日常使用最广泛的存储系统,接口十分友好,实现五花八门 对象存储:公有云上的王牌产品,immutable语义加持 key-value存储:形式最灵活,存在大量的开源/黑盒产品 数据库系统 关系型数据库:基于关系和关系代数构建的,一般支持事务和SQL访问,使用体验友好的存储产品 非关系型数据库:结构灵活,访问方式灵活,针对不同场景有不同的针对性产品 分布式架构 数据分布策略:决定了数据怎么分布到集群里的多个物理节点,是否均匀,是否能做到高性能 数据复制协议:影响1○路径的性能、机器故障场景的处理方式 分布式事务算法:多个数据库节点协同保障一个事务的ACD特性的算法,通常基于2c的思想设计
本文主要介绍了存储系统的基本概念和特点,以及主流的存储系统产品,包括单机存储系统、分布式存储系统、关系型数据库和非关系型数据库。单机存储系统包括本地文件系统和key-value存储,其中本地文件系统在Linux中采用统一抽象接口VFS,而key-value存储则采用LSM Tree数据结构实现高性能写入。分布式存储系统包括HDFS和Ceph,它们采用不同的数据分配算法和数据复制方式,具有高容错性、高扩展性和高性能的特点。关系型数据库和非关系型数据库都有自己的优势和特点,前者通过SQL实现严格的结构化数据管理和事务能力,后者则可以更灵活地处理半结构化数据和支持复杂的查询语言。