数据库产品剖析 | 青训营笔记

112 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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 交互