这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
单机存储
单机存储 = 单个计算机节点上的存储软件系统,一般不涉及网络交互
本地文件系统
Linux 文件系统的两大数据结构
Index Node
记录文件元数据,如 ID、大小、权限、磁盘位置等 inode 是一个文件的唯一标识,会被存储到磁盘上 inode 的 总数在格式化文件系统时就固定了
Directory Entry
记录文件名、inode 指针、层级关系等,dentry 是内存结构,与 inode 的关系是 N:1 (hardlink的实现)
key-value 存储
常见使用方式:put(k,v) & get(k) 常见数据结构:LSM-Tree,某种程度上牺牲读性能,追求写入性能 拳头铲平:RocksDB
分布式存储
分布式存储就是在单机存储基础上实现分布式协议,涉及大量网络交互
HDFS
核心特点
- 支持海量数据存储
- 高容错性
- 弱 POSIX 语义
- 使用普通 x86 服务器,性价比高
Ceph
核心特点
- 一套系统支持对象接口、块接口、文件接口,但是一切皆对象
- 数据写入采用主备数据模型
- 数据分布模型采用 CRUSH 算法
单机关系型数据库
商业产品 Oracle 称王,开源产品 MySQL & PostgreSQL 称霸
通用组件
Query Engine —— 负责解析 query,生成查询计划 Txn Manager —— 负责事务并发管理 Lock Manager —— 负责锁相关的策略 Storage Engine —— 负责组织内存/磁盘数据结构 Relication —— 负责主备同步
数据结构
关键内存数据结构:B-Tree、B+-Tree、LRUList 关键磁盘数据结构:WriteAheadLog(RedoLog)、Page
单机非关系型数据库
MongoDB、Redis、Elasticsearch 三足鼎立
关系型数据库一般直接使用 SQL 交互,而非关系型数据库交互方式各不相同
非关系型数据库的数据结构千奇百怪,没有关系约束,schema 相对灵活
管管是否为关系型数据库,大家都在尝试支持 SQL(子集)和“事务”
Elasticsearch
- 面向「文档存储」
- 文档可序列化称 JSON,支持嵌套
- 存在「index」,index = 文档的集合
- 存储和构建索引能力依赖 Lucene 引擎
- 实现了大量搜索数据结构 & 算法
- 支持 RESTFUL API,也支持 SQL 交互
MongoDB
- 面向「文档」存储
- 文档可序列化成 JSON/BSON,支持嵌套
- 存在「collection」,collction = 文档的集合
- 存储和构建索引能力依赖 wiredTiger 引擎
- 4.0 后开始支持事务(多文档、跨分片多文档等)
- 常用 client/SDK 交互,可通过插件转译支持弱 SQL
Redis
- 数据结构丰富(hash表、set、zset、list)
- C 语言实现,超高性能
- 主要基于内存,但支持 AOF/RDB 持久化
- 常用 redis-ci/多语言 SDK 交互