这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
存储的本质
经典案例
一条数据的流动
客户端->后端服务器->数据库->其它系统
数据在数据库中的操作(数据持久化)
验证数据合法性->修改内存(用高效的数据结构组织数据)->写入存储介质(以寿命或性能友好的方式写入硬盘)
存储和数据库简介
存储
存储系统:提供读写、控制类接口,能够安全有效的把数据持久化的软件
特点:性能敏感、系统软件架构容易受硬件影响、系统代码简单又复杂
存储器层级结构:
金字塔结构,塔顶的存储器类型的存储空间小但是访问迅速方便、塔底的存储器类型的存储空间大但是访问慢且困难,中间的存储器类型兼顾空间和速度--Persistent Memory
数据从软件到硬件:
缓存贯穿整个存储体系、拷贝很昂贵,尽量减少、硬件设备众多,需要抽象出统一的接入层
RAID技术:高性能、高性价比、高可靠性的硬盘
RAID背景:
单块大容量磁盘价格>多块小磁盘
单块写入能力<多块并发写入
单块磁盘容错能力有限,不够安全
数据库
关系型数据库:存储系统、结构化数据友好、支持事务(A原子性、C一致性、I隔离性、D持久性)、支持复杂查询语句(SQL)
非关系型数据库:一般不要求严格结构化、半结构化数据友好、可能支持事务、可能支持复杂查询语句
SQL:一种DSL,方便人类阅读的关系代数表达形式
一条数据写入关系型数据库,以表形式管理(方便、可视化)、支持事务、使用SQL语句操作,写入经典存储系统需要自行定义管理结构(繁琐)
主流产品
单机存储
本地文件系统、K-V存储系统(LSM-Tree,追求写入性能、牺牲读性能)
分布式存储
分布式文件系统:HDFS:海量存储、高容错、弱POSIX语义、高性价比
分布式对象存储:Ceph:支持对象接口、块接口、文件接口,但是一切皆对象、数据写入采用主备复制模型、数据分布模型采用CRUSH算法
单机数据库
关系型数据库:Query Engine(查询)、Txn Manager(事务)、Lock Manager(锁)、 Storage Engine(存储)、Replication(主备同步)
关键内存数据结构:B-Tree、B+-Tree、LRU List等
关键磁盘数据结构:WriteAheadLog、Page
非关系型数据库:
MongoDB(面向文档存储、支持事务和弱SQL)
Redis(数据结构丰富、超高性能)
Elasticsearch(面向文档存储、依赖Lucene引擎、支持弱SQL)
特点:交互方式各不相同、schema相对灵活、尝试支持SQL和事务
分布式数据库
存储节点池化、动态扩缩容、解决弹性问题、解决性价比问题
扩展视野
SPDK(Storage Performance Development Kit)
Kernel Space -> User Space :避免syscall带来的性能损耗,直接从用户态访问磁盘
中断 -> 轮询:SPDK poller 绑定特定的cpu核不断轮询,减少cs,提高性能
无锁数据结构:使用Lock-free queue,降低并发时的同步开销