这是我参与「第五届青训营 」伴学笔记创作活动的第16天
前言
我们或许知道存储在一个系统里面是非常重要的,但可能不了解存储的状态,本文笔者学习储存的本质并进行学习记录。
经典案例
1-数据的产生
某天,我们下了个APP,由于第一次使用,我们进入APP需要注册一个新的账号。
然后我们三下五除二地填好了信息点下了注册按钮。
就这样,数据从无到有产生了,并且在数十/百毫秒内向App后端服务器飞奔而去......
2-数据的流动
3-数据的持久化
潜在问题
- 数据库怎样保证数据不丢?
- 数据库怎么处理多人同时修改的问题?
- 为什么用数据库,除了数据库还能存到别的存储系统吗?
- 数据库只处理结构化数据吗?
- 有哪些操作数据库的方式,要用什么编程语言?
存储&数据库简介
储存系统-概述
一个提供了了读写、控制类接口,能够安全有效地把数据库持久化的软件,就可以称为存储系统。
user、Medium(磁盘)、Memory(内存)、Network。
存储系统-特点
- 作为后端软件的底座,性能敏感。
- 存储系统代码既“简单”又“复杂”。
- 储存系统软件架构,容易受硬件影响。
存储系统-数据怎么从应用存储介质
- 缓存:很重要,贯穿整个存储体系。
- 拷贝:很昂贵,应该尽量减少。
- 硬件设备五花八门,需要有抽象统一的接入层。
储存系统-RAID技术
单机存储系统怎样做到高性能、高性价比、高可靠性?
Redundant Array of Inexpensive Disks。
RAID出现背景:
- 单块大容量磁盘的价格>多块小容量磁盘。
- 单块磁盘的写入性能<多块磁盘的并发写入性能。
- 单块磁盘的容错能力有限,不够安全。
| RAID | |
|---|---|
| 名称 | 特点 |
| RAID 0 | 多块磁盘简单组合;数据条带化存储提高磁盘带宽;没有额外的容错设计 |
| RAID 1 | 一块磁盘对应一块额外镜像盘;真实空间利用率仅50%;容错能力强 |
| RAID 0+1 | 结合了RAID 1和RAID 0;真实空间利用率仅50%;容错能力强写入带宽好 |
数据库(关系/非关系型)-概览
关系模型于1970年被提出。
- 关系=集合=任意元素组成的若干有序偶对,反应了事物间的关系。
- 关系代数=对关系作运算的抽象查询语言,交、并、笛卡尔积.....
- SQL=一种DSL=方便人类阅读的关系代数表达形式。
数据库-关系型数据库特点
关系型数据库是存储系统,但是在存储之外又发展出其他能力。
- 结构化数据友好
- 支持事务(ACID)
- 支持复杂的查询语言
数据库-非关系型数据库特点
非关系数据库也是存储系统,但一般不要求严格的结构化。
- 半结构化数据友好
- 可能支持事务
- 可能支持复查查询语言
数据库-结构化数据库管理
一条用户数据
{
"username":"admin",
"password":"password",
......
}
- 写入关系型数据库以表形式管理
- 写入文件自行定义管理结构
数据库-事务能力
数据库支持事务有优越性。
事务(ACID)具体有:
- Atomicity,事务内想操作要么全做要么不做
- Consistancy,事务执行前后,数据状态是一致的
- Isolation,可以隔离锁多个并发事务,避免影响
- Durability,事务一旦提交成功数据保证持久性
主流产品剖析
单机存储-概览
单机存储=单个计算机节点上的存储软件系统,一般不涉及网络交互。
- 本地文件系统
- 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(harddink的实现)
单机存储-key value存储
世间一切皆key-value--key是你的身份证,value是你的内涵。
- 常见的使用方式:put&get
- 常见的数据结构:LSM-Tree,某种程度上牺牲读性能,追求写性能
- 拳头产品:RocksDB
分布式存储-概览
分布式存储=在单机存储的基础上实现了分布式协议,涉及大量网络交互。
- 分布式文件系统
- 分布式对象存储
分布式存储-HDFS
HDFS:堪称大数据的时代基石。
时代背景:专用的高级硬件很贵,同时数据存量很大,要求超高吞吐。
HDFS核心特点:
- 支持海量数据存储
- 高容错性
- 弱POSIX语义
- 使用普通x86服务器,性价比高
分布式存储-Ceph
Ceph:开源分布式存储系统里的万精油。
Ceph核心特点:
- 一套系统支持对象接口、块接口、文件接口。但是一切皆对象
- 数据写入采用主备复制模型
- 数据分布模型采用CRUSH(HASH+权重+随机抽签)算法
单机数据库-概览
单机数据库=单个计算机节点上的数据库系统
事务在单机内执行,也可以通过网络交互实现分布式事务
- 关系型数据库
- 非关系学数据库
单机数据库-关系型数据库
商业产品OracleZ称王,开源产品MYSQL&PostgreSQL称霸
关系型数据库通用组件:
- Query Engine:负责解析Query,生成查询计划
- Txn Manager:负责事务并发管理
- Lock Manager:负责锁相关策略
- Storage Engine:负责组织内存/磁盘数据结构
- Replication:负责主备同步
关键内存数据结构:B-Tree、B+-Tree、LRu List等
关键磁盘数据结构:WriteAheadLog、Page
单机数据库-非关系型数据库
MongoDB、Redis、Elasicsearchs三足鼎立
- 关系型数据库一般直接使用SQL交互,而非关系型数据交互方式各不相同
- 非关系型数据库的数据结构千奇百怪,没有关系约束后schema相对灵活
- 不管是否关系型数据库。都在尝试支持SQL子集和事务
Elasicsearchs
- 面向文档存储
- 文档可序列化成json支持嵌套
- 存在index,index=文档的集合
- 存储和构建索引能力依赖Lucene引擎
- 实现了大量搜索数据结构&算法
- 支持RESTFULAPI,也支持弱SQL交互
MongoDB
- 面向文档存储
- 文档可序列化成json/bson支持嵌套
- 存在collection,collection等于文档的集合
- 存储和构建索引能力依赖wiredTiger引擎
- 4.0后开启支持事务(多文档、跨分片多文档等)
- 常用client/SDK交互,可通过插件转译支持弱SQL
Redis
- 数据结构丰富
- C语言实现,超高性能
- 主要基于内存,但支持ADF/RDB持久化
- 常用Redis-cli/多语言SDK交互
小结(学习心得)
能比较清晰的了解存储、存储的状态以及存储有关的数据库或者工具。
参考
- 字节跳动青训营《带你认识存储的本质——状态》课程