首批通过分布式安全可靠测评,为关键业务系统打造
使用命令行部署两副本加仲裁服务的 OceanBase 集群
更新时间:2025-12-31 17:57:02
OceanBase 数据库从 V4.1 版本开始支持仲裁服务(Arbitration Service),不仅可以解决两地三中心场景下同城副本故障时 RT 变大的问题,还能降低跨城带宽开销,并将第三机房的成本降到极低。
本节主要介绍使用命令行部署一个包含两台机器的 OceanBase 集群和一个仲裁成员。
说明
- 单个 OceanBase 集群最多只能使用一个仲裁成员。
- 仲裁服务目前只支持单机部署。
前提条件
在安装 OceanBase 数据库之前,需要确认以下信息:
- OBServer 服务器已完成相关配置。详细信息,请参见 服务器配置、(可选)配置时钟源 和 使用 oatcli 初始化 OBServer 服务器。
- OBServer 服务器已创建
admin用户。 - 已获取 OceanBase 数据库 RPM 包。详细信息,请参见 准备安装包。
操作步骤
步骤一:部署 OceanBase 集群
在两台 OBServer 服务器中分别安装 RPM 包。
安装 OceanBase 数据库 RPM 包。
切换至存放 OceanBase 数据库 RPM 包的目录:
[root@xxx /]# cd $rpm_dir安装 OceanBase 数据库 RPM 包:
[root@xxx $rpm_dir]# rpm -ivh $rpm_name [--prefix=/home/admin/oceanbase]其中
$rpm_dir表示存放 RPM 包的目录,$rpm_name表示 RPM 包的名称。说明
OceanBase 数据库软件会默认安装在目录
/home/admin/oceanbase下。示例如下:
[root@xxx /home/admin/rpm]# rpm -ivh oceanbase-4.1.0.0-100000682023020119.el7.x86_64.rpm Preparing... ################################# [100%] Updating / installing... 1:oceanbase-4.1.0.0-100000682023020################################# [100%](可选)安装 OceanBase 客户端。
OceanBase 客户端 OBClient 是 OceanBase 数据库专用的命令行客户端工具,通过 OBClient 您可以连接 OceanBase 数据库的 MySQL 租户和 Oracle 租户。如果只连接 OceanBase 数据库的 MySQL 租户,也可以通过 MySQL 客户端(mysql)连接 OceanBase 数据库。
注意
由于
obclientV2.2.1 之前的版本依赖于libobclient,所以需要先安装libobclient。请联系技术支持获取 OBClient RPM 包和 libobclient RPM 包。示例如下:
[root@xxx /home/admin/rpm]# rpm -ivh obclient-2.2.1-20221122151945.el7.alios7.x86_64.rpm Preparing... ################################# [100%] Updating / installing... 1:obclient-2.2.1-20221122151945.el7################################# [100%] ##核查是否安装成功## [root@xxx /home/admin/rpm]# which obclient /usr/bin/obclient配置 observer 进程目录。
(可选)清理目录。
新机器第一次部署 OceanBase 数据库时不用清理目录。
如果是以下情况选择直接清理旧的 OceanBase 目录:
- 清理之前的 OceanBase 环境。
- OceanBase 安装部署过程中出现问题导致环境变乱或者产生文件影响下一次安装。
[root@xxx /home/admin]# kill -9 `pidof observer` [root@xxx /home/admin]# rm -rf /data/1/$cluster_name [root@xxx /home/admin]# rm -rf /data/log1/$cluster_name [root@xxx /home/admin]# rm -rf /home/admin/oceanbase/store/$cluster_name [root@xxx /home/admin]# rm -rf /home/admin/oceanbase/log/* /home/admin/oceanbase/etc/*config*其中
$cluster_name为集群名。示例如下:
[root@xxx /home/admin]# kill -9 `pidof observer` [root@xxx /home/admin]# rm -rf /data/1/obdemo [root@xxx /home/admin]# rm -rf /data/log1/obdemo [root@xxx /home/admin]# rm -rf /home/admin/oceanbase/store/obdemo [root@xxx /home/admin]# rm -rf /home/admin/oceanbase/log/* /home/admin/oceanbase/etc/*config*初始化 OceanBase 目录。
OceanBase 的数据目录通常建议在独立的磁盘上,然后通过软链接方式链接到软件 Home 目录下面。
##切换到admin用户## [root@xxx /home/admin]# su - admin ##使用admin用户执行以下命令## -bash-4.2$ mkdir -p /data/1/$cluster_name/{etc3,sstable,slog} -bash-4.2$ mkdir -p /data/log1/$cluster_name/{clog,etc2} -bash-4.2$ mkdir -p /home/admin/oceanbase/store/$cluster_name for t in {etc3,sstable,slog};do ln -s /data/1/$cluster_name/$t /home/admin/oceanbase/store/$cluster_name/$t; done -bash-4.2$ for t in {clog,etc2};do ln -s /data/log1/$cluster_name/$t /home/admin/oceanbase/store/$cluster_name/$t; done其中
$cluster_name为集群名。slog和 数据文件必须在同一个磁盘上。示例如下:
[root@xxx /home/admin]# su - admin -bash-4.2$ mkdir -p /data/1/obdemo/{etc3,sstable,slog} -bash-4.2$ mkdir -p /data/log1/obdemo/{clog,etc2} -bash-4.2$ mkdir -p /home/admin/oceanbase/store/obdemo -bash-4.2$ for t in {etc3,sstable,slog};do ln -s /data/1/obdemo/$t /home/admin/oceanbase/store/obdemo/$t; done -bash-4.2$ for t in {clog,etc2};do ln -s /data/log1/obdemo/$t /home/admin/oceanbase/store/obdemo/$t; done说明
obdemo是以集群名称创建的目录,可自定义,在启动进程时会用到。检查结果:
-bash-4.2$ cd /home/admin/oceanbase -bash-4.2$ tree store/ store/ `-- obdemo |-- clog -> /data/log1/obdemo/clog |-- etc2 -> /data/log1/obdemo/etc2 |-- etc3 -> /data/1/obdemo/etc3 |-- slog -> /data/1/obdemo/slog `-- sstable -> /data/1/obdemo/sstable 6 directories, 0 files
初始化 OceanBase 集群。
说明
示例 IP 做了脱敏处理,这不是安装需求。在部署时应根据自己机器真实 IP 填写。
启动 observer 进程。
在每个节点的
admin用户下,启动 observer 进程。注意
两个副本下,每个节点启动参数并不完全相同。启动 observer 时只需指定 Root Service 所在的 2 台(或者多台)机器,不需要在创建集群时指定所有机器;集群创建完成后可以添加新的机器。
cd /home/admin/oceanbase && /home/admin/oceanbase/bin/observer -i $devname -P $rpc_port -p $sql_port -z $zone_name -d /home/admin/oceanbase/store/$cluster_name -r '$ip:2882:2881' -c $cluster_id -n $cluster_name -o "system_memory=30G,datafile_size=500G,config_additional_dir=/data/1/$cluster_name/etc3;/data/log1/$cluster_name/etc2"参数解释:
参数 说明 -i指定网卡名,可通过 ifconfig命令查看。-p指定服务端口号,一般指定为 2881。-P指定 RPC 端口号,一般指定为 2882。-n指定集群名称。可自定义,不同集群名称不要重复即可。 -z指定启动的 observer 进程所属的 Zone。 -d指定集群主目录,初始化目录时创建的目录。除集群名字 $cluster_name外,其他不要变动。-c指定集群 ID。为一组数字,可以自定义,不同集群不要重复即可。 -l指定日志级别。 -r指定 RS 列表,格式是 $ip:2882:2881,分号分割,表示 Root Service 信息。-o指定集群启动参数(配置项)列表,为可选项。可以为多个配置项指定值,多个配置项的值之间使用英文逗号进行分隔。请根据实际需要,选择适当的启动参数并为每个参数指定合适的值,以优化集群的性能和资源利用率。以下是一些常用的集群启动参数: - cpu_count:用于设置系统 CPU 总数。
- system_memory:用于设置系统预留给租户 ID 为
500的租户的内存容量,即指定 OceanBase 数据库内部保留内存。在机器内存较少的情况下可以考虑将该值调小,需要注意的是,在性能测试时可能会出现内存不足的问题。 - memory_limit:用于设置可用的总内存大小。
- datafile_size:用于设置数据文件占用磁盘可用空间的大小。即指定 OceanBase 数据库数据文件
sstable的大小(一次性初始化),根据/data/1/可用空间评估,建议不少于100G。 - datafile_disk_percentage:磁盘数据文件占用磁盘总空间的百分比。
- config_additional_dir:用于设置本地存储配置文件的多个目录,为了冗余存储多份配置文件。
- log_disk_size:用于设置 Redo 日志磁盘的大小。
- log_disk_percentage:用于设置 Redo 日志占用其所在磁盘总空间的百分比。
- syslog_level:用于设置系统日志级别。
- syslog_io_bandwidth_limit:用于设置系统日志所能占用的磁盘 IO 带宽上限,超过带宽上限容量的系统日志将被丢弃。
- max_syslog_file_count:用于设置在回收日志文件之前可以容纳的日志文件数量。
- enable_syslog_recycle:用于设置是否打开记录 OBServer 节点启动前的旧日志的开关。与
max_syslog_file_count配合使用,决定回收逻辑是否考虑旧的日志文件。
示例如下:
在 OBServer 服务器中启动 observer 进程,以
10.10.10.1和10.10.10.2为例,启动 observer 进程。zone1:
[root@xxx admin]# su - admin -bash-4.2$ cd /home/admin/oceanbase && /home/admin/oceanbase/bin/observer -i eth0 -P 2882 -p 2881 -z zone1 -d /home/admin/oceanbase/store/obdemo -r '10.10.10.1:2882:2881;10.10.10.2:2882:2881' -c 10001 -n obdemo -o "system_memory=30G,datafile_size=500G,config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2"zone2:
[root@xxx admin]# su - admin -bash-4.2$ cd /home/admin/oceanbase && /home/admin/oceanbase/bin/observer -i eth0 -P 2882 -p 2881 -z zone2 -d /home/admin/oceanbase/store/obdemo -r '10.10.10.1:2882:2881;10.10.10.2:2882:2881' -c 10001 -n obdemo -o "system_memory=30G,datafile_size=500G,config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2"可以通过下面命令查看 observer 进程是否启动成功:
netstat -ntlp命令,如果监听到了2881与2882端口,则说明进程启动成功。ps -ef|grep observer命令可以返回 observer 进程信息。
示例如下:
-bash-4.2$ netstat -ntlp (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:2881 0.0.0.0:* LISTEN 11112/observer tcp 0 0 0.0.0.0:2882 0.0.0.0:* LISTEN 11112/observer ... ... ... ... ... ... -bash-4.2$ ps -ef|grep observer admin 11112 0 40 16:18 ? 00:00:17 /home/admin/oceanbase/bin/observer -i eth0 -P 2882 -p 2881 -z zone1 -d /home/admin/oceanbase/store/obdemo -r 10.10.10.1:2882:2881;10.10.10.2:2882:2881 -c 10001 -n obdemo -o system_memory=30G,datafile_size=500G,config_additional_dir=/data/1/obdemo/etc3;/data/log1/obdemo/etc2集群 bootstrap 操作。
通过 OBClient 命令连接任意一台节点,密码为空。
[root@xxx admin]# obclient -h127.0.0.1 -uroot -P2881 -p****** obclient [(none)]> SET SESSION ob_query_timeout=1000000000; Query OK, 0 rows affected obclient [(none)]> ALTER SYSTEM BOOTSTRAP ZONE 'zone1' SERVER '10.10.10.1:2882',ZONE 'zone2' SERVER '10.10.10.2:2882'; Query OK, 0 rows affected注意
如果这一步失败报错了,其原因很可能就是 observer 进程启动参数有不对、observer 相关目录权限不对、日志目录空间不足一定比例(跟数据目录合用了大目录,空间被数据目录占用了)、节点时间不同步、节点内存资源不足等。请先排查这些问题点后,然后清理 OceanBase 目录从头开始部署。
验证集群初始化成功。
在完成集群的 bootstrap 初始化操作后,通过执行
SHOW DATABASES;命令进行验证,若查询结果显示数据库列表中存在oceanbase数据库,即可确认集群初始化成功。修改密码。
sys租户的root用户密码默认为空,初始化成功后请修改密码。ALTER USER root IDENTIFIED BY '******';
步骤二:部署仲裁服务
在仲裁 Server 服务器中安装 OceanBase RPM 包。
切换至存放 OceanBase 数据库 RPM 包的目录:
[root@xxx /]# cd $rpm_dir安装 OceanBase 数据库 RPM 包:
[root@xxx $rpm_dir]# rpm -ivh $rpm_name [--prefix=/home/admin/oceanbase]其中
$rpm_dir表示存放 RPM 包的目录,$rpm_name表示 RPM 包的名称。说明
OceanBase 数据库软件会默认安装在目录
/home/admin/oceanbase下。示例如下:
[root@xxx /home/admin/rpm]# rpm -ivh oceanbase-4.1.0.0-100000682023020119.el7.x86_64.rpm Preparing... ################################# [100%] Updating / installing... 1:oceanbase-4.1.0.0-100000682023020################################# [100%]配置仲裁 server 进程目录
在仲裁 Server 服务器中创建仲裁 server 进程的
clog目录。说明
- 启动仲裁 server 进程时,
-d指定的store目录中需要确保提前创建好clog目录。 - 需要避免
store目录所在的磁盘空间被完全占满,否则会导致仲裁 Server 的功能出现异常。
##切换到admin用户## [root@xxx /home/admin]# su - admin ##使用admin用户执行以下命令## -bash-4.2$ mkdir -p /home/admin/oceanbase/store/clog- 启动仲裁 server 进程时,
启动仲裁 server 进程。
在仲裁 Server 服务器的
admin用户下,以仲裁模式启动仲裁 server 进程,指定必要的启动参数。启动语句如下:cd /home/admin/oceanbase && /home/admin/oceanbase/bin/observer -m arbitration -P $rpc_port -d $obdir/store [-i $devname] [-l $log_level] [-o "parameters_list"]参数解释:
参数 说明 -m指定仲裁模式,取值为 arbitration。-P指定仲裁 server 进程的 RPC 端口号,一般指定为 2882。-d指定存储目录路径。通常为 /home/admin/oceanbase/store,需确保该目录下已创建好clog子目录。-i指定网卡名,可通过 ifconfig命令查看网卡名。可选项,observer 自动检测本机网卡名。-l指定日志级别。可选项,默认值是 WDIAG。取值范围:{DEBUG,TRACE,WDIAG,EDIAG,INFO,WARN,ERROR},有关日志的详细信息,请参见 日志级别。-o指定配置项列表,可选项。可为多个配置项指定值,中间用英文逗号分隔。
仲裁 server 进程相关的配置项如下:- cpu_count
- system_memory
- memory_limit
- __easy_memory_limit
- log_disk_size
- log_disk_percentage
- syslog_level
- syslog_io_bandwidth_limit
- max_syslog_file_count
- enable_syslog_recycle
注意
为了确保仲裁节点的日志目录能自动清理并防止磁盘写满,需要将
enable_syslog_recycle设置为True,并且将max_syslog_file_count设置为一个有效值。否则,日志文件会不断增长,可能导致磁盘空间耗尽。示例如下:
在仲裁 Server 服务器中启动仲裁 server 进程,以
10.10.10.3为例,启动仲裁 server 进程。[root@xxx /home/admin]# su - admin -bash-4.2$ cd /home/admin/oceanbase && /home/admin/oceanbase/bin/observer -m arbitration -P 2882 -d /home/admin/oceanbase/store -o "enable_syslog_recycle=True,max_syslog_file_count=100"
步骤三:为集群添加仲裁服务
为集群添加仲裁服务,命令如下:
ALTER SYSTEM ADD ARBITRATION SERVICE "$arb_server_ip:$arb_server_port";
说明
仲裁 server 进程地址将被记录到 sys 租户的一张内部表中,可以通过视图 DBA_OB_ARBITRATION_SERVICE 查看,该指令为同步操作。
示例如下:
obclient [(none)]> ALTER SYSTEM ADD ARBITRATION SERVICE "10.10.10.3:2882";
Query OK, 0 rows affected
obclient [(none)]> SELECT * FROM oceanbase.DBA_OB_ARBITRATION_SERVICE;
+---------------------+---------------------+-------------------------+---------------------+------------------------------+------+
| CREATE_TIME | MODIFY_TIME | ARBITRATION_SERVICE_KEY | ARBITRATION_SERVICE | PREVIOUS_ARBITRATION_SERVICE | TYPE |
+---------------------+---------------------+-------------------------+---------------------+------------------------------+------+
| 2023-03-06 17:29:36 | 2023-03-06 17:29:36 | default | 10.10.10.3:2882 | NULL | ADDR |
+---------------------+---------------------+-------------------------+---------------------+------------------------------+------+
1 row in set
步骤四:为 sys 租户开启仲裁服务
可以在创建租户时即为租户开启仲裁服务,新建租户时为租户开启仲裁服务的详细信息,请参见 CREATE TENANT。
如果在创建租户时未开启仲裁服务,也可以待租户创建成功后,为租户开启仲裁服务。
执行以下语句给给已有租户开启仲裁服务。
ALTER TENANT $tenant_name [SET] enable_arbitration_service = true;
示例如下:
给集群的 sys 租户开启仲裁服务。
obclient [(none)]> ALTER TENANT sys SET enable_arbitration_service = true;
Query OK, 0 rows affected
步骤五:查询租户仲裁服务状态
查看租户的仲裁服务是否开启。
可以通过视图
DBA_OB_TENANTS查询租户的信息,通过arbitration_service_status这一列确认仲裁服务的开启状态。arbitration_service_status取值如下:ENABLED:表示该租户已开启仲裁服务。ENABLING:表示该租户仲裁服务开启过程中。DISABLED:表示该租户已关闭仲裁服务。DISABLING:表示该租户仲裁服务关闭过程中。
示例如下:
obclient [(none)]> SELECT TENANT_ID,TENANT_NAME,ARBITRATION_SERVICE_STATUS FROM oceanbase.DBA_OB_TENANTS WHERE tenant_name = 'sys'; +-----------+-------------+----------------------------+ | TENANT_ID | TENANT_NAME | ARBITRATION_SERVICE_STATUS | +-----------+-------------+----------------------------+ | 1 | sys | ENABLED | +-----------+-------------+----------------------------+ 1 row in set查看当前仲裁服务是否可用。
租户的仲裁服务开启成功表示该租户在开启时刻已创建的日志流都可以使用仲裁服务,但开启之后新创建的日志流可能缺少仲裁成员,因为创建日志流是非严格模式执行的,不保证仲裁成员一定创建成功,对于这种情况,用户可通过如下 SQL 语句确认该租户所有日志流是否都有仲裁成员。
##查询租户内没有仲裁副本的日志流列表## (SELECT distinct ls_id FROM GV$OB_LOG_STAT WHERE tenant_id = xxx) except (SELECT ls_id FROM GV$OB_LOG_STAT WHERE tenant_id = xxx and role = 'LEADER' and arbitration_member = "$arb_server_ip:$arb_server_port");示例如下:
查询
sys租户内没有仲裁副本的日志流列表,返回空集说明当前租户的仲裁服务是可用状态。obclient [oceanbase]> (SELECT distinct ls_id FROM GV$OB_LOG_STAT WHERE tenant_id = 1) except (SELECT ls_id FROM GV$OB_LOG_STAT WHERE tenant_id = 1 and role = 'LEADER' and arbitration_member = "10.10.10.3:2882"); Empty set
后续操作
集群创建成功后,可根据业务需要创建用户租户。
使用命令行创建用户租户的详细信息,请参见 创建租户。