这是我参与「第五届青训营 」伴学笔记创作活动的第16天
问题
- 数据库怎么保证数据不丢?
- 数据库怎么处理多人同时修改的问题?
- 为什么用数据库, 除了数据库还能存到别的存储系统?
- 数据库只能处理结构化数据吗?
- 有哪些操作数据库的方式, 要用什么编程语言?
存储&数据库简介
存储系统:
一个提供了读写, 控制类接口, 能够安全有效地把数据持久化的软件, 就可以称为存储系统
特点:
作为后端软件的底座, 性能敏感 存储系统代码, 既"简单"又"复杂": 性能要求高, 因此代码要简单. 要考虑多种异常情况, 故代码会复杂 存储系统软件架构, 容易受硬件影响
存储器层级结构:
Computer Memory Hierarchy
塔尖: 性能高, 容量小 塔底: 性能低, 容量大 各层代表: processor register 处理器寄存器 processor cache 处理器缓存 random access memory 随机存取存储器 flash/USB memory hard drivers 硬盘驱动器(简称, 硬盘) tape backup 磁带备份
数据怎样从应用到存储介质
缓存: 很重要, 贯穿整个存储体系
拷贝: 很昂贵, 应该尽量减少
RAID
Q: 单机存储系统怎么做到高性能/高性价比/高可靠性? A: Redundant Array of Inexpensive Disks
RAID出现的背景: 单块大容量磁盘的价格 > 多块小容量磁盘 单块磁盘的写入性能 < 多块磁盘的并发写入性能 单块磁盘的容错能力有限, 不够安全
RAID 0 多块磁盘简单组合 数据条带化存储, 提高磁盘带宽 没有额外的容错设计 RAID 1 一块磁盘对应一块额外镜像盘 真实空间利用率仅50% 容错能力强 RAID 0+1 结合了RAID 0和RAID 1 真实空间利用率仅50% 容错能力强, 数据条带化存储, 写入带宽好
数据库
关系(Relation)是什么?
Edgar.F.Codd于1970年提出[关系模型]
关系=集合=任意元素组成的若干偶对的集合
关系代数=对关系作运算的抽象查询语言(如交, 并, 笛卡尔积)
SQL=一种DSL=方便人类阅读的关系代数表达形式
DSL: Domain Specific Language 领域专用语言. 区别于GPL
GPL: General Purpose Language 通用编程语言
关系型数据库特点
结构化数据友好 支持事务(ACID) 支持复杂查询语言
非关系型数据库特点
半结构化数据友好 可能支持事务(ACID) 可能支持复杂查询语言
数据库 vs 经典存储
1 结构化数据管理
数据库: 以表形式管理(关系型数据库) 经典存储: 写入文件, 自行定义管理结构
2 事务能力
数据库可以支持事务(ACID: Atomicity原子性, Consistency一致性, Isolation隔离性, Durability持久性)
3 复杂查询能力 数据库: 灵活, 简洁 经典存储: 僵化, 复杂
补充
单机存储
单机存储: 单个计算机节点上的存储软件系统, 一般不涉及网络交互
分布式存储
分布式存储 = 在单机存储基础上实现了分布式协议, 涉及大量网络交互
单机关系型数据库
单机数据库: 单个计算机节点上的数据库系统
事务在单机内执行, 也可能通过网络交互实现分布式事务
关系型数据库
商业产品Oracle称王, 开源产品MySQL & PostgreSQL称霸
单机非关系型数据库
MongoDB, Redis, Elasticsearch三足鼎立
分布式数据库
容量, 弹性, 性价比问题: 单点受硬件限制 解决: 存储节点池化, 动态扩缩容
More To Do: 单写 -> 多写 磁盘弹性 -> 内存弹性 分布式事务优化
新技术演进
软件架构变更: Bypass OS kernel AI增强: 智能存储格式转换 新硬件革命: 存储介质变更 计算单元变更 网络硬件变更