存储 & 数据库 | 青训营笔记

203 阅读7分钟
  1. 经典案例
  1. 数据的产生
    过程:用户提供数据 -> 后端服务器 -> 数据库(数据持久化) -> 其它系统(略)
  2. 数据持久化 校验数据的合法性 -> 修改内存(用高效的数据结构组织数据) -> 写入存储介质
  1. 存储 & 数据库简介
  1. 存储系统
    1. 是什么
      一个提供了读写、控制接口,能够安全有效的把数据持久化的软件
    2. 特点
      • 作为后端软件的底座,性能敏感(频繁的输出输入需要高性能)
      • 存储系统代码既“简单”又“复杂”(代码不能写太复杂,搞得性能差;异常错误处理上得考虑全面)
      • 存储系统软件架构,容易受硬件影响(软件顺应硬件)
    3. 存储器层级结构
      • 金字塔(读取速度快慢和容量大小相反)
      • 速度和容量大概相兼容:persistent memory
    4. 数据怎么从应用到存储介质
      • 缓存很重要,贯穿整个存储体系(硬件读取数据和软件输出的数据速度不一致,以友好的方式进行交互)
      • 拷贝很昂贵,应该尽量减少(拷贝需要用到cpu)
      • 硬件设备五花八门,需要有抽象统一的接入层(让软件与硬件适配性更好)
    5. RAID技术
      • 背景需求
        • 价格
        • 性能
        • 容错能力、安全性
      • 型号
        • RAID 0:把一个用户数据并发写入多个磁盘,性能较好,但没有容错
        • RAID 1:也是多个磁盘的组合,但并不是为了性能,而是为了容错。 一块磁盘对应一块额外镜像盘;故真实空间利用率仅为50%;容错能力强
        • RAID 0+1: 结合了RAID 0和RAID 1;真实空间利用率仅为50%;容错能力强,写入带宽好
  2. 什么是数据库系统
    1. 关系
      • 关系 = 集合 = 任意关系组成的若干有序偶对
      • 反映事物间的关系
      • 关系代数 = 对关系做运算的抽象查询语言(交、并、笛卡尔积...)
    2. 关系型
      关系型数据库是存储系统,但在存储之外,又发展出其他能力
      • 结构化数据友好
      • 支持事务(ACID)
      • 支持复杂查询语言
    3. 非关系型
      非关系型数据库也是存储系统,但是一般不要求严格的结构化
      • 半结构化数据友好
      • 可能支持事务(ACID)
      • 可能支持复杂查询语言
    4. 数据库 vs 经典存储
      1. 结构化数据管理
      • 结构化数据
        • 结构化数据,简单来说就是数据库,也可称作行数据,它是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。
        • 结构化数据的一般特点:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的,存储在数据库中;能够用数据或统一的结构加以表示,如数字、符号;能够用二维表结构来逻辑表达实现,包含属性和元组
      • 比较 image.png
      1. 事物能力ACID
        • Atomicity: 事物内的操作要么全做,要么不做
        • Consistency:事物执行前后,数据状态是一致的
        • Isolation:可以隔离多个并发事物,避免影响
        • Durability:事物一旦提交成功,数据保证持久性
      2. 复杂查询能力
        • 如sql
  1. 主流产品剖析
  1. 单机存储
    • 单机存储 = 单个计算机节点上的存储软件系统,一般不涉及网络交互
      1. 本地文件系统
      • Linux中的经典哲学:一切皆文件
      • 文件系统的管理单元:文件
      • 文件系统接口:文件系统繁多,如Ext2/3/4,sysfs,rootfs等,但都遵循VFS的统一接口
      • Linux文件系统的两大数据结构:Index Node & Directory Entry
        1. Index Node
          • 记录文件元数据,如id、大小、权限、磁盘位置等
          • inode是一个文件的唯一标识,会被存储到磁盘上
          • inode的总数在格式化文件系统时就固定了
        2. Directory Entry
          • 记录文件名、inode指针、层级关系(parent)等
          • dentry是内存结构,与inode的关系是N:1(hardlink的实现)
      1. key-value存储
        • 世间一切皆key-value
        • 常见使用方法:put(k,v) & get(k)
        • 常见数据结构:LSM-Tree,某种程度上牺牲读性能,追求写入性能
        • 拳头产品(类似代表作的意思):RocksDB
  2. 分布式存储
    • 分布式存储 = 在单机存储基础上实现了分布式协议,涉及大量网络交互
    • HDFS:堪称大数据时代的基石
      • 背景 专用的高级硬件很贵,同时数据存量很大,要求超高吞吐
      • 核心特点
        • 支持海量数据存储
        • 高容错性(便宜错多,所以要有高容错性)
        • 若POSIX语义
        • 使用普通x86服务器,性价比高
    • Ceph:开源分布式存储系统里的万金油
      • 一套系统支持对象接口、块接口、文件接口,但是一切皆而对象
      • 数据写入采用主备复制模型
      • 数据分布模型采用CRUSH算法 (HASH+权重+随机抽签)
  3. 单机数据库
    单机数据库 = 单个计算机节点上的数据库系统
    事务在单机内执行,也可能通过网络交互实现分布式事务
    1. 单机关系型数据库 商业产品:Oracle 开源产品:MySQL & PostgreSQL
    2. 单机非关系型数据库 代表:MongoDB、Redis、Elastisearch
    • 关系型数据库一般直接使用SQL交互,而非关系型数据库交互方式各不相同
    • 非关系型数据库的数据结构千奇百怪,没有关系约束后,schema相对灵活
    • 不管是否关系型数据库,大家都在尝试支持SQL(子集)和“事物”(内卷)
    • Elastisearch
      • 面向文档存储
      • 文档可序列化为JSON,支持嵌套
      • 存在【index】,index = 文档的集合
      • 存储和构建索引能力依赖Lucene引擎
      • 实现了大量搜索数据结构 & 算法
      • 支持RESTFUL API,也支持弱SQL交互
      • 跟RDBMS相比,ES天然能做模糊搜索,还能自动算出关联程度
    • MongoDB
      • 面向文档存储
      • 文档可序列化为JSON/BSON,支持嵌套
      • 存在【collection】,collection = 文档的集合
      • 存储和构建索引能力依赖wiredTiger引擎
      • 4.0后开始支持事物(多文档、跨分片多文档等)
      • 支持client/SDK交互,可通过插件转译支持弱SQL
    • Redis
      • 数据结构丰富(hasg表、set、zset、list)
      • C语言表现,超高性能
      • 主要基于内存,但支持AOF/ROB持久化
      • 常用redis-cli多语言SDK交互
  4. 分布式数据库
    单机问题:
    1. 容量问题
      单点容量有限,受硬件限制
      改进:存储节点池化,动态扩缩容
    2. 弹性问题
    3. 性价比问题
  1. 新技术演进
  1. 概览
  • 软件架构变更
  • AI增强
  • 新硬件革命(存储介质变更、计算单元变更、网络硬件变更)
  1. SPDK
  • Kernel Space -> User Space
  • 中断 -> 轮询
  • 无锁数据结构
  1. AI & Storage
  • 存储格式的转换(行存、列存、行列混存)
  1. 高性能硬件
  • RDMA网络
  • Persistent Memory
  • 可编程交换机
  • CPU/GPU/DPU
  1. 总结

image.png 在存储 & 数据库领域,硬件反推软件变革十分常见

在学习本次课程之前,我一直以为存储系统和数据库是两个彼此毫无关联的东西,听完课程后才发现这两者也是有相同之处的。
用我自己的理解,我把他们两个这样来表示‘数据库 > 存储系统’,因为数据库除了是一个存储系统,还有着其他功能。
此外,也对Redis有了比较高的兴趣,不仅仅是许多oj要求有Redis能力。原来MySQL是关系型数据库,而Redis是非关系型数据库,所以我想去学习了解一下它们有什么不同,这样也更能理解关系型数据库和非关系型数据库的区别。