<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          lushan基于 Memcache 的 key-value 數(shù)據(jù)庫

          聯(lián)合創(chuàng)作 · 2023-10-01 01:30

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

          lushan的每個(gè)庫由數(shù)據(jù)文件和索引文件組成, 數(shù)據(jù)文件命名為dat, 索引文件命名為idx, 目錄命名為hdict_xxxxxxxxxxx, 后面是時(shí)間編號(hào). 索引文件由一個(gè)個(gè)key-pos對(duì)組成. 其中key就是key-value結(jié)構(gòu)中需要查詢的key, 而pos則包含兩部分信息, 它的前40位表示value在dat文件中的偏離值off, 后20位表示value的長(zhǎng)度length, 通過off和length來共同定位dat文件中的value

          關(guān)于lushan的實(shí)現(xiàn)原理可以參考微博推薦博客的這篇博文: http://www.wbrecom.com/?p=453

          使用方法

          源碼編譯

          依賴的第三方源碼包

          • libevent1.4

          步驟

          1. git clone https://github.com/wbrecom/lushan.git

          2. 創(chuàng)建lushan編譯環(huán)境

            SOURCE_DIR=/tmp/lushan_environment/
            mkdir "$SOURCE_DIR"
          3. 復(fù)制lushan項(xiàng)目源碼到lushan編譯環(huán)境目錄

            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. 創(chuàng)建lushan部署環(huán)境

            SOURCE_DIR=/tmp/lushan_environment/
            DEPLOY_DIR=/tmp/lushan_deploy/
            mkdir -p $DEPLOY_DIR
          2. 創(chuàng)建bin conf hdb logs upload目錄

            cp -r "$SOURCE_DIR"lushan/bin $DEPLOY_DIRcp -r "$SOURCE_DIR"lushan/conf $DEPLOY_DIRcp -r "$SOURCE_DIR"lushan/hdb $DEPLOY_DIRcp -r "$SOURCE_DIR"lushan/logs $DEPLOY_DIRcp -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. 掛載數(shù)據(jù)

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

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

            cp -r hdict_20150820131415 "$DEPLOY_DIR"hdb/1
          6. 啟動(dòng)lushan

            bash "$DEPLOY_DIR"bin/hyper_dict.sh
          7. 補(bǔ)充: 動(dòng)態(tài)掛載數(shù)據(jù)

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

            該目錄包含done.flg dat idx這3個(gè)文件

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

          訪問示例

          啟動(dòng)后即可通過stats命令查看lushan狀態(tài)

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

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

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

          生成數(shù)據(jù)

          生成符合lushan格式的數(shù)據(jù)有兩種方法

          腳本轉(zhuǎn)化

          0. 有一個(gè)原始的數(shù)據(jù)文件dat, 每行都是key-value結(jié)構(gòu), 用:分隔, key必須為整數(shù)
          1. 通過tools/generate_idx.py腳本生成索引文件
          2. 如果數(shù)據(jù)文件的key是無序的, 可使用index_sort程序?qū)λ饕募判?
          3. 新建hditc_xxxxxxxxx目錄, 將idx文件和dat文件放到該目錄下

          MapReduce直接生成

          如果是在hadoop上用MapReduce直接生成數(shù)據(jù), 則需要使用tools/LushanFileOutputFormat.java, 指定MapReudce的輸出格式類為L(zhǎng)ushanFileOutputFormat

          job.setOutputFormat(LushanFileOutputFormat.class)

          支持命令

          • info

            查看庫是否掛載成功, 顯示每個(gè)庫的信息, 打開時(shí)間, 當(dāng)前處理的請(qǐng)求量, 庫里面有多少條記錄

          • stats

            查看lushan本身的狀態(tài), 主要是通信部分的信息(例如: 當(dāng)前等待處理隊(duì)列里有多少請(qǐng)求, 有多少請(qǐng)求在等待隊(duì)列里超時(shí)了). 這些信息, 有利于知道服務(wù)是否穩(wěn)定, 是否性能滿足要求

          • randomkey

            隨機(jī)取得一個(gè)key

          • get

            取得一個(gè)或多個(gè)key的value

          • open reopen

            動(dòng)態(tài)掛載庫

          • stats reset(慎用)

            重置lushan統(tǒng)計(jì)信息

          • close

            關(guān)閉客戶端連接

          瀏覽 20
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人妖fS互X调教在线看 | 中文字幕亚洲视频在线观看 | 人妻无码中文专区久久5566 | 美女啪啪免费视频 | 九九在线视频 |