文章目录
MiniOB 是一个具备基础功能的项目实战型数据库,可实现数据库的部分功能
官方:https://github.com/oceanbase/miniob
1. 数据库系统概论
数据库模型
根据数据之间联系的表达方式划分:
层次数据模型
在数据库中定义满足以下两个条件的记录以及它们之间联系的集合为层次模型:
- 有且只有一个结点没有双亲结点,这个结点称为根结点;
- 根节点以外的其他结点有且只有一个双亲结点。
网状数据模型
网状模型的数据结构主要有以下两个特征:
- 允许有一个以上的节点无双亲。
- 至少有一个节点可以有多于一个的双亲。
从上述特征中可以看出,层次模型中子结点与双亲结点的联系是唯一的,而在网状模型中这种联系可以不唯一。
因此,在网状模型中要为每个联系命名,并指出与该联系有关的双亲记录和子记录。
关系数据模型
关系模式实际就是记录类型,包括:模式名、属性名、值域名及模式的主键。关系模型利用表的集合来表示数据和数据间的联系,在逻辑层和视图层描述数据,使用户不必关注数据存储的底层细节。
关系模型就是现在数据库的主流模型
数据库系统架构
整个关系数据库大概分为三大块:存储、事务和 SQL:
- 存储:相当于关系数据库的数据结构。
存储在工业界基本上最常见的两种基础的数据结构:哈希表、B+ 树。
哈希表:可以实现 O(1) 的计算,哈希表 put/get 的性能非常快,唯一的缺陷是不支持范围scan。
B+ 树:是今天关系数据库里面用的最多的一种方式。最大的优势它可以做范围scan,并且它是一个平衡二叉树,它的读、写、删除都非常的均衡
补充:LSM-Tree:
最大的特点就是它会更适合于写多读少的场
景,其核心思想就是将离散的随机写请求都转换成批量的顺序写请求,大幅度减少随机写的这种随机操作,提高写的性能。
- 事务:相当于关系数据库的算法。
事务里面最核心的有四个概念:
原子性(Atomicity):事务操作要么全部成功,要么全部失败。即一旦事务出错,就回滚事务。
一致性(Consistency):一个事务只能使数据库从一个一致的状态跳到另一个一致的状态,不能存在一个中间的状态。
隔离性(Isolation):多个并发事务互相不影响,就如同多个事务串行执行一般。
持久性(Duration):事务一旦提交成功对数据库的影响就是永久的。
- SQL:相当于关系数据库操作的描述语言,其实就是相当于接口。SQL 在数据库实现中相当于接口的实现。在数据库内部有专门一个**模块 (SQL 引擎)**来实现这一套接口。
MiniOB框架
MiniOB线程模型
SEDA框架——线程池事件处理框架
MiniOB使用了 SEDA 的框架,像 Resolver、优化器等在 SEDA 中都是一个个的 Stage,各个 Stage 之间通过事件来传递数据。MiniOB 的多线程能力是基于 SEDA 来做的,SEDA 本身就是支持线程池的。
SEDA框架图:如下所示,线程池可以有多个,每个线程池可以包含多个 Stage,一个 Stage 会绑定到某一个线程池里面。每个线程池可以设置自己的线程的个数、事件队列的大小,线程池中的多个 Stage 之间是通过事件通讯的,不同的线程池之间的 Stage 也可以通过事件通讯,并且每一个线程池里面的 Stage 可以是不同的。
SEDA 框架好处:可以将 Stage 进行分类,比如把处理 SQL 的分作一类,把 IO 处理的分作为一类,并把不同的分类分配到不同的线程池。——隔离性好
Stage 模型:一个 Stage 对应一个类型的事件,事件是放在线程池事件队列中的。线程池事件指当事件队列有事件后,就将其交给对应的 Stage 来处理。
有空可以查查具体资料(下面资料文章只是随手找了一篇阅读量相对高的贴上来):
资料1
资料2
MiniOB事件
事件生命周期
事件执行过程
客户端通过网络发送一个请求到服务端,服务端在接收到消息后会创建一个消息包,并创建对应的SessionEvent。然后调用 add_event 把 SessionEvent 添加到 SessionStage 里(即线程事件队列中)(参考 net/server.cpp 中session_stage_->add_event(sev);),再放到对应的事件队列中。SessionStage 以及后续处理事件的几个
Stage,都在 SQLThreads 线程池中。
SessionStage 处理 SessionEvent 后,会创建一个 SQLStageEvent 传递给后面的 Stage。后续的 Stage 都是处理这个 SQLStageEvent 的事件。如下图所示,事件经过一个流转,处理完成后返回结果给客户端。
代码层面的具体了解
在配置文件 etc/observer.ini 中可以很清晰的看到 MiniOB 有哪些线程池(SQL、IO 和 Default)以及 Stage。