博客
关于我
FastDB 磁盘和无盘模式
阅读量:717 次
发布时间:2019-03-21

本文共 1432 字,大约阅读时间需要 4 分钟。

FastDB的高效性能与磁盘模式的实现机制解析

在进行数据库性能测试时,FastDB展现出了优越的性能表现,尤其在批量提交事务时,其速度甚至比SQLite高出3-10倍。然而,这种优势在逐条提交事务时却会急剧下降,主要原因在于磁盘模式下的频繁IO操作,性能暴跌几倍。这是FastDB设计时需要权衡的重要问题。

磁盘模式的实现原理

file.cpp文件中,我们可以观察到FastDB在磁盘模式下的核心实现逻辑。FastDB在磁盘模式下首先尝试打开主目录下的文件*.fdb,使用标准的文件操作函数:

fd = ::open(name, open_flags, 0666);

如果文件打开失败(fd < 0),系统会记录错误信息并返回错误代码:

int orig_errno = errno;dbTrace("failed opening file '%s' - fd - %d, errno - %d\n", name, fd, orig_errno);return orig_errno;

接下来,FastDB使用mmap()函数将数据库以文件映射到内存中:

mmapAddr = (char*)mmap(NULL, mmapSize, (flags & read_only) ? PROT_READ : PROT_READ|PROT_WRITE, mmap_attr, fd, 0);

如果mmap()失败(mmapAddr == (char*)-1),系统同样会记录错误信息并关闭文件:

status = errno;mmapAddr = NULL;if (fd >= 0) {    ::close(fd);}return status;

需要注意的是,mmap()映射的有名文件机制是一种高效的数据同步方式,能够确保数据库文件与内存数据保持一致。

无盘模式的实现引擎

FastDB默认采用磁盘模式,但通过修改config.h文件并重新编译,可以切换至无盘模式。无盘模式的核心思想是完全放置数据库在内存中,避免与物理磁盘进行频繁IO操作。在sync.cpp中,系统通过以下步骤实现了无盘模式:

  • 首先打开一个临时文件:
  • int fd = ::open(fileName, O_RDWR|O_CREAT, ACCESS_PERMISSION_MASK);
    1. 检查文件打开结果:
    2. if (fd < 0) {    if (fileName != name) {        delete[] fileName;    }    return false;}
      1. 创建共享内存块:
      2. shm = shmget(key, DOALIGN(size, 4096), IPC_CREAT|ACCESS_PERMISSION_MASK);
        1. 检查共享内存的映射结果:
        2. if (shm < 0) {    return false;}
          1. 将共享内存挂载到本进程:
          2. ptr = (char*)shmat(shm, NULL, 0);

            这种设计充分利用了内核_VM Thanh's机制,确保所有数据库操作均在内存完成,从而极大提升了性能表现。

            结论

            综上所述,FastDB通过磁盘模式提供数据持久性保证,但在高频IO场景下性能不足。为解决这一问题,同系开发者提出了两种解决方案:定时备份和无盘模式。无盘模式通过完全依赖内存操作,显著提升了数据库性能表现,是在性能与持久性之间做出的优化选择。

    转载地址:http://tybrz.baihongyu.com/

    你可能感兴趣的文章
    Mysql学习总结(57)——MySQL查询当天、本周、本月、上周、本周、上月、距离当前现在6个月数据
    查看>>
    Mysql学习总结(58)——深入理解Mysql的四种隔离级别
    查看>>
    Mysql学习总结(59)——数据库分库分表策略总结
    查看>>
    Mysql学习总结(5)——MySql常用函数大全讲解
    查看>>
    Mysql学习总结(60)——并发量大、数据量大的互联网业务数据库设计规范总结
    查看>>
    Mysql学习总结(61)——MySQL优化之DBA级优化整理汇总
    查看>>
    Mysql学习总结(62)——MySQL连接com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link问题
    查看>>
    Mysql学习总结(63)——Mysql数据库架构方案选择与分析
    查看>>
    Mysql学习总结(64)——Mysql配置文件my.cnf各项参数解读
    查看>>
    Mysql学习总结(65)——项目实战中常用SQL实践总结
    查看>>
    Mysql学习总结(66)——设置MYSQL数据库编码为UTF-8
    查看>>
    Mysql学习总结(67)——MYSQL慢查询日志
    查看>>
    Mysql学习总结(68)——MYSQL统计每天、每周、每月、每年数据 SQL 总结
    查看>>
    Mysql学习总结(69)——Mysql EXPLAIN 命令使用总结
    查看>>
    Mysql学习总结(6)——MySql之ALTER命令用法详细解读
    查看>>
    Mysql学习总结(70)——MySQL 优化实施方案
    查看>>
    Mysql学习总结(71)——MySQL 重复记录查询与删除总结
    查看>>
    Mysql学习总结(71)——数据库介绍(MySQL安装 体系结构、基本管理)再回顾
    查看>>
    Mysql学习总结(72)——MySQL 开发者开发,设计规范再总结
    查看>>
    Mysql学习总结(73)——MySQL 查询A表存在B表不存在的数据SQL总结
    查看>>