经典案例
数据由产生,流动,持久化的全生命周期
结构化数据:
{
"user_name" : "小明"
"password" :"hello"
"password_hint" : "coding"
}
**基本流程:**数据传输到后端服务器,由服务器存储在数据库中,得到永久化(数据库中的数据可能会和其他系统由交互)
数据持久化
- 校验数据的合法性
- 修改内存(用高效的数据结构组织数据)
- 写入存储介质(以寿命&性能友好的方式写入硬件)
存储&数据库简介
**存储系统(Storage System)**是计算机系统中用于持久化保存数据的硬件与软件的集合。它负责存储计算机系统和应用程序所产生和使用的数据。
特点:
- 性能敏感
- 代码结构简单,但功能复杂
- 存储系统软件架构,容易受到硬件影响
存储系统的主要功能包括:
- 数据持久化:将内存中的数据持久化存储,以防数据丢失。
- 大容量存储:提供大容量的存储空间,满足应用的存储需求。
- 低成本:存储密度高,成本比较低。
- 高性能:支持快速读写数据,满足应用的性能需求。
- 高可靠性:通过冗余等机制,确保数据的可靠性和高可用性。
常见的存储系统包括:
- 直接存储:通过地址直接访问数据,包括内存、高速缓存等。性能最高但成本也最高。
- 磁盘存储:机械磁盘或固态磁盘,性价比高,是主流的持久化存储介质。包括硬盘、SSD等。
- 存储区域网络(SAN):通过光纤通道技术实现远程磁盘存储,并以编址空间的形式对操作系统呈现。
- 网络附加存储(NAS):通过网络(通常为以太网)将元数据与使用数据分离,在文件系统层面共享数据。
- 对象存储:通过控制节点将大 объект分离存储在物理上独立的存储节点上,完全通过API访问数据。
- 云存储:由服务商通过网络提供的可扩展、可配置的存储,并以“pay-as-you-go”的方式计费。
程序中多作缓存,少用
copy减少占用
RAID技术
RAID(Redundant Array of Inexpensive Disks)
RAID 0
- 多块磁盘简单组合
- 数据条带化存储,提高磁盘宽带
- 但没有额外的容错设计
RAID 1
- 一块磁盘对应一块额外镜像盘
- 真实空间利用率仅50%
- 容错能力强
RAID 0 + 1
- 结合
RAID 0和RAID 1 - 真实空间利用率仅为50%
- 容错率高,写入带宽好
数据库
关系模型:
- 关系 = 集合 =任意元素组合成的若干有序偶对
SQL 一种DSL,方便人类阅读的关系代数表达形式
关系型数据库
关系型数据库是存储系统,但存储外,还有别的能力
- 结构化数据友好
- 支持事务(ACID)
- 支持复杂查询语言(SQL)
结构化数据管理
写入关系型数据库,以表格形式管理
事务能力
- A(atomicity):事务内的操作要么全做,要么不做
- C(consistency):事务执行前后,数据状态是一致的
- I(isolation):可以隔离多个并发事务,避免影响
- D(durability):事务一旦提交成功,数据保证持久性
非关系型数据库
相对于关系型数据库而言,一般不要求严格的结构化
- 半结构化数据友好,
- 可能支持事务(ACID)
- 可能支持复杂的查询语言
主流存储产品
单机存储
单个计算机节点上的存储软件系统,一般不涉及网络交互
本地文件系统
文件系统的接口:Ext2/3/4,sysfs,rootfs,都遵循VFS的统一抽象接口
Linux两大数据结构:Index Node & Directory Entry
Index Node:记录文件元数据,(id,大小,权限,磁盘位置)
inode是文件的唯一标识,会被存储到磁盘上
inode的总数在格式化文件系统时就固定了
**Directory Entry:**记录文件名,inode指针,层级关系(parent)等
dentry 是内存结构,与inode的关系是 N:1 (hardlink的实现)
key -value 系统
常见使用方式:put(k,v)&get(k)
常见数据结构:LSM-Tree,某种程度上牺牲读性能,追求写入性能
**拳头产品:**RocksDB,LevelDB
Lsm-Tree
LSM(Log-Structured Merge-Tree)树是一种高性能的数据库索引结构。 采用分层的结构,数据先写入内存,然后定期刷到磁盘上,并最终合并成一棵有序的树
LSM树的主要结构包括:
- MemTable:内存数据结构, recently written data。数据首先写入MemTable,然后定期刷到磁盘上形成SSTable。
- SSTable:磁盘上的数据文件,由MemTable刷到磁盘上形成。SSTable采用压缩和有序的结构存储数据,方便快速查找。
- Bloom Filter:每个SSTable对应一个Bloom Filter,用于加速查找操作。
- Compaction:随着数据量增加,会有多个SSTable。Compaction的作用是将多个SSTable合并成一个更大的SSTable,使得数据更加聚集,查找更高效。
- Level:SSTable根据大小和数目划分不同的Level,小的在上层,大的在下层。Compaction发生在相邻的Level之间,上层的SSTable会并入下层。
LSM树的写操作流程是:
- 数据首先写入MemTable,当MemTable满或达到刷盘条件时,将MemTable刷到磁盘,形成一个新的SSTable。
- 新生成的SSTable会放在最高Level(通常是0层)。
- 当Level 0层SSTable达到指定数量(通常为4个),会触发0->1层的Compaction,生成一个在1层的新SSTable。
- 依此类推,不断 Compaction 和下层迁移,最终达到指定的层数(通常为 3-5层)。
LSM树的读操作流程是:
- 先在MemTable中查找,如果找到直接返回。
- 如果MemTable未找到,则在Bloom Filter中查找,如果Bloom Filter判断不存在,直接返回空;如果可能存在,在对应SSTable中查找。
- 在SSTable从上至下逐层查找,直到找到值为止。由此可见,LSM树通过MemTable + SSTable的结构实现了读写高效与数据持久化的最佳结合,被广泛应用于需高吞吐的数据库系统中。
分布式存储 - HDFS & Ceph
HDFS
- 支持海里数据存储
- 高容错率
- 弱POSIX语义
- 使用普通
x86服务器,性价比高
HDFS(Hadoop Distributed File System)是一个分布式文件系统,用于存储PB级以上数据。
主要结构:
- NameNode:文件名空间管理器,用于管理文件目录结构与文件元数据(metadata)。只有一个NameNode。
- DataNode:数据存储节点,用于实际存储文件数据块(block)。通常有多个DataNode,并置于不同的物理节点上。
- Client:文件系统的客户端,用于访问HDFS。可以是上传/下载数据的应用程序。
- Block:文件在HDFS上以块(默认64MB)为单位分割和存储。
- Replication:每个block默认有3份副本(Replication Factor),存放在不同的DataNode上,以实现容错。
- Secondary NameNode:用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。
- Checkpoint:Secondary NameNode检索的快照信息, contains file system namespace image and edit log which changes the image in past.
HDFS工作机制:
- 用户通过Client上传文件到HDFS,NameNode将文件按block大小(默认64MB)分割成一个或多个block。
- NameNode选择block存放的DataNode(通常在不同的机架上),并记录block与DataNode的映射关系。
- Client通过NameNode获取block存放的DataNode列表,并直接与DataNode通信,上传block数据。
- NameNode定期得到阻断报告和心跳报告,以监控DataNode。当某DataNode失效时,会将其上的数据block复制到其他DataNode上。
- Client读取文件时,先向NameNode申请getFileInfo以获取文件所有block的位置信息。然后Client直接与相应的DataNode通信,读取block数据。
- Secondary NameNode定期合并NameNode的文件系统元数据镜像以防元数据损坏。Checkpoint会定期进行检查点操作。
- DataNode之间通过背间传输(rack-to-rack)直接传输block replica,加速block数据的复制。
Ceph(HASH + 权重 + 随机抽签)
CEPH是一种开源的分布式存储系统,用于构建PB级别的无单点故障的存储集群。
主要特点:
- 分布式:CEPH存储集群由许多存储节点组成,节点之间没有主备之分,全部对等。
- 无单点故障:CEPH存储集群没有中心节点,所以不存在单点故障问题。节点或盘故障不会影响集群。
- 高扩展性:CEPH存储集群可以由成百上千个节点组成,理论上没有上限,可以容纳EB级数据。
- 弹性:CEPH存储集群可以动态添加或删除OSD节点而不影响线上服务。
- 高性能:CEPH使用CRUSH算法计算数据分布,支持多副本,并行读写,实现高吞吐。
- 统一界面:CEPH为用户提供用于对象、块设备和文件系统的统一接口
CEPH的工作机制:
客户端通过连接MON获取OSD Maps,再直接与OSD通信进行数据的读写操作。OSD间通过PING-PONG机制和心跳检测进行监控。CRUSH算法计算数据在OSD间的分布。CEPH Filesystem和CEPH Block Device通过RADOS接口使用CEPH存储服务。
单机数据库
事务在单机内执行,也可能通过网络交互实现分布式事务
关系型数据库(Oracle,MySQL,PostgreSQL)
组件
- Query Engine 负责解析query,生成查询计划
- Txn Manager 负责事务并发管理
- Lock manager 负责锁相关的策略
- Storage Engine 负责组织内存/磁盘数据结构
- Replication 负责主备同步
关键内存数据结构:B - Tree , B +- Tree ,LRU List等
**关键磁盘数据结构:**WriteAheadLog (RedoLog)、Page
非关系型数据库(MongoDB,Redis,Elasticsearch)
- 交互方式各不相同
- 数据结构很奇怪,没有关系约束后,schema相对灵活