这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
存储与数据库
数据的持久化:校验数据的合法性 -> 修改内存(用高效的数据结构组织数据) -> 写入存储介质(以寿命&性能友好的方式)
存储系统:一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件
关系型数据库
关系 = 集合 = 任意元素组成的若干有序对
反映了事物间的关系 描述两个实体间的联系
关系代数 = 对关系作运算的抽象查询语言 (并、交、笛卡尔积)
关系型数据库在存储系统基础上,对结构化数据友好,支持事务(ACID特性),支持复杂查询语言
非关系型数据库
不要求严格的结构化 不一定支持事务与复杂查询语言
单机存储 —— 本地文件系统 Linux
文件系统的管理单元:文件
文件系统遵循VFS的统一抽象接口
Linux文件系统关键数据结构:
- Index Node:记录文件元数据(如id、大小、权限、磁盘位置等)的节点 文件的唯一标识 inode总数在格式化磁盘时就固定了
- Directory Entry:记录文件名、inode指针、层级关系(parent) 是内存结构 与inode是n对1关系
单机存储 —— Key-Value存储
常见使用方式:put(k,v) get(k)
常用数据结构:LSM-Tree(某种程度牺牲读性能,追求写入性能)
分布式存储
分布式存储 = 在单机存储基础上实现了分布式协议 涉及大量网络交互
HDFS核心特点
- 支持海量数据存储
- 高容错性
- 弱POSIX语义(并非支持POSIX全集)
- 使用普通x86硬件
Ceph核心特点
- 一切皆对象,基于对象发展了很多高级接口(块存储、文件存储)
- 数据写入采用 主备复制(先写入主节点,再由主节点作链状的冗余复制)
- 数据分布模型 采用 CRUSH算法(核心思想:哈希 + 权重 + 随机)
单机数据库
事务在单机上执行,也可能通过网络交互实现分布式事务
关系型
把数据以表的形式存储,然后在各个表间建立关系,通过这些表间的关系操作不同表之间的数据
使用SQL交互
核心组件:
- Query Engine:负责解析query,生成查询计划
- Txn Manager:负责事务并发管理
- Lock Manager:负责锁相关的策略(锁管理、锁调度)
- Storage Engine:负责组织内存/磁盘数据结构(高性能读写、淘汰)
- Replication:负责主备同步
关键内存数据结构:B -Tree、B+ -Tree、LRUList
关键磁盘数据结构:WriteAheadLog(RedoLog)、Page
非关系型
交互方式各不相同
没有固定的表结构 数据之间可以是独立的
没有关系约束后、schema相对灵活
从单机到分布式
单机数据库主要问题:容量、弹性、性价比