1. 程式人生 > >一個支援memcache協議的支援線上批量更新的kv資料庫(適用於推薦引擎)

一個支援memcache協議的支援線上批量更新的kv資料庫(適用於推薦引擎)

# 簡介
terminal是一個支援memcache協議的key-value資料庫, 可以線上掛載多個靜態資料儲存, 很適合用於推薦引擎儲存離線計算的候選集及非實時更新的大批量資料。 它不支援寫操作, 只能用於進行靜態資料儲存, 但是它可以批量的動態載入線下生成的資料檔案,這樣可以減少更新大批量資料寫入對系統造成的影響, 最大程度的降低寫放大對磁碟的損耗。
terminal結合使用記憶體和硬碟, 記憶體只用來儲存索引檔案, 硬碟則用來儲存真正的資料檔案. 很大程度上減少對機器記憶體的消耗。

terminal的每個庫由資料檔案和索引檔案組成, 資料檔案命名為dat, 索引檔案命名為idx, 索引檔案由一個個key-pos對組成. 其中key就是key-value結構中需要查詢的key, 而pos則包含兩部分資訊, 它的前40位表示value在dat檔案中的偏離值off, 後20位表示value的長度length, 通過off和length來共同定位dat檔案中的value, 當前版本支援Integer和String的key, Integer型別key的查詢相對於String型別的要快一些。

使用方法

管理控制檯

  1. 修改配置檔案 terminal/web/conf.py
    指定每個server的host, port 還有標記server的tag
  2. 啟動控制檯的http server(依賴於 tornado, 你可以使用pip install tornado 來安裝它)
    python http_server.py <port>
  1. 現在你就可以通過控制檯來檢視服務的狀態,並且在上面管理每個db服務了

原始碼編譯

依賴的第三方原始碼包

- libevent1.4

開始編譯

1. git clone https://github.com/desion/terminal.git
2. 編譯
   cd terminal
   make

使用

  1. 啟動
      -p <num>   TCP port to listen on (default: 9898)
      -l <ip_addr>  interface to listen on, default is INDRR_ANY
      -c <num>      max simultaneous connections (default: 1024)
      -d            daemon
      -h            help
      -v            verbose (print errors/warnings)
      -t
<num> number of worker threads to use, default 4 -T <num> timeout in millisecond, 0 for none, default 0 ./terminal -p 9898 -c 1024 -d -t 8
  1. 掛載資料
    掛載資料只需要將相應的idx和dat檔案放在一個目錄,然後執行下面的命令通知服務載入
    echo -ne "open <data_dir>\r\n" | nc 127.0.0.1 9898
  或者可以通過append命令向相應的庫追加新的資料,如果同以往的資料有重疊,那麼新版本的資料會替換舊版本的資料
    echo -ne "append <data_dir>\r\n" | nc 127.0.0.1 9898
  1. 解除安裝資料
    echo -ne "close <label>\r\n" | nc 127.0.0.1 9898
  1. 解除安裝制定版本的資料
    echo -ne "close <label> <version>\r\n" | nc 127.0.0.1 9898

訪問示例

啟動後即可通過stats命令檢視服務狀態

echo -ne "stats\r\n" | nc 127.0.0.1 9898

查詢某個key的value(get label-key)

echo -ne "get 1-123456\r\n" | nc 127.0.0.1 9898

可以通過info命令檢視當前掛載庫的狀態

echo -ne "info\r\n" | nc 127.0.0.1 9898

生成資料

1. 有一個原始的資料檔案dat, 每行都是key-value結構, 用:分隔, key必須為整數
2. 如果資料檔案的key是無序的, 可以先將資料檔案中的key按數字進行排序
3. 使用編譯生成的index_create程式生成索引檔案
生成Integer型別key的索引檔案:
    ./index_create -i <dat> -o <idx> -l <label>
<dat> 為要生成索引的資料檔案
idx是生成索引檔案的路徑
label是庫的標識
生成String型別key的索引檔案:
    ./index_create -i <dat> -o <idx> -l <label> -s -n <keys num>
dat 為要生成索引的資料檔案
idx是生成索引檔案的路徑
label是庫的標識
keys num是dat檔案中包含key的個數

支援命令

  • info

    檢視庫是否掛載成功, 顯示每個庫的資訊, 開啟時間, 當前處理的請求量, 庫裡面有多少條記錄

  • stats

    檢視服務的狀態, 主要是通訊部分的資訊(例如: 當前等待處理佇列裡有多少請求, 有多少請求在等待佇列裡超時了). 這些資訊, 有利於知道服務是否穩定, 是否效能滿足要求

  • get

    取得一個或多個key的value

  • open reopen

    動態掛載庫

  • append

    在已有庫的情況下追加新的資料

  • stats reset(慎用)

    重置統計資訊

  • close

    解除安裝資料,close db