【简介】

OBDeploy是OceanBase集群部署的工具,可以通过简单的几行命令,就能快速的进行OceanBase部署。但对于初学者来讲,可能会比较困惑,Deploy到底做了哪些事情?里面的具体步骤有哪些?虽然部署会成功,可能对于细节还是一头雾水。万一部署失败,排障的过程就会非常麻烦,所以我们尝试脱离OBDeploy,进行手工部署OceanBase集群,以了解一下具体的安装细节。

另外一方面,用OBDeploy部署,有一些莫名其妙的限制。比如目录是动态MD5生成,安装包是在/home/admin目录下,等等。这些限制对于标准化部署,可能不是那么标准。所以,脱离OBDeploy,部署OCeanbase,也有实际意义。

【场景选择】

OceanBase部署的场景很多,有单机,本机,群集,是否带OBProxy等等。在OBDeploy中,example目录下,有一些示例模板。

模板名称 说明
distributed-example.yaml 服务器内存>50G, 多节点部署
distributed-with-obproxy-example.yaml 服务器内存>50G,多节点部署,并且部署obproxy
local-example.yaml 服务器内存>50G, 本机单节点部署,只有一个zone
mini-distributed-example.yaml 服务器内存小,多节点部署。
mini-distributed-with-obproxy-example.yaml 服务器内存小,多节点部署。并且部署obproxy
mini-local-example.yaml 服务器内存小,本机单节点部署,只有一个zone
mini-single-example.yaml 服务器内存小,远程单节点部署,只有一个zone
mini-single-with-obproxy-example.yaml 服务器内存小,单节点部署,单zone,且部署obproxy
single-example.yaml 服务器内存>50G, 单节点部署,只有一个zone
single-with-obproxy-example.yaml 服务器内存>50G, 单节点部署,单zone, 有obproxy

这里,我们选择mini-distributed-example.yaml这个模板。Mini指的是我们服务器内存小,测试用途。实际规格是20C 256G,distributed指的是三节点部署。我们跳过obproxy的安装,因此选用该模板。 我们用RPM包的方式进行安装。

准备如下四台服务器:

SERVERA 	10.10.10.8	[中控机,可以用虚拟机,用于从外网下载RPM包,以及OBDEPLOY工具]
SERVERB 	10.10.10.139
SERVERC 	10.10.10.135
SERVERD 	10.10.10.133

PS:SERVERB, SERVERC, SERVERD需要用物理机。虚拟机会在群集创建的步骤,非常容易超时,导致搭建失败

【环境准备】

1.在所有服务器上,创建用户obuser

sudo useradd obuser;  sudo passwd obuser

2.切换到obuser账号,创建SSH

ssh-keygen –t RSA

3.把obuser账号加入到sudoer中

sudo visudo

4.在中控机器上,.ssh目录下,复制key:

ssh-copy-id obuser@10.10.10.111
ssh-copy-id obuser@10.10.10.131 
ssh-copy-id obuser@10.10.10.138

5.在中控机上,wget下载:
http://mirrors.aliyun.com/oceanbase/community/stable/el/7/x86_64/
这里选择的版本是当前的版本,如果有最新的,应该选择最新的版本:

libobclient-2.0.0-2.el7.x86_64.rpm
obclient-2.0.0-2.el7.x86_64.rpm
ob-deploy-1.0.2-2.el7.x86_64.rpm
obproxy-3.1.0-1.el7.x86_64.rpm
oceanbase-ce-3.1.0-2.el7.x86_64.rpm
oceanbase-ce-libs-3.1.0-2.el7.x86_64.rpm
oceanbase-ce-sql-parser-3.1.0-2.el7.x86_64.rpm

并把该下载的文件,传递到SERVERB, SERVERC, SERVERD上。

scp *.rpm obuser@10.10.10.111:~
scp *.rpm obuser@10.10.10.131:~
scp *.rpm obuser@10.10.10.138:~

【服务器准备】

1)在每台工作机上,修改环境变量:

sudo sed -i '$a vm.max_map_count=655360\nfs.aio-max-nr=1048576' /etc/sysctl.conf
sudo sed -i '$a* soft nofile 655350\n* hard nofile 655350\n* soft nproc 655360\n* hard nproc 655360' /etc/security/limits.d/20-nproc.conf
sudo sed -i '$a* soft nofile 655350\n* hard nofile 655350\n* soft nproc 655360\n* hard nproc 655360\n* hard core unlimited\n* soft core unlimited\n* hard stack 10240\n* soft stack 10240\n* hard cpu unlimited\n* soft cpu unlimited' /etc/security/limits.conf

并重启使得生效。

2)在每台工作机上,安装ocenabase:

sudo yum install oceanbase-ce-libs-3.1.0-2.el7.x86_64.rpm
sudo yum install  oceanbase-ce-3.1.0-2.el7.x86_64.rpm

安装程序会把oceanbase安装到 /home/admin/oceanbase目录下。该目录并非是我们所期望的,所以做如下调整:

cd /home/obuser
sudo mv /home/admin/oceanbase .
sudo chown –R obuser:obuser /home/obuser/oceanbase

3)库路径处理

下面步骤需要操作一下,如果不处理的话,群集可能会搭建不起来。(虽然服务可以起来)。

sudo mv /home/obuser/oceanbase/lib /home/obuser/oceanbase/libs
ln –sf /home/obuser/oceanbase/libs /home/obuser/oceanbase/lib

在每台机器上, export环境变量LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/home/obuser/oceanbase/lib:$LD_LIBRARY_PATH 

或者可以直接修改.bashrc文件,使得一直生效。

我们可以运行下面命令:

/home/obuser/oceanbase/bin/observer –help 

来验证observer是否能打印帮助信息。

【数据目录准备】

在每台机器上,创建数据目录:

sudo mkdir /data/observer
sudo chown -R obuser:obuser /data/observer

mkdir -p /data/observer/admin;
mkdir -p  /data/observer/.conf
mkdir -p /data/observer/log;
mkdir -p /data/observer/store;

mkdir -p /data/observer/store/sstable
mkdir -p /data/observer/store/clog
mkdir -p /data/observer/store/ilog
mkdir -p /data/observer/store/slog

备注,如果后续群集搭建不成功,需要将整个目录清空。所以需要准备好清理脚本:在重建之前,必须保持目录干净:

sudo kill -9 `pidof observer`
rm -fr /data/observer/log/*
rm -fr /data/observer/run/mysql.sock
rm -fr /data/observer/run/observer.pid
rm -fr /data/observer/store/clog_shm
rm -fr /data/observer/store/ilog_shm
rm -fr /data/observer/store/clog/1
rm -fr /data/observer/store/ilog/1
rm -fr /data/observer/store/slog/1
rm -fr /data/observer/store/sstable/block_file

【启动服务】

我们启动observer的时候,一定要到 /data/observer目录下进行启动。

cd /data/observer   // 要在该目录下启动服务

第一台服务器上,运行如下命令,启动:

/home/obuser/oceanbase/bin/observer -r '10.10.10.111:5022:2883;10.10.10.131:5022:2883;10.10.10.138:5022:2883’ -o datafile_size=16G,memory_limit=8G,system_memory=4G,stack_size=512K,cpu_count=8,cache_wash_threshold=1G,workers_per_cpu_quota=10,schema_history_expire_time=1d,net_thread_count=4,major_freeze_duty_time=Disable,minor_freeze_times=10,enable_separate_sys_clog=0,enable_merge_by_turn=False,datafile_disk_percentage=20,idc='idc1' -z 'zone1' -p 2883 –P5022 -c 11 -d /data/observer/store -i eth0 –n myapp –l ERROR

第二台服务器上,启动如下命令:

/home/obuser/oceanbase/bin/observer -r '10.10.10.111:5022:2883;10.10.10.131:5022:2883;10.10.10.138:5022:2883' -o datafile_size=16G,memory_limit=8G,system_memory=4G,stack_size=512K,cpu_count=8,cache_wash_threshold=1G,workers_per_cpu_quota=10,schema_history_expire_time=1d,net_thread_count=4,major_freeze_duty_time=Disable,minor_freeze_times=10,enable_separate_sys_clog=0,enable_merge_by_turn=False,datafile_disk_percentage=20,idc='idc2' -z 'zone2' -p 2883 –P5022 -c 11 -d /data/observer/store -i eth0 –n myapp –l ERROR

第三台服务器上,启动如下命令:

/home/obuser/oceanbase/bin/observer -r '10.10.10.111:5022:2883;10.10.10.131:5022:2883;10.10.10.138:5022:2883' -o datafile_size=16G,memory_limit=8G,system_memory=4G,stack_size=512K,cpu_count=8,cache_wash_threshold=1G,workers_per_cpu_quota=10,schema_history_expire_time=1d,net_thread_count=4,major_freeze_duty_time=Disable,minor_freeze_times=10,enable_separate_sys_clog=0,enable_merge_by_turn=False,datafile_disk_percentage=20,idc='idc3' -z 'zone3' -p 2883 –P5022 -c 1 -d /data/observer/store -i eth0 –n myapp –l ERROR

服务启动应该不会有什么问题,也很少会报错。

【群集搭建】

群集启动后,我们用如下命令进行登录:

Mysql –h 10.10.10.111 –port 2883 –u root

登录后,执行下面的命令创建群集

alter system bootstrap REGION "sys_region" ZONE "zone1" SERVER "10.10.10.111:5022",REGION "sys_region" ZONE "zone2" SERVER "10.10.10.131:5022",REGION "sys_region" ZONE "zone3" SERVER "10.10.10.138:5022";

这步在物理机上,一般耗时30秒左右。但如果是虚拟机的话,可能部署的时间会更长。系统超时是10分钟。如果部署条件不符合的话,最终的结果也是超时,所以,如果创建集群超过3分钟都还没有完成的话,应该是前面的配置出现问题了。