在CentOS6上编译并单机部署OceanBase0.4

文/likai 2015-12-31 07:11:00

在CentOS6上编译并单机部署OceanBase0.4

下载代码

  • 下载OceanBase代码

OceanBase目前只开源到了0.4版本,github地址为[https://github.com/alibaba/oceanbase]

git clone git@github.com:alibaba/oceanbase.git
  • 下载tblib代码

编译OceanBase需要依赖淘宝开源的基础库tblib,项目地址为[http://code.taobao.org/svn/tb-common-utils/],我克隆了一份到自己的github

git clone git@github.com:kayaklee/tb-common-util.git
  • 下载gtest和gmock

编译OceanBase需要依赖google开源的gtest和gmock的1.6.0版,由于众所周知的原因,我们经常不能成功的下载它们,因此我下载后上传到了美团云存储

gtest地址 [http://share-495949.mtmssdn.com/oceanbase/gtest-1.6.0.zip]
gmock地址 [http://share-495949.mtmssdn.com/oceanbase/gmock-1.6.0.zip]

编译准备

  • 安装OceanBase自带的编译依赖包

进入代码目录oceanbase/oceanbase0.4/libeasyrpm,安装编译rpm包

sudo rpm -ivh *.el6.x86_64.rpm
#可忽略屏幕输出的下面两个警告
#warning: user ds does not exist - using root
#warning: group ds does not exist - using root
  • 安装gtest/gmock
# 安装gtest
wget http://share-495949.mtmssdn.com/oceanbase/gtest-1.6.0.zip
unzip gtest-1.6.0.zip
cd gtest-1.6.0
./configure
make
sudo cp -rf include/* /usr/local/include/
sudo ./libtool --mode=install cp lib/libgtest.la /usr/local/lib/

# 安装gmock
wget http://share-495949.mtmssdn.com/oceanbase/gmock-1.6.0.zip
unzip gmock-1.6.0.zip
cd gmock-1.6.0
./configure
make
sudo cp -rf include/* /usr/local/include/
sudo ./libtool --mode=install cp lib/libgmock.la /usr/local/lib/
  • 安装其他依赖依赖包
sudo yum install lzo-devel snappy-devel curl-devel libaio-devel mysql-devel -y
  • 安装tblib

安装tblib需要先新建一个目录,用于发布tblib的头文件和库文件,然后设置环境变量TBLIB_ROOT为这个目录

mkdir ~/tblib/
export TBLIB_ROOT=~/tblib/
cd tb-common-util/trunk
./build.sh
# 编译完成后,tblib的头文件和库文件会被自动拷贝到$TBLIB_ROOT指向的目录
  • 设置环境变量
export EASY_ROOT=/usr
export EASY_LIB_PATH=/usr/lib64
export DRC_ROOT=/home/ds
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ds/lib64

编译

进入代码目录oceanbase/oceanbase_0.4/,使用build.sh构建configure

./build.sh init

使用configure构建Makefile

./configure --with-release

编译src目录源代码

cd src
make

部署

OceanBase各个server的启动并不需要配置文件,涉及机器地址等几个关键配置项都是通过命令行参数传入的,其他配置项则在集群启动后通过内部表修改,当然也可以在server启动时通过命令行参数传入,不过填写比较繁琐。因此我们按照OceanBase默认要求的目录位置进行部署。我们确定本次启动集群的名字为obtest,后面多处会用到。

OceanBase运行目录默认要建立在/home/admin/oceanbase/下,并建立如下目录结构

/home/admin/oceanbase/
├── bin
├── data
│   ├── 1  #chunkserver数据目录,多块盘则按顺序编号
│   │   └── obtest  #集群名字为obtest
│   │       └── sstable
│   ├── rs  #rootserver数据目录
│   ├── rs_commitlog  #rootserver RedoLog目录
│   ├── ups_commitlog  #updateserver RedoLog目录
│   └── ups_data  #updateserver数据目录,多个raid目录表示副本,raid内支持多个store目录
│       └── raid0
│           ├── disk0  #ups数据存储目录,这个可以随命名,也不必一定要放在这里,实际部署时一般是磁盘挂载点
│           └── store0 -> disk0/  #storeN必须是指向一个存储目录的软连接
├── etc
└── lib

拷贝代码目录的编译产出物到运行目录

# 拷贝可执行文件
cp src/chunkserver/chunkserver /home/admin/oceanbase/bin
cp src/updateserver/updateserver /home/admin/oceanbase/bin
cp src/rootserver/rootserver /home/admin/oceanbase/bin
cp src/mergeserver/mergeserver /home/admin/oceanbase/bin
cp src/rootserver/rs_admin /home/admin/oceanbase/bin
# 拷贝动态库
cp src/common/compress/.libs/liblzo_1.0.so /home/admin/oceanbase/lib
cp src/common/compress/.libs/libsnappy_1.0.so /home/admin/oceanbase/lib
cp src/common/compress/.libs/libnone.so /home/admin/oceanbase/lib

建立schema文件,OceanBase0.4极大简化了schema文件的配置,内部表和用户表schema都不需要写在这个文件,而是都通过SQL语句修改,并保存在内部表中。只需要在/home/admin/oceanbase/etc/目录中建立schema.ini文件,并写入如下内容:

cat /home/admin/oceanbase/etc/schema.ini
[app_name]
name=obtest  #OceanBase集群名字,这里我命名为obtest,需要与后续启动server命令行中的一致
max_table_id=2000

启动server

进入/home/admin/oceanbase目录,假设本机IP地址保存在IP变量中,并设置环境变量

IP=`hostname -i`
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/admin/oceanbase/lib
  • 启动rootserver
#rootserver启动在2500端口,并把本机设置为主rootserver
./bin/rootserver -i bond0 -r $IP:2500 -R $IP:2500 -C 1
  • 启动chunkserver
#chunkserver启动在2600端口,并配置本集群的rootserver地址端口,集群名字为obtest
./bin/chunkserver -i bond0 -n obtest -D ./data -p 2600 -r $IP:2500
  • 启动updateserver
#updateserver启动在2700端口,并绑定一个内部通信用的2701端口
./bin/updateserver -i bond0 -n obtest -m 2701 -p 2700 -r $IP:2500
  • 启动listener mergeserver
#mergeserver启动在2800端口,作为listener mergeserver它要为rootserver的bootstrap过程提供SQL服务,因此绑定mysql协议端口为2828
./bin/mergeserver -i bond0 -p 2800 -z 2828 -r $IP:2500
  • bootstrap,命令rootserver成为主rootserver,并开始执行bootstrap过程,以初始化各个内部表和schema
#rs_admin默认给本地2500端口的rootserve发送命令
./bin/rs_admin set_obi_role -o OBI_MASTER
#超时时间120s,执行bootstrap
./bin/rs_admin -t 120000000 boot_strap
#bootstrap成功后,可以使用mysql客户端登陆2828端口

mysql -uadmin -padmin -h127.0.0.1 -p2828
#0.4版本没有databases概念,show tables会直接列出所有表,包括内部表
mysql> show tables;
+-----------------------+
| table_name            |
+-----------------------+
| __first_tablet_entry  |
| __all_all_column      |
| __all_join_info       |
| __all_client          |
| __all_cluster         |
| __all_server          |
| __all_server_session  |
| __all_server_stat     |
| __all_statement       |
| __all_sys_config      |
| __all_sys_config_stat |
| __all_sys_param       |
| __all_sys_stat        |
| __all_table_privilege |
| __all_trigger_event   |
| __all_user            |
+-----------------------+
16 rows in set (0.00 sec)

至此OceanBase已成功启动,可以使用mysql客户端执行操作了。

知识共享许可协议
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。

最新文章 全部