OceanBase Quick Start From Sourcecode
来源:互联网 发布:免费字体软件下载 编辑:程序博客网 时间:2024/06/05 19:38
概述
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" >> ~/.bashrcecho "export LD_LIBRARY_PATH=/usr/lib/:/usr/local/lib:$TBLIB_ROOT/lib:$HOME/ob-install-dir/lib:$LD_LIBRARY_PATH" >> ~/.bashrcsource ~/.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.gztar 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
【注意:Oceanbase默认使用LZO进行压缩/解压缩,如果$LD_LIBRARY_PATH设置不正确,运行过程中会发生Core Dump】
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.gztar 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变量没有配置正确,请确定libsnappy.so.1所在目录并加入到$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/project/view/3/ 以了解更多情况。 注意,安装和使用tbnet和tbsys之前,要设置好 TBLIB_ROOT 这个环境变量,这个环境变量指示了安装tbnet和tbsys库的路径.
用如下命令下载源码并编译安装:
cd ~export TBLIB_ROOT=$HOME/ob-install-dirsvn 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/includecp -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-dirsvn co http://code.taobao.org/svn/OceanBase/trunk/ ob-src-dir
编译安装
(cd ob-src-dir; cd oceanbase; ./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-dircp bin/single-machine-bootstrap ./ #拷贝脚本到当前目录 ./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-dirbin/rootserver -f etc/rootserver.confbin/updateserver -f etc/updateserver.confbin/mergeserver -f etc/mergeserver.confbin/chunkserver -f etc/chunkserver.conf
当然,OceanBase并不强制要求四个Server的启动顺序。
Server都作为daemon运行,可以用如下命令查看对应的log:
cd $HOME/ob-install-dirtail -f data/log/rootserver.logtail -f data/log/updateserver.logtail -f data/log/mergeserver.logtail -f data/log/chunkserver.log
在成功启动OceanBase后,按照默认的配置认生成了一个名为test的表。这个表是典型的kv数据表,可以使用OceanBase提供的API读写这个表。 如有运行有问题,可以参考后面关于配置的更加详细的解释。
使用OceanBase
创建一个简单的的数据库
上一步我们执行了命令:
./single-machine-bootstrap init
可以看到,在${HOME}/ob-install-dir/etc目录下生成一个shema.ini文件。它定义了表格的schema(schema详细文档见:Schema说明文档)
[app_name]name=testmax_table_id=1002[table]table_id=1001max_column_id=27table_type=1rowkey_is_fixed_length=0column_info=1,2,name,varchar,128column_info=1,3,value,introwkey_max_length=17rowkey_split=0
可以看到,创建的默认表格包含两列,第一列的列ID为2,字符串类型,长度不能超过128字节,第二列的列ID为3,是64整数类型。下面我们将使用obsql客户端工具对默认的表格进行增删查改操作。
obsql的使用介绍
obsql提供了简单的SQL功能,利用它可以实现对数据的增删改查,也可以实现对server的状态的查看,关于它的详细使用情况,请参考该页面:http://code.taobao.org/trac/OceanBase/wiki/OceanBase控制台使用说明
首先进入到obsql所在的目录
cd ${HOME}/ob-install-dir/bin
登陆到obsql的命令是:
./obsql -h root_server_ip -p root_server_port [-q] [-?/--help]
其中root_server_ip指定了root_server的ip地址,root_server_port指定了RootServer的端口号,-q将日志设置到ERROR级别 假设我们要登陆到的oceanbase机器的本地机器, 端口号是2542,执行下面的命令
./obsql -h localhost -p 2542
登陆后会显示obsql的提示符。
命令成功执行后进入obsql的控制台。要获取命令的帮助,输入
obsql>help
则会得到相关命令的使用方法
要查看应用的schema的话,输入show schema
obsql>show schema
这样就能显示出schema的信息,这个信息是和schema.ini是一致的
如果要查看各个server的状态的话,执行show state命令,
show stats update_server [XXX.XXX.XXX.XXX]
[XXX.XXX.XXX.XXX]指定了这个server所在的地址。假如我们的update_server部署在本地机器上,我想查看它的状态的话,就输入
obsql>show stats update_server localhost
其状态如下
向表中添加数据,
insert into tablename values(XXX, ..., XXX) where rowkey=(XXX)
tablename指定要插入的表的名称,values后面的括号,指定了要插入的数据的各列的值。rowkey后面的括号中指定了新纪录的rowkey的值。以上面的表为例子,我们只需要指定一个新的rowkey,且其长度小于17个字节
obsql>insert into table values("a", 1) where rowkey=(10000000)
如果插入成功,我们可以在输出中看到“INSERT runs successfully"。
在数据库中插入数据之后,我们就可以进行查询,
select * from tablename where rowkey=(XXX)
命令中的各个字段的意义和insert操作中的意义保持一致,继续以上面的表为例子
obsql>select * from table where rowkey=(10000000)
成功执行以后,显示如下:
【注意,select可能返回-3003错误,这是因为集群第一次启动需要初始化,大约需要几分钟,这时需要grep $HOME/ob-install-dir/data/log/rootserver.log,当出现“build new root table ok”日志时,表示集群第一次初始化完成】
如果想要对表中的数据进行修改的话,需要执行update命令
update tablename set column1=XXX where rowkey=(***)
tablename指定了要修改的表的名称,column1应该修改为你想要修改的列的列名.
obsql>update table set name="b" where rowkey=(10000000)
如果修改成功,我们可以在输出结果中看到“UPDATE runs successfully”。
查询一下,发现相应的数据已经被修改
如果你想要删除指定行的数据的话,
obsql>delete from table where rowkey=(10000000)
如果删除成功,我们可以在输出结果中看到“DELETE runs successfully”。
查询以后,发现相关数据已经被删除:
配置文件说明
OceanBase提供表格存储服务,所以首先要有一个schema文件描述表格,其次RootServer, UpdateServer, ChunkServer和MergeServer都有自己的配置文件。 四个Server的配置文件是在启动Server时通过命令行参数指定的,schema文件的路径是在RootServer的配置文件中指定的。
关于数据库schema配置文件
一个schema配置文件描述一个应用,一个应用可以有多个表格,配置文件中要指定应用的名字,及每个表的名字,每一列的名字,类型等信息。 详细的请参考该页面:http://code.taobao.org/trac/OceanBase/wiki/schema
[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文件的路径等。
[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.conf
UpdateServer的配置主要指定自己的地址及RootServer的地址, 数据的存储目录等信息。
[update_server] dev_name = updateserver监听的网卡名称,如eth0 vip = updateserver的VIP设备地址,用来实现热备,开发环境中只需要单updateserver,这里指定为updateserver地址即可 port = updateserver的监听端口 ups_inner_port=updateserver的低优先级监听端口,以用于每日合并 store_root = sstable文件存储的根目录 必须是相对目录 raid_regex = store_root下raid目录名的匹配式 dir_regex = raid目录下指向磁盘实际目录的软链接的名字匹配式 log_sync_type = 1 updateserver写操作日志的方式,1表示每次批处理都写磁盘并且sync,0表示操作日志将在内存中积累到2M后才写入磁盘,在配备了带缓存raid卡的机器上可以配置为1;普通机器建议配置为0,否则写操作的速度将会很慢 [root_server] vip = rootserver的VIP设备地址 port = rootserver的监听端口
关于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
- OceanBase Quick Start From Sourcecode
- Quick Start
- Quick Start
- Use ant checkout sourcecode from CVS/SVN
- WAP Push Quick Start
- Purify Quick Start
- [Avalon] Quick Start
- CodeSmith Quick Start Guide
- JavaMail quick start
- Ibatisnet Quick Start
- Ibatisnet Quick Start
- KGDB Quick Start
- dom4j Quick start
- Resin Installation Quick Start
- iBatisnet Quick Start(转)
- OpenLDAP Quick Start Guide
- squid quick start
- DOJO Quick Start
- POJ 1584 判断凸包,点在多边形内外,点到直线最短距离
- 高效读写DB---目标
- 黑马程序员_单一职责原则
- top,parent,opener,iframe
- 怎么样减少模板特化的代码臃肿
- OceanBase Quick Start From Sourcecode
- 她和他的故事
- 编辑框(Edit)消息
- 链表翻转的递归和非递归算法
- 堆排序java语言描述
- 颜色对照表
- 黑马程序员_基础加强(5) 注解
- SQL语句大全
- CCommandLineInfo详解-启动不创建新文档