OceanBase手动安装步骤

— 本帖被 mq4096 执行加亮操作(2019-02-21) —
一、安装前的准备

1. 安装方式选择
OceanBase是一个集群数据库,至少要三个节点。通常三个节点是要在三台机器上。有关OceanBase的介绍请参考官网 http://oceanbase.alipay.com/docs  。

官网上提供了一个安装包的下载,地址是: OceanBase安装包下载链接 。 这个安装包里的内容很多。很大一部分是OCP的安装包以及相关安装说明。详细查看 安装包组件说明 。
我们只需要里面的2个文件。

$unzip ocp-release.zip
$cd ocp-release/
$tar zxvf ocp-setup.tar.gz
$cd ocp_yh

$ls -lrth obproxy-1.3.3-1506155.el7.x86_64.rpm oceanbase-1.4.60-1571952.el7.x86_64.rpm

-rwxr-xr-x 1 admin admin  36M May 11  2018 oceanbase-1.4.60-1571952.el7.x86_64.rpm
-rwxr-xr-x 1 admin admin 5.4M May 11  2018 obproxy-1.3.3-1506155.el7.x86_64.rpm

这两个文件就是我们后面安装需要的。一个是observer的安装包,一个是obproxy的安装包。

由于环境的权限限制,服务之间不能直接打通ssh通道,并且默认也不允许开启80端口和图形化界面,导致我无法使用官网推荐的2种方式安装。于是,我就一步步从命令行下安装OceanBase集群。从这个步骤里也可以看出一些OceanBase的原理。 实际过程并不复杂,很容易掌握。

2. 部署要求

项目 描述
机型要求 建议物理机。如果是vmware虚拟出来的虚拟机也行,只是cpu、内存和磁盘不要太低。
操作系统 推荐redhat 7.2, centos 7.2 。  7.x 应该也可以。具体问题具体分析。
内存 推荐64G以上,生产环境建议256G以上。如果只是研究功能 8G以上。比这个还小,后面使用不熟悉的话,会误以为有很多问题。
磁盘 推荐普通ssd即可,生产环境也不需要高密度ssd盘。如果只是研究功能,用sata或sas也行。就是性能会不怎么好(其他数据库同理)。
磁盘空间 内存的4倍以上。生产环境建议1T以上。 如果只是研究功能,至少也要100G以上。比这个还小,后面使用不熟悉的话,会误以为有问题。
文件系统 ext4, xfs都可以。
网卡 推荐千兆互联以上。生产环境建议万兆互联。节点间的网络延时对OB的性能会有很大影响,所有的分布式产品都如此。
CPU 至少16核以上,生产环境建议32核以上。cpu太少,没法体验OB的多租户功能。

3. OS环境准备

这里就参见官方文档 修改操作系统配置 ,挑几个重要的提一下。

ulimit用于限制shell启动进程所占用的资源。有两种方法可以修改资源限制,一种是通过启动时session级别指定,另外一种是修改/etc/security/limits.conf配置文件,全局生效。
OBServer进程涉及的几个限制包括线程最大栈空间大小(stack),最大文件句柄数(openfiles),core文件大小(core file size)。

[size=font-size: 10.5pt,10.5pt]$vi /etc/security/limits.conf添加
[size=font-size: 10.5pt,10.5pt]*  soft  nofile  655350
[size=font-size: 10.5pt,10.5pt]*  hard  nofile  655350
[size=font-size: 10.5pt,10.5pt]*  soft  stack    20480
[size=font-size: 10.5pt,10.5pt]*  hard stack     20480
[size=font-size: 10.5pt,10.5pt]*  soft    nproc    655360
[size=font-size: 10.5pt,10.5pt]*  hard    nproc    655360
[size=font-size: 10.5pt,10.5pt]*  soft  core    unlimited
[size=font-size: 10.5pt,10.5pt]*  hardcore     unlimited

稍微提一下的是目录准备。每个节点都会写数据和日志。根据经验数据和日志盘在底层要分离。如果能在raid层面隔离是最好的。如果做不好,那就用LVM在逻辑层面做隔离(即做不同的LV)
下面是我的环境

$sudo lvs -a
LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
data vgob -wi-ao---- 10.97t
log  vgob -wi-ao----  1.05t

$cat /etc/fstab

LABEL=log1              /data/log1              ext4            defaults,noatime,nodiratime,nodelalloc,barrier=0        0 0
LABEL=data1             /data/1         xfs             defaults,noatime,nodiratime,barrier=0   0 0

sysctl.conf修改

#  for oceanbase
net.core.somaxconn = 2048
net.core.netdev_max_backlog = 10000
net.core.rmem_default = 16777216
net.core.wmem_default = 16777216
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

net.ipv4.ip_local_port_range = 3500 65535
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_slow_start_after_idle=0

vm.swappiness = 0
kernel.core_pattern = /data/1/core-%e-%p-%t
vm.min_free_kbytes = 2097152
vm.max_map_count=655360

4. 机器准备

IP Zone 描述
xxx.xxx.171.187 zone1 observer 节点,rootservice 所在机器之一
xxx.xxx.241.129 zone1 observer 节点
xxx.xxx.240.24 zone2   observer 节点,rootservice 所在机器之一
xxx.xxx.241.145 zone2   observer 节点
xxx.xxx.241.125 zone3    observer 节点,rootservice 所在机器之一
xxx.xxx.241.159 zone3   observer 节点
xxx.xxx..242.22 NA obproxy 机器,一台就够了,可以部署多台,也可以复用 observer节点。

zone 是对机器的划分。一个oceanbase集群的机器至少划分为三个zone。通常数据至少有三份,分布在每个zone里面。二、安装启动OBServer

1. 安装软件包

OceanBase是一个集群,但是安装却很简单,只需要在每个节点安装一个observer的rpm包(有2个依赖包 snappy和lzo需要先安装一下),然后启动即可。

$sudo yum -y install snappy lzo
$sudo rpm -ivh oceanbase-1.4.60-1571952.el7.x86_64.rpm

2. 准备数据库目录

在启动 OBServer之前,需要准备一些数据目录。并且启动用户建议是 admin。 admin需要sudo权限。假设我要搭建的数据库集群叫 obdemo 。下面目录里会用到这个名字。
关于目录结构不多解释,待OB集群搭建成功后大家可以再去研究其目录。

su - admin
mkdir -p /data/1/obdemo/
cd /data/1/obdemo/
mkdir -p etc3  sort_dir  sstable
mkdir -p /data/log1/obdemo/
cd /data/log1/obdemo/
mkdir -p clog  etc2  ilog  oob_clog  slog
mkdir -p /home/admin/oceanbase/store/obdemo
cd /home/admin/oceanbase/store/obdemo/
ln -s /data/1/obdemo/sort_dir /home/admin/oceanbase/store/obdemo/sort_dir
ln -s /data/1/obdemo/sstable /home/admin/oceanbase/store/obdemo/sstable
ln -s /data/log1/obdemo/clog /home/admin/oceanbase/store/obdemo/clog
ln -s /data/log1/obdemo/ilog /home/admin/oceanbase/store/obdemo/ilog
ln -s /data/log1/obdemo/oob_clog /home/admin/oceanbase/store/obdemo/oob_clog
ln -s /data/log1/obdemo/slog /home/admin/oceanbase/store/obdemo/slog
$ls -lrth /home/admin/oceanbase/store/obdemo/
total 0
lrwxrwxrwx 1 admin admin 23 Oct  6 21:10 sort_dir -> /data/1/obdemo/sort_dir
lrwxrwxrwx 1 admin admin 22 Oct  6 21:10 sstable -> /data/1/obdemo/sstable
lrwxrwxrwx 1 admin admin 22 Oct  6 21:10 clog -> /data/log1/obdemo/clog
lrwxrwxrwx 1 admin admin 22 Oct  6 21:10 ilog -> /data/log1/obdemo/ilog
lrwxrwxrwx 1 admin admin 26 Oct  6 21:10 oob_clog -> /data/log1/obdemo/oob_clog
lrwxrwxrwx 1 admin admin 22 Oct  6 21:10 slog -> /data/log1/obdemo/slog

从这个目录结构里就可以看出数据和日志是分开存储了。

3. 启动observer

此前规划的6台机器,分属于3个zone。 启动参数 大部分相同,只是zone的名字要改一改。

$bin/observer --help
bin/observer --help
observer [OPTIONS]
-h,--help                print this help
-z,--zone ZONE           zone
-p,--mysql_port PORT     mysql port
-P,--rpc_port PORT       rpc port
-N,--nodaemon            don't run in daemon
-n,--appname APPNAME     application name
-c,--cluster_id ID       cluster id
-d,--data_dir DIR        OceanBase data directory
-i,--devname DEV         net dev interface
-o,--optstr OPTSTR       extra options string
-r,--rs_list RS_LIST     root service list
-l,--log_level LOG_LEVEL server log level

所有zone1 机器的observer启动命令:

cd /home/admin/oceanbase && /home/admin/oceanbase/bin/observer -i bond0 -P 2882 -p 2881 -z zone1 -d /home/admin/oceanbase/store/obdemo -r 'xx.xxx.171.187:2882:2881;xx.xxx.240.24:2882:2881;xx.xxx.241.125:2882:2881' -c 2018100601 -n obdemo -o "datafile_disk_percentage=50,config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2"

高亮部分都是可以改的。在没有理解之前不要修改。  -n 指定的 appname,就是集群名,后面都会用到。 -r 后面列表里的ip 就是被选为rootservice的三台机器ip。
observer的启动目录必须是  /home/admin/oceanbase 。所以cd 那个命令不要忘记了。

datafile_disk_percentage=50 这个比例可以调整,默认是90(表示90%的磁盘分区空间会被OB占用)。如果你的磁盘空间想留一点给其他应用用。就缩小这个比例。当data和log目录是共用的时候,更要调小这个比例。否则observer启动会因为clog空间不足而失败。

$ps -ef | grep observer
admin     62603      1 99 Oct06 ?        2-00:59:16 /home/admin/oceanbase/bin/observer -i bond0 -P 2882 -p 2881 -z zone1 -d /home/admin/oceanbase/store/obdemo -r xx.xxx.171.187:2882:2881;xx.xxx.240.24:2882:2881;xx.xxx.241.125:2882:2881 -c 2018100601 -n obdemo -o config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2
admin    108165  61410  0 11:30 pts/1    00:00:00 grep --color=auto observer

所有zone2 机器的启动命令:

cd /home/admin/oceanbase && bin/observer -i bond0 -P 2882 -p 2881 -z zone2 -d /home/admin/oceanbase/store/obdemo -r 'xx.xxx.171.187:2882:2881;xx.xxx.240.24:2882:2881;xx.xxx.241.125:2882:2881' -c 2018100601 -n obdemo -o "config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2"
ps -ef | grep observer

所有zone3机器的启动命令

cd /home/admin/oceanbase && bin/observer -i bond0 -P 2882 -p 2881 -z zone3 -d /home/admin/oceanbase/store/obdemo -r 'xx.xxx.171.187:2882:2881;xx.xxx.240.24:2882:2881;xx.xxx.241.125:2882:2881' -c 2018100601 -n obdemo -o "config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2"
ps -ef | grep observer

此时,只是在每个机器上启动了observer,还并没有形成一个OceanBase集群。后面会初始化一个OceanBase集群。

备注:上面每个observer的启动参数很长,实际上只有第一次启动的时候需要这么写。等后面初始化OceanBase集群成功后,每个observer会自动把它所有参数写到一个配置文件里。默认在 /home/admin/oceanbase/etc/observer.config.bin 里, 这个配置文件很重要,所以observer允许额外通过参数config_additional_dir 指定存储多份,类似于oracle的控制文件。 三、初始化OceanBase集群

前面在每个机器节点上都启动了一个observer,其参数独特之处是都指定了一个 rootservice list。

-r 'xx.xxx.171.187:2882:2881;xx.xxx.240.24:2882:2881;xx.xxx.241.125:2882:2881'

这里面有3个ip,是被设计为存储rootservice 的机器。 在初始化oceanbase集群之前,这三台机器里至少有两台机器的observer必须启动,并且以同样的参数启动。初次安装我们默认三台机器的observer都启动了。

1. 清空所有数据文件(第一次不需要)

pkill observer
等待几秒钟
/bin/rm /home/admin/oceanbase/log/*log*
cd /data/log1/obdemo && /bin/rm -rf clog  etc2  ilog  oob_clog  slog
mkdir clog  etc2  ilog  oob_clog  slog
cd /data/1/obdemo && /bin/rm -rf etc3  sort_dir  sstable
mkdir etc3  sort_dir  sstable
ll ~/oceanbase/store/obdemo

这个命令是用于清空数据文件,重新执行后面步骤。第一次做的时候不需要(没有历史数据文件)。要做的时候,需要先到所有observer机器上 kill掉 observer,再跑该脚本。

2. 登录observer
选rootservice里任意一个机器登录,登录observer

$mysql -h127.1 -uroot -P2881 -p
空密码

此时进来之后,还不能执行 show database命令,因为元数据还没有构建好。

3. 执行 bootstrap
然后在mysql命令行下执行 bootstrap

mysql>alter system bootstrap ZONE 'zone1' SERVER 'xxx.xxx.171.187:2882', ZONE 'zone2' SERVER 'xxx.xxx.240.24:2882', ZONE 'zone3' SERVER 'xxx.xxx.241.125:2882';

这个命令通常几秒钟就返回了。如果没有返回或者很久以后报错timeout了,那说明前面有observer启动参数指定不对。看看是不是zone名称不对,或者rootservicelist里的ip和port跟 -P和-p 指定的port不一致等等。
找到原因解决问题后,执行第1步清空历史数据文件,重头来过。

这一步成功后,一个 1-1-1的OceanBase集群就初始化成功了。此时退出mysql命令行,重新登录的时候就要换下面命令了。

$mysql -h127.1 -uroot@sys -P2881 oceanbase -p
空密码

MySQL [oceanbase]> show databases;
+--------------------+
| Database           |
+--------------------+
| oceanbase          |
| information_schema |
| mysql              |
| test               |
+--------------------+

然而我准备了6台机器用于部署oceanbase集群,所以还需要把其他三台机器加入到 当前集群里。也就是扩容命令了。

4. 扩容oceanbase集群

ALTER SYSTEM ADD SERVER 'ip:port' [,'ip:port'…] [ZONE=’zone_name’];

mysql> alter system add server 'xxx.xxx.241.129:2882' zone='zone1';
mysql> alter system add server 'xxx.xxx.241.145:2882' zone='zone2';
mysql> alter system add server 'xxx.xxx.241.159:2882' zone='zone3';

注意端口号只需要指定 rpc port(2882), 以及zone不要加错。
加成功后,查看当前server列表

MySQL [oceanbase]> select zone,svr_ip,svr_port,with_rootserver ,build_version from __all_server order by zone, with_rootserver desc;
+-------+----------------+----------+-----------------+-------------------------------------------------------------------------------+
| zone  | svr_ip         | svr_port | with_rootserver | build_version                                                                 |
+-------+----------------+----------+-----------------+-------------------------------------------------------------------------------+
| zone1 | xxx.xxx.171.187 |     2882 |               1 | 1.4.60_1571952-758a58e85846f9efb907b1c14057204cb6353846(Mar  9 2018 14:32:07) |
| zone1 | xxx.xxx.241.129 |     2882 |               0 | 1.4.60_1571952-758a58e85846f9efb907b1c14057204cb6353846(Mar  9 2018 14:32:07) |
| zone2 | xxx.xxx.240.24  |     2882 |               0 | 1.4.60_1571952-758a58e85846f9efb907b1c14057204cb6353846(Mar  9 2018 14:32:07) |
| zone2 | xxx.xxx.241.145 |     2882 |               0 | 1.4.60_1571952-758a58e85846f9efb907b1c14057204cb6353846(Mar  9 2018 14:32:07) |
| zone3 | xxx.xxx.241.125 |     2882 |               0 | 1.4.60_1571952-758a58e85846f9efb907b1c14057204cb6353846(Mar  9 2018 14:32:07) |
| zone3 | xxx.xxx.241.159 |     2882 |               0 | 1.4.60_1571952-758a58e85846f9efb907b1c14057204cb6353846(Mar  9 2018 14:32:07) |
+-------+----------------+----------+-----------------+-------------------------------------------------------------------------------+
6 rows in set (0.00 sec)

备注:上面默认root@sys密码是空,生产环境一定要设置复杂密码。

MySQL [oceanbase]> alter user root identified by 'root';四、安装启动反向代理OBProxy

前面装好了一个 2-2-2的OceanBase集群,但是客户端要连接这个数据库集群,前面那种连接方式还不够好。因为要考虑到某个observer节点宕机问题。直连这个observer肯定不好。
此外,由于OceanBase是一个分布式数据库,数据可能分布在多个节点上,但具体在哪个机器上客户端是不知道的,所以需要一个反向代理OBProxy 来负责数据访问路由。

理论上obproxy可以安装在任何机器上。如安装在observer上,或者独立的机器上,或者应用服务器上。并且obproxy由于只做路由功能,非常轻量,无状态,支持安装多个obproxy。安装多个obproxy的时候,可以再前面再通过负载均衡机制(F5或者lvs,slb等)做一个vip,肩负起 obproxy的高可用和负载均衡作用。这样就不怕某个obproxy挂掉或者压力过大了。

1. 安装obproxy rpm包

sudo rpm -ivh obproxy-1.3.3-1506155.el7.x86_64.rpm
目录权限改到admin用户下。
chown -R admin.admin /opt/taobao/install/obproxy

2. 初始化obproxy用户

mysql> CREATE USER proxyro IDENTIFIED BY password '*e9c2bcdc178a99b7b08dd25db58ded2ee5bff050' ;
mysql> GRANT SELECT ON *.* to proxyro;

proxyro是个连接observer的只读帐号,obproxy会用到这个帐号。

3.  启动obproxy

第一次启动obproxy的时候,也需要指定一些参数。如rootservice 列表。以及指定监听端口(2883,也可以写别的任意端口,不跟已有端口冲突即可)

cd /opt/taobao/install/obproxy && bin/obproxy -r "xxx.xxx.171.187:2881; xxx.xxx.240.24:2881; xxx.xxx.241.125:2881" -p 2883 -o "enable_strict_kernel_release=false,enable_cluster_checkout=false" -c obdemo

查看日志确认是否有异常。

cd /opt/taobao/install/obproxy
tail -f log/obproxy.进程号.log

通过obproxy连接一下OceanBase集群

$mysql -h xxx.xxx.242.22 -uroot@sys#obdemo -P2883 -p oceanbase

或者

$mysql -h xxx.xxx.242.22 -uobdemo:sys:root -P2883 -p oceanbase

可以看出 跟连接mysql很像,区别在于 user的格式。 oceanbase的user格式是  “用户名@租户名#集群名” 或者 "集群名:租户名:用户名“ 等。五、分配租户(实例)

前面用6台机器搭建了一个2-2-2的OceanBase集群。现在某个应用需要申请一个数据库。我们并不会直接把这个OceanBase集群给到应用使用。
实际上刚初始化的OceanBase集群默认只有一个sys租户,其规格很小(cpu/memory/disk)。

MySQL [oceanbase]> select * from __all_unit_config where name='sys_unit_config';
+----------------------------+----------------------------+----------------+-----------------+---------+---------+-------------+-------------+----------+----------+----------------+---------------------+
| gmt_create                 | gmt_modified               | unit_config_id | name            | max_cpu | min_cpu | max_memory  | min_memory  | max_iops | min_iops | max_disk_size  | max_session_num     |
+----------------------------+----------------------------+----------------+-----------------+---------+---------+-------------+-------------+----------+----------+----------------+---------------------+
| 2018-10-06 21:05:49.881126 | 2018-10-06 21:05:49.881126 |              1 | sys_unit_config |       5 |     2.5 | 19423884214 | 16186570178 |    10000 |     5000 | 18578870894592 | 9223372036854775807 |
+----------------------------+----------------------------+----------------+-----------------+---------+---------+-------------+-------------+----------+----------+----------------+---------------------+
1 row in set (0.00 sec)

这个sys租户只有 2.5-5个cpu,15-18 G内存的规格。
所以要给业务帐号单独分配一个租户。这也是OceanBase使用的正确姿势。

有关租户、资源池等概念,详情参见 OceanBase开发和运维漫谈

1. 创建资源池规格

create resource unit unit_2c10g512g, max_cpu=2, max_memory='10G', min_memory='10G', max_iops=10000, min_iops=1000, max_session_num=1000000, max_disk_size=536870912;
create resource unit unit_4c20g1024g, max_cpu=4, max_memory='20G', min_memory='20G', max_iops=20000, min_iops=5000, max_session_num=1000000, max_disk_size=1073741824;
create resource unit unit_8c40g2048g, max_cpu=8, max_memory='40G', min_memory='40G', max_iops=50000, min_iops=10000, max_session_num=1000000, max_disk_size=2147483648;

查看资源规格

select * from __all_unit_config;

因为我的测试机器都是物理机,cpu和内存很大,所以我的多个规格定义的资源都比较大。大家可以根据自己情况修改。

2. 分配资源池

create resource pool pool_demo unit = 'unit_16c50g4096g', unit_num = 1;
select * from __all_resource_pool order by resource_pool_id desc ;

资源池分配后,只有创建租户并关联它才可以被使用。

3. 创建租户

create tenant t_obdemo resource_pool_list=('pool_demo');
---- alter tenant t_obdemo set variables ob_tcp_invited_nodes='xxx.xxx.0.0/16,127.0.0.1';

租户名可以自定义。

注释的alter语句是设置租户连接的白名单,安全性跟高。不过只有在1.4.7版本以后才有。
新租户默认root密码为空。老规矩,首先改密码。

mysql -h xxx.xxx.242.22 -uroot@t_obdemo#obdemo -P2883 oceanbase -A -p
alter user root identified by 'root';

4. 创建应用数据库和帐号

create database sbtest;
grant all privileges on sbtest.* to sbuser@'%' identified by 'sbtest';

连接应用数据库

mysql -h127.1 -usbuser@t_obdemo#obdemo -P2883 sbtest -A -psbtest
MySQL [sbtest]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| sbtest               |
+--------------------+
2 rows in set (0.02 sec) 总结

1.  OceanBase的安装首先是在各个机器上安装并启动observer,第一次启动时指定rootservice list和相关参数。
2.  初始化OceanBase集群。成功后,就可以逐台机器  重启一下observer。关闭方式就是 pkill 或者kill。  着急的话就kill -9 。 启动方式就是 cd /home/admin/oceanbase; bin/observer 第二次启动不需要指定参数,参数都在参数文件里。初始化proxyro用户。
3. 安装obproxy软件并启动。第一次启动也要指定rootservice和相关参数。启动成功后可以重启obproxy。关闭方式就是pkill或者kill。启动方式就是 cd /opt/taobao/install/obproxy; bin/obproxy  第二次启动不需要指定参数,参数都在参数文件里。
4. 分配资源创建租户
5. 在租户里创建业务数据库和帐号。