閱讀96 返回首頁    go 技術社區[雲棲]


淘寶開源數據庫OceanBase編譯、安裝和配置手冊

概述

    OceanBase是 一個高性能的分布式表格係統,提供類似BigTable的性能和擴展性,但表格中保存的是強類型的數據,比如integer,string,datetime等。 它使用C++編寫,運行於64位Linux環境下。生產環境下需要使用多台機器搭建OceanBase集群以提供高可用和高性能,但是你也完全可以使用一 台機器運行OceanBase。

    本章節講解如何迅速搭建一個可用的最小OceanBase環境,在這之前請確保你能提供以下的條件:

  • 64位的Linux服務器一台, 內存至少1G。
  • 足夠的磁盤空間,最少100MB。
  • 擁有root權限或能通過sudo提升至root權限。

    如果你滿足要求,恭喜你。可以繼續安裝OceanBase的過程了。這大概分為如下幾個步驟:

  • 從源碼編譯安裝OceanBase及其依賴的庫
  • 啟動OceanBase
  • 使用OceanBase

    最後,我們會對OceanBase中的配置做一個粗略的解釋以幫助你解決啟動時遇到的問題。

從源碼編譯安裝OceanBase及其依賴的庫

    在安裝OceanBase之前,請檢查gcc的版本:


   gcc --version

   最好用gcc 4.1.2編譯,如果版本不匹配,不一定可以編譯成功,歡迎大家測試不同版本的編譯器,同時歡迎大家提供patch讓OceanBase能在更多版本的編譯器下編譯通過。

    Oceanbase在運行時需要用到一些動態庫,建議在bashrc中將LD_LIBRARY_PATH設置好:


echo "export TBLIB_ROOT=$HOME/ob-install-dir"  >> ~/.bashrc
echo "export LD_LIBRARY_PATH=/usr/lib/:/usr/local/lib:\$TBLIB_ROOT/lib:\$HOME/ob-install-dir/lib:\$LD_LIBRARY_PATH" >> ~/.bashrc
source ~/.bashrc

安裝依賴的庫

[libtoolize]

    編譯腳本中用到了aclocal, autoconf, automake等工具,一般機器上會自帶。如果機器上沒有安裝,請先安裝:


sudo yum install libtool.x86_64

liblzo2

    liblzo2是一個壓縮庫,OceanBase需要用它來壓縮靜態數據. 利用yum快速安裝


sudo yum install LZO.x86_64

    如果yum找不到這個包,可以選擇手動安裝:

wget -c https://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz 
tar zxf lzo-* 
(cd lzo-2.03; ./configure --enable-shared --prefix=/usr/ && make && sudo make install)

    安裝完成後你可以編譯一個C程序看看編譯器能否找到它:


echo "int main(){ return 0;}" > /tmp/a.c && gcc /tmp/a.c -llzo2 -o /tmp/a.out
/tmp/a.out

    如果沒報錯就說明安裝成功了。如果顯示下麵的消息則說明$LD_LIBRARY_PATH變量沒有配置正確,請確定liblzo2.so.2所在目錄並加入到$LD_LIBRARY_PATH中。

./a.out: error while loading shared libraries: liblzo2.so.2: cannot open shared object file: No such file or directory

Snappy

    Snappy是Google出品的壓縮庫,OceanBase用它來壓縮靜態數據[可選]. 注意:Snappy依賴於lzo庫,請先裝lzo庫再裝Snappy。利用yum快速安裝


sudo yum install Snappy.x86_64

    如果yum找不到這個包,可以選擇手動安裝:


cd ~
wget -c https://snappy.googlecode.com/files/snappy-1.0.3.tar.gz
tar zxf snappy-*
(cd snappy-1.0.3; ./configure --prefix=/usr/ && make && sudo make install)

    安裝完成後你可以編譯一個C程序看看編譯器能否找到它:


echo "int main(){ return 0;}" > /tmp/a.c && gcc /tmp/a.c -o /tmp/a.out -lsnappy
/tmp/a.out

    如果沒報錯就說明安裝成功了。如果顯示下麵的消息則說明$LD_LIBRARY_PATH變量沒有配置正確,請確定liblzo2.so.2所在目錄並加入到$LD_LIBRARY_PATH中。


./a.out: error while loading shared libraries: libsnappy.so.1: cannot open shared object file: No such file or directory

libnuma

    Oceanbase中用到了NUMA支持,需要libnuma的支持。下麵通過yum安裝numactl來添加numa相關的頭文件和庫。


sudo yum install numactl-devel.x86_64

    如果yum找不到這個包,可以選擇手動安裝:


cd ~
wget -c https://freshmeat.net/urls/5994b4dd6cf45abcf4c4ed8c16a75f24  # 如果該地址失效,請到https://freshmeat.net/projects/numactl/手工下載
tar zxf numactl-*
(cd numactl-2.0.7; make && sudo make install)

libaio

    Oceanbase中用到了AIO,需要libaio的支持。下麵通過yum安裝libaio來添加numa相關的頭文件和庫。


sudo yum install libaio-devel.x86_64

    如果yum找不到這個包,可以選擇手動安裝:


cd ~
wget -c https://libaio.sourcearchive.com/downloads/0.3.107-7/libaio_0.3.107.orig.tar.gz  # 如果該地址失效,請到https://libaio.sourcearchive.com/手工下載
tar zxf libaio*
(cd libaio-0.3.107; make && sudo make install)

tbnet和tbsys

    tbsys是對操作係統服務的封裝,tbnet則提供了網絡框架,OceanBase依賴於這兩個庫。 tbnet和tbsys被作為tb-common-utils被開源了, 可以訪問  https://code.taobao.org/trac/tb-common-utils/wiki/ZhWikiStart 以了解更多情況。 注意,安裝和使用tbnet和tbsys之前,要設置好 TBLIB_ROOT 這個環境變量,這個環境變量指示了安裝tbnet和tbsys庫的路徑.

    用如下命令下載源碼並編譯安裝:


cd ~
export TBLIB_ROOT=$HOME/ob-install-dir
svn checkout https://code.taobao.org/svn/tb-common-utils/trunk/ tb-common-utils
(cd tb-common-utils; sh build.sh)

    安裝成功後, TBLIB_ROOT 所指示的目錄下會有include和lib兩個目錄,可用如下的命令驗證編譯器能否找到庫:


echo "int main(){ return 0;}" > /tmp/a.c && gcc /tmp/a.c -o /tmp/a.out -L$TBLIB_ROOT/lib -ltbnet -ltbsys
/tmp/a.out

    如果報錯,檢查 TBLIB_ROOT 是否設置正確了。

gtest

    可選。如果你執行./configure –without-test-case不編譯OB的test,那麼這一節可以忽略。如果你要編譯test,本節內容僅供參考:新版gtest是不允許安 裝的,gtest上的wiki有說到。建議./configure && make之後,直接:


cp -r gtest-build-dir/include/gtest ob-src-dir/include
cp -r gtest-build-dir/lib/.libs ob-src-dir/lib

編譯安裝OceanBase

    檢出OB分支源代碼:


cd ~
#開源後svn地址   svn co https://code.taobao.org/svn/oceanbase/trunk/ ob-src-dir
svn co https://svn.app.taobao.net/repos/oceanbase/branches/rm/oceanbase/ ob-src-dir

    編譯安裝

(cd ob-src-dir; ./build.sh init && ./configure --prefix=$HOME/ob-install-dir --with-release --without-test-case && make -j2 && make install)

    注意 –without-test-case表示不編譯測試用例,因為OceanBase使用googletest作為測試框架,如果你想跑單元測試,需要把googletest的頭文件和庫放入到oceanbase源碼頂層目錄的include和lib目錄。 安裝完成後需要進行一次初始化,根據當前機器配置生成必要的初始化文件。執行single-machine-bootstrap腳本就可以完成全部初始化工作。


cd $HOME/ob-install-dir
 ./single-machine-bootstrap init# 創建必要的目錄,生成配置文件

一切初始化完成後係統目錄如下圖所示:

 /
        |--/usr/lib/
        |   |-- liblzo*.so.*
        |   |-- libsnappy*.so.*
        |   `-- ...
        |
        |--$HOME
            |-- tb-common-utils
            |-- ob-src-dir
            |   `- ...
            |
            `-- ob-install-dir
                |-- single-machine-bootstrap
                |-- include
                |-- lib                     
                |-- bin                     
                |-- @etc                    
                |   |-- rootserver.conf
                |   |-- mergeserver.conf
                |   |-- chunkserver.conf
                |   |-- updateserver.conf
                |   `-- schema.ini          
                |
                `-- @data                   
                    |-- ups_commitlog
                    |-- rs_commitlog
                    |-- ups_data
                    |-- log
                    |-- cs
                    `-- rs

啟動OceanBase

    在整個OceanBase集群中一共有四種角色:RootServer?,UpdateServer?,ChunkServer?和MergeServer:

    應用程序使用OceanBase,需要通過客戶端庫,客戶端隻需要知道RootServer的地址即可。

    在最簡單的情況下,OceanBase由一個RootServer, 一個UpdateServer, 一個ChunkServer和一個MergeServer組成,這四個Server都運行在同一台物理機上。可以用如下的命令啟動四個Server:


cd $HOME/ob-install-dir
bin/rootserver -f etc/rootserver.conf
bin/updateserver -f etc/updateserver.conf
bin/mergeserver -f etc/mergeserver.conf
bin/chunkserver -f etc/chunkserver.conf

    當然,OceanBase並不強製要求四個Server的啟動順序。

    Server都作為daemon運行,可以用如下命令查看對應的log:


cd $HOME/ob-install-dir
tail -f data/log/rootserver.log
tail -f data/log/updateserver.log
tail -f data/log/mergeserver.log
tail -f data/log/chunkserver.log

    在成功啟動OceanBase後,按照默認的配置認生成了一個名為test的表。這個表是典型的kv數據表,可以使用OceanBase提供的API讀寫這個表。 如有運行有問題,可以參考後麵關於配置的更加詳細的解釋。

使用OceanBase

    TODO

配置文件說明

    OceanBase提供表格存儲服務,所以首先要有一個schema文件描述表格,其次RootServer,UpdateServer?ChunkServer?和MergeServer都有自己的配置文件。 四個Server的配置文件是在啟動Server時通過命令行參數指定的,schema文件的路徑是在RootServer的配置文件中指定的。

修改數據庫schema配置文件

    一個schema配置文件描述一個應用,一個應用可以有多個表格,配置文件中要指定應用的名字,及每個表的名字,每一列的名字,類型等信息。 詳細的描述參見源碼包的文檔: doc/OceanBase的schema.docx


       [app_name]
        name = 數據庫應用名稱
        max_table_id = 應用的最大數據表ID

        [數據表1名稱]
        table_id = 數據表1的ID
        ...其他字段含義要參考OB文檔...
        compress_func_name=lzo_1.0
        column_info=1,2,info_user_nick,varchar,128
        ....

        [數據表2名稱]
        table_id = 數據表2的ID
        compress_func_name=lzo_1.0
        ...

修改 rootserver.conf

    RootServer?的配置主要指定自己的地址及UpdateServer的地址,Schema文件的路徑等。

修改 updateserver.conf

    UpdateServer?的配置主要指定自己的地址及RootServer的地址, 數據的存儲目錄等信息。


        [root_server]
        pid_file = rootserver的pid文件路徑
        log_file = rootserver的運行日誌文件路徑
        data_dir = rootserver的持久化數據目錄

        log_level = rootserver的日誌級別
        dev_name = rootserver監聽的網卡名稱,如eth0
        vip = rootserver的VIP設備地址,用來實現熱備,開發環境中隻需要單rootserver,這裏指定為rootserver地址即可
        port = rootserver的監聽端口

        __create_table_in_init=1     # 在係統初始化時建立表
        __safe_copy_count_in_init=1  # 防止在隻有1個chunkserver時產生warn信息
        __safe_copy_count_in_merge=1 #

        [update_server]
        vip = updateserver的VIP設備地址,用來實現熱備,因為rootserver是主動連接updateserver的。開發環境中隻需要單updateserver,這裏指定為updateserver地址即可
        port = updateserver的監聽端口,以便rootserver連接
        ups_inner_port=updateserver的低優先級監聽端口,以用於每日合並

        [schema]
        file_name = 數據庫schema配置文件路徑

關於UpdateServer的數據目錄結構

    store_root, raid_regex和dir_regex 共同指定了UpdateServer的數據目錄,UpdateServer?以 sstable的方式保存數據。在 store_root 項指定的目錄下建立多個與 raid_regex 配置項匹配的目錄, 目前默認的目錄名是這樣的raid1 raid2 raid3 ….,同一個sstable文件會在一個raid目錄產生多份拷貝,在上述每個raid目錄下建立多個與 dir_regex 配置項匹配的軟鏈接,目前默認的目錄名是這樣的store1 store2 store3… 分別指向不同設備掛載點下的目錄(如 /data/1-1/ups_store /data/1-2/ups_store… ), 在測試時我們可以使用普通的目錄代替掛載點。

    因此建立好的環境用tree命令看是這樣的:

data
        |-- raid1
        |   |-- store1 -> /data/1-1/ups_store/
        |   |-- store2 -> /data/1-2/ups_store/
        |   |-- store3 -> /data/1-3/ups_store/
        |   |-- store4 -> /data/1-4/ups_store/
        |   `-- store5 -> /data/1-5/ups_store/
        `-- raid2
            |-- store1 -> /data/2-1/ups_store/
            |-- store2 -> /data/2-2/ups_store/
            |-- store3 -> /data/2-3/ups_store/
            |-- store4 -> /data/2-4/ups_store/
            `-- store5 -> /data/2-5/ups_store/

    可用如下的命令建立目錄和鏈接

mkdir -p /data/{raid{1..2},{1..2}-{1..5}/ups_store} for i in {1..2}; do 
for j in {1..5}; do 
ln -s /data/$i-$j/ups_store /data/raid$i/store$j; # 注意這裏建立軟鏈接時最好使用絕對路徑 
done 
done

修改 mergeserver.conf

    MergerServer?的配置主要指定RootServer的地址等。


        [merge_server]
        port = mergeserver監聽端口
        dev_name = mergeserver監聽網卡名稱,如eth0
        log_file = mergeserver的運行日誌文件路徑
        pid_file = mergesever的pid文件路徑
        log_level = mergeserver的日誌級別

        [root_server]
        vip = rootserver的VIP設備地址,開發環境中隻要指定為rootserver地址即可
        port = rootserver的監聽端口

修改 chunkserver.conf

    ChunkServer?的配置主要指定RootServer的地址, 數據存儲目錄等。


        [public]
        pid_fie = chunkserver的運行日誌文件路徑
        log_file = chunkserver的pid文件路徑
        log_level = chunkserver的日誌級別

        [chunkserver]
        dev_name = chunkserver的監聽網卡名稱,如eth0
        port = chunkserver的監聽端口
        datadir_path = chunkserver數據持久化目錄的路徑
        application_name = 數據庫應用名稱
        [root_server]
        vip = rootserver的VIP設備地址,開發環境中隻要指定為rootserver地址即可
        port = rootserver監聽端口

    chunkserver的數據放在 /datadir_path/$i/application_name/sstable 下, 並且由於該目錄並不存在因此需要建立對應的目錄


        mkdir -p /datadir_path/{1..10}/application_name/sstable
原文出處:https://www.mysqlops.com/2011/08/31/oceanbase-install.html

最後更新:2017-04-02 16:48:10

  上一篇:go 前端必備:jQuery 1.7.1API手冊
  下一篇:go iOS中的圖像處理(三)——混合運算