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

114 阅读10分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天

这里主要讲的是,讲解存储/数据库系统的产生背景及基本特点。本节课将通过一个模拟案例,描述数据是怎么产生,在后端系统里怎么流通,最后怎么写入到存储/数据库系统。

经典案例

注册APP,填写了很多的资料 -> 注册

image-20230126094045466

数据的流动

image-20230126094132389

数据的持久化

校验数据的合法性(是否已经存在了之类的?) -> 修改内存(用搞笑的数据结构组织数据) -> 写入存储介质(以寿命&性能友好的方式写入硬件)

潜在的问题

  • 数据库怎么保证数据不丢?
  • 数据库怎么处理多人同时修改的问题?
  • 为什么用数据库,除了数据库还能存到别的存储系统吗?
  • 数据库只能处理结构化数据吗?
  • 有哪些操作数据库的方式,要用什么编程语言?

存储 & 数据库简介

存储系统简介

  • 什么是存储系统,系统概览:

    • 一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件,就可以称为存储系统。
    • User, Medium, Memory, Network
  • 系统特点:

    • 作为后端软件的底座,性能敏感
    • 系统存储代码,既“简单”又“复杂”
    • 存储系统软件架构,容易受硬件影响

Computer Memory Hierarchy

image-20230126095327147

处于中间位置,稳定+高性能+便宜

###数据从应用到存储介质

image-20230126095414924

  • 「缓存」很重要,贯穿整个存储体系
  • 「拷贝」很昂贵,应该尽量减少
  • 硬件设备五花八门,需要有抽象统一的接入层

RAID技术

  • 单机存储系统怎么做到高性能/高性价比/高可靠性

    • R(edundant) A(rray) of I(nexpensive) D(isks)
  • RAID出现的背景:

    • 单块大容量磁盘的价格>多块小容量磁盘
    • 单块磁盘的写入性能<多块磁盘的并发写入性能
    • 单块磁盘的容错能力有限,不够安全
  • 经典RAID组合:

    • RAID 0

      • 多块磁盘简单组合
      • 数据条带化存储,提高磁盘带宽
      • 没有额外的容错设计
    • RAID 1

      • 一块磁盘对应一块额外镜像盘
      • 真实空间利用率仅50%
      • 容错能力强
    • RAID 0+1

      • 结合了RAID0 和 RAID 1
      • 真实空间利用率仅50%
      • 容错能力强,写入带宽好

数据库

关系型数据库/非关系型数据库

概览

  • Edgar .F . Codd于1970年提出「关系模型」

  • 关系代数=对关系作运算的抽象查询语言

    • 交、并、笛卡尔积....
  • 关系=集合=任意元素组成的若干有序偶对,反应了事物间的关系
  • SQL =一种DSL =方便人类阅读的关系代数表达形式

关系型数据库特点

  • 关系型数据库是存储系统,但是除了存储功能,又衍生出了其他能力:

    • 结构化数据友好
    • 支持事务(ACID)
    • 支持复杂查询语言(SQL)

非关系型数据库特定

  • 非关系型数据库也是存储系统,但是一般不要求严格的结构化:

    • 半结构化数据友好
    • 可能支持事务(ACID)
    • 可能支持复杂查询语言(SQL)

经典存储 vs 数据库

结构化数据管理

image-20230126101010551

经典存储系统(hhh我个人觉着这里狭隘了,指的是磁盘,内存等):是和bytes打交道,不是很好用昂。

关系型数据库系统:和表和数据打交道,不考虑底层bytes,上层抽象非常棒!!!

事务能力

image-20230126101157436

经典存储系统,并不天然支持ACID。数据库这层抽象做了非常newbee的封装,提供了非常好用的特性昂!

复杂查询逻辑

image-20230126101312176

SQL支持非常复杂的查询,分组,统计之类的,就挺好用的昂!!!

关系型数据库灵活&简洁,经典的存储系统僵化,复杂。

数据库使用方式

image-20230126101448745

主流产品剖析

单机存储

单机存储=单个计算机节点上的存储软件系统,一般不涉及网络交互

  • 类型:

    • 本地文件系统
    • Key-value存储

本地文件系统

Linux经典哲学:一切皆文件

  • 文件系统接口:文件系统繁多,如Ext2/3/4. sysfs, rootfs等,但都遵循VFS的统一抽象接口

  • Linux文件系统的两大数据结构: Index Node & Directory Entry

    • Index Node:

      • 记录文件元数据,如id、大小、权限、磁盘位置等
      • inode是唯一个文件的唯一标识, 会被存储到磁盘上
      • inode的总数在格式化文件系统时就固定了。
    • Directory Entry:

      • 记录文件名、inode指针, 层级关系(parent)等
      • dentry是内存结构,与inode的关系是N: 1 (hardlink的实现)

key-value存储

世间一切皆key-value — key是你身份证, value是你的内涵: )

常见使用方式: put(k, v) & get(k)

常见数据结构: LSM-Tree,某种程度上牺牲读性能,追求写入性能

拳头产品: RocksDB

image-20230126102752411

分布式存储

分布式存储 = 单机存储基础上实现了分布式协议,设计大量网络交互

  • 类型:

    • 分布式文件系统
    • 分布式对象存储

HDFS

大数据时代的基石

  • 时代背景:专用的高级硬件很贵,数据存量很大,要求超高吞吐。
  • HDFS核心特点:

    • 支持海量数据存储
    • 高容错性
    • 弱POSIX语义
    • 使用普通x86服务器,性价比高
  • 系统结构:

image-20230126103233981

  • Hadoop计算体系框架的很多核心思想:

    • 数据和计算逻辑近一点
    • 甚至计算放在数据存储节点上计算
    • 尽可能不要让数据挪来挪去,少用网络,效率比较高昂

Ceph

开源分布式存储系统里的万金油

  • Ceph的核心特点

    • 套系统支持对象接口、块接口、文件接口,但是一切皆对象
    • 数据写入采用主备复制模型
    • 数据分布模型采用CRUSH算法(CRUSH算法很精巧,自己下去康康昂:HASH + 权重 + 随机抽签)

image-20230126103542922

单机数据库

单机数据库 = 单个计算机节点上的数据库系统

事务在单机内执行,也可能通过网络交互实现分布式服务。

  • 类型:

    • 关系型数据库
    • 非关系型数据库

关系型数据库

商业Oracle, 开源MySQL & PostgreSQL

  • 关系型数据库的通用组件:

    • Query Engine:负责解析query,生成查询计划
    • Txn Manager:负责事务并发管理
    • Lock Manager:负责锁相关的策略
    • Storage Engine:负责组织内存/磁盘数据结构
    • Replication:负责主备同步
  • 关键内存数据结构: B-Tree、B+-Tree、LRU List等
  • 关键磁盘数据结构: WriteAheadLog (RedoLog) 、Page

image-20230126104013312

非关系型数据库

MongoDB、Redis、ES三足鼎力

  • 关系型数据库一般直接使用SQL交互,而非关系型数据库交互方式各不相同。
  • 非关系型数据库的数据结构千奇百怪,没有关系约束后,schema相对灵活。
  • 不管是否关系型数据库,大家都在尝试支持SQL(子集)和“事务”。

image-20230126104224539

  • ES:

    • 面向「文档」存储
    • 文档可序列化成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交互

ES使用案例

image-20230126104503518

分布式数据库

单机不够用,分布式架构来解决

  • 问题:

    • 容量
    • 弹性
    • 性价比

解决容量问题

  • 单点容量有限,受硬件限制
  • 解决方法:

image-20230126104637994

存储节点池化,动态扩缩容

解决弹性问题

image-20230126104732436

单机就要搬来搬去了orz

解决性价比问题

image-20230126104818475

More to Do

  • 单写 vs 多写
  • 从磁盘弹性到内存弹性
  • 分布式事务优化

新技术的演进

新技术演进

  • 软件架构变更:bypass os kernel

  • AI增强:智能存储格式转换

  • 新硬件革命:

    • 存储介质变更
    • 计算单元变更
    • 网络硬件变更

SPDK

Bypass OS Kernel已经成为了一种趋势

image-20230126113218893

  • kernel space -> user space

    • 避免syscall带来的性能损耗,从用户态访问磁盘。
  • 中断 -> 轮询

    • 磁盘性能提高后,中断次数随之上升,不利于IO性能。
    • SPDK poller可以绑定特定的CPU核不断轮询,减少cs,提高性能。
  • 无锁数据结构

    • 使用Lock-free queue,降低并发时的同步开销

AI & Storage

image-20230126113641129

高性能硬件

image-20230126113751095

Summary

  • 存储系统

    • 块存储:存储软件栈里的底层系统,接口过于朴素
    • 文件存储:日常使用最广泛的存储系统,接口十分友好,实现五花八门 对象存储:公有云上的王牌产品,immutable语 义加持
    • key-value存储:形式最灵活,存在大量的开源/黑盒产品
  • 数据库系统

    • 关系型数据库:基于关系和关系代数构建的,- 般支持事务和SQL访问,使用体验友好的存储产品
    • 非关系型数据库:结构灵活,访问方式灵活,针对不同场景有不同的针对性产品
  • 分布式架构

    • 数据分布策略:决定了数据怎么分布到集群里的多个物理节点,是否均匀,是否能做到高性能
    • 数据复制协议:影响IO路径的性能、机器故障场景的处理方式
    • 分布式事务算法:多个数据库节点协同保障一个事务的ACID特性的算法,通常基于2pc的思想设计

存储&数据库领域,硬件反推软件变革十分常见昂!

References