• Berkeley DB (三) DB Architecture


    Berkeley DB -- DB Architecture


    The big picture

    前面几章讲了用访问方法快速的存储和取回数据。后面主要讲任何访问方法的应用,它们是线性的和可恢复的在面对系统故障时。
    Berkeley DB 底层体系结构:



    如上图,应用程序调用访问方法,而访问方法使用底层的共享内存cache放置最近用过的文件页面。

    当应用程序需具备恢复能力的时候,它们调用的访问方法必须预先封装在事务字系统中。程序告诉bdb事务的开始和结束点。必须准备面对特殊情况下可能的失败,导致事务异常终止。
    一个例子说明具有事务保护的代码的大致样子:
    for (fail = 0;;) {
        /* Begin the transaction. */
        if ((ret = dbenv->txn_begin(dbenv, NULL, &tid, 0)) != 0) {
            dbenv->err(dbenv, ret, "dbenv->txn_begin");
            exit (1);
        }

        /* Store the key. */
        switch (ret = dbp->put(dbp, tid, &key, &data, 0)) {
        case 0:
            /* Success: commit the change. */
            printf("db: %s: key stored.\n", (char *)key.data);
            if ((ret = tid->commit(tid, 0)) != 0) {
                  dbenv->err(dbenv, ret, "DB_TXN->commit");
                  exit (1);
            }
            return (0);
        case DB_LOCK_DEADLOCK:
        default:
            /* Failure: retry the operation. */
            if ((t_ret = tid->abort(tid)) != 0) {
                  dbenv->err(dbenv, t_ret, "DB_TXN->abort");
                  exit (1);
            }
            if (fail++ == MAXIMUM_RETRY)
                  return (ret);
            continue;
        }
    }  
    Berkeley DB由五个主要的子系统构成.包括: 存取管理子系统、内存池管理子系统、事务子系统、锁子系统以及日志子系统。其中存取管理子系统作为Berkeley DB数据库进程包内部核心组件,而其他子系统都存在于Berkeley DB数据库进程包的外部。每个子系统支持不同的应用级别。

    1.数据存取子系统 数据存取(Access Methods)子系统为创建和访问数据库文件提供了多种支持。Berkeley DB提供了以下四种文件存储方法:哈希文件、B树、定长记录(队列)和变长记录(基于记录号的简单存储方式),应用程序可以从中选择最适合的文件组织结构。程序员创建表时可以使用任意一种结构,并且可以在同一个应用程序中对不同存储类型的文件进行混合操作。   在没有事务管理的情况下,该子系统中的模块可单独使用,为应用程序提供快速高效的数据存取服务。数据存取子系统适用于不需事务只需快速格式文件访问的应用。

    2.内存池管理子系统   内存池(Memory pool)子系统对Berkeley DB所使用的共享缓冲区进行有效的管理。它允许同时访问数据库的多个进程或者进程的多个线程共享一个高速缓存,负责将修改后的页写回文件和为新调入的页分配内存空间。它也可以独立于Berkeley DB系统之外,单独被应用程序使用,为其自己的文件和页分配内存空间。内存池管理子系统适用于需要灵活的、面向页的、缓冲的共享文件访问的应用。

    3.事务子系统 事务(Transaction)子系统为Berkeley DB提供事务管理功能。它允许把一组对数据库的修改看作一个原子单位,这组操作要么全做,要么全不做。在默认的情况下,系统将提供严格的ACID事务属性,但是应用程序可以选择不使用系统所作的隔离保证。该子系统使用两段锁技术和先写日志策略来保证数据库数据的正确性和一致性。它也可以被应用程序单独使用来对其自身的数据更新进行事务保护。事务子系统适用于需要事务保证数据的修改的应用。  

    4.锁子系统   锁(Locking)子系统为Berkeley DB提供锁机制,为系统提供多用户读取和单用户修改同一对象的共享控制。数据存取子系统可利用该子系统获得对页或记录的读写权限;事务子系统利用锁机制来实现多个事务的并发控制。     该子系统也可被应用程序单独采用。锁子系统适用于一个灵活的、快速的、可设置的锁管理器。  

    5.日志子系统   日志(Logging)子系统采用的是先写日志的策略,用于支持事务子系统进行数据恢复,保证数据一致性。它不大可能被应用程序单独使用,只能作为事务子系统的调用模块。   以上几部分构成了整个Berkeley DB数据库系统。各部分的关系如下图所示:    



    在这个模型中,应用程序直接调用的是数据存取子系统和事务管理子系统,这两个系统进而调用更下层的内存管理子系统、锁子系统和日志子系统。     由于几个子系统相对比较独立,所以应用程序在开始的时候可以指定哪些数据管理服务将被使用。可以全部使用,也可以只用其中的一部分。例如,如果一个应用程序需要支持多用户并发操作,但不需要进行事务管理,那它就可以只用锁子系统而不用事务。有些应用程序可能需要快速的、单用户、没有事务管理功能的B树存储结构,那么应用程序可以使锁子系统和事务子系统失效,这样就会减少开销。  
    Programming model

    它直接链接到应用程序中,与应用程序运行于同样的地址空间中。

    Programmatic APIs

    DB为多种编程语言提供了API接口,其中包括C、C++、Java。
    值得一提的是bdb提供dbm样式的接口,以前使用unix Dbm/Ndbm的,只需要换个头文件#include <db.h>,重新编译一下,db效率将成倍的提高。当然我们也可以使用dbm样式的接口编写简单的应用程序,这种接口比较简洁。

    也为脚本语言Perl、Tcl、Python和PHP提供了接口。
    对apache也以module的方式提供了接口,安装后,可以在写apache api时候直接调用。除了几个函数不一样外,其他都相同。


    bdb提供的公用程序:

    db_archive
    打印出不再使用的日志文件路径名
    db_checkpoint
    监视和检查数据库日志的守护进程
    db_deadlock
    当死锁发生时,退出锁定要求
    db_dump
    把数据库文件转换成db_load能认出的文本文件
    db_load
    从db_dump产生的文本文件中创建出数据库文件
    db_printlog
    把数据库日志文件转换成人能读懂的文本
    db_recover
    在发生错误后,把数据库恢复到一致的状态
    db_stat
    显示数据库环境统计
    db_upgrade
    把数据库文件转换成新版本的Berkley DB格式
    db_verify
    对数据库文件进行一致性检查
    db库
    许多程序中与db相关的函数都将使db库。
  • 相关阅读:
    CF1029C Maximal Intersection 暴力枚举
    2018中国大学生程序设计竞赛
    php远程抓取(下载)文件到本项目指定目录中
    FCKEditor添加字体
    UCenter 与 DIscuz 通信失败的解决方法
    运用php函数mkdir创建多级目录
    PHP 数组函数-数组排序
    php登陆ssh执行命令
    php定时执行任务的几个方法
    PHP Yii框架中使用smarty模板
  • 原文地址:https://www.cnblogs.com/huqingyu/p/522253.html
Copyright © 2020-2023  润新知