这是我参与「第五届青训营」伴学笔记创作活动的第13天
经典案例
通过一个模拟案例,描述了数据是怎么产生,在后端系统里怎么流通,最后怎么写入到存储/数据库系统。 问题:
存储 & 数据库简介
-
存储系统概览:一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件,就可以称之为存储系统
- 存储系统特点:
- 作为后端系统软件底座,性能敏感
- 存储系统软件架构,容易受硬件影响
- 存储系统代码,即“简单”又“复杂”
- 存储器层级结构
- 硬件
- 硬件
- 单机存储栈
- 软件
- 缓存很重要,贯穿整个存储系统
- 拷贝很昂贵,应该尽量减少
- 硬件设备五花八门,需要有抽象统一的接入层
- 软件
- RAID技术
- RAID 0 没有容错,条带化存储,提高带宽
- RAID 1 空间利用率50%, 容错
- RAID 10 结合两者
- 存储系统特点:
-
数据库系统概览
- 关系型数据库特点
- 结构化数据友好
- 支持事务(ACID)
- 支持复杂的查询语言
- 非关系型数据库特点
- 半结构化数据友好
- 可能支持事物(ACID)
- 可能支持复杂查询语言
- 数据库 vs 经典存储
- 结构化数据管理:
- 关系型数据库以表形式管理
- 经典存储,写入文件自行定义管理结构
- 事务能力
- Atomicity 事务内的操作要么全做、要么不做
- Consistency 事务执行前后,数据状态是一致的
- Isolation 可以隔离多个并发事务,避免影响
- Durability 事务一旦提交成功,数据保证持久性
- 支持复杂查询能力
- 结构化数据管理:
- 数据库使用方式
- 关系型数据库特点
主流产品剖析
-
单机存储产品
- 单机文件系统
- Linux Index Node(inode)、 Directory Entry(dentry)
- 单机key-value存储
- 常见使用方式:put(k,v) & get(k);
- 常见数据结构:LSM-Tree;牺牲读性能,追求写性能
- RocksDB
- 单机文件系统
-
分布式存储产品
- HDFS
- 特点:
- 支持海量数据存储
- 高容错性
- 弱POSIX语义
- 使用普通x86服务器,性价比高
- 特点:
- Ceph
- 特点
- 一套系统支持对象接口、块接口、文件接口,但是一切皆对象
- 数据写入采用主备复制模型
- 数据分布模型采用CRUSH算法:Hash+权重+随机抽签
- 特点
- HDFS
-
单机数据库产品
- 关系型数据库 —— PG、MySQL
- 非关系型数据库 —— ES、MongoDB、Redis
- Elasticsearch使用案例:模糊搜索、计算相似度
-
分布式数据库产品
- 问题与挑战:容量、弹性、性价比
- 解决方案
- 存储节点池化,动态扩缩容
新技术演进
- SPDK:Bypass OS kernel
- 人工智能
- 新硬件加速
课后思考
-
写入存储系统的粒度太大,会不会导致数据原子性问题?例如一次性写100MB,如果系统突然crash,会不会只有一部分数据持久化了,另一部分丢失了?如果要解决原子性问题,一般会设计什么机制?
-
在从应用程序到存储介质的链路上,无论读还是写,数据可能要被拷贝好几次,这几次拷贝能不能去掉?如果我们去掉大部分拷贝操作,会有什么副作用,要怎么缓解副作用?
-
一个关系型数据库大概率是会被并发访问的,如果要保证并发安全,除了在行数据上加悲观锁还有其他方式吗?
-
在数据库领域,把数据按行存和按列存各有好处,你能从性能优先的角度设计出一种混合存储格式吗?