分佈式日誌系統Scribe編譯安裝

最近準備整合多個系統的日誌,於是想到構建一套分佈式日誌存儲系統,首先考慮的是Scribe,不過編譯安裝耗費了不少時間(Scribe相關文檔確實少了點,相比Flume) html

環境:Ubuntu13.04 32bit bootstrap

組件:
scribe    2.x(最新版)
thrift    0.9.0
boost    1.54
fb303    thrift自帶 分佈式

至於其餘所依賴的相關包(如libevent、automake、flex、bison等)可根據configure的結果進行安裝或更新。 測試

一、安裝boost flex

官網下載boost,版本要求高於1.36(做者用的是1.54.0),按照文檔中給出的方法編譯:
    $tar --bzip2 -xf /home/vincent/Download/boost_1_54_0.tar.bz2
    $cd /home/vincent/Download/boost_1_54_0
    $./bootstrap.sh --help
    $./bootstrap.sh --prefix=opt/boost_1.54
    $./b2 install
ui

至此,boost庫編譯完成,編譯時無需指定其餘選項,在--prefix參數指定的目錄下生成include和lib文件夾存放頭文件和庫文件。 spa

二、安裝thrift 日誌

下載thrift包,安裝是經典的三大步:
    $tar zxvf thrift-0.9.0.tar.gz
    $cd thrift-0.9.0/
    $sudo ./configure CPPFLAGS="-DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H" 
    $sudo make
    $sudo make install
server

configure時CPPFLAGS參數不可少,不然make時會產生諸如「uint_32未定義」之類錯誤。另外,configure時如找不到boost庫,則需使用--with-boost參數指定boost庫位置。thrift安裝後能夠進行簡單的測試以確認是否安裝成功。 htm

三、安裝fb303

fb303包含在thrift安裝包裏,直接make安裝:
    $cd contrib/fb303 
    $sudo ./bootstrap.sh --with-boost=/opt/boost_1.54/lib/ 
    $sudo make 
    $sudo make install 

此處--with-boost便是指定boost庫位置

四、安裝scribe

依賴組件安裝完畢,便可開始編譯scribe:
    $./bootstrap.sh
    $sudo ./configure --with-boost=/opt/boost_1.54/lib/ --prefix=/opt/scribe
    $sudo make
    $sudo make install

編譯時可能會產生相關錯誤:
1)configure若遇到以下錯誤
    checking whether the Boost::System library is available… yes
    checking whether the Boost::Filesystem library is available… yes
    configure: error: Could not link against  !
則需在configure時加上參數
    --with-boost-system=lboost_system
    --with-boost-filesystem=lboost_filesystem
筆者的configure以下:

    sudo ./configure --prefix=/opt/scribe --with-boost=/usr/local/lib --with-boost-system=boost_system --with-boost-filesystem=boost_filesystem CPPFLAGS="-DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H -DBOOST_FILESYSTEM_VERSION=3"

2)make時若遇到:
    undefined reference to 'boost::system::generic_category()'
    undefined reference to 'boost::system::system_category()'
在確認boost::system庫存在且路徑正確後,檢查GCC連接代碼(根據make輸出),筆者的以下:
g++  -Wall -O3 -L/usr/local/lib/ -lboost_system -lboost_filesystem  -o scribed store.o store_queue.o conf.o file.o conn_pool.o scribe_server.o network_dynamic_config.o dynamic_bucket_updater.o  env_default.o  -L/usr/local/lib -L/usr/local/lib -L/usr/local/lib -lfb303 -lthrift -lthriftnb -levent -lpthread  libscribe.a libdynamicbucketupdater.a
此時需將-lboost_system -lboost_filesystem兩個選項放在最後,並在src目錄下手動執行連接便可完成編譯。(該問題是因爲gcc在靜態連接時對依賴庫的順序有要求致使,詳細解釋可參考http://www.cppblog.com/wiisola/archive/2010/05/18/115637.html

相關文章
相關標籤/搜索