前言

WiredTiger 自 mongodb3.0 集成进来之后为mongodb拉回了大量的口碑,从而在mongodb-3.2 版本直接代替了in-memory存储引擎,作为了mongodb的默认存储引擎。其 通过支持Append-only btree + lsm-tree 以及 针对磁盘/内存数据结构上的多核和无锁优化,从而拥有了极高的性能,同时支持mongodb基本的事务/备份/time-based 等需求,成为mongodb 的核心动力。

研究wiredtiger 能够对基本的B-tree/LSM-tree 数据结构的工业实现有极为深刻的理解,而且我们实际测试wired-tiger 能够提供超过 rocksdb 2-3 倍的读性能,这里的测试是有cache和没有cache场景测的,都有同样的性能提升(b-tree的查找本身就是比较高效) 和 不弱于rocksdb 的写性能(append-only btree 也是顺序写,所以仍然需要类似LSM-tree的compact操作)。

当然,在不了解内部核心链路的基本流程之前直接看源代码基本难度很大(百万级的行数),比rocksdb大一个量级。不过还是贴上源码地址吧:https://github.com/wiredtiger/wiredtiger

基本接口

关于 wiredtiger 的编译和安装 :

  • on-linux 可以参考wiredtiger 编译安装
  • on-mac 可以直接 brew install wiredtiger

了解整个引擎之前还是先将整个引擎跑一跑,看看运行之后的db数据状态;跑跑bench-mark,看看性能什么的,后续梳理出一个roadmap 再进行源码层级的深入。

如下测试代码,涵盖了wiredtiger的基础db操作的接口:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wiredtiger.h>
static const char *home;void
CheckOp(const int ret, const char* funcname, const char* home) {if (ret != 0) {fprintf(stderr, "%s -- Error connecting to %s: %s\n",funcname, home, wiredtiger_strerror(ret));}
}int
main(void)
{WT_CONNECTION *conn;WT_SESSION *session;WT_CURSOR *cursor;int ret;/* 打开一个wiredtiger要操作的db目录*/if (getenv("WIREDTIGER_HOME") == NULL) {home = "WT_HOME";ret = system("rm -rf WT_HOME && mkdir WT_HOME");} else {home = NULL;}/* 打开或者创建数据库 */CheckOp(wiredtiger_open(home, NULL, "create", &conn), "wiredtiger_open", home);/* 打开1个数据库连接 */CheckOp(conn->open_session(conn, NULL, NULL, &session), "open_session", home);/* 创建一张名字为access的表,后续的db文件会以表的名字来命名 */CheckOp(session->create(session, "table:access", "key_format=S,value_format=S"), "create", home);/* 创建一个cursor,所有的请求都通过cursor来访问 */CheckOp(session->open_cursor(session, "table:access", NULL, NULL, &cursor), "open_cursor", home);/* 向一个cursor 插入一个KV */cursor->set_key(cursor, "key1");cursor->set_value(cursor, "value1");char* key = NULL;/* 获取key , 当然,获取value也是同样的方式,通过get_value即可*/CheckOp(ret = cursor->get_key(cursor, &key),"get_key", home);printf("wt key is : %s", key);CheckOp(ret = conn->close(conn, NULL),"close", home);return (ret);
}

我是在mac上编译的: gcc test_wt.c -o test_wt -lwiredtiger,如果是linux,直接链接编译好的libwiredtiger.so就可以了。
运行之后会生成一个WT_HOME的db目录:

╰─$ tree WT_HOME
WT_HOME
├── WiredTiger
├── WiredTiger.basecfg
├── WiredTiger.lock
├── WiredTiger.turtle
├── WiredTiger.wt
├── WiredTigerLAS.wt
└── access.wt

这里面的文件信息如下:

  1. wiredTiger 是wiredTiger的版本信息或者编译时间
  2. WiredTiger.basecfg wiredTiger的配置信息
  3. WiredTiger.lock lock文件,防止多个进程链接同一个数据库(rocksdb的LOCK文件),单进场独享的
  4. WiredTiger.turtle存储WiredTiger.wt文件的元数据信息
  5. access.wt 是实际的表数据,我们在代码中创建了一个access命名的表
  6. WiredTiger.wt 特殊的table,用于存储其他表数据的元数据信息
  7. WiredTigerLAS.wt 这个是与wiredtiger的cache evict 相关的数据文件,主要是当内存使用率高时用于临时存放不能被逐出到用户表文件中的数据,表WiredTigerLAS中的数据会被高优先级逐出到磁盘文件WiredTigerLAS.wt中。

还有更多的官方提供的关于 session/cursor/事务 等 接口的使用demo 可以参考: example

一个简单的程序来使用WiredTiger 存储引擎相关推荐

  1. BoltDB 一个简单的纯 Go key/value 存储 [译]

    作者:wolf4j 链接:https://www.jianshu.com/p/cb1b05aa7dd2 boltDB Blot Bolt 是由 Howard Chu 的 LMDB 项目启发的一个纯粹的 ...

  2. 如何编辑程序(一个简单的程序)

    如何编辑程序(一个简单的程序) 运行Excel程序,创建一个新的站长工作簿(格式.xlsm),进入VBE,让我们开始编写一个站长列表的程序.程序运行后,一个对话框显示"你好,欢迎来到VBA& ...

  3. LabWindows_CVI测试技术及工程应用_学习笔记1(构建一个简单的程序)

    构建一个简单的程序 1.创建工程文件 或File--〉New--〉Project(*.prj),默认名Untitled.prj,存储在Unititled.cws的工作空间中 File--〉Save U ...

  4. python的简单程序代码_小白学编程?从一个简单的程序开始学习Python编程

    笔者思虑再三还是决定选择图文(因为百家的视频发布画质真不怎么样[囧]). 笔者学习编程的时间也挺长的,因为业余,因为时间不多,各种原因,自学编程的路特别难走.然后笔者发现,自己能为小白贡献一些力量,然 ...

  5. 编写一个简单Java程序,计算银行年存款的本息

    编写一个简单Java程序,计算银行年存款的本息 要求:程序运行后要求用户输入存款本金.年利率和存款年限,最后程序计算并输出相应年限后存款的金额.相应的计算公式为:存款总额=本金 * (1 + 利率)存 ...

  6. Protues的一个简单51程序仿真

    Protues的一个简单51程序仿真 一.组装原件步骤 二.代码编写 三.仿真结果 四.总结 一.组装原件步骤 1.创建一个新的工程 2.找原件 3.将各元件连接起来,构成原理图 二.代码编写 1.打 ...

  7. Mongodb WiredTiger存储引擎特性

    数据库的存储引擎组件,负责管理存储在内存和硬盘上的数据.MongoDB支持多个存储引擎,为特定的工作指派合适的存储引擎为您的用例可以显著提高应用程序的性能. **MongoDB WiredTiger* ...

  8. WiredTiger存储引擎知多少?

    关注我们,及时下载学习资源 内容来源:2018 年 10 月 27 日,MongoDB中文社区联席主席郭远威在"2018年MongoDB中文社区 广州大会"进行<WiredT ...

  9. WiredTiger存储引擎分析

    初始化 mongodb中wiredtiger初始化 MONGO_INITIALIZER_WITH_PREREQUISITES(WiredTigerEngineInit, ("SetGloba ...

最新文章

  1. 北京大学深圳研究生院计算机学什么,2018年北京大学深圳研究生院408计算机学科专业基础综合之计算机操作系统考研核心题库...
  2. iptables 限制网速
  3. mysql 日期区间创建_按日期范围统计数据
  4. 用js操作table、tr、td 「字体样式及TD背景图片」
  5. 我要做 Android 之面笔试总结
  6. Keras之ML~P:基于Keras中建立的简单的二分类问题的神经网络模型(根据200个数据样本预测新的5个样本)——概率预测
  7. Redis批量操作详解及性能分析
  8. 性能测试测试环境与生产环境_不在生产中测试? 在生产中进行测试!
  9. 字符、字符集和字符编码详解(一文扫清疑惑)
  10. 过去15年,到底是什么真正推动了云计算的革命?
  11. 开源的49款Java 网络爬虫软件
  12. 数据结构代码学习笔记(持续更新中)
  13. opencv+海康威视网络摄像头实时预览+抓图(环境配置加程序)
  14. img在div中居中
  15. 关于网站嵌入faceboook以及youtube视频
  16. MFC:读取整个记事本文件
  17. 信息检索(IR)——索引与检索
  18. Faceted project metadata file “/game/.settings/org.eclipse.wst.common.projec
  19. Augustus操作指南
  20. 编程式事务和声明式事务浅析

热门文章

  1. cocos2d-x 音效中断问题
  2. emacs 探索之五:latex配置
  3. mysql主从结构主数据库_mysql主从结构主数据库
  4. 《OpenCV3编程入门》学习笔记6 图像处理(一)线性滤波:方框滤波、均值滤波、高斯滤波
  5. arnold如何设置鱼眼相机_华为相机实用技巧——如何调整相机设置?(2)
  6. 函数重载需要注意的点
  7. linux按文件名排序ls,linux – 如何使用shell脚本按名称对文件进行排序
  8. 习题8_6与习题9_2
  9. halcon:(4)halcon中XLD的概念与应用----汽车引擎盖圆孔检测
  10. Python 骚操作:微信远程控制电脑