一些存储引擎存储结构简介

简介: # 概述 本文简要介绍了一些存储引擎存储结构,包括InnoDB, TokuDB, RocksDB, TiDB, CockroachDB, 供大家对比分析 # InnoDB InnoDB 底层存储结构为B+树,结构如下 ![image.

概述

本文简要介绍了一些存储引擎存储结构,包括InnoDB, TokuDB, RocksDB, TiDB, CockroachDB, 供大家对比分析

InnoDB

InnoDB 底层存储结构为B+树,结构如下
image.png

B树的每个节点对应innodb的一个page,page大小是固定的,一般设为16k。
其中非叶子节点只有键值,叶子节点包含完成数据。

InnoDB按segment, extent, page方式管理page
image.png
每个数据节点page结构如下
image.png

数据记录record按行存储,record具体格式由row_format决定.
详情可以参考数据内核月报

TokuDB

TokuDB 底层存储结构为Fractal Tree
屏幕快照 2017-10-16 下午2.38.11.png

Fractal Tree的结构与B+树有些类似, 在Fractal Tree中,每一个child指针除了需要指向一个child节点外,还会带有一个Message Buffer ,这个Message Buffer 是一个FIFO的队列,用来缓存更新操作。

例如,一次插入操作只需要落在某节点的Message Buffer就可以马上返回了,并不需要搜索到叶子节点。这些缓存的更新会在查询时或后台异步合并应用到对应的节点中。

RocksDB

RockDB的存储结构如下
xx.png

RocksDB写入数据时,先写到memtable中,memtable一般为skiplist, memtable写满时转为immutable memtable并刷入Level 0.

Level0中的SST文件中的数据都是有序的,Level0中SST文件之间的数据范围可能存在重叠。
其他Level中的SST文件之间的数据范围不重叠。

RocksDB会以一定的机制从低level compact数据到高level中。

RocksDB中SST文件的结构如下
image.png

MyRocks使用的存储引擎就是RocksDB, MyRocks的中RocksDB的数据映射关系参考之前的月报
image.png

TiDB

TiDB的存储结构

image.png

TiDB是分布式存储,分为两个部分TiKV和Placement Driver server。
TiKV用于存储真正的数据,TiKV由分布在不同机器上的RocksDB实例组成。
数据按范围划分为一个个Region. 并且会尽量保持每个 Region 中保存的数据不超过一定的大小(这个大小可以配置,目前默认是 64MB). 同一Region分布在不同的RocksDB实例中,一个RocksDB实例包含多个Region.
图中,Region4有三个副本分布在三个RocksDB实例中,这三个Region副本组成一个RaftGroup,副本间通过Raft协议保证一致性。
Placement Driver server(PD), 也是一个集群,也通过Raft协议保证一致性。PD主要有以下作用:

  • 存储region的位置等元数据信息
  • 调度和rebalance regions, TiKV中的Raft leader等信息
  • 分配全局事务ID

TiDB的数据映射关系
以下表为例

create table user(user_id int primary key, name varchar(100), email varchar(200));
INSERT INTO user VALUES (1, “bob”, “huang@pingcap.com”);
INSERT INTO user VALUES (2, “tom”, “tom@pingcap.com”);

对应到RocksDB中的KV结构如下

|Key |Values|
| ------------- |:-------------:|
|user/1|bob huang@pingcap.com|
|user/2|tom tom@pingcap.com |

CockroachDB

CockroachDB的存储结构

image.png

image.png

CockroachDB的也是分布式存储,其结构和TiDB类似。CockroachDB按范围划分为Range,Range默认为64M,Range的存储为RocksDB, CockroachDB的一个node包含多个RocksDB实例。
Range副本分布在不同的node中,通过Raft协议保证一致。

Range的元数据信息也保存在Range中(靠前的Range中).

System keys come in several subtypes:

  • Global keys store cluster-wide data such as the "meta1" and "meta2" keys as well as various other system-wide keys such as the node and store ID allocators.
  • Store local keys are used for unreplicated store metadata (e.g. the StoreIdent structure). "Unreplicated" indicates that these values are not replicated across multiple stores because the data they hold is tied to the lifetime of the store they are present on.
  • Range local keys store range metadata that is associated with a global key. Range local keys have a special prefix followed by a global key and a special suffix. For example, transaction records are range local keys which look like: x01ktxn-.
  • Replicated Range ID local keys store range metadata that is present on all of the replicas for a range. These keys are updated via Raft operations. Examples include the range lease state and abort cache entries.
  • Unreplicated Range ID local keys store range metadata that is local to a replica. The primary examples of such keys are the Raft state and Raft log.

CockroachDB的数据映射关系

以下表为例

create table mydb.customers(name varchar(100) primary key, address varchar(100) , URL varchar(100));
insert into mydb.customers values('Apple','1 Infinite Loop, Cupertino, CA','http://apple.com/');

表结构信息

|Key |Values|
| ------------- |:-------------:|
|/system/databases/mydb/id | 51|
|/system/tables/customer/id | 42|
|/system/desc/51/42/address |69|
|/system/desc/51/42/url |66

表中的数据

|Key |Values|
| ------------- |:-------------:|
|/51/42/Apple/69| 1 Infinite Loop, Cupertino, CA|
|/51/42/Apple/66| http://apple.com/|

最后

本文简要介绍了各存储引擎的结构,供大家参考,有错误之处请指正.

参考文档

目录
相关文章
|
7月前
|
存储 关系型数据库 MySQL
认真学习InnoDB的数据存储结构
认真学习InnoDB的数据存储结构
83 0
|
存储 SQL 算法
Mysql进阶索引篇02——InnoDB存储引擎的数据存储结构(一)
前面我们已经剖析了mysql中InnoDB与MyISAM索引的数据结构,了解了B+树的设计思想、原理,并且介绍了B+树与Hash结构、平衡二叉树、AVL树、B树等的区别和实际应用场景。 页和页之间并不一定在物理上相连,只是在逻辑上使用双向链表关联。指针、记录究竟是如何存储的呢?其实这就需要联系我们之前提到的行格式了。数据查找在页目录中二分法快速定位到槽,上面的过程都与页的内部结构相关,本文将详细的阐述。
Mysql进阶索引篇02——InnoDB存储引擎的数据存储结构(一)
|
2月前
|
存储 消息中间件 大数据
解密存储引擎 bitcask 的设计原理
解密存储引擎 bitcask 的设计原理
72 2
|
6月前
|
存储 SQL 关系型数据库
使用关系型数据库三级模式存储数据的优缺点
【6月更文挑战第10天】数据模型是DBMS的核心,提供数据透明性和设计指导。包括概念、逻辑和物理三层:概念模型(如ER模型)用于理解和收集需求,逻辑模型(如关系模型)关注设计,物理模型涉及实际存储实现。
117 0
使用关系型数据库三级模式存储数据的优缺点
|
6月前
|
存储 NoSQL MongoDB
深入详解MongoDB索引的数据组织结构
深入详解MongoDB索引的数据组织结构
|
6月前
|
存储 分布式计算 NoSQL
RocksDB:高性能键值存储引擎初探
RocksDB:高性能键值存储引擎初探
|
7月前
|
存储 NoSQL 关系型数据库
LSM设计一个数据库引擎
LSM设计一个数据库引擎
96 0
|
存储 消息中间件 缓存
NoSQL常用数据结构 LSM Tree 简介
NoSQL常用数据结构 LSM Tree 简介
321 0
|
存储 SQL 缓存
第7章_InnoDB数据存储结构
第7章_InnoDB数据存储结构
269 0
|
存储 SQL 关系型数据库
MySQL - 剖析MySQL索引底层数据结构
MySQL - 剖析MySQL索引底层数据结构
94 0