存储与数据库|青训营笔记
这是我参与【第五届青训营】伴学笔记创作活动的第14天。
一、重点知识
- 数据存储的定义、特点、数据如何存储
- 数据库:常见数据库、架构、与数据存储到区别
- 常见数据存储与数据库
二、详细知识点
1. 经典案例
- 数据的产生: 注册生成大量数据
- 数据的流动:用户的数据存到后端服务器->数据库
- 持久化之后才能存储下来
- 若不持久化,则没有记忆能力
- 数据的持久化
- 教验数据合法性
- 修改内存:高效的数据结构组织数据
- 写入存储介质
- 潜在问题
- 数据库如何保证数据不丢
- 数据库怎么处理同时多人修改问题
- 除了数据库外其他的存储系统
- 数据库只能处理结构化数据么
- 哪些操作数据库方式,编程语言?
2. 存储、数据库简介
2.1 存储系统
- 系统概览:存储系统
- 提供了读写、控制类接口
- 能够安全有效的把数据持久化软件
- 系统特点
- 作为后端软件底座,性能敏感
- 存储系统软件架构受硬件影响
- 存储系统代码简单又复杂
- 数据从应用到存储介质
- 缓存:贯穿整个存储体系
- 拷贝:昂贵,尽量减少
- 硬件设备五花八门,需要抽象统一的接口
2.2 RAID技术
- 单机存储系统:高性能/高性价比/高可靠
- Redundant Array of Inexpensive Disks
- 背景
- 单块大容量磁盘价格>多块小容量磁盘
- 单块写入性能<多块磁盘并发写入性能
- 单块磁盘容错能力有限,不够安全
- RAID0
- 多块磁盘简单组合
- 数据条带化存储,提高磁盘带宽
- 没有额外的容错设计
- RAID1
- 一块磁盘对应一块额外镜像盘
- 真实空间利用率50%
- 容错能力强
- RAID 0+1
- 结合两方优点
- 真实空间利用率50%
- 容错能力强,写入带宽好
2.3 数据库
- 分类
- 关系型数据库
- 关系=集合=任意元素组成的若干有序偶对
- 关系代数=对关系做运算的抽象查询语言
- SQL=DSL=方便人类阅读的关系代数表达形式
- 发展出其他能力
- 结构化数据友好
- 支持事务ACID
- 支持复杂查询语言SQL
- 非关系型数据库
- 也是存储系统,不要求严格结构化
- 半结构化数据友好
- 可能支持事务
- 可能支持复杂查询语言
- 也是存储系统,不要求严格结构化
- 关系型数据库
- 结构化数据管理
- 写入关系性数据库:以表形式管理
- 写入文件:自行定义管理结构
- 事务能力
- Atomicity:要么全做要么不做
- Consistency:事务执行前后数据状态一致
- Isolation:隔离多个并发事务避免影响
- Durability:一旦提交成功,数据保证持久性
- 复杂查询能力
- 数据库可以SQL直接查询
- 非数据库需要写代码
3. 主流产品剖析
3.1 单机存储
- 单机存储:单个计算机节点上的存储系统
- 本地文件系统
- 文件系统管理单元:文件
- 文件系统接口:Ext2/3/4,sysfs,rootfs,都遵循VFS统一抽象接口
- Linux文件系统的两大数据结构
- Index Node:记录文件元数据,文件的唯一标识,会被存储到磁盘上,inode总数在格式化文件系统时就固定了
- Directory Entry:记录文件名、inode指针、层级关系等
- dentry是内存结构,与inode N:1
- KV存储
- put(K,V) & get(K)
- LSM-Tree:某种程度上牺牲读性能追求写入性能
- RocksDB
3.2 分布式存储
- 在单机存储基础上实现了分布式协议,大量网络交互
- HDFS
- 存储和管理分离,通过询问管理节点访问实际的存储节点
- 支持海量数据存储
- 高容错性
- 弱POSIX语义
- 普通x86服务器性价比高
- Ceph
- 核心特点:支持对象接口、块接口、文件接口,一切皆对象
- 数据写入采用主备复制模型
- 数据分布模型采用CRUSH算法:hash+权重+随机抽签
3.3 单机关系性数据库
- 单机数据库:单个计算机节点上的数据库系统
- 事务在单机内执行,也可能通过网络交互实现分布式事务
- Oracle MySQL&PostgreSQL
- 通用组件
- Query Engine解析query生成查询计划
- Txn manager:负责事务并发管理
- Lock Manager:负责锁相关策略
- Storage Engine:负责组织内存、磁盘数据结构
- Replication:负责主备同步
- 关键内存数据结构:B-Tree,B+ tree,LRU
- 关键磁盘数据结构:WriteAheadLog(Redolog)、Page
- 通用组件
3.4 单机非关系型数据库
- MongoDB、Redis、Elasticsearch
- 交互方式各不相同,数据结构千奇百怪,尝试支持SQL和事务
- Elasticsearch
- 面向文档存储
- 文档可序列化为Json
- 存在Index,文档的集合
- 存储和构建索引能力依靠Lucene
- 大量搜索数据结构/算法
- 支持Restful API
- MongoDB
- 面向文档存储
- 可序列化JSON/BSON 支持嵌套
- 存在collection:文档集合
- 存储构建索引依靠wiredTiger引擎
- 4.0后支持事务
- 常用client/SDK交互
- 通过插件转译支持弱SQL
- redis
- 数据结构丰富:hash表、set、zset、list
- c语言实现,超高性能
- 主要基于内存,支持AOF/RDB持久化
- 常用redis-client/多语言SDK交互
3.5 分布式数据库
- 单机的问题:容量/弹性/性价比
- 解决容量问题
- 单点容量有限,受硬件限制
- 存储节点池化,可以动态扩缩容
- 解决弹性问题
- 扩张搬迁的时候需要耗费大量时间
- 缩容难以解决disk问题
- 使用共享存储池,不需要扩展CPU、减少池
- 需要解决的问题
- 单写/多写
- 从磁盘弹性到内存弹性
- 分布式事务优化
4. 新技术演进
4.1 概览
- 软件架构变更:bypass OS kernel
- AI增强:智能存储格式转换
- 新硬件革命
- 存储介质变更
- 计算单元变更
- 网络硬件变更
4.2 SPDK
- 避开OS的kernel space,直接放入用户态,避免syscall的性能损耗
- 磁盘性能提高后中断次数随之上升,不利于IO性能;SPDK poller可以绑定特定CPU核不断轮询,减少cs提高性能
- 无锁queue,降低并发时同步开销
4.3 AI&Storage
- 数据存储格式转换
- AI决策:行列混存
4.4 高性能硬件
- RDMA网络:不经过传统网络协议,把用户态虚拟内存映射给网卡,减少拷贝开销CPU开销
- Persistent Menory:可以用作易失性内存,也可用作持久化介质
- 可编程交换机
- CPU/GPU/DPU
三、课后总结
本节课主要介绍了存储与数据库相关的知识。在学习中对于关系型数据库的利用较为充分,而本节课介绍了非关系型数据库、分布式存储的相关内容,需要在今后的学习中进一步进行理解。