目前有关OceanBase功能、案例、故事的文章已经很多,对OceanBase感兴趣的朋友都想安装一个数据库试试。本文就是分享初学者如何手动搭建一个OceanBase集群。这也是学习理解OceanBase集群原理的第一步。在生产环境,我们有自动化运维平台OCP
可以负责生产环境的OceanBase集群部署和运维。同时官网上提供的下载文件里也有python脚本自动化部署OceanBase集群,大家熟悉了安装原理后就可以使用那个自动化脚本。
OceanBase是分布式数据库,以集群的形式存在,是share-nothing
架构。各个节点就是普通的x86
服务器,使用本地盘(SSD
),不依赖共享存储,也没有集群文件系统。各个节点之间网络互通即可,不需要直连线。所以OceanBase集群的搭建相比ORACLE RAC集群而言,还是很简单的。不过目前还不完美的是OceanBase对内存资源要求不低,建议学习环境每个节点在32G以上,64G更好。并且OceanBase集群至少包含三个节点,节点数以奇数递增。如果有三台机器更好,但是如果只有一台机器,但是内存够大(192G以上),那也可以启动三个OceanBase进程来模拟三个节点。
observer
安装OceanBase分布式数据库是以集群形式存在,至少三个节点,每个节点的形式一个observer
进程,不同节点上多个observer
进程组成一个集群对外提供服务。
本次安装目标会搭建一个2-2-2
架构的OceanBase集群,理论上这个需要6台机器,实际上我只有3台。因此我会在每个机器上启动2个OceanBase进程来模拟2个节点。
机器节点规划如下。如果你只有一台大内存的机器,可以在上面起3个或者6个OceanBase进程,注意RPC Port
和Connect Port
不要重复或者跟其他应用端口冲突即可。
Zone | IP | RPC Port | Connect Port |
---|---|---|---|
Zone1 | 192.168.1.241 | 2882 | 2881 |
Zone1 | 192.168.1.241 | 3882 | 3881 |
Zone2 | 192.168.1.81 | 2882 | 2881 |
Zone2 | 192.168.1.81 | 3882 | 3881 |
Zone3 | 192.168.1.86 | 2882 | 2881 |
Zone3 | 192.168.1.86 | 3882 | 3881 |
由于OceanBase是分布式数据库,应用的数据可能分布在任一节点上,所以应用需要通过一个反向代理OBProxy来访问OceanBase集群。OBProxy可以安装在任意机器上,包括OceanBase数据库节点上。这里我安装在其中一个节点上。
OceanBase机器节点环境主要是安装用户、内核参数配置、防火墙和SELinux设置、时间同步设置、和用户会话限制等。
OceanBase默认会安装在用户admin
下。可以选择安装在其他用户下(不使用RPM
包安装)。
通常建议admin
用户配置sudo
权限,这样安装过程中就不需要root
账户介入。
useradd admin
passwd admin
# 赋予sudo权限
chmod u+w /etc/sudoers
vi /etc/sudoers
root ALL=(ALL) ALL
admin ALL=(ALL) ALL
chmod u-w /etc/sudoers
使用命令ulimit
可以查看用户会话默认限制。修改下面文件可以默认会话限制修改永久生效。
sudo vi /etc/security/limits.conf
* soft nofile 655350
* hard nofile 655350
* soft stack 20480
* hard stack 20480
* soft nproc 655360
* hard nproc 655360
* soft core unlimited
* hard core unlimited
退出重登录,检查设置生效
ulimit -a
内核参数主要是网络、内存相关的设置。
sudo vi /etc/sysctl.conf
fs.aio-max-nr = 65536
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
修改后使用下面命令生效,并检查
sudo sysctl -p
Linux的防火墙和SELinux安全特性可能会导致OceanBase各个节点之间通信异常,所以都建议关闭
sudo systemctl disable firewalld
sudo systemctl stop firewalld
sudo systemctl status firewalld
sudo vi /etc/selinux/config
SELINUX=disabled
sudo setenforce 0
OceanBase是个分布式数据库,要求各个节点的时间保持同步,时间误差控制在50ms以内。节点时间误差偏大时,后面初始化OceanBase集群会失败,或者现有的OceanBase集群会出现异常。
节点间的时间同步要靠Linux的NTP
同步来保证。检查时间误差 使用clockdiff命令
clockdiff 192.168.1.86
clockdiff 192.168.1.81
clockdiff 192.168.1.241
配置节点的NTP
同步
sudo vi /etc/ntp.conf
server 192.168.1.239
停掉ntpd
服务,强行同步一次时间,再启动ntpd
服务。后续时间同步靠ntpd
服务。
sudo service ntpd stop;
sudo ntpdate 192.168.1.239;
sudo service ntpd start;
ntpq -4p
目前官网(oceanbase.alipay.com
)上提供了OCP试用版下载,里面包含了OCP和OB的很多文件,手动安装只需要里面两个RPM
文件:obproxy
和oceanbase
。获取方法如下:
wget https://gw.alipayobjects.com/os/downloads/ossupload/ocp-release.zip
unzip ocp-release.zip
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
我们先看一下oceanbase
的RPM
包内容,
rpm2cpio oceanbase-1.4.60-1571952.el7.x86_64.rpm |cpio –div
cd home/admin;tar czvf ob1.4.6.tar.gz oceanbase/
cd ~/
scp home/admin/ob1.4.6.tar.gz 192.168.1.241:/tmp/;
scp home/admin/ob1.4.6.tar.gz 192.168.1.81:/tmp/;
scp home/admin/ob1.4.6.tar.gz 192.168.1.86:/tmp/;
可以看到目录结构如下。其中bin
下有可执行文件observer
,etc
目录用于存放配置和相关脚本。
如果直接安装该RPM
包,则会安装在admin用户的根目录下。由于我们要在一个机器上启动两个observer
进程,彼此软件目录要分开。所以改用解压缩RPM
包文件然后复制到两个目录,目录owner
是admin
。
su - admin
mkdir -p node1 node2
cd ~/node1; tar zxvf /tmp/ob1.4.6.tar.gz -C .
cd ~/node2; tar zxvf /tmp/ob1.4.6.tar.gz -C .
cd ~/; tree
OceanBase的存储目录是在软件目录下的store
文件夹里。存储目录会包含数据文件目录和相关日志文件目录。出于性能考虑,数据文件目录和相关日志文件目录都需要单独的文件系统(如果底层是独立的盘会更好)。然后把实际目录映射到软件目录下的store
目录下。
su - admin
mkdir -p /data/data/1/obdemo/{etc3,sort_dir,sstable}
mkdir -p /data/log/log1/obdemo/{clog,etc2,ilog,oob_clog,slog}
mkdir -p /home/admin/node1/oceanbase/store/obdemo
for t in {etc3,sort_dir,sstable};do ln -s /data/data/1/obdemo/$t /home/admin/node1/oceanbase/store/obdemo/$t; done
for t in {clog,etc2,ilog,slog,oob_clog};do ln -s /data/log/log1/obdemo/$t /home/admin/node1/oceanbase/store/obdemo/$t; done
tree /home/admin/node1/oceanbase/store/obdemo/ -uh
tree ~/node1 -uh
mkdir -p /data/data/2/obdemo/{etc3,sort_dir,sstable}
mkdir -p /data/log/log2/obdemo/{clog,etc2,ilog,oob_clog,slog}
mkdir -p /home/admin/node2/oceanbase/store/obdemo
for t in {etc3,sort_dir,sstable};do ln -s /data/data/2/obdemo/$t /home/admin/node2/oceanbase/store/obdemo/$t; done
for t in {clog,etc2,ilog,slog,oob_clog};do ln -s /data/log/log2/obdemo/$t /home/admin/node2/oceanbase/store/obdemo/$t; done
tree /home/admin/node2/oceanbase/store/obdemo/ -uh
tree ~/node2 -uh
由此一个完整的OBServer
进程的相关目录如下:
RPM
包安装OceanBase会对数据进行压缩,所以依赖两个压缩协议的RPM
文件:snappy.x86_64
和lzo.x86_64
。
rpm -q snappy.x86_64 lzo.x86_64
yum -y install snappy.x86_64 lzo.x86_64
observer
启动首先分别在每个节点上启动第一个observer
进程,监听端口是2881和2882. 下图中灰色斜体部分都根据实际情况调整。注意根据实际情况修改zone
名称、ip
, 网卡名字等。
192.168.1.241:2881:2882
zone1 注意修改 zone, ip, 网卡名字
cd /home/admin/node1/oceanbase && /home/admin/node1/oceanbase/bin/observer -i eth0 -P 2882 -p 2881 -z zone1 -d /home/admin/node1/oceanbase/store/obdemo -r '192.168.1.241:2882:2881;192.168.1.81:2882:2881;192.168.1.86:2882:2881' -c 20190423 -n obdemo -o "cpu_count=24,memory_limit=100G,datafile_size=200G,config_additional_dir=/data/data/1/obdemo/etc3;/data/log/log1/obdemo/etc2"
ps -ef|grep observer
vi log/observer.log
其他两个节点的启动民两个分别如下。
192.168.1.81:2881:2882
zone2 注意修改 zone, ip, 网卡名字
cd /home/admin/node1/oceanbase && /home/admin/node1/oceanbase/bin/observer -i eth3 -P 2882 -p 2881 -z zone2 -d /home/admin/node1/oceanbase/store/obdemo -r '192.168.1.241:2882:2881;192.168.1.81:2882:2881;192.168.1.86:2882:2881' -c 20190423 -n obdemo -o "cpu_count=24,memory_limit=100G,datafile_size=200G,config_additional_dir=/data/data/1/obdemo/etc3;/data/log/log1/obdemo/etc2"
ps -ef|grep observer
vi log/observer.log
192.168.1.86:2881:2882
zone3 注意修改 zone, ip, 网卡名字
cd /home/admin/node1/oceanbase && /home/admin/node1/oceanbase/bin/observer -i eth3 -P 2882 -p 2881 -z zone3 -d /home/admin/node1/oceanbase/store/obdemo -r '192.168.1.241:2882:2881;192.168.1.81:2882:2881;192.168.1.86:2882:2881' -c 20190423 -n obdemo -o "cpu_count=24,memory_limit=100G,datafile_size=200G,config_additional_dir=/data/data/1/obdemo/etc3;/data/log/log1/obdemo/etc2"
ps -ef|grep observer
vi log/observer.log
3节点observer都启动后,这一步集群初始化命令就至关重要,成败在此一举。
首先使用mysql命令登录任一节点,然后执行bootstrap
命令。注意命令中不要有空格和空白。
mysql -h192.168.1.241 -uroot -P2881 -p
alter system bootstrap ZONE 'zone1' SERVER '192.168.1.241:2882', ZONE 'zone2' SERVER '192.168.1.81:2882', ZONE 'zone3' SERVER '192.168.1.86:2882';
大概十几秒后集群启动成功。此时重新退出再登录集群。登录命令的username
格式需要变化一下。登录成功后修改默认sys
租户管理员root@sys
。
mysql -h192.168.1.241 -uroot@sys -P2881 -p -c -A oceanbase
alter user root identified by 'rootpwd';
退出使用密码登录验证,同时查看集群资源信息。
mysql -h192.168.1.241 -uroot@sys -P2881 -prootpwd -c -A oceanbase
select zone, svr_ip, inner_port, cpu_total, cpu_assigned, cpu_assigned_percent cpu_ass_percent, round(mem_total/1024/1024/1024) mem_total_gb, round(mem_assigned/1024/1024/1024) mem_ass_gb, round(disk_total/1024/1024/1024) disk_total_gb, unit_num, substr(build_version,1,6) version
from __all_virtual_server_stat
order by zone, svr_ip, inner_port;
目前搭建的还是1-1-1
布局的OceanBase集群,需要再添加3个节点,扩容到2-2-2
布局。这里就直接在3台机器上再启动第二个observer
进程,监听端口是3881和3882.
192.168.1.241:3881:3882
zone1 注意修改node zone, ip, port, 网卡名字
cd /home/admin/node2/oceanbase && /home/admin/node2/oceanbase/bin/observer -i eth0 -P 3882 -p 3881 -z zone1 -d /home/admin/node2/oceanbase/store/obdemo -r '192.168.1.241:2882:2881;192.168.1.81:2882:2881;192.168.1.86:2882:2881' -c 20190423 -n obdemo -o "cpu_count=24,memory_limit=61440M,datafile_size=100G,config_additional_dir=/data/data/2/obdemo/etc3;/data/log/log2/obdemo/etc2"
ps -ef|grep observer
vi log/observer.log
192.168.1.81:2881:2882
zone2 注意修改node zone, ip, port, 网卡名字
cd /home/admin/node2/oceanbase && /home/admin/node2/oceanbase/bin/observer -i eth3 -P 3882 -p 3881 -z zone2 -d /home/admin/node2/oceanbase/store/obdemo -r '192.168.1.241:2882:2881;192.168.1.81:2882:2881;192.168.1.86:2882:2881' -c 20190423 -n obdemo -o "cpu_count=24,memory_limit=61440M,datafile_size=100G,config_additional_dir=/data/data/2/obdemo/etc3;/data/log/log2/obdemo/etc2"
ps -ef|grep observer
vi log/observer.log
192.168.1.86:2881:2882
zone3 注意修改node zone, ip, port, 网卡名字
cd /home/admin/node2/oceanbase && /home/admin/node2/oceanbase/bin/observer -i eth3 -P 3882 -p 3881 -z zone3 -d /home/admin/node2/oceanbase/store/obdemo -r '192.168.1.241:2882:2881;192.168.1.81:2882:2881;192.168.1.86:2882:2881' -c 20190423 -n obdemo -o "cpu_count=24,memory_limit=61440M,datafile_size=100G,config_additional_dir=/data/data/2/obdemo/etc3;/data/log/log2/obdemo/etc2"
ps -ef|grep observer
vi log/observer.log
将新增的3节点加入到OceanBase集群中。注意zone
名称和ip
要对应正确。
alter system add server '192.168.1.241:3882' zone 'zone1';
alter system add server '192.168.1.81:3882' zone 'zone2';
alter system add server '192.168.1.86:3882' zone 'zone3';
select zone, svr_ip, inner_port, cpu_total, cpu_assigned, cpu_assigned_percent cpu_ass_percent, round(mem_total/1024/1024/1024) mem_total_gb, round(mem_assigned/1024/1024/1024) mem_ass_gb, round(disk_total/1024/1024/1024) disk_total_gb, unit_num, substr(build_version,1,6) version
from __all_virtual_server_stat
order by zone, svr_ip, inner_port;
OceanBase是分布式数据库,应用的数据可能分布在任一节点上并且不固定,所以应用不可能知道数据在哪个节点或者记录所有节点ip
。这时就需要一个反向代理OBProxy在OceanBase集群前面提供SQL路由功能。应用通过OBProxy访问OceanBase集群,OBProxy就是数据库的代表。
一个节点只需要安装一个OBproxy,所以可以直接使用RPM
包安装。
su - admin
mkdir -p /home/admin/logs/obproxy/log /home/admin/logs/obproxy/minidump
sudo rpm -ivh obproxy-1.3.3-1506155.el7.x86_64.rpm
OBProxy需要跟OceanBase集群保持通信,所以需要在sys
租户里提前创建好账户。
CREATE USER proxyro IDENTIFIED BY password '*e9c2bcdc178a99b7b08dd25db58ded2ee5bff050' ;
GRANT SELECT ON *.* to proxyro;
show grants for proxyro;
注意其中 -r
指定的是rootservice list
地址,格式稍微不同,不需要RPC Port
信息。-p
指定OBProxy的监听端口。
cd /opt/taobao/install/obproxy && bin/obproxy -r "192.168.1.241:2881;192.168.1.81:2881;192.168.1.86:2881" -p 2883 -o "enable_strict_kernel_release=false,enable_cluster_checkout=false" -c obdemo
ps -ef|grep obproxy
通过OBProxy连接OceanBase集群的命令有两种格式,区别在于用户名的格式。如:[用户名]@[租户名]#[集群名]
或 [集群名]:[租户名]:[用户名]
。
mysql -h192.168.1.241 -uroot@sys#obdemo -P2883 -prootpwd -c -A oceanbase
或
mysql -h192.168.1.241 -uobdemo:sys:root -P2883 -prootpwd -c -A oceanbase
OceanBase分布式数据库跟传统数据库或者其他分布式数据库产品的一个显著的区别就是它有资源管理的思想在里面。OceanBase集群把多台主机的资源(CPU
、内存和空间)聚合在一个大的池子里,然后从中分配出指定规格的资源给一个具体的业务使用。这个提供给业务使用的就是租户,也叫实例。
下面简单演示一个租户的创建过程。
mysql -h192.168.1.241 -uroot@sys#obdemo -P2883 -prootpwd -c -A oceanbase
create resource unit unit_4c20g512g, max_cpu=4, max_memory='20G', min_memory='10G', max_iops=10000, min_iops=1000, max_session_num=1000000, max_disk_size=53687091200;
create resource unit unit_8c40g1024g, max_cpu=8, max_memory='40G', min_memory='20G', max_iops=20000, min_iops=5000, max_session_num=1000000, max_disk_size=107374182400;
create resource unit unit_16c80g2048g, max_cpu=16, max_memory='80G', min_memory='40G', max_iops=50000, min_iops=10000, max_session_num=1000000, max_disk_size=214748364800;
select unit_config_id,name,max_cpu,min_cpu,round(max_memory/1024/1024/1024) max_mem_gb, round(min_memory/1024/1024/1024) min_mem_gb, round(max_disk_size/1024/1024/1024) max_disk_size_gb
from __all_unit_config
order by unit_config_id;
mysql -h192.168.1.241 -uroot@sys#obdemo -P2883 -prootpwd -c -A oceanbase
create resource pool pool_demo unit = 'unit_4c20g512g', unit_num = 1;
select resource_pool_id, name,unit_count, unit_config_id, zone_list, tenant_id, gmt_modified
from __all_resource_pool order by resource_pool_id ;
mysql -h192.168.1.241 -uroot@sys#obdemo -P2883 -prootpwd -c -A oceanbase
create tenant t_obdemo resource_pool_list=('pool_demo');
select tenant_id, tenant_name, zone_list, locality ,gmt_modified from __all_tenant;
mysql -h192.168.1.241 -uroot@t_obdemo#obdemo -P2883 oceanbase -A -p
show databases;
create database sysbenchtest;
grant all privileges on sysbenchtest.* to testuser@'%' identified by 'testpwd';
mysql -h192.168.1.241 -uroot@t_obdemo#obdemo -P2883 oceanbase -A -p
select tenant_id,tenant_name, unit_id, zone, svr_ip,svr_port,max_cpu,min_cpu,round(max_memory/1024/1024/1024) max_mem_gb, round(min_memory/1024/1024/1024) min_mem_gb, round(max_disk_size/1024/1024/1024) max_disk_size_gb
from gv$unit;
如果业务觉得数据库很慢且瓶颈是在资源,则对租户的资源能力进行扩容。
租户扩容有两个思路,一是提升资源单元规格,二是增加资源单元数量。
mysql -h192.168.1.241 -uobdemo:sys:root -P2883 -prootpwd -c -A oceanbase
alter resource pool pool_demo unit = 'unit_8c40g1024g';
alter resource pool pool_demo unit_num = 2;
缩容同理
alter resource pool pool_demo unit_num = 1;
至此,OceanBase集群和租户都搭建好了。为了避免学习环境因为资源紧张导致OceanBase不稳定,还需要做一些参数配置,类似于ORACLE中的参数变更。
配置日志相关参数
mysql -h192.168.1.241 -uobdemo:sys:root -P2883 -prootpwd -c -A oceanbase
-- observer log自清理设置
alter system set enable_syslog_recycle=True;
alter system set max_syslog_file_count=5;
show parameters where name in ('enable_syslog_recycle', 'max_syslog_file_count');
配置OBProxy参数
-- obproxy设置:
alter proxyconfig set enable_metadb_used=False;
alter proxyconfig set enable_proxy_scramble=True;
alter proxyconfig set proxy_mem_limited=2G;
alter proxyconfig set log_dir_size_threshold=10G;
配置冻结合并参数
-- 关闭轮转合并,设置转储次数
alter system set enable_merge_by_turn = false;
alter system set minor_freeze_times=3;
alter system set minor_warm_up_duration_time='300s';
OceanBase还支持对租户的行为进行配置,这些是通过租户变量的修改实现。类似于MySQL中的变量修改。
mysql -h192.168.1.241 -uroot@t_obdemo#obdemo -P2883 oceanbase -A -p
set global ob_query_timeout=100000000;
如果前面在集群初始化中出现报错,则需要清理所有步骤重新来过。
### OceanBase安装环境清理
```bash
pkill observer
Sleep 10
rpm -qa|grep oceanbase
rpm -qa|grep obproxy
sudo rpm -e
su - admin
/bin/rm -rf ~/node1 ~/node2
/bin/rm -rf /data/data/* /data/log/*
有关OceanBase集群手动搭建过程就到此为止。是不是比ORACLE RAC简单很多?限于时间和篇幅,安装中涉及到的OceanBase原理没有详细解释。有兴趣的朋友可以参看OceanBase其他学习资源。后续还会持续推出OceanBase运维实践经验直播分享,敬请关注。