lushan - 一個基于 Memcache 協議的 key-value 數據庫

jopen 9年前發布 | 11K 次閱讀 lushan NoSQL數據庫

lushan是一個基于memcache協議的key-value數據庫, 可以動態掛載多個庫, 用來進行靜態數據的存儲, 適用于存儲更新頻次較低的數據. 可以作為redis的有效補充, 以節省昂貴的內存服務器成本, lushan不像redis那樣需要將數據完全存在內存中, 而是結合使用內存和硬盤, 內存只用來存儲索引文件, 硬盤則用來存儲真正的數據文件. 另外在寫入時不能像redis那樣實時寫入, 而是通過加載離線的靜態數據文件完成(例如用MapReduce生成的數據)

lushan的每個庫由數據文件和索引文件組成, 數據文件命名為dat, 索引文件命名為idx, 目錄命名為hdict_xxxxxxxxxxx, 后面是時間編號. 索引文件由一個個key-pos對組成. 其中key就是key-value結構中需要查詢的key, 而pos則包含兩部分信息, 它的前40位表示value在dat文件中的偏離值off, 后20位表示value的長度length, 通過off和length來共同定位dat文件中的value

關于lushan的實現原理可以參考微博推薦博客的這篇博文: http://www.wbrecom.com/?p=453

使用方法

源碼編譯

依賴的第三方源碼包

  • libevent1.4
  1. git clone https://github.com/wbrecom/lushan.git
  2. 創建lushan編譯環境
    SOURCE_DIR=/tmp/lushan_environment/
    mkdir "$SOURCE_DIR"
  3. 復制lushan項目源碼到lushan編譯環境目錄
    cp -r lushan "$SOURCE_DIR"
  4. 編譯libevent
    cd "$SOURCE_DIR"lushan/depend/libevent-1.4.14b-stable
    ./configure --prefix="$SOURCE_DIR"libevent
    make && make install
  5. 編譯lushan
    cd "$SOURCE_DIR"lushan/src
    # 修改common.mk, 將LIBEVENT_HOME的值修改為剛才安裝libevent的目錄
    LIBEVENT_DIR="$SOURCE_DIR"libevent
    sed -i "s#LIBEVENT_HOME.*#LIBEVENT_HOME = $LIBEVENT_DIR#g" common.mk
    make

部署lushan

  1. 創建lushan部署環境
    SOURCE_DIR=/tmp/lushan_environment/
    DEPLOY_DIR=/tmp/lushan_deploy/
    mkdir -p $DEPLOY_DIR
  2. 創建bin conf hdb logs upload目錄
    cp -r "$SOURCE_DIR"lushan/bin $DEPLOY_DIR cp -r "$SOURCE_DIR"lushan/conf $DEPLOY_DIR cp -r "$SOURCE_DIR"lushan/hdb $DEPLOY_DIR cp -r "$SOURCE_DIR"lushan/logs $DEPLOY_DIR cp -r "$SOURCE_DIR"lushan/upload $DEPLOY_DIR
  3. 替換編譯好的lushan程序
    cp "$SOURCE_DIR"lushan/src/hyper_dict "$DEPLOY_DIR"bin
  4. 修改lushan.conf配置文件
    HDB_DIR="$DEPLOY_DIR"hdb
    sed -i "s#HDB_PATH=.*#HDB_PATH=$HDB_DIR#g" "$DEPLOY_DIR"conf/hyper_dict.conf
    UPLOAD_DIR="$DEPLOY_DIR"upload
    sed -i "s#UPLOAD_PATH=.*#UPLOAD_PATH=$UPLOAD_DIR#g" "$DEPLOY_DIR"conf/hyper_dict.conf
  5. 掛載數據

    將含有數據文件的目錄復制到hdb目錄下(數據文件目錄命名為hdict_$datetime)

    該目錄包含choic.flg done.flg dat idx這4個文件

    cp -r hdict_20150820131415 "$DEPLOY_DIR"hdb/1
  6. 啟動lushan
    bash "$DEPLOY_DIR"bin/hyper_dict.sh
  7. 補充: 動態掛載數據

    將含有數據文件的目錄復制到upload目錄下(數據文件目錄命名為hdict_$datetime)

    該目錄包含done.flg dat idx這3個文件

    cp -r hdict_20150820142244 "$DEPLOY_DIR"upload/2
    touch "$DEPLOY_DIR"upload/2/hdict_20150820142244/done.flg

訪問示例

啟動后即可通過stats命令查看lushan狀態

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

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

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

生成數據

生成符合lushan格式的數據有兩種方法

腳本轉化

0. 有一個原始的數據文件dat, 每行都是key-value結構, 用:分隔, key必須為整數
1. 通過tools/generate_idx.py腳本生成索引文件
2. 如果數據文件的key是無序的, 可使用index_sort程序對索引文件排序
3. 新建hditc_xxxxxxxxx目錄, 將idx文件和dat文件放到該目錄下

MapReduce直接生成

如果是在hadoop上用MapReduce直接生成數據, 則需要使用tools/LushanFileOutputFormat.java, 指定MapReudce的輸出格式類為LushanFileOutputFormat

job.setOutputFormat(LushanFileOutputFormat.class)

項目主頁:http://www.baiduhome.net/lib/view/home/1440164795114

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!