存储和数据库
事务的四大特性
ACID:原子性,一致性,隔离性,持久性
Atomicity:事务内的操作要么全做,要么不做
Consistency:事务执行前后,数据的状态是一致的
Isolation:可以隔离多个并发事务,避免影响
Durability:事务一旦提交成功,数据保证持久性
单机存储
单机存储 = 单个计算机节点上的存储软件系统,一般不涉及网络交互
e.g. 本地文件系统、key/value存储
本地文件系统
Linux哲学:一切皆文件。所有种类的文件系统都遵循VFS的统一抽象接口
Linux的两大核心数据结构:Index Node和Directory Entry
Index Node:
- 记录文件元数据,如id,大小,权限,磁盘位置等。
- inode是一个文件的唯一标识符,会被存储到磁盘上。
- inode的总数在格式化文件系统的时候就固定了
Directory Entry:
- 记录文件名,inode指针,其层级关系等。
- dentry是内存结构,与inode的关系是N:1。
key/value存储
常见使用:put(k,v)和get(k)
常用数据结构:LSM-Tree(一定程度上牺牲读性能,追求写性能,append写入)
分布式存储系统
分布式存储 = 在单机存储基础上实现了分布式协议,涉及大量网络交互
e.g. HDFS,Ceph
HDFS
大数据时代的基石!!!
核心特点:
- 支持海量数据存储
- 高容错性
- 弱POSIX语义,POSIX:可移植操作系统接口
- 使用普通x86服务器,性价比高
Management Node:管控面,通过此访问数据
Storage Node:存储数据
NameNode:名称主节点,保存整个文件系统的目录信息,文件信息,分块信息。
Secondary NameNode:如果主节点失效,则切换到此从节点
DataNode:数据节点,分布在廉价的计算机上,用于存储Block块文件
注: 在此HDFS的基础上,有了Hadoop体系,其核心思想:计算和数据更加接近,把计算推到DataNode上,避免数据通过网络四处移动。
Ceph
核心特点:
- 一套系统支持对象接口、块接口、文件接口。但是一切皆对象
- 数据写入采用主备复制模型
- 数据分布模型采用
CRUSH算法
单机数据库
单机数据库 = 单个计算机节点上的数据库系统
事务在单机内执行,也可能通过网络交互实现分布式事务
关系型数据库
通用组件:
Query Engine:解析query,生成查询计划
Txn Manager:事务并发管理
Lock Manager:锁相关的策略
Storage Engine:组织内存/磁盘数据结构,进行读写和淘汰等
Replication:负责主备同步
关键的内存数据结构:B-Tree,B+-Tree,LRU List等
关键的磁盘数据结构:WriteAheadLog(RedoLog)、Page
B树:按键所对应的值有序地存储记录集合。B-tree 是一种特殊的高度平衡树, n-ary, n > 2,所有叶子节点必须在统一层上。
实体(Entries[*])和搜索信息(如 key)可存储在 B-tree 的内部节点和叶子节点。
B+树:所有的实体 entries 都在叶子节点上,内部节点只包含有序的搜索信息(key values)和子节点指针。entries 是 (key , data) 对,按 key 值排序。
MySQL采用的存储方式就是B+树,其一个节点占有一页,这样只把搜索信息放进固定大小的一页(16K)中显然会有更多的子节点,减小了树的高度,更能有效搜素数据。
RedoLog
MySQL的数据以页为单位存储,涉及查询操作时,会先从硬盘把一页的数据加载出来,加载出来的数据叫数据页,会放入到Buffer Pool中。后续的查询更新等都是先从Buffer Pool中找,没有命中再去硬盘加载,减少硬盘IO开销,提升性能。
在进行以上操作时,会把在数据页中所做的操作记录都记录到Redo Log buffer中,后续刷盘到redo log文件中。
注:redo log是InnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。
非关系型数据库
关系型数据库一般直接使用SQL交互,而非关系型数据库交互方式各不相同
非关系型数据库的数据结构各有不同,没有关系约束后,schema相对灵活。(schema,模式,即数据库的组织和结构)
e.g. MongoDB、Redis、Elasticsearch
Elasticsearch
- 面向文档存储
- 文档可json序列化,支持嵌套
- 无表,通过index管理,index=文档集合
- 存储和构建索引能力依赖Lucene引擎
- 实现了大量搜索数据结构和算法
- 支持RESTFUL API和类SQL的交互
MongoDB
- 面向文档存储,数据存储非常灵活,任意类型
- 文档可以序列
JSON与BSON,支持嵌套 - 无表,通过collection管理,collection=文档集合
- 存储和构建索引能力依赖wireTiger引擎,纯C打造
- 4.0后开始支持事务
- client/SDK进行交互,目前可以通过插件转译支持弱SQL
Redis
- 数据结构丰富(
hash,set,zset,list,string) - 纯C打造,超高性能
- 基于内存,支持AOF和RDB持久化
- 常用redis-cli/多语言SDK交互,不支持SQL
注:Redis提供了持久化,即把数据保存到磁盘。
RDB,就是把内存数据以快照的形式保存到磁盘上。是指在指定的时间间隔内,执行指定次数的写操作,将内存中的数据集快照写入磁盘中,它是Redis默认的持久化方式。dump.rdb
AOF(append only file) 持久化,采用日志的形式来记录每个写操作,追加到文件中,重启时再重新执行AOF文件中的命令来恢复数据。它主要解决数据持久化的实时性问题。默认是不开启的。
分布式数据库
容量问题
单点数据库容量有限,受到硬件限制。
解决方案:存储节点池化,动态扩缩容量。
弹性问题
单机CPU资源紧张,扩容获取新的数据库,迁移耗费大。一旦遇到缩容操作,无法解决。
解决方案:池化节点
性价比问题
数据存储量巨大,但是CPU利用率不高
解决方案:池化节点,可以单一扩充容量或者CPU的方式
我觉得池化技术正是分布式数据库可以搭建起来的重要依托~
学习感想
本次学习中,我更多的学习了存储与数据库的分类,以及在不同的场景下,何种数据库能更优的解决存储问题。对于以往很多分散的数据库方向的知识有了统合。