58
Flash Group 开开开开 开开开

Flash Group 开发报告 梁智超

  • Upload
    zamir

  • View
    166

  • Download
    3

Embed Size (px)

DESCRIPTION

Flash Group 开发报告 梁智超. 大纲. 芳径缥缈无踪迹, 姹紫嫣红何所栖? 丛中一只含露放, 拊尽芜杂终向伊。 ( 支持原创! ). 大纲. 芳径缥缈无踪迹, 姹紫嫣红何所栖? 丛中一只含露放, 拊尽芜杂终向伊。. 自古华山两条路. 白手起家,所有代码自己开发 - 导致重复性的工作 - 开发时间长 改造已有的开源 DBMS 原型系统 - 如何选择. 大纲. 芳径缥缈无踪迹, 姹紫嫣红何所栖? 丛中一只含露放, 拊尽芜杂终向伊。. FireBird - PowerPoint PPT Presentation

Citation preview

Page 1: Flash Group  开发报告 梁智超

Flash Group 开发报告梁智超

Page 2: Flash Group  开发报告 梁智超

大纲 芳径缥缈无踪迹, 姹紫嫣红何所栖? 丛中一只含露放, 拊尽芜杂终向伊。 ( 支持原创! )

Page 3: Flash Group  开发报告 梁智超

大纲 芳径缥缈无踪迹, 姹紫嫣红何所栖? 丛中一只含露放, 拊尽芜杂终向伊。

Page 4: Flash Group  开发报告 梁智超

自古华山两条路 白手起家,所有代码自己开发 - 导致重复性的工作 - 开发时间长

改造已有的开源 DBMS 原型系统 - 如何选择

Page 5: Flash Group  开发报告 梁智超

大纲 芳径缥缈无踪迹, 姹紫嫣红何所栖? 丛中一只含露放, 拊尽芜杂终向伊。

Page 6: Flash Group  开发报告 梁智超

FireBird -2000 年 7 月, Borland (即现在的 Inprise )公司公布了其数据库产品 Interbase 的源代码。 Firebird 数据库就是从该数据库中派生出来的。 -Firebird 的设计思想是小型、快速和最小化的管理。这对于需要一个数据库用于存储数据,但又不想花太多时

间来调整数据性能的开发人员很适用。

Page 7: Flash Group  开发报告 梁智超

mSQL -mSQL(mini SQL) 是一种小型的关系数据库 , 性能不是太好 , 对 SQL 语言的支持也不够完全,个人使用免费,商业使用收费。 - 由于 mSQL 较简单,在运行简单的 SQL 语句时速度比MySQL 略快。

Page 8: Flash Group  开发报告 梁智超

MySQL - 由瑞典的 MySQL AB 公司负责开发和维护的,它是一个

真正的多用户、多线程 SQL 数据库服务器。 -MySQL 主要特点是快速、健壮和易用。 -The world's most popular open source database !

Page 9: Flash Group  开发报告 梁智超

PostgreSQL - 最早是由美国加州大学伯克利分校开发的。 - 支持 SQL 、有丰富的数据类型、面向对象。 -PostgreSQL 运行速度明显低于 MySQL 。 -The world‘s most advanced open source database !

Page 10: Flash Group  开发报告 梁智超

Berkeley DB - Berkeley DB 是由美国 Sleepycat Software 公司开发的一套开放源码的嵌入式数据库的程序库。 - 不支持 SQL 语言,所有操作通过调用 API 来实现。 - 嵌入式、轻便灵活、可伸缩。

Page 11: Flash Group  开发报告 梁智超

SQLite -SQLite 是 D. Richard Hipp 用 C 语言编写的开源嵌入式数据库引擎。它是完全独立的,不具有外部依赖性。它是作为 PHP V4.3 中的一个选项引入的,构建在 PHP V5 中。 -SQLite 支持多数 SQL92 标准 ,也非常健壮 。

Page 12: Flash Group  开发报告 梁智超

大纲 芳径缥缈无踪迹, 姹紫嫣红何所栖? 丛中一只含露放, 拊尽芜杂终向伊。

Page 13: Flash Group  开发报告 梁智超

Berkeley DB -功能齐全 - 代码量小 -模块松耦合 -非关系型数据库 -非通用 - 不支持 SQL

Page 14: Flash Group  开发报告 梁智超

MySQL Vs PostgreSQL MySQL -层次结构清晰,松耦合。 -Designed by/for Database Application Developers PostgreSQL -层次结构复杂,紧耦合。 - 设计缜密,超前,很学院派。 - Designed by/for Database Administrators

Page 15: Flash Group  开发报告 梁智超

MySQL Vs PostgreSQL (cont.) 开发重点 MySQL: Vs PostgreSQL:1 Ease-of-use Data integrity2 Performance Security3 Programmer Features Reliability4 Reliability Standards5 DB Features DB Features6 Data integrity Performance 7 Security Ease-of-use 8 Standards Programmer Features

Page 16: Flash Group  开发报告 梁智超

MySQL 整体架构

Page 17: Flash Group  开发报告 梁智超

The Answer

Page 18: Flash Group  开发报告 梁智超

大纲 芳径缥缈无踪迹, 姹紫嫣红何所栖? 丛中一只含露放, 拊尽芜杂终向伊。

Page 19: Flash Group  开发报告 梁智超

整体计划 09 暑假:吃透 Berkeley DB 源代码,完成说明文档。 09-10第一学期:设计并修改 BDB 的底层数据文件的存储结构。 09-10第二学期:设计并修改 BDB 的索引结构( btree 、hash 、 queue 、 recno )。 10-11…: 缓冲区管理、查询处理、事务管理(锁、日志)。 终极目标:设计并实现 一个针对 Flash 芯片及 SSD 的 DBMS !

Page 20: Flash Group  开发报告 梁智超

暑期开发计划

Page 21: Flash Group  开发报告 梁智超

暑期开发计划 (cont.)模块 对应文件夹及代码数量 负责人

数据结构 dbinc ( 526K)、 env ( 119) 梁智超索引、存储 btree ( 409K)、 hash ( 292K) 周大

日志 、事务处理 log ( 105K)、 txn( 102K) 范玉雷锁机制 lock ( 102K) 卢泽萍缓冲区管理 mp ( 130K) 汤显

Page 22: Flash Group  开发报告 梁智超

暑期开发计划 (cont.)

Page 23: Flash Group  开发报告 梁智超

暑期开发计划 (cont.)frankey others

主要数据结构 粗读相应代码核心文件 整理相应数据结构其他文件 相应核心文件整合文档 相应其它文件

Page 24: Flash Group  开发报告 梁智超

暑期开发计划 (cont.) 第一周: - 梁智超报告 db文件夹中包含的主要数据结构及各个数据结间的关系; -周大报告 BDB 中 hash索引的实现机制。 第二周: -汤显报告 BDB 中缓冲区管理的实现机制。 -范玉雷报告 BDB日志管理部分的实现机制;

Page 25: Flash Group  开发报告 梁智超

暑期开发计划 (cont.) 第三周: -卢泽萍报告 BDB锁管理部分的实现机制; - 梁智超报告 env 的主要数据结构及其对其它功能模块的整合调用。 第四周: -周大报告 BDB 中 btree索引的实现机制; -范玉雷报告 BDB 中事务管理部分实现机制。

Page 26: Flash Group  开发报告 梁智超

暑期开发计划 (cont.) 周一碰头会: -交流上周的阅读执行情况; -提出并讨论代码阅读的计划。 周三碰头会: -解决相互间的问题并进行总结,以更好地完成本周任务;

Page 27: Flash Group  开发报告 梁智超

Template 主要数据结构描述 - 数据结构定义 struct __db_mpool { db_mutex_t mutex; DB_MPREG *pg_inout; LIST_HEAD(__db_mpregh,__db_mpreg)dbreg; TAILQ_HEAD(__db_mpoolfileh,__db_mpoolfile) dbmfq; ENV *env; REGINFO *reginfo; }

Page 28: Flash Group  开发报告 梁智超

Template (cont.) 主要数据结构描述 -相关属性解释 mutex 线程互斥体 pg_inout 对于 DB pgin/pgout方法的 DB_MPREG结构 dbregq 相链接的指明应用的 pgin/pgout方法列表 dbmfq DB_MPOOLFILE的列表 env 封装的环境 reginfo 底层的区域文件信息

Page 29: Flash Group  开发报告 梁智超

Template (cont.) 数据结构间的关系

Page 30: Flash Group  开发报告 梁智超

Template (cont.) 程序结构总框图

Page 31: Flash Group  开发报告 梁智超

Template (cont.) 函数体描述 函数名称: __memp_fget( ) 函数功能:从文件中得到一个缓 冲页 算法流程图: 上下层接口设计: -e.g. 被 XXX调用,调用 XXX

Page 32: Flash Group  开发报告 梁智超

Berkeley DB 简介 Berkeley DB 是由美国 Sleepycat Software 公司开发的一套开放源码的嵌入式数据库的程序库( database library ),它为应用程序提供可伸缩的、高性能的、有事务保护功能的数据管理服务。 Berkeley DB为数据的存取和管理提供了一组简洁的函数调用 API接口。它是一个经典的 C-library模式的 toolkit ,为程序员提供广泛丰富的函数集,是为应用程序开发者提供工业级强度的数据库服务而设计的 。

Page 33: Flash Group  开发报告 梁智超

Berkeley DB 的特点 嵌入式( Embedded ) - 它直接链接到应用程序中,与应用程序运行于同样的地址空间中,因此,无论是在网络上不同计算机之间还是在同一台计算机的不同进程之间,数据库操作并不要求进程间通讯。 Berkeley DB为多种编程语言提供了 API接口,其中包括C、 C++、 Java 、 Perl 、 Tcl 、 Python 和 PHP ,所有的数据库操作都在程序库内部发生。多个进程,或者同一进程的多个线程可同时使用数据库,有如各自单独使用,底层的服务如加锁、事务日志、共享缓冲区管理、内存管理等等都由程序库透明地执行。

Page 34: Flash Group  开发报告 梁智超

Berkeley DB 的特点 (cont.) 轻便灵活( Portable ) - 它可以运行于几乎所有的 UNIX和 Linux系统及其变种系统、Windows操作系统以及多种嵌入式实时操作系统之下。它在 32位和 64 位系统上均可运行,已经被好多高端的因特网服务器、台式机、掌上电脑、机顶盒、网络交换机以及其他一些应用领域所采用。一旦 Berkeley DB被链接到应用程序中,终端用户一般根本感觉

不到有一个数据库系统存在。

Page 35: Flash Group  开发报告 梁智超

Berkeley DB 的特点 (cont.) 可伸缩( Scalable ) - 这一点表现在很多方面。 Database library本身是很精简的(少于 300KB 的文本空间),但它能够管理规模高达 256TB 的数据库。它支持高并发度,成千上万个用户可同时操纵同一个数据库。 Berkeley DB 能以足够小的空间占用量运行于有严格约束的嵌入式系统,也可以在高端服务器上耗用若干 GB 的内存和若干 TB 的磁盘空间。

Page 36: Flash Group  开发报告 梁智超

Berkeley DB 产品种类 普通数据存储( Berkeley DB Data Store ) 并发数据存储( Berkeley DB Concurrent Data Store ) 事务数据存储( Berkeley DB Transactional Data Store ) 高可用性数据存储( Berkeley DB High Availability )

Page 37: Flash Group  开发报告 梁智超

Berkeley DB 的子系统 Berkeley DB 由五个主要的子系统构成,包括存取管理子系统、内存池管理子系统、事务子系统、锁子系统以及日志子系统。

Page 38: Flash Group  开发报告 梁智超

Berkeley DB 的子系统 (cont.) 数据存取( Access Methods )子系统为创建和访问数据库文件提供了多种支持。 Berkeley DB提供了以下四种文件存储方法:哈希文件、 B树、定长记录(队列)和变长记录(基于记录号的简单存储方式)。 内存池( Memory pool )子系统对 Berkeley DB 所使用的共享缓冲区进行有效的管理。它允许同时访问数据库的多个进程或者进程的多个线程共享一个高速缓存,负责将修改后的页写回文件和为新调入的页分配内存空间。

Page 39: Flash Group  开发报告 梁智超

Berkeley DB 的子系统 (cont.) 事务( Transaction )子系统为 Berkeley DB提供事务管理功能。该子系统使用两段锁技术和先写日志策略来保证数据库数据的正确性和一致性。 锁( Locking )子系统为 Berkeley DB提供锁机制,为系统提供多用户读取和单用户修改同一对象的共享控制。 日志( Logging )子系统采用的是先写日志的策略,用于支持事务子系统进行数据恢复,保证数据一致性。

Page 40: Flash Group  开发报告 梁智超

Berkeley DB 存取系统 ( key , value )对 :Berkeley DB让应用程序将其定义的每一个表作为一个“数据库”进行存储,表中的每一条记录都是一个( key , value )对。对这些记录可以进行以下几种操作: (1) 向数据库中插入一条记录 ; (2) 从数据库中删除一条记录; (3)通过 key值从数据库中查找一条记录; (4)更新一个已经存在的记录;

Page 41: Flash Group  开发报告 梁智超

Berkeley DB 存取系统 (cont.) 数据库:在 Berkeley DB 中,数据库是数据的逻辑组织单位,库作为一个逻辑概念,物理上对应于一个按某种结构组织起来的文件或文件中按某种结构组织起来的一部分。每一个数据库由若干条记录组成,每条记录都是一个( key , value )对,或叫 key/data pair 。实际上,在 Berkeley DB 中所提到的“数据库”,相当于一般关系数据库系统中的表;而“ key/data”对则相当于关系数据库系统中的行( rows )。

Page 42: Flash Group  开发报告 梁智超

Berkeley DB 存取系统 (cont.) 例子:水果——销售商店名称数据库表 :字段为( fruit ,store ),其中 fruit字段为主键

KEY: DATA:Apple Convenience Store Blueberry Farmer's Market Peach Shopway Pear Farmer's Market Raspberry Shopway Strawberry Farmer's Market

Page 43: Flash Group  开发报告 梁智超

Berkeley DB 存取系统 (cont.) Key 和 value都可以是任意长的字节串。存储和获取记录的过程都不需要进行数据格式的转换,但应用程序本身必须知道这些数据在存入之前是什么结构或类型。 一方面, Berkeley DB 不会为应用程序员提供关于它所存储的 value 的内容和结构信息,因为它根本不知道,因此程序员自己必须得知道它所取出的数据结构和含义。 另一方面, Berkley DB 对存入其中的数据无任何有关数据类型的限制,应用程序也不需要把自己的应用程序数据转化成 Berkeley DB 所支持的数据类型。无论多么复杂的数据类型或结构, Berkeley DB都可以存取。

Page 44: Flash Group  开发报告 梁智超

Berkeley DB 存取系统 (cont.) Btree:该存储类型是要将数据库的数据组织成一个有序的平衡树结构并对其进行维护,大致结构如下图所示。

Key …… Key Free space

Key ……

Key Free space

Key

……

Key

Free space

……

Key Data …… Key Data Free space

Key Data …… Key Data Free space ……

Page 45: Flash Group  开发报告 梁智超

Berkeley DB 存取系统 (cont.) Hash: Berkeley DB采用一种叫做可扩展线性散列方法( Extended Linear Hashing ),是参考 1980 年 VLDB 的一篇论文” Linear Hashing: A New Tool for File and Table Addressing ”。 Queue:队列方法使用逻辑记录号作为 key值来存储定长记录。可向队尾快速插入数据,利用游标机制从队头删除或返回记录。 Recno:记录号存取方法用于存取以逻辑记录号作为关键字的记录。其记录号可以为可变( mutable )或固定( fixed )两种模式。前者是指在插入或删除记录后,其余记录的记录号会发生改变,而后一种模式下记录号不变。

Page 46: Flash Group  开发报告 梁智超

Berkeley DB事务系统 在 BerkeleyDB 中事务子系统通过 DB_ENV->open 来建立、初始化和打开, DB_ENV->txn->begin 开始一个事务, DB_ENV->abort或 DB_ENV->commit结束一个事务,每个事物都有一个事务管理器进行管理。 事务通过一个 31bit 的无符号整数来标识,在数据库环境最初建立的时候,事务的 ID被重置,新的事物从 0X80000000 开始,往后循环使用。

Page 47: Flash Group  开发报告 梁智超

Berkeley DB事务系统 (cont.) Berkeley DB提供对嵌套事务的支持。嵌套事务允许一个应用程序将一个大而长的事务分成可以独立中止的小的事务单元。用一个父事务标识符创建的事务称为子事务。 嵌套事务特性: ( 1)一旦一个事务成为父事务,只要它的任何一个子事务还没有提交或中止,该父事务除了开始更多一些子事务,不可以有任何 Berkeley DB 调用。

Page 48: Flash Group  开发报告 梁智超

Berkeley DB事务系统 (cont.) ( 2 )当一个子事务开始时,它继承它的父事务的所有锁,这意味着子事务将不会被父事务所持有的锁阻碍。 ( 3)子事务是完全臣服于父事务。即使一个子事务提交,如果它的父事务最终中止了,将 undo 这个子事务的所有改变,子事务也将中止。子事务是提交还是中止最终取决于父事务,如果父事务提交,则子事务也提交;

如果父事务中止,则子事务也中止。

Page 49: Flash Group  开发报告 梁智超

Berkeley DB事务系统 (cont.) 当创建事务应用程序时,通常需要围绕数据库环境创建一个管理架构。这个架构有 5个部分: ( 1)死锁检查 : db_deadlock, DB_ENV->lock_detect, DB_ENV->set_lk_detect ( 2 )检查点 : db_checkpoint, DB_ENV->txn_checkpoint ( 3)数据库和日志文件归档 : db_archive, DB_ENV->log_archive ( 4)恢复处理 : db_recover, DB_ENV->open

Page 50: Flash Group  开发报告 梁智超

Berkeley DB事务系统 (cont.) 死锁检查: ( 1)为了检测死锁的发生,一个独立的进程或线程必须回顾数据库中当前持有的锁,建立一个事务等待图,如果发现图中存在回路,则表明系统中出现了死锁(等待图法)。 ( 2 )可以为事务设定一个 timeout ,如果事务的执行时间超出这个 timeout ,就认定发生死锁。(超时法)。 一旦死锁发生就选择一个牺牲品,释放牺牲事务的所占的资源。

Page 51: Flash Group  开发报告 梁智超

Berkeley DB事务系统 (cont.) 数据库归档: Berkeley DB可以进行周期性的创建数据库的快照 ,这些快照可以是标准的备份,即在单一时刻及时创建数据库的一个一致性映射,也可以是联机备份(热备份),即在产生快照期间的一个未指定的时刻创建数据库的一个一致性映射。 数据库恢复:正常恢复和灾难性恢复,主要基于“日志先写( write-ahead logging )”。

Page 52: Flash Group  开发报告 梁智超

Berkeley DB事务系统 (cont.) 事务的并发控制:两段锁协议( Two-Phase Locking ,简称 2PL )。 lock A-lock B-lock C-unlock B- |< -- 扩展阶段 -- >|< -- unlock A-unlock C 收缩阶段 -- >|

Page 53: Flash Group  开发报告 梁智超

Berkeley DB锁系统 锁子系统是用于提供进程间以及进程内部并发控制的一种机制,主要用于 Berkeley DB 的存取和事务系统中,同时也可以作为一个单独的子系统对指定的资源进行并发控制。 锁子系统的创建、初始化和打开是通过在调用 DB_ENV->open 时设定 DB_INIT_LOCK这个标志位来实现的,而锁的获取与释放则是通过 DB_ENV->lock_vec 来实现。

Page 54: Flash Group  开发报告 梁智超

Berkeley DB锁系统 (cont.) Berkeley DB 的标准锁模式: ( 1) DB_LOCK_NG:not granted 0 ( 2 ) DB_LOCK_READ:read shared ( 3) DB_LOCK_WRITE:write exclusive ( 4) DB_LOCK_IREAD: intention to read shared ( 5) DB_LOCK_IWR: intention to read and write shared

Page 55: Flash Group  开发报告 梁智超

Berkeley DB锁系统 (cont.) 锁粒度:除了 Queue , Berkeley DB 的其它存取模式均为页级锁。页的大小可以在数据库创建的时候通过调用 DB->set_pagesize 来设定。 不同的存取方式不同的并发控制: ( 1) B树和 Recno: lock coupling ( 2 ) Queue: short-term page lock ( 3) Hash: read-lock on metadata

Page 56: Flash Group  开发报告 梁智超

Berkeley DB日志系统 Berkeley DB 的日志子系统不同于其他几个子系统,只能用于自身。通过 DB_ENV->open 的调用来打开一个日志, 使用 DB_ENV->close 关闭。 日志通过日志序列号( DB_LSN)进行标识,可以通过游标对日志进行读取。 重要的配置参数: ( 1)日志系统的大小 ( 2 )磁盘上日志文件的大小 ( 3)内存中日志缓冲区的大小

Page 57: Flash Group  开发报告 梁智超

Berkeley DB内存池管理系统 内存池就是允许同时访问数据库的多个进程或者进程的多个线程共享的一个高速缓存。通过在调用 DB_ENV->open 时对 DB_INIT_MPOOL进行设定来创建。 MPOOL 使用“最近最少使用”( LRU)算法选择一页淘汰调。缓冲池中所有的 dirty页可以一起 Flush写回操作系统文件中 内存池大小的配置方法: ( 1)调用 DB_ENV->set_cachesize为应用 Berkeley DB环境的所有应用设定一个内存池的大小。 ( 2 )调用 DB->set_cachesize为一个特定的数据库 设定内存池大小。

Page 58: Flash Group  开发报告 梁智超

Q & A