数据库&主流存储产品剖析 | 青训营笔记

85 阅读6分钟

主流存储产品剖析

TODO

大纲:

3.1 单机存储

3.2 分布式存储

3.3 单机关系型数据库

3.4 单机非关系型数据库

3.5 分布式数据库

3.1 单机存储

概述:

单机存储 = 单个计算机节点上的存储系统软件系统,一般不涉及网络交互。

  • 本地文件系统

  • Key-Value 存储

本地文件系统:

DB-local-file-system.png

一切皆文件!

Linux 文件系统的两大数据结构:Index Node & Directory Entry

Index Node:

元数据节点,记录上述信息的信息,inode 是一个文件的唯一标识,会被存储到磁盘上inode的总数在格式化文件系统时就固定了。

Directory Entry:

记录文件名、inode指针、层级关系(parent)等

dentry是全内存的数据结构,并不会被持久化到磁盘,与inode关系是 N:1(类似 hardlink 的实现)

Key-Values 存储:

DB-key-value-storage.png

世间一切皆 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:

DB-HDFS.png

堪称大数据时代的基石

核心特点:

  • 支持海量数据存储

  • 高容错性

  • Posix语义

  • 使用普通x86服务器,性价比高

架构分为 Management Node 和 Storage Node。

Management Node 就是分布式系统里的管控面,包含 NameNode 和 Secondary NameNode。保存了整个系统数据存储的拓扑。我们读数据时要先和 NameNode 交互,拿到数据存储的物理位置,拿到物理位置后才能去 Storage Node 上读取数据。

在HDFS之上 发展出了 Hadoop 体系(计算体系),数据存到Data Node 之后,也就是 Hadoop 体系里那些计算框架。像 MapReduce,他的核心思想是 要让数据和计算逻辑靠的比较近,甚至要在数据存储的节点上做计算。所以MapReduce 的计算框架 模型要把计算推到 DataNode上去做,不要让DataNode上的数据进行移动,然后通过网络来交互,这样效率比较高。

Ceph

DB-Ceph.png

核心特点:

  • 一套系统支持对象接口、块接口、文件接口,但是一切皆对象

  • 数据写入采用主备复制模型

  • 数据分布模型采用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

关键磁盘数据结构:

DB-Relation-Disk-data-structure.png 左边是内存数据结构,右边是磁盘数据结构。

关系型数据库一般是以树状结构来组织内存数据。

树的每个节点都被称为 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(子集)和“事务”

非关系型数据库特点:


3.5 分布式数据库