求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
OceanBase:编译、安装和配置手册
 

发布于2011-10-11

 

概述

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 http://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 http://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 http://freshmeat.net/urls/5994b4dd6cf45abcf4c4ed8c16a75f24 # 如果该地址失效,请到http://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 http://libaio.sourcearchive.com/downloads/0.3.107-7/libaio_0.3.107.orig.tar.gz # 如果该地址失效,请到http://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被开源了, 可以访问 http://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 http://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 http://code.taobao.org/svn/oceanbase/trunk/ ob-src-dir svn co http://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 #lib下是OceanBase一些运行时依赖的库文件。 |-- bin #bin下是可执行文件,其中 chunkserver mergeserver rootserver updateserver这四个是我们的主要服务程序, 其它为工具程序. |-- @etc #etc下为配置文件,参考文档最后的说明 | |-- rootserver.conf | |-- mergeserver.conf | |-- chunkserver.conf | |-- updateserver.conf | `-- schema.ini #示例schema(即表定义) | `-- @data #Oceanbase数据库及日志所在文件夹 |-- 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 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


相关文章 相关文档 相关视频



我们该如何设计数据库
数据库设计经验谈
数据库设计过程
数据库编程总结
数据库性能调优技巧
数据库性能调整
数据库性能优化讲座
数据库系统性能调优系列
高性能数据库设计与优化
高级数据库架构师
数据仓库和数据挖掘技术
Hadoop原理、部署与性能调优

 
分享到
 
 
     


MySQL索引背后的数据结构
MySQL性能调优与架构设计
SQL Server数据库备份与恢复
让数据库飞起来 10大DB2优化
oracle的临时表空间写满磁盘
数据库的跨平台设计
更多...   


并发、大容量、高性能数据库
高级数据库架构设计师
Hadoop原理与实践
Oracle 数据仓库
数据仓库和数据挖掘
Oracle数据库开发与管理


GE 区块链技术与实现培训
航天科工某子公司 Nodejs高级应用开发
中盛益华 卓越管理者必须具备的五项能力
某信息技术公司 Python培训
某博彩IT系统厂商 易用性测试与评估
中国邮储银行 测试成熟度模型集成(TMMI)
中物院 产品经理与产品管理
更多...