存储与数据库 | 青训营
存储&数据库
案例导入
- 数据库怎么保证数据不丢失
- 数据库如何处理多人同时修改数据的问题
- 为什么使用数据库作为存储,除了数据库还能将数据存到其他存储系统中吗
- 数据库只能处理结构化数据吗
- 有哪些操作数据库的方式,要用什么编程语言
存储系统
- 作为后端软件的底座,性能敏感(很可能会被高并发、多次操纵)
- 存储系统软件架构容易受硬件影响(存储系统软件需要与存储硬件介质接轨,因此底层硬件发生变化,软件架构通常需要随之变化)
- 存储系统代码,既“简单”(主要是IO方面,因为需要保证大量高并发操作的性能,IO操作过于复杂,容易出问题),又“复杂”(需要考虑到各种异常情况,因此其涉及到的异常处理逻辑比较复杂)
追求性价比,稳定、容量较大、速度较快且价格不高——Persistent Memory
经验之谈
- 单块大容量磁盘的价格 > 多块小容量磁盘的价格
- 单块磁盘的写入性能 > 多块磁盘的并发写入性能
- 单块磁盘的容错能力有限,不够安全
- 多块磁盘简单组合
- 数据条带化存储,提高磁盘带宽
- 没有额外的容错设计
- 一块磁盘对应一块额外镜像盘(每有一块做存储,就有一块连着做它的镜像)
- 真实空间利用率仅50%
- 容错能力强
- 真实空间利用率仅50%
- 容错能力强,写入带宽好
数据库
- 结构化数据友好
- 支持事务(ACID)
- 支持复杂查询语言
- 半结构化数据友好
- 可能支持事务(ACID)
- 可能支持复杂查询语言
- Create user
- Create database
- Create table
- Alter table
- 。。。
- Insert
- Update
- Select
- Delete
- 。。。
- A(tomicity),事务内的操作要么全做,要么全不做(转账操作,A钱减少,B钱增加;否则都不变)
- C(onsistency),事务执行前后,数据状态是一致的(两人之间进行转账,总额转账前后始终一致)
- I(solation),多个并发事务隔离执行,互不影响(看设定的隔离级别)
- D(urability),事务一旦提交,数据保证持久性(进入数据库中了)
主流存储&新技术
主流产品
单机存储
分布式存储
- 支持海量数据存储
- 高容错性(低级硬件出错较多,软件系统需要高容错)
- 弱POSIX语义
- 使用普通x86服务器,性价比高
- 系统支持对象接口、块接口、文件接口,一切皆对象
- 数据写入采用主备复制模型
- 数据分布模型采用CRUSH算法(Hash+权重+随机抽签)
单机数据库
单机关系型数据库
- Query Engine —— 负责解析query,生成查询计划
- Txn Manager —— 负责事务并发管理
- Lock Manager —— 负责锁相关的策略
- Storage Engine —— 负责组织内存/磁盘数据结构
- Replication —— 负责主备同步
单机非关系型数据库
- 面向【文档】存储
- 文档可序列化成JSON/BSON,支持嵌套
- 存在【collection】,collection = 文档的集合
- 存储和构建索引的能力依赖 wiredTiger 引擎
- 4.0后开始支持事务(多文档、跨分片文档等类型的事务)
- 常用client/SDK交互,可通过插件转译支持弱 SQL 交互
- 数据结构丰富(hash表、set、zset、list)
- C语言实现,具有超高性能
- 主要基于内存,但支持AOF/RDB持久化
- 常用redis-cil/多语言SDK交互
- 面向【文档】存储
- 文档可序列化成JSON,支持嵌套
- 存在【index】,index = 文档的集合
- 存储和构建索引的能力依赖 Lucene 引擎
- 实现了大量搜索数据结构 & 算法
- 支持 RESTFUL API,也支持弱 SQL 交互
- 与RDBMS相比,天然能做【模糊搜索】,还能自动算出关联程度(RDBMS需要上层设计模糊匹配)
分布式数据库
单机数据库系统在使用过程中有以下几个主要问题
- 较于单机数据库系统,支持多写(多人写入操作)
- 从磁盘弹性(问题解决中提到的)扩展到了内存弹性
- 分布式事务优化
新技术
目前现状
- 存储介质变更
- 计算单元变更
- 网络硬件变更
SPDK
- 避免syscall带来的性能损失,直接从用户态访问磁盘
- 磁盘性能提高后,中断次数随之上升,不利于IO性能
- SPDK poller 可以绑定特定的cpu核不断轮询,减少cs,提高性能
- 使用Lock-free queue,降低并发时的同步开销
AI & Storage
- 传统的数据存储通常是列存或是行存,但是单一存储格式并不能最大化利用存储空间,
- 而行列混存这个设想可以解决这个问题,但是Storage是动态变化的,所以需要AI动态决策行列混存策略