主流存储产品剖析
TODO
大纲:
3.1 单机存储
3.2 分布式存储
3.3 单机关系型数据库
3.4 单机非关系型数据库
3.5 分布式数据库
3.1 单机存储
概述:
单机存储 = 单个计算机节点上的存储系统软件系统,一般不涉及网络交互。
-
本地文件系统
-
Key-Value 存储
本地文件系统:
一切皆文件!
Linux 文件系统的两大数据结构:Index Node & Directory Entry。
Index Node:
元数据节点,记录上述信息的信息,inode 是一个文件的唯一标识,会被存储到磁盘上inode的总数在格式化文件系统时就固定了。
Directory Entry:
记录文件名、inode指针、层级关系(parent)等
dentry是全内存的数据结构,并不会被持久化到磁盘,与inode关系是 N:1(类似 hardlink 的实现)
Key-Values 存储:
世间一切皆 key-value —— key 是你身份证,value是内涵:)
-
常见使用方式:
put(k,v) & get(k,v) -
常见数据结构:LSM-Tree,某种程度牺牲读性能,追求写入性能。(一直用append的方式把数据往系统追加)
-
拳头产品:RocksDB
LSM-Tree 数据结构特点:
顺序写入友好,读性能被牺牲。
数据结构被分为两部分,一部分是左边的 Memory 数据结构,另一边是磁盘的数据结构。在内存和磁盘,都遵循顺序写入的,不断put Key-Value。本质上是记着一个最新的 key-Value,一直追加到内存里,一个有序的内存的数据结构。
当内存里有序的 Memory Table满了之后,然后就会被刷到不可变的 Immutable Memory Table。过段时间或者触发条件时,就会把他顺序写入到磁盘的 SSTable 里。SSTable 是 Sorted String Table 有序的key-Value的集合。当 Level 0 的 SSTable 装满时,就会被下刷到 Level 1,同理到 Level2。如果要读取最新版本的 Key-Value 数据,可能要合并多层 0 1 2的最新版本 Key-Value 数据,才能服务用户的 Get request。
3.2 分布式存储
概览:
分布式存储 = 在单机存储基础上实现了分布式协议,涉及大量网络交互。
-
分布式文件系统
-
分布式对象存储
HDFS:
堪称大数据时代的基石
核心特点:
-
支持海量数据存储
-
高容错性
-
弱Posix语义
-
使用普通x86服务器,性价比高
架构分为 Management Node 和 Storage Node。
Management Node 就是分布式系统里的管控面,包含 NameNode 和 Secondary NameNode。保存了整个系统数据存储的拓扑。我们读数据时要先和 NameNode 交互,拿到数据存储的物理位置,拿到物理位置后才能去 Storage Node 上读取数据。
在HDFS之上 发展出了 Hadoop 体系(计算体系),数据存到Data Node 之后,也就是 Hadoop 体系里那些计算框架。像 MapReduce,他的核心思想是 要让数据和计算逻辑靠的比较近,甚至要在数据存储的节点上做计算。所以MapReduce 的计算框架 模型要把计算推到 DataNode上去做,不要让DataNode上的数据进行移动,然后通过网络来交互,这样效率比较高。
Ceph
核心特点:
-
一套系统支持对象接口、块接口、文件接口,但是一切皆对象
-
数据写入采用主备复制模型
-
数据分布模型采用CRUSH算法
主备复制:client 要往 Ceph 写入数据,会先写到多副本的主节点,再从主节点做链状的多副本的冗余复制,并不是直接从 Client 直接把多副本发出。
数据分布模型:一份数据,如果用户写入 1MB,为了保证数据可靠性和系统可用性,往往会把 1MB 分为 三个或六个副本,在系统里做冗余存储。数据分布模型就是决定这几个副本要放在哪几个服务器,用CRUSH 算法来确定几个副本落地存储的服务器。
CRUSH算法 = HASH +权重 + 随机抽签
3.3 单机关系型数据库
概览:
单机数据库 = 单个计算机节点上的数据库系统
事务在单机内执行,也可能通过网络交互实现分布式事务
-
关系型数据库
-
非关系型数据库
关系型数据库
商业产品Oracle称王,开源产品 MySQL & PostgreSQL称霸
关系型数据库的通用组件:
-
Query Engine:负责解析 query,生成查询计划
-
Txn Manager:负责事务并发管理
-
Lock Manager:负责锁相关的策略
-
Storage Engine:负责组织内存/磁盘数据结构
-
Replication:负责主备同步
关键内存数据结构:B -Tree、B+ -Tree、LRU List等
关键磁盘数据结构:WriteAheadLog(RedoLog)、Page
关键磁盘数据结构:
左边是内存数据结构,右边是磁盘数据结构。
关系型数据库一般是以树状结构来组织内存数据。
树的每个节点都被称为 Page,如果有用户想插入数据,例如Update。其实本质上是来更新内存里的 Page 数据结构。用来更新 Page 数据结构时,要先记录一条操作日志 Redo Log,来保证修改,更新操作不会丢失,需要把操作记下来。左上的长条,代表 Redo Log,记录了 对哪个 Page 做怎样的操作。
在内存中,除了 Page、Redo Log 外,还有大量的 Temp data.
临时数据指的是,查询时内存不够用了,把 join 或者 排序的结果生成临时数据,后面计算过程的不断推进,再把临时数据拼接起来,变成最终的结果,返回给执行查询的用户。
磁盘结构:
有三类文件,一类是 Page Files,对应内存数据结构的 Page。一类是 Redo Log Files,存储的是事务执行过程的各种 Redo Log。Other 很有可能存储 Temp Data临时数据文件。内存不够,查询生成的临时数据先写到磁盘上,后面内存够用了,再把 Temp Data load 到内存中进行整合。
3.4 单机非关系型数据库
概览:
MongoDB、Redis、Elasticsearch 三足鼎立
-
关系型数据库一般直接使用SQL交互,而非关系型数据库交互方式各不相同。
-
非关系型数据库的数据结构千奇百怪,没有关系约束后,schema相对灵活。
-
不管是否关系型数据库,大家大家都在尝试支持 SQL(子集)和“事务”