存储与数据库
存储系统
一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件,称为存储系统
系统特点:
- 容易受硬件影响
- 性能敏感
- 存储系统代码简单,但在IO或非IO的错误、异常处理方面代码较为全面复杂
存储器层级结构(金字塔型):
数据如何从应用到存储介质
参考The Linux Programming Interface(第13章 FILE I/O BUFFERING),单机存储系统大致为:
用户数据(user data)在用户内存区通过标准分配库调用(stdio library calls)进入标准分配缓冲区(stdio buffer),该区域会强制缓冲区刷新(to force buffer flush)以达到将位于标准分配缓冲区的数据进入I/O系统调用(I/O system calls)区以便进行写入磁盘(disk)的操作; 同时,标准分配库调用区在每个I/O调用上自动刷新(make flushing automatic on each I/O call),也达到前面所述作用。 在数据通过I/O系统调用写入内核缓冲区缓存(kernel buffer cache)时,内存内核调用fsync()、fdatasync()、sync()等函数进行强制缓存区刷新,做到将内核缓存区缓存送进内核启动的写入(kernel-initiated write)中,下一步写入磁盘; 同时I/O系统调用会通过调用open(path,flags|O_SYNC,mode)函数进行I/O调用自动刷新,达到前面所述效果。
其中存储栈上缓存重要,贯穿整个存储体系
RAID技术
Redundant Array of Inexpensive Disks
RAID出现于单块大容量磁盘的价格>多块小容量磁盘、单块磁盘的写入性能<多块磁盘的并发写入性能、单块磁盘的容错能力有限,不够安全的背景下
数据库
不同于存储系统,数据库系统是一种用于组织、存储和管理数据的软件系统,以特定的数据模型和语言来存储数据。
关系=集合=两个实例间的联系 SQl=一种DSL=方便人类阅读
关系型数据库
存储系统,除此之外发展出其他能力
- 结构化数据友好
- 支持事务
- 支持复杂查询语言
非关系型数据库
存储系统,但一般不要求严格的结构化
- 半结构化数据友好
- 可能支持事务
- 可能支持复杂查询语言
数据库vs经典存储
结构化数据管理
一条用户注册数据
- 写入关系型数据库,以表形式管理
- 经典存储是写入文件,自行定义、管理结构
事务能力
数据库支持事务的优越性 ACID特性:
- Atomicity:事务要么全部完成,要么全部取消。 如果事务崩溃,状态回到事务之前(事务回滚)。
- Isolation:如果2个事务 T1 和 T2 同时运行,事务 T1 和 T2 最终的结果是相同的,不管 T1和T2谁先结束。
- Durability:一旦事务提交,不管发生什么(崩溃或者出错),数据要保存在数据库中。
- Consistency:只有合法的数据(依照关系约束和函数约束)才能写入数据库。
经典存储不支持事务,对比之下就显复杂
查询能力
体现在数据库进行数据查询可以使用SQL语句
select xxx from yy where zzz...
而经典存储的数据查询要写代码
for each data{
if (user_name&&xx&&xxx){
mark in list
}
....
}
存储系统和数据库系统区别
存储系统用于存储数据的硬件和软件系统,其目的是提供大容量存储空间便用户能够保存大量数据。该系统可远程可本地。
数据库系统是一种用于组织、存储和管理数据的软件系统,以特定的数据模型和语言来存储数据。
- 数据库系统通常在存储系统之上运行,使用存储系统提供的空间来存储数据
- 存储系统重点在于存储数据,数据库系统重点在于组织。