一个简单的程序来使用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 <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
這里面的文件信息如下:
wiredTiger是wiredTiger的版本信息或者編譯時間WiredTiger.basecfgwiredTiger的配置信息WiredTiger.locklock文件,防止多個進程鏈接同一個數據庫(rocksdb的LOCK文件),單進場獨享的WiredTiger.turtle存儲WiredTiger.wt文件的元數據信息access.wt是實際的表數據,我們在代碼中創建了一個access命名的表WiredTiger.wt特殊的table,用于存儲其他表數據的元數據信息WiredTigerLAS.wt這個是與wiredtiger的cache evict 相關的數據文件,主要是當內存使用率高時用于臨時存放不能被逐出到用戶表文件中的數據,表WiredTigerLAS中的數據會被高優先級逐出到磁盤文件WiredTigerLAS.wt中。
還有更多的官方提供的關于 session/cursor/事務 等 接口的使用demo 可以參考: example
總結
以上是生活随笔為你收集整理的一个简单的程序来使用WiredTiger 存储引擎的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “非惜年芳绝”上一句是什么
- 下一篇: 三个字的微信网名女