带你认识存储的本质 - 状态 | 青训营笔记

128 阅读8分钟

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

前言

这是我将参加青训营期间的收获进行整理和总结,同时便于日后复习和查阅。如果能给各位小伙伴提供些帮助,也是我的荣幸,希望大家可以多多赐教,一起学习和交流。

本篇文章主要内容:

  • 模拟案例
  • 存储 & 数据库简介
  • 主流存储产品剖析
  • 新技术演进

模拟案例

模拟案例.png 数据的产生、数据的流动、数据的持久化、……

  • 效验数据的合法性 —> 修改内存 —> 写入存储介质。

存储 & 数据库简介

存储系统

系统概述

Q:什么是存储系统?

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

系统特点

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

存储器层级结构 存储器层级结构.png

数据怎么从应用到存储介质

存储介质.png

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

PAID技术

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

A:R(edundant)A(rray) of I(nexpensive)D(isks)

RAID 0

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

PAID 1

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

RAID

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

数据库

数据库分为关系型数据库非关系型数据库,那么关系(Relation)又是什么?

一个老爷子 Edgar.F.Codd于 1970 年提出【关系模型】。

关系 = 集合= 任意元素组成的若干有序偶对,反应了事物间的关系。

关系代数 = 对关系作运算的抽象查询语言,例如交、并、笛卡尔积……

SQL = 一种DSL = 方便人类阅读的关系代数表达形式

关系型数据库特点

关系型数据库是存储系统

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

非关系型数据库特点

也是存储系统,但一般不要求严格的结构化

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

数据库 VS 经典存储

结构化数据管理

数据库:写入关系型数据库,以表形式管理

经典存储:写入文件,自行定义管理结构

事务能力

凸显出数据库支持【事务】的优越性。

事务具有:

  • A(tomicity),事务内的操作要么全做,要么全不做
  • C(onsistency),事务执行前后,数据状态是一致的
  • I(solation),可以隔离多个并发事务,避免影响
  • D(urability),事务一旦提交成功,数据保持持久性

主流存储产品剖析

单机存储

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

本地文件系统

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,某种程度上牺牲读性能,追求写u人性能。

拳头产品:RocksDB

分布式存储

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

分布式文件系统 — HDFS

HDFS:堪称大数据时代的基石。

时代背景:专用的高级硬件很贵,同时数据存量很大,要求超高吞吐。

HDFS核心特点:

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

分布式对象存储 — Ceph

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

Ceph 的核心特点:

  • 一套系统支持对象接口、块接口、文件接口,但是一切皆对象

  • 数据写入采用主备复制模型

  • 数据分布式模型采用 CRUSH 算法

    • CRUSH:HASH + 权重 + 随机抽取

单机数据库

单机数据库 = 单个计算机节点上的数据库系统,事务在单机内执行,有可能通过网络加护实现分布式事务。

关系型数据库

商业产品 Oracle 称王,开源产品 MySQL & PostgreSQL称霸

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

  • Query Engine — 负责解析 query,生成查询计划
  • Txn Manager — 负责事务并发管理
  • Lock Manager — 负责锁相关的策略
  • Storage Engine — 负责组织内存 / 磁盘数据结构
  • Replication — 负责主备同步

关键内存数据结构:B-Tree、B+-Tree、LRU List等

关键磁盘数据结构:writeAheadLog(RedoLog)、Page 关系型数据库.png

非关系型数据库

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

Elasticsearch

  • 面向【文档】存储
  • 文档可序列化成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/ROB 持久化
  • 常用 redis - cli / 多语言 SDK 交互

分布式数据库

问题与挑战

  • 解决容量问题

    • 原因:单点容量有限,受硬件限制
    • 解决:存储节点池化,动态扩缩容
  • 解决弹性问题

  • 解决性价比问题

新技术演进

概览

  • 软件架构变更

    • Bypass OS kernel
  • AI 增强

    • 智能存储格式转换
  • 新硬件革命

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

SPDK

  • kernel Space —> User Space

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

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

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

高性能硬件

RDMA 网络

  • 传统的网络协议栈,需要基于多层网络协议处理数据包,存在用户态 & 内核态的切换,足够通用但性能不是最佳
  • RDMA 是 kernel bypass的流派,不经过传统的网络协议栈,可以把用户态虚拟内存映射给网卡,减少拷贝开销,减少cpu 开销

Persistent Memory

在 NVMe SSD 和 Main Memory之间有一种全新的存储产品:Persistent Memory

  • IO 时延介于 SSD 和 Memory 之间,约白纳秒量级
  • 可以用作易失性内存(memory mode),也可以用作持久化介质(app - direct)

可编程交换机

P4 Switch,配有编译器、计算单元、DRAM、可以在交互机层对网络包做计算逻辑。在数据库场景下,可以实现缓存一致性协议等。

CPU / GPU / DPU

  • CPU:从 multi - core 走向 many - core
  • GPU:强大的算力 & 越来越大的显存空间
  • DPU:异构计算,减轻CPU的workload

总结

存储系统

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

数据库系统

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

分布式架构

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

引用

  • 字节内部课《后端入门 - 存储与数据库》