数据的流动
用户产生数据 -> 到达后端服务器 -> 到达数据库 -> 其他系统
- 在到达数据库系统后,后面非常可能还有其他系统,但本篇文章主要学习数据库与存储系统,所以不对其做解释
存储系统
一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件,就可以称为存储系统
存储系统的特点
- 作为后端软件的底座,性能敏感
- 要考虑到后端频繁的并发去操作数据库
- 存储系统代码,既“简单”又“复杂”
- 简单:存储系统对性能要求高,所以在存储系统的IO路径上,代码一定不能写的太复杂,不能有很多分支,导致系统性能差
- 复杂:在IO路径上的一些错误处理的分支上,要考虑到所有的异常情况;例如软件可能会出错,硬件可能会坏
- 存储系统软件架构,容易受硬件影响
- 存储系统直接和硬件打交道,硬件发生一些变革,存储系统的软件可能要推倒重写,受硬件影响比较大
RAID技术
RAID(Redundant Array of Inexpensive Disks)技术让单机存储系统做到高性能/高性价比/高可靠性!
RAID出现的背景:
- 单块大容量磁盘的价格>多块小容量磁盘
- 单块磁盘的写入性能<多块磁盘的并发写入性能
- 单块磁盘的容错能力有限,不够安全
RAID技术的组合
-
RAID 0
- 多块磁盘简单组合
- 数据条带化存储,提高磁盘宽带
- 没有额外的容错设计
-
RAID 1
- 一块磁盘对应一块额外镜像盘
- 真实空间利用率仅50%(因为有镜像盘)
- 容错能力强
前面两种是走了两个方向的极端,那么有没有一个方案综合它们的优点呢?那就是RAID 0 + 1
- RAID 0+1
- 结合了RAID 0和RAID 1
- 真实空间利用率仅50%
- 容错能力强、写入宽带好
上面的内容都是存储系统,下面是关于数据库的
数据库分为关系型数据库和非关系型数据库
-
关系(Relation)是什么?
- 由Edgar.F.Codd于1970年提出【关系模型】
- 关系 = 集合 = 任意元素组成的若干有序偶对,反应了事物间的关系
-
关系代数
- 对关系作运算的抽象查询语言
- 如:交、并、笛卡尔积
-
SQL
- 一种DSL
- 方便人类阅读的关系代数表达形式
-
关系型数据库是存储系统,在存储之外,发展出的其它能力
- 结构化数据友好、支持事务(ACID),支持复杂查询语言
-
非关系型数据库也是存储系统,但是一般不要求严格的结构化
- 半结构化、非结构数据友好;可能支持事务(ACID);可能支持复杂查询语言
下图展示了使用关系型数据库和自己维护存储的数据的区别
前者仅需关系增删改查,后者需要自己定义和管理结构,非常麻烦
事务的优越性
- A(Atomicity):原子性;事务内的操作要么全做,要么不做
- C(Consistency):一致性;事务执行前后,数据状态是一致的;以转账做例子,A转账给B,转账前后,整个系统内的金额总和是不变的
- I(Isolation):隔离;可以隔离多个并发事务,避免影响
- D(Durability):持久性;事务一旦提交成功,数据保证持久性
- 如果要做一个如图的复杂查询
- 自己使用代码去实现(图右)是很麻烦的,代码量很大
- 而如果使用关系型数据库支持的复杂查询(使用SQL)只需要图左的几行代码
课后总结
在今天的学习中,我对存储系统和数据库有了更深入的了解。我认识到存储系统是后端软件的重要组成部分,它负责将用户产生的数据持久化存储,并提供读写和控制接口。存储系统需要考虑到高并发操作数据库的情况,因此在设计上需要保持简单而高效。这些知识将对我的后续学习和实践有很大的帮助。