Class8:存储&数据库
经典案例:新app注册登录
一条数据从产生,到数据流动,最后持久化的全生命周期
- 数据的产生:填写注册信息,建立账户
- 数据流动:一条结构化用户注册数据,包括账户,密码等 -> 到达后端服务器 -> 到达数据库(其他系统支持)
- 数据持久化:校验数据合法性(账号原本是否存在)-> 修改内存 -> 写入存储介质(寿命&性能友好)
问题:数据库如何保证数据不丢?如何处理多人同时修改问题?除了数据库,还有别的存储系统吗?有。数据库只能处理结构化数据?不是(非结构化数据如何存储)。有哪些操作数据库的方式,要用什么编程语言?
存储&数据库简介
存储系统:提供读写、控制类接口,能安全有效把数据持久化的软件,即可称为存储系统(用户、介质、内存、网络)
系统特点:性能敏感(后端系统底座)、易受硬件影响(存储系统软件架构)、代码即简单(读写)又复杂(IO异常分支处理系统)
存储器的层级结构:金字塔塔尖:特定存储设备(容量极小,支撑超高性能),塔底:容量很大,但性能较差(tape磁带),persistent memory:兼顾持久化存储与内存存储
数据怎么从应用到存储介质:缓存cache(很重要,贯穿存储体系,尤其是跨软件层,以硬件友好的方式交互)、拷贝(昂贵,尽量减少)、需要抽象统一的接入层 - Disk(硬件存储)
存储系统 - RAID技术
RAID:Redundant Array of Inexpensive Disks
单机存储系统高性能、高性价比、高可靠性
背景:单块磁盘的性价比、性能、容错能力都小于多块磁盘
RAID0:多块磁盘的简单组合,数据条带化存储、提高磁盘带宽、但没有额外的容错设计
RAID1:一块磁盘对应一块额外镜像盘、真实空间利用率仅50%,但容错能力强。与RAID0是两个极端
RAID 0+1:结合RAID0和1(4块磁盘,两两以RAID0连接,再用RAID1连接这两对磁盘,或者反向,向连RAID1,再连RAID0),真实空间利用率为50%,容错能力强,写入带宽好
数据库
- 关系型数据库
关系:集合
关系代数:对关系运算的抽象查询语言,例如交、并、笛卡尔积
SQL(Structured Query Language,结构化查询语言):一种DSL(Domain-specific Language,领域专业语言),方便人类阅读的关系代数表达形式
关系型数据库的特点:结构化数据友好,支持事务(ACID四个特性),支持复杂查询语言(SQL)
- 非关系型数据库
一般不要求严格的结构化
特点:半数据化结构友好,可能支持事务(ACID),可能支持复杂查询语言(SQL)
数据库 vs 经典存储 - 结构化数据管理
关系型数据库:一条结构化用户注册数据 -> 写入关系型数据库,以表形式管理
经典存储:写入文件,自行定义,管理结构,定义数据结构,结构体(总长度,4 byte,下一字段长度,字段,长度,字段,长度,字段...)
- 事务能力:数据库支持事务
事务具有的四个特性:ACID
-
Atomicity:事务内操作(插入,更新,查询)要么全做,要么不做
-
Consistency:事务执行前后,数据状态是一致的(转账前后,总钱数不变,A减少,则B增加)
-
Isolation:可以隔离多个并发事务,避免影响(与隔离级别也有关系)
-
Durability:事务一旦提交成功,数据保证持久性
- 复杂查询能力:数据库更简洁、灵活
可以理解为,存储系统为word,数据库为excel,对于结构化数据的查询,添加数据等事务操作,存储写入等excel更简洁高效
主流产品剖析
单机存储
单机存储:单个计算机节点上的存储软件系统,一般不涉及网络交互
- 本地文件系统
管理单元:文件
文件系统接口:Ex2/3/4,sysfs,rootfs等繁多文件系统均遵循VFS的统一抽象接口
Linux文件系统的两大数据结构:Index Node(记录文件元数据,包括id,大小,权限,磁盘位置等,index是一个文件的唯一标识),Directory Entry(记录文件名、index指针,层级关系等,dentry是内存结构,与index的关系是N:1)
- key-value存储
key:身份证
value:内涵
常见使用方式:put(k, v) & get(k)
常见数据结构:LSM-Tree,某种程度上牺牲读性能,追求写入性能,顺序写入,持续追加,内存某一块写满,即写入磁盘level1,然后到level2,持续下压,读入要一层一层读
拳头产品:RocksDB
分布式存储
分布式存储:单机存储基础上实现分布式协议,设计大量网络交互
- 分布式文件系统
HDFS: 大数据时代基石
背景:专用高级硬件很贵,数据存量很大,要求超高吞吐(单个大的很贵,用很多个便宜的组装起比较便宜)
HDFS核心特点:支持海量数据存储,高容错性,弱POSIX语义,使用普通x86服务器,性价比高
management Node (NameNode) -> Storage Node (DataNode)
- 分布式对象存储
Ceph: 开源分布式存储系统中的万金油
核心特点:一套系统支持对象接口、块接口、文件接口,但一切皆对象。数据写入采用主备复制模型(先写入主节点,再通过主节点进行链状的多副本冗余复制)。数据分布模型采用CRUSH(Hash+权重+随机抽签)算法
单机关系型数据库
单机数据库:单个计算机节点上的数据库系统
事务在单机内执行,也可能通过网络交互实现分布式事务
商业产品Oracle
开源产品MySQL & PostgreSQL
关系型数据库的通用组件:
- Query Engine —— 负责解析query,生成查询计划
- Txn Manager —— 负责事务并发管理
- Lock Manager —— 负责锁相关的策略
- Storage Engine —— 负责组织内存/磁盘数据结构,进行高性能读写
- Replication —— 负责主备同步
关键内存数据结构:B-Tree、B+-Tree LRU List等
关键磁盘结构:WriteAheadLog(RedoLog)、Page
在内存中,数据以Page数据结构树状存储在内存,进行修改操作时,会写一条Re do log,并会产生临时文件
在磁盘中,有三类文件,Page Files对应树状图的一个Page数据结构,Redo Log Files对应Redolog,Others对应临时文件
单机非关系型数据库
MongoDB、Redis、Elasticsearch三足鼎立,特点:
- 关系型数据库一般直接使用SQL交互,而非关系型数据库交互方式各不相同
- 非关系型数据库的数据结构千奇百怪,没有关系约束后,schema相对灵活
- 不管是否是关系型数据库,都在尝试支持SQL(子集)和“事务”
Elasticsearch:
- 面向文档存储,
- 文档可序列化为JSON,支持嵌套
- 存在“index”,即文档的集合
- 存储和构建索引能力依赖Lucene引擎
- 实现了大量搜索数据结构&算法
- 支持RESTFUL API,也支持弱SQL交互
案例:小明在注册的app上发了一个帖子“C++编程有点难”,会变为结构化数据存储。
小李在app上搜索“编程语言哪个好,哪个难度大?”会以“编程语言,好,难度”等关键词进行模糊搜索/匹配,就会把小明的帖子反馈给小李,这正是Elasticsearch擅长的
特点:与关系型数据库(RDBMS: Relational Database Management System)相比,ES(Elasticsearch)天然能做模糊搜索,还能自动计算出关联程度
MongoDB:灵活
- 面向文档存储
- 可序列化成JSON/BSON,支持嵌套
- 存在collection,即文档的集合
- 存储和构建索引能力依赖wiredTiger引擎
- 4.0后开始支持事务(多文档、跨分片多文档等)
- 常用client/SDK交互,可通过插件转译支持弱SQL
Redis
- 数据结构丰富(Hash表、set、zset、list)
- C语言实现,超高性能
- 主要基于内存,但支持AOF/RDB持久化
- 常用redis-cli/多语言SDK交互
分布式数据库
问题:容量、弹性、性价比
- 容量:单点容量有限,受硬件限制,解决方案:存储节点池化,动态扩缩容
- 弹性:原本数据库比较小,但随着业务增加,CPU资源紧张,不够用了,进行扩容,搬迁全量数据,扩容成功,访问新数据库,后来又需要缩容,搬数据到硬盘难以解决。池化可以解决存储空间扩缩容问题。
- 性价比:一个16核往往配100G的容量,但要写500G数据,则CPU利用率仅为20%,若加为32核,1TB容量,容量够,但CPU利用率仅为10%(核数加倍,利用率减半)。磁盘容量池化后(可动态扩容),可以利用16核CPU配池化的500G容量,提高性价比。
其他问题:单写 vs 多写;从磁盘弹性到内存弹性;分布式事务优化
存储与数据库新技术
新架构/新硬件/新理论/人工智能
- 软件架构变更:Bypass OS kernel趋势:SPDK,User Space、轮询、无锁数据结构
- AI增强:智能存储格式转换:数据存储格式是转换,行存/列存 -> 行列混存(AI辅助实时决策)
- 新硬件革命:存储介质变更、计算单元变更、网络硬件变更
高性能硬件:
- RDMA网络
- Persistent Memory
- 可编程交换机
- CPU/GPU/DPU(异构计算)(计算单元的变革)
总结
存储系统 - 数据库系统 - 分布式架构,由硬件反推软件变革
存储系统为word,数据库为excel,对于结构化数据的查询,添加数据等事务操作,存储写入等excel更简洁高效,分布式则是池化磁盘空间,固定的核数下,提供动态磁盘空间的扩缩容。