96
技術社區[雲棲]
淘寶開源數據庫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:
- RootServer?是集群的中心控製結點
- UpdateServer?是集群的更新服務結點
- ChunkServer?是集群靜態數據存儲結點
- MergeServer?為查詢服務結點。
應用程序使用OceanBase,需要通過客戶端庫,客戶端隻需要知道RootServer的地址即可。
在最簡單的情況下,OceanBase由一個RootServer, 一個UpdateServer, 一個ChunkServer和一個MergeServer組成,這四個Server都運行在同一台物理機上。可以用如下的命令啟動四個Server:
cd
$HOME/ob-install-dir |
當然,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 |
最後更新:2017-04-02 16:48:10