Skip to content

Commit

Permalink
文档工具改成mkdocs (#407)
Browse files Browse the repository at this point in the history
文档工具改成mkdocs
  • Loading branch information
hnwyllmm authored May 14, 2024
1 parent fb73701 commit 675394d
Show file tree
Hide file tree
Showing 220 changed files with 442 additions and 212 deletions.
19 changes: 6 additions & 13 deletions .github/workflows/gh-pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,34 +28,27 @@ jobs:
# Build job
build:
runs-on: ubuntu-latest
env:
MDBOOK_VERSION: 0.4.21
steps:
- uses: actions/checkout@v3
- name: Install mdBook
- name: Install Dependencies
run: |
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf -y | sh
rustup update
cargo install --version ${MDBOOK_VERSION} mdbook
python3 -m pip install -r ./docs/requirements.txt
- name: Setup Pages
id: pages
uses: actions/configure-pages@v3

- name: Build with mdBook
run: mdbook build
run: |
mkdocs build
working-directory: ./docs

- name: Doxygen Action
uses: mattnotmitt/[email protected]
with:
working-directory: .
doxyfile-path: ./Doxyfile
doxyfile-path: ./docs/Doxyfile

- name: Upload artifact
uses: actions/upload-pages-artifact@v1
with:
path: docs/book
path: docs/site

# Deployment job
deploy:
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ MiniOB 整体代码简洁,容易上手,设计了一系列由浅入深的题

MiniOB 整体架构如下图所示:

<img src="./docs/src/design/images/miniob-architecture.svg" width = "60%" alt="InternalNode" align=center />
<img src="./docs/docs/design/images/miniob-architecture.svg" width = "60%" alt="InternalNode" align=center />

其中:

Expand Down
2 changes: 1 addition & 1 deletion Doxyfile → docs/Doxyfile
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ PROJECT_LOGO =
# entered, it will be relative to the location where doxygen was started. If
# left blank the current directory will be used.

OUTPUT_DIRECTORY = docs/book/design/doxy
OUTPUT_DIRECTORY = docs/site/design/doxy

# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096
# sub-directories (in 2 levels) under the output directory of each output format
Expand Down
14 changes: 0 additions & 14 deletions docs/book.toml

This file was deleted.

Binary file added docs/docs/assets/favicon.ico
Binary file not shown.
Binary file added docs/docs/assets/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions docs/src/blog/1.md → docs/docs/blog/1.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
---
title: High-Performance Concurrency Control Mechanisms for Main-Memory Databases
---

> 本篇文章来自 [OceanBase](https://github.com/oceanbase/oceanbase) 内部论文分享
本篇文章分享的论文是[《High-Performance Concurrency Control Mechanisms for Main-Memory Databases》](https://www.microsoft.com/en-us/research/wp-content/uploads/2011/12/MVCC-published-revised.pdf),该论文介绍了微软SQL Server内存数据库Hekaton所使用的并发控制算法原型,提出了一种无锁的乐观并发控制以及一种无锁的悲观并发控制方法,最终Hekaton采用的是其中的乐观并发控制方法,其也是第一个在生产中将OCC落地的数据库。欢迎感兴趣的同学一起交流学习~
Expand Down
File renamed without changes
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
---
title: 介绍
---

MiniOB 博客放一些数据库技术实现原理相关的内容,有些来自[OceanBase](https://github.com/oceanbase) 内部分享的一些论文阅读笔记、技术分享、开发心得等,希望能够帮助大家了解数据库。
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
---
title: MiniOB架构
---

# MiniOB代码架构框架设计和说明

# MiniOB代码结构说明
## MiniOB代码结构说明

## 背景
### 背景
MiniOB旨在帮助不太熟悉数据库设计和实现的同学快速掌握和深入学习数据库内核。我们希望通过MiniOB的培训,学生能够理解不同数据库内核模块的功能和它们之间的联系。这个项目主要面向在校学生,对模块的设计和实现进行了简化处理,以便于他们更好地理解和学习。

## MiniOB架构介绍
### MiniOB架构介绍

<img src="./images/miniob-architecture.svg" width = "60%" alt="InternalNode" align=center />
![MiniOB架构](./images/miniob-architecture.svg)

- 网络模块(NET Service):负责与客户端交互,收发客户端请求与应答;
- SQL解析(Parser):将用户输入的SQL语句解析成语法树;
Expand All @@ -24,9 +28,9 @@ MiniOB旨在帮助不太熟悉数据库设计和实现的同学快速掌握和
- 客户端(Client):作为测试工具,接收用户请求,向服务端发起请求。


## 各模块工作原理介绍
### 各模块工作原理介绍

### 服务端启动过程
#### 服务端启动过程

虽然代码是模块化的,并且面向对象设计思想如此流行,但是很多同学还是喜欢从main函数看起。那么就先介绍一下服务端的启动流程。

Expand All @@ -44,14 +48,14 @@ main函数参考 main@src/observer/main.cpp。启动流程大致如下:

建议把精力更多的留在核心模块上,以更快的了解数据库的工作原理。

### 网络模块
#### 网络模块
网络模块代码参考src/observer/net,主要是Server类。
当前支持TCP socket和Unix socket,TCP socket可以跨主机通讯,需要服务端监听特定端口。Unix socket只能在本机通讯,测试非常方便。
在处理具体连接的网络IO请求时,会有具体的线程模型来处理,当前支持一对一连接线程模型和线程池模型,可以参考文档[MiniOB线程模型](./miniob-thread-model.md)
网络服务启动后,会监听端口(TCP)或Unix连接,当接收到新的连接,会将新的连接描述字加入网络线程模型中。
线程模型会在进程运行时持续监听对应socket上新请求的到达,然后将请求交给具体的处理模块。

### SQL解析
#### SQL解析
SQL解析模块是接收到用户请求,开始正式处理的第一步。它将用户输入的数据转换成内部数据结构,一个语法树。
解析模块的代码在`src/observer/sql/parser`下,其中`lex_sql.l`是词法解析代码,`yacc_sql.y`是语法解析代码,`parse_defs.h`中包含了语法树中各个数据结构。
对于词法解析和语法解析,原理概念可以参考《编译原理》。
Expand All @@ -61,28 +65,28 @@ NOTE:在查询相关的地方,都是用关键字relation、attribute,而

更多相关内容请参考 [MiniOB SQL语法解析](./miniob-sql-parser.md)

### 语义解析
#### 语义解析
语法解析会将用户发来的SQL文本内容,解析为一个文本描述的语法树,语义解析(Resolver)将语法树中的一些节点,比如表名、字段名称等,转换为内部数据结构中的真实对象。

解析可以做的更多,比如在解析表字段映射的过程中,可以创建Tuple,将字段名直接转换为使用更快的Field或数字索引的方式来访问某一行数据的字段。当前没有做此优化,每次都是在执行过程中根据字段名字来查找特定的字段,参考类 `ProjectTuple`

### 优化
#### 优化
优化决定SQL执行效率非常重要的一环,通常会根据一定的规则,对SQL语法树做等价调整,再根据一些统计数据,比如表中的数据量、索引情况等,来选择更好的执行计划。
MiniOB中的执行计划优化仅实现了简单的框架,可以参考 `OptimizeStage`

### 计划执行
#### 计划执行
顾名思义,计划执行就是按照优化后生成的执行计划原意执行,获取SQL结果。
当前查询语句被转换成了火山执行计划,执行时按照火山模型算子中,通过执行算子的 `next` 方法获取每行的执行结果。
对于DDL等操作,SQL最终被转换为各种Command,由`CommandExecutor`来执行。
计划执行的代码在`src/observer/sql/executor/`下,主要参考`execute_stage.cpp`的实现。

### 元数据管理模块
#### 元数据管理模块
元数据是指数据库一些核心概念,包括db、table、field、index等,记录它们的信息。比如db,记录db文件所属目录;field,记录字段的类型、长度、偏移量等。代码文件分散于`src/observer/storage/table,field,index`中,文件名中包含`meta`关键字。

### 客户端
#### 客户端
这里的客户端提供了一种测试miniob的方法。从标准输入接收用户输入,将请求发给服务端,并展示返回结果。这里简化了输入的处理,用户输入一行,就认为是一个命令。

### 通信协议
#### 通信协议
MiniOB 采用TCP通信,支持两种通讯协议,分别是纯文本模式和MySQL通讯协议,详细设计请参考 [MySQL 通讯协议设计](./miniob-mysql-protocol.md)
对于纯文本模式,客户端与服务端发送数据时,使用普通的字符串来传递数据,使用'\0'字符作为每个消息的终结符。

Expand All @@ -91,7 +95,7 @@ MiniOB 采用TCP通信,支持两种通讯协议,分别是纯文本模式和M

为了方便测试,MiniOB 支持不使用客户端,可以直接启动后在终端输入命令的方式做交互,在启动 observer 时,增加 `-P cli` 参数即可,更多信息请参考 [如何运行MiniOB](../how_to_run.md)

# 参考
## 参考
- 《数据库系统概念》
- 《数据库系统实现》
- 《flex_bison》 flex/bison手册
Expand All @@ -102,10 +106,10 @@ MiniOB 采用TCP通信,支持两种通讯协议,分别是纯文本模式和M
- [OceanBase数据库文档](https://www.oceanbase.com/docs)
- [OceanBase开源网站](https://github.com/oceanbase/oceanbase)

# 附录-编译安装测试
## 附录-编译安装测试

## 编译
### 编译
参考 [如何构建MiniOB](../how_to_build.md) 文件。

## 运行服务端
### 运行服务端
参考 [如何运行MiniOB](../how_to_run.md)
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
---
title: B+ 树并发操作
---

# B+ 树并发操作

> [MiniOB](https://github.com/oceanbase/miniob)[OceanBase](https://github.com/oceanbase/oceanbase) 联合华中科技大学推出的一款用于教学的小型数据库系统,希望能够帮助数据库爱好者系统性的学习数据库原理与实战。
# B+ 树介绍
## B+ 树介绍


B+ 树是传统数据库中常见的索引数据结构,比如MySQL、PostgreSQL都实现了B+树索引。B+ 树是一个平衡多叉树,层级少(通常只有3层)、数据块(内部节点/叶子节点)大小固定,是一个非常优秀的磁盘数据结构。关于B+ 树的原理和实现,网上有非常多的介绍,就不在此聒噪。这里将介绍如何实现支持并发操作的B+树以及MiniOB中的实现。


# B+树的并发操作
## B+树的并发操作
在多线程并发操作时,通常使用的手段是加锁,这里的实现方法也是这样。不过在学习并发B+树实现原理之前,需要对B+树的实现比较熟悉,有兴趣的同学可以网上搜索一下。

## Crabing Protocol
### Crabing Protocol
在操作B+树时加对应的读写锁是一种最简单粗暴但是有效的方法,只是这样实现效率不高。于是就有一些研究创建了更高效的并发协议,并且会在协议设计上防止死锁的发生。
![B+树示例](images/bplus-tree.jpg)

Expand All @@ -30,11 +35,11 @@ B+树的操作除了上述的插入、删除和查询,还有一个扫描操作
问题:哪种场景下,扫描加锁可能会与更新操作的加锁引起死锁?
问题:请参考[2],给出一个遍历时不需要重试的加锁方案。

## MiniOB实现
### MiniOB实现
MiniOB的B+树并发实现方案与上个章节描述的方法是一致的。这里介绍一些实现细节。
> 在这里假设同学们对B+树的实现已经有了一定的了解。
### B+树与Buffer Pool
#### B+树与Buffer Pool
B+树的数据是放在磁盘上的,但是直接读写磁盘是很慢的一个操作,因此这里增加一个内存缓冲层,叫做Buffer Pool。了解数据库实现的同学对这个名词不会陌生。在MiniOB中,Buffer Pool的实现是 `class DiskBufferPool`。对Buffer Pool实现不太了解也没关系,这里接单介绍一下。

`DiskBufferPool` 将一个磁盘文件按照页来划分(假设一页是8K,但是不一定),每次从磁盘中读取文件或者将数据写入到文件,都是以页为单位的。在将文件某个页面加载到内存中时,需要申请一块内存。内存通常会比磁盘要小很多,就需要引入内存管理。在这里引入Frame(页帧)的概念(参考 `class Frame`),每个Frame关联一个页面。`FrameManager`负责分配、释放Frame,并且在没有足够Frame的情况下,淘汰掉一些Frame,然后将这些Frame关联到新的磁盘页面。
Expand All @@ -48,7 +53,7 @@ B+ 树的数据保存在磁盘,其树节点,包括内部节点和叶子节

问题:为什么一定要先执行解锁,再执行unpin(frame引用计数减1)?

### 处理流程
#### 处理流程
B+树相关的操作一共有4个:插入、删除、查找和遍历/扫描。这里对每个操作的流程都做一个汇总说明,希望能帮助大家了解大致的流程。

**插入操作**
Expand Down Expand Up @@ -113,7 +118,7 @@ B+树相关的操作一共有4个:插入、删除、查找和遍历/扫描。
memo.release_last // 释放当前节点之前加到的锁
```

### 根节点处理
#### 根节点处理
前面描述的几个操作,没有特殊考虑根节点。根节点与其它节点相比有一些特殊的地方:
- B+树有一个单独的数据记录根节点的页面ID,如果根节点发生变更,这个数据也要随着变更。这个数据不是被Frame的锁保护的;
- 根节点具有一定的特殊性,它是否“安全”,就是根节点是否需要变更,与普通节点的判断有些不同。
Expand All @@ -123,15 +128,15 @@ B+树相关的操作一共有4个:插入、删除、查找和遍历/扫描。
在MiniOB中,可以参考`LatchMemo`,是直接使用xlatch/slatch对Mutex来记录加过的锁,这里可以直接把根节点数据保护锁,告诉LatchMemo,让它来负责相关处理工作。
判断根节点是否安全,可以参考`IndexNodeHandler::is_safe``is_root_node`相关的判断。

### 如何测试
#### 如何测试
想要保证并发实现没有问题是在太困难了,虽然有一些工具来证明自己的逻辑模型没有问题,但是这些工具使用起来也很困难。这里使用了一个比较简单的方法,基于google benchmark框架,编写了一个多线程请求客户端。如果多个客户端在一段时间内,一直能够比较平稳的发起请求与收到应答,就认为B+树的并发没有问题。测试代码在`bplus_tree_concurrency_test.cpp`文件中,这里包含了多线程插入、删除、查询、扫描以及混合场景测试。

## 其它
### 其它

### 有条件的开启并发
#### 有条件的开启并发
MiniOB是一个用来学习的小型数据库,为了简化上手难度,只有使用-DCONCURRENCY=ON时,并发才能生效,可以参考 mutex.h中`class Mutex``class SharedMutex`的实现。当CONCURRENCY=OFF时,所有的加锁和解锁函数相当于什么都没做。

### 并发中的调试
#### 并发中的调试
死锁是让人非常头疼的事情,我们给Frame增加了调试日志,并且配合pin_count的动作,每次加锁、解锁以及pin/unpin都会打印相关日志,并在出现非预期的情况下,直接ABORT,以尽早的发现问题。这个调试能力需要在编译时使用条件 `-DDEBUG=ON` 才会生效。
以写锁为例:

Expand All @@ -157,7 +162,7 @@ void Frame::write_latch(intptr_t xid)
}
```
# 参考
## 参考
[1] [15445 indexconcurrency](https://15445.courses.cs.cmu.edu/fall2021/notes/08-indexconcurrency.pdf)
[2] Concurrency of Operations on B-Trees
Expand Down
Loading

0 comments on commit 675394d

Please sign in to comment.