d3认识存储和数据库
这一部分没涉及代码实现,听得很快
经典案例
注册数据-后端服务器-数据库系统-其他系统
存储系统
存储系统:一个提供了读写、控制类接口,摒弃能够安全有效的把数据持久化的软件 特点:性能敏感;容易受硬件影响;代码简单又复杂(考虑到软件和硬件存在的问题,容易受硬件的影响) 缓存:很重要,贯穿整个存储体系,软件使用cache满足不同软件/硬件的读写要求 拷贝:消耗cpu性能,非常昂贵,应该尽量减少 接口:统一接口,满足不同硬件的要求
RAID(redundant array inexpensive disks)系统
- RAID0: 磁盘简单组合,没有容错设计,提高带宽
- RAID1: 一块磁盘对应一块一块镜像盘,空间率50%
- RAID0 + 1:提高带宽,利用率50%,容错率高
数据库
数据库&存储系统?
- 关系性数据库 是存储系统,但是在存储之外,发展出其他能力(结构化数据友好,支持事务(ACID),支持复杂的查询语言(sql))
- 存储:关系型数据库存储数据以表的形式,经典存储系统需要写入文件并自行定义管理结构
- 事务(ACID):原子性,一致性,隔离性,持久性
- 数据查询操作比较简单,经典存储结构查询很复杂
- 非关系型数据库也是存储系统,不要求严格的结构化(半结构化数据友好,可能支持数据/复杂查询语言)
- 关系(relation)= 集合 = 结合=任意元素组成的若干偶序对
- sql(domain specific language) = 方便人类阅读的关系代数表达形式
主流存储产品剖析
单机存储
单机存储 = 单个计算机节点上的存储软件系统,一般不涉及网络交互 e.g
本地文件系统
文件系统的管理单元:文件 文件系统结构:都遵循VFS的统一抽象结构 linux文件系统的两大核心数据结构:
- index Node(记录文件元数据,如Id, 大小,权限, 磁盘位置等,index是一个文件的唯一标识,会被存储到磁盘上,index总数在格式化文件系统时就被固定了),
- directory entry :记录文件名,inode指针,parent关系;dentry是内存结构,与inode的关系是N:1(hardlink) linux:一切皆文件
key-value
常见使用方式: put(k, v), get(k) 常见数据结构:lsm-tree, 因为在内存/磁盘中都是顺序写入,某种程度上牺牲读性能,追求写入性能 rocksDB
分布式存储
在单机存储的基础上实现了分布式协议,涉及大量网络交互
HDFS
支持海量数据存储(文件形式),高容错性,弱posix语义, 使用普通x86服务器性价比高
ceph
一切皆对象:对象接口,块接口,文件接口 数据写入采用:数据主备复制模型 数据分布模型采用CRUSH算法
单机关系型数据库
单个计算机节点上的数据库系统,事务在单机内执行,也可能通过网络交互实现分布式事务 关系型数据库:
单机非关系型数据库
redis高性能,不支持sql, mongodb灵活面向文件, Elasticsearch 灵活,面向文件,支持模糊搜索
分布式数据库
单机数据库容量/弹性/性价比遇到了问题
- 容量: 存储节点池化(和数据库通过网络交互),动态扩缩容。db存储容量超过阈值之后,存储池自动扩容
- 弹性:单机数据库扩容缩容都很困难
- 性价比:单机数据库cpu浪费严重,分布式可以根据需要分配不同的server
新技术
软件架构变更:By pass over kernel AI增强:数据存储格式转变(e.g.根据实时分析进行行列混存) 硬件:存储介质/计算单元/网络硬件 变更