首页 > 一个简单的程序来使用WiredTiger 存储引擎

一个简单的程序来使用WiredTiger 存储引擎

前言

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 
#include 
#include 
#include 
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
",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 以其优异的性能(B-tree和LSM-tree都支持)和稳定性(Mongodb的默认存储引擎) 被我们备选为异构引擎里的一个子引擎,后续将深入wiredtiger 引擎原理。这里简单记录一下Wiredtiger 存储引擎的编译记录。 Environment CPU:Intel(R)...

  •     戳https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.60/bin/apache-tomcat-8.5.60.zip 下载好了解压到你一个不可描述的文件夹里面,譬如D盘根目录 然后开始核心骚操作 win+PauseBreak键 第一步 名称:JA...

  • 1、复制已有的tomcat目录到同级目录 # cp -r tomcat tomcat-new 2、编辑tomcat-new/conf/server.xml # vim tomcat-new/conf/server.xml /Connector n --找到

    【原创】PostgreSQL 增量备份详解以及相关示例

    PostgreSQL 没有类似MySQL 的二进制日志, 但是有和MySQL 类似的REDO LOG,并且有MySQL 没有的REDO 归档功能。当然REDO 的归档已经MariaDB 和Percona-MySQL 已经实现。那我们就利用PGSQL的REDO 归档,也叫WAL来实现增量备份。 假设我们已经做了一个物理的全备,并且相应的...

  • 在4gl中CURSOR可以说是每一个程序中都会有的,而CURSOR又分为三种SCROLLING CURSOR、Non-SCROLLING CURSOR、LOCKING CURSOR。 Non-SCROLLING CURSOR的聲明有兩種,一種是先定義好sql語句到一個變量里: DECLARE    cursor名  CURSOR  F...

  • 我们使用SQL语句处理数据时,可能会碰到一些需要循环遍历某个表并对其进行相应的操作(添加、修改、删除),这时我们就需要用到咱们在编程中常常用的for或foreach,但是在SQL中写循环往往显得那么吃力,翻遍网上的资料,找不到几个正确的并能执行的循环处理数据的方法,在这里,我来给大家分享一下! 要SQL中写类似for循环,我这里使用的...

  • cursor:hand 与 cursor:pointer 的效果是一样的,都像光标指向链接一样,光标变成手行。 cursor:hand :IE完全支持。但是在firefox是不支持的,没有效果。 cursor:pointer :是CSS2.0的标准。所以firefox是支持的,但是IE5.0既之前版本不支持。IE6开始支持。 结论:还...