腾讯大讲堂42 数据库内核设计思路浅析

30
数据库通用设计思路浅析 Alexyang 无线产品部开发组 20080804

Transcript of 腾讯大讲堂42 数据库内核设计思路浅析

Page 1: 腾讯大讲堂42 数据库内核设计思路浅析

数据库通用设计思路浅析

Alexyang无线产品部开发组

20080804

Page 2: 腾讯大讲堂42 数据库内核设计思路浅析

提纲

体系结构

系统实现的关键技术

Page 3: 腾讯大讲堂42 数据库内核设计思路浅析

体系结构

Page 4: 腾讯大讲堂42 数据库内核设计思路浅析

服务器核心系统总体结构客户 客户 客户

TCP/IP网络

连接监听线程

总控线程 检查点线程

工作线程

工作线程

工作线程

任务队列

系统 /日志缓冲

读 /写线程 日志线程

DB

会话线程

Page 5: 腾讯大讲堂42 数据库内核设计思路浅析

线索主要有

控制台线索 工作线索 I/O 线索 会话线索 连接监听线索 日志线索 检查点线索 备份线索

Page 6: 腾讯大讲堂42 数据库内核设计思路浅析

工作线程工作流程

从任务队列中取得任务

是否为通讯请求

通讯请求的处理 SQL 语句任务的处理

Page 7: 腾讯大讲堂42 数据库内核设计思路浅析

会话线程

处于死循环中,保持接收客户请求,放入

系统任务队列,由工作线索取出执行。

Page 8: 腾讯大讲堂42 数据库内核设计思路浅析

连接监听线索

创建结构地址和 socket ,进行两者的绑定

,开始监听。不断检查是否有客户端的连

接请求,若有则将它放入客户端队列,继

续检查是否有新的客户端来的请求。

Page 9: 腾讯大讲堂42 数据库内核设计思路浅析

控制台线索

当数据库用 console 启动时,有些数据库是

支持在该 console 下输入命令以得到相关信

息,比如锁信息等等。

Page 10: 腾讯大讲堂42 数据库内核设计思路浅析

日志线索

进行日志的刷盘操作。

Page 11: 腾讯大讲堂42 数据库内核设计思路浅析

系统实现的关键技术

Page 12: 腾讯大讲堂42 数据库内核设计思路浅析

服务器主要模块

通讯子系统

语言分析器

查询优化器

解释执行器

系统缓冲区管理子系统

并发控制 / 封锁子系统

事务管理子系统

日志管理模块

备份和恢复模块

物理存储模块

Page 13: 腾讯大讲堂42 数据库内核设计思路浅析

语法 /词法分析

负责解析 SQL 命令和过程性语句块

过滤注释 , 解析参数

使用成熟的工具(如 YACC/LEX )生成

灵活的语法规则定义

便于语法的扩展与修改

生成统一格式的语法树

Page 14: 腾讯大讲堂42 数据库内核设计思路浅析

举例

from_tv_list :

from_tv

{

$$ = (par_from_tv_list_t *)new_node(PAR_FROM_TV_LIST,1);

$$->un_1.from_tv_list_1.from_tv = $1;

}

| from_tv ',' from_tv_list

{

$$ = (par_from_tv_list_t *)new_node(PAR_FROM_TV_LIST,2);

$$->un_1.from_tv_list_2.from_tv_list = $3;

$$->un_1.from_tv_list_2.from_tv = $1;

};

Page 15: 腾讯大讲堂42 数据库内核设计思路浅析

struct par_from_tv_list_struct

{

ulint par_type; //值为 PAR_FROM_TV_LIST: 1134

ulint par_tag; //1:规则 1; 2:规则 2

ulint par_lineno;

union

{

struct

{

par_from_tv_t *from_tv; //$1

}from_tv_list_1; //规则 1

struct

{

par_from_tv_t* from_tv; //$1

par_from_tv_list_t* from_tv_list; //$3

}from_tv_list_2; //规则 2

}un_1;

};

Page 16: 腾讯大讲堂42 数据库内核设计思路浅析

对应的语法结构

Select * from t1, t2, t3;

par_from_tv_list_struct 结构

par_from_tv_list_t* from_tv_list;

par_from_tv_t* from_tv

par_from_tv_list_struct 结构

par_from_tv_list_t* from_tv_list;

par_from_tv_t* from_tv

par_from_tv_list_struct 结构

par_from_tv_t* from_tv

par_from_tv_struct结构

T1

par_from_tv_struct结构

T2

par_from_tv_struct结构

T3

规则2 规

则1

Page 17: 腾讯大讲堂42 数据库内核设计思路浅析

语义分析

数据库对象名字解析

合法性检查

内部 ID 的转换

权限检查

语法树数据结构的简化与预处理

DDL 语句分解为对系统表的 DML

视图对象的替换等

Page 18: 腾讯大讲堂42 数据库内核设计思路浅析

代价优化器

接受语义分析的输入

统计信息的分析 数据分布

统计直方图

代价的计算 基于统计信息

操作符号的选择

基于成本的最优执行路径选择

生成优化的执行计划

Page 19: 腾讯大讲堂42 数据库内核设计思路浅析

基于操作符的执行计划

物理操作符功能简单专一 , 完成特定的数据库操作

如 : 连接 , 过滤 , 排序等

执行计划操作符的组合 , 构成树型的执行计划

执行时 , 数据从叶子向根流动

在根汇集成结果集 , 或者得到结果状态

计划被自动缓存 , 以备重用

Page 20: 腾讯大讲堂42 数据库内核设计思路浅析

执行计划 1

Page 21: 腾讯大讲堂42 数据库内核设计思路浅析

执行计划 2

Page 22: 腾讯大讲堂42 数据库内核设计思路浅析

系统缓冲区管理子系统

内存池:使用伙伴系统管理内存。

内存堆:多次申请一次释放,提升了内存使用效率,同时也很好地解决了内存泄漏的问题。

数据缓冲区:采用 LRU 提高命中率,提升I/O 性能。

日志缓冲区:集中写入,提升性能。

Page 23: 腾讯大讲堂42 数据库内核设计思路浅析

事务和线程的分离

事务对应于用户连接 / 会话 (SESSION)每个连接,有一个活动的事务

工作线程是共享资源

一组工作线程,协同工作,为所有的事务服务

数据库对象的封锁失败,导致事务暂停,却不会阻塞工作线程

提高 CPU 的利用率

Page 24: 腾讯大讲堂42 数据库内核设计思路浅析

事务和线程的分离

事务对应于用户连接 / 会话 (SESSION)每个连接,有一个活动的事务

工作线程是共享资源

一组工作线程,协同工作,为所有的事务服务

数据库对象的封锁失败,导致事务暂停,却不会阻塞工作线程

提高 CPU 的利用率

Page 25: 腾讯大讲堂42 数据库内核设计思路浅析

数据库锁和线程锁

数据库锁

针对数据库对象

用户可干预

锁定失败 ,导致事务暂停或事务回滚

线程锁

针对核心系统资源

锁定失败 ,导致线程被挂起

用户不能干预

设计时 ,采用严格的规则 ,防止出现死锁

Page 26: 腾讯大讲堂42 数据库内核设计思路浅析

回滚段

记录每一个数据库操作的逻辑动作

插入 /删除 /更新

在对聚集索引更新时 , 生成回滚记录

每个事务对应一个回滚段

事务回滚时 ,扫描回滚段 ,做插入 /删除 /更新的

反动作

回滚记录也是数据复制的基础

Page 27: 腾讯大讲堂42 数据库内核设计思路浅析

重做 (REDO)日志

日志数据的构成:物理页的修改信息

日志中不记录逻辑上的数据库操作,如 :插入,删除等

逻辑上的数据库操作,被记录在回滚段上

恢复时,以完整的物理事务为单位

最后一个不完整的物理事务被丢弃

日志对回滚段和普通的数据文件同样处理

物理恢复完成后,按照回滚段上的逻辑操作,对

未提交的事务做相应的反动作,以取消这个事务

Page 28: 腾讯大讲堂42 数据库内核设计思路浅析

分层设计 /优化

隔离 CPU 的特性高地址高位 (INTEL)低地址高位 (SPARC)

隔离OS 特性文件系统

线程

同步原语

充分利用 LINUX 2.6 核心

Page 29: 腾讯大讲堂42 数据库内核设计思路浅析

问题 ?

Page 30: 腾讯大讲堂42 数据库内核设计思路浅析

谢谢 !