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. 在租户里创建业务数据库和帐号。