三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

OceanBase 可用区和节点的管理

OceanBase 可用区和节点的管理

OceanBase 集群由若干个 Zone 组成。从物理层面来讲,一个 Zone 通常是一个独立的物理部署单元,可以是一个数据中心(IDC)或者云上的一个Zone(可用区),也可以是一个单独的机架(Rack)。

1. zone 的状态管理

1.1 zone 的状态查看

通过查询 DBA_OB_ZONES 视图获取 zone 的状态:

obclient(root@sys)[oceanbase]> SELECT * FROM DBA_OB_ZONES; +-------+----------------------------+----------------------------+--------+-------------+---------------+-----------+ | ZONE | CREATE_TIME | MODIFY_TIME | STATUS | IDC | REGION | TYPE | +-------+----------------------------+----------------------------+--------+-------------+---------------+-----------+ | zone1 | 2026-08-01 14:46:05.704904 | 2026-08-01 14:47:11.744709 | ACTIVE | default_idc | deault_region | ReadWrite | | zone2 | 2026-08-01 14:46:05.704904 | 2026-08-01 14:47:11.764566 | ACTIVE | default_idc | deault_region | ReadWrite | | zone3 | 2026-08-01 14:46:05.704904 | 2026-08-01 14:47:11.787405 | ACTIVE | default_idc | deault_region | ReadWrite | +-------+----------------------------+----------------------------+--------+-------------+---------------+-----------+ 3 rows in set (0.013 sec)

其他字段容易理解,这里解释一下 TYPE 字段,分为

  • ReadWrite :标准的读写型 Zone。它拥有完整的数据副本(包含 Paxos 内存日志和持久化数据),既能参与 Paxos 投票,也能处理业务的读写请求。
  • ReadOnly:只读型 Zone。不参与 Paxos 投票,仅同步数据供只读业务查询。

1.2 zone 的运维

可用区的运维通常包括 Zone 的停止与启动,Zone 的属性修改,以及添加、删除 Zone。

  1. STOP ZONE (停止可用区)
  • 说明:停止 Zone 内所有 OBServer 节点的服务,其执行逻辑与 Stop Server 类似。
  • 语法ALTER SYSTEM STOP ZONE zone_name;
  1. START ZONE (启动可用区)
  • 说明:启动 Zone 内所有 OBServer 节点的服务,其执行逻辑与 Start Server 类似。
  • 语法ALTER SYSTEM START ZONE zone_name;
  1. ALTER ZONE (修改可用区属性)
  • 说明:修改 Zone 所属的 Region 及 IDC 信息。
  • 语法ALTER SYSTEM ALTER ZONE zone_name SET [IDC [=]'idc_name', REGION [=]'region_name'];
  1. ADD ZONE (添加可用区)
  • 说明:添加 Zone 通常用于集群的扩容场景中,添加 Zone 之后还要添加 OBServer 节点。
  • 语法ALTER SYSTEM ADD ZONE zone_name [IDC [=] 'idc_name', REGION [=] 'region_name'];
  1. DELETE ZONE (删除可用区)
  • 说明:删除 Zone 通常用于集群缩容的场景中,删除 Zone 的前提是Zone 内的 OBServer 节点已经全部删除
  • 语法ALTER SYSTEM DELETE ZONE zone_name [IDC [=] 'idc_name', REGION [=] 'region_name'];

2. OBServer 的状态管理

2.1 查询节点状态

通过查询 DBA_OB_SERVERS 视图获取 OBServer 的状态,之前我们介绍过 GV$OB_SERVERS 视图,前者是数据库管理员视图,记录的是节点状态变化过程;后者是Global View(全局动态性能视图),记录的更多的是资源。

obclient(root@sys)[oceanbase]> SELECT ZONE, SVR_IP, SVR_PORT, SQL_PORT, WITH_ROOTSERVER, STATUS, START_SERVICE_TIME, STOP_TIME, LAST_OFFLINE_TIME FROM oceanbase.DBA_OB_SERVERS; +-------+----------------+----------+----------+-----------------+--------+----------------------------+-----------+-------------------+ | ZONE | SVR_IP | SVR_PORT | SQL_PORT | WITH_ROOTSERVER | STATUS | START_SERVICE_TIME | STOP_TIME | LAST_OFFLINE_TIME | +-------+----------------+----------+----------+-----------------+--------+----------------------------+-----------+-------------------+ | zone1 | 192.168.182.21 | 2882 | 2881 | YES | ACTIVE | 2026-08-03 08:22:42.996496 | NULL | NULL | | zone2 | 192.168.182.22 | 2882 | 2881 | NO | ACTIVE | 2026-08-03 08:24:42.536593 | NULL | NULL | | zone3 | 192.168.182.23 | 2882 | 2881 | NO | ACTIVE | 2026-08-03 08:25:48.979806 | NULL | NULL | +-------+----------------+----------+----------+-----------------+--------+----------------------------+-----------+-------------------+ 3 rows in set (0.001 sec)

字段解释:

  • ZONE
    • 描述:OBServer 节点所属的 Zone
  • SVR_IP
    • 描述:服务器 IP 地址
  • WITH_ROOTSERVER
    • 描述Root Service Leader 所在的机器, 如果是 Yes,表明是 Leader
  • STATUS
    • 描述:节点状态
    • 状态枚举
      • ACTIVE节点心跳状态正常,对应的是 OBServer 进程状态
      • INACTIVE:节点心跳状态异常
      • DELETING:节点正在删除中
  • START_SERVICE_TIME
    • 描述:节点启动后,开始对外服务的时间点
    • 取值说明
      • NULL:节点未启动或状态不可用
      • 有效值:节点开始对外服务的时间
  • STOP_TIME
    • 描述:节点停止服务的时间点
    • 取值说明
      • NULL节点没有被 Stop
      • 有效值:节点被 Stop 的时间
  • LAST_OFFLINE_TIME
    • 描述:OBServer 节点上次下线的时间
    • 取值说明
      • NULL节点没有下线过
      • 有效值:节点的上次下线时间

2.2 重启节点

重启是常见运维动作之一,适用于对机器进行短暂维修,以及修改系统配置项后需要重启生效的场景。重启节点从 OceanBase 层面包括Stop ServerStart Server的过程,在操作系统层面还包括observer进程的重启。

(1)STOP SERVER (停止节点服务)

  • 核心逻辑
    • Leader 切走:将待重启节点上的 Leader 全部切走,并保证除了重启节点以外的其他节点上的副本满足多数派。
    • 状态标记:当 OBServer 停止完成后,Root Service 将节点标记为服务停止状态
      • 此时DBA_OB_SERVERS视图的状态标识为:STATUS=ACTIVE, STOP_TIME>0
    • 请求切走:OBProxy 识别 OBServer 的状态为停止后,不会将业务请求路由到该节点。
obclient(root@sys)[oceanbase]> alter system stop server '192.168.182.23:2882'; obclient(root@sys)[oceanbase]> SELECT ZONE, SVR_IP, SVR_PORT, SQL_PORT, WITH_ROOTSERVER, STATUS, START_SERVICE_TIME, STOP_TIME, LAST_OFFLINE_TIME FROM oceanbase.DBA_OB_SERVERS; +-------+----------------+----------+----------+-----------------+--------+----------------------------+----------------------------+-------------------+ | ZONE | SVR_IP | SVR_PORT | SQL_PORT | WITH_ROOTSERVER | STATUS | START_SERVICE_TIME | STOP_TIME | LAST_OFFLINE_TIME | +-------+----------------+----------+----------+-----------------+--------+----------------------------+----------------------------+-------------------+ | zone1 | 192.168.182.21 | 2882 | 2881 | YES | ACTIVE | 2026-08-03 08:22:42.996496 | NULL | NULL | | zone2 | 192.168.182.22 | 2882 | 2881 | NO | ACTIVE | 2026-08-03 08:24:42.536593 | NULL | NULL | | zone3 | 192.168.182.23 | 2882 | 2881 | NO | ACTIVE | 2026-08-03 08:25:48.979806 | 2026-08-03 11:04:11.726478 | NULL | +-------+----------------+----------+----------+-----------------+--------+----------------------------+----------------------------+-------------------+ 3 rows in set (0.001 sec) -- stop server 之后发现仍是 `ACTIVE` 状态,并且进程仍然存在。 [root@oceanbase3 log]# ps -ef|grep observer admin 2953 1 90 08:22 ? 02:29:26 /home/admin/observer/bin/observer -p 2881 admin 3581 1 0 08:23 ? 00:00:03 /home/admin/observer/bin/obshell daemon --ip 192.168.182.23 --port 2886 admin 3614 3581 0 08:24 ? 00:00:21 /home/admin/observer/bin/obshell server --ip 192.168.182.23 --port 2886 root 51356 1808 0 11:08 pts/0 00:00:00 grep --color=auto observer -- 手动 kill 进程 [root@oceanbase3 log]# kill -9 2953 -- 节点状态变成 INACTIVE ,LAST_OFFLINE_TIME 更新为进程停掉的时间 obclient(root@sys)[oceanbase]> SELECT ZONE, SVR_IP, SVR_PORT, SQL_PORT, WITH_ROOTSERVER, STATUS, START_SERVICE_TIME, STOP_TIME, LAST_OFFLINE_TIME FROM oceanbase.DBA_OB_SERVERS; +-------+----------------+----------+----------+-----------------+----------+----------------------------+----------------------------+----------------------------+ | ZONE | SVR_IP | SVR_PORT | SQL_PORT | WITH_ROOTSERVER | STATUS | START_SERVICE_TIME | STOP_TIME | LAST_OFFLINE_TIME | +-------+----------------+----------+----------+-----------------+----------+----------------------------+----------------------------+----------------------------+ | zone1 | 192.168.182.21 | 2882 | 2881 | YES | ACTIVE | 2026-08-03 08:22:42.996496 | NULL | NULL | | zone2 | 192.168.182.22 | 2882 | 2881 | NO | ACTIVE | 2026-08-03 08:24:42.536593 | NULL | NULL | | zone3 | 192.168.182.23 | 2882 | 2881 | NO | INACTIVE | NULL | 2026-08-03 11:04:11.726478 | 2026-08-03 11:12:16.881884 | +-------+----------------+----------+----------+-----------------+----------+----------------------------+----------------------------+----------------------------+ 3 rows in set (0.000 sec)

(2)START SERVER (启动节点服务)

  • 核心逻辑
    • 数据同步:将 Clog 或者基线数据与其他副本进行同步(补齐),并将上一次合并之后的内存数据恢复出来(clog 回放)。
    • 负载均衡:Root Service 调度负载均衡来完成 Leader 切回等任务。
    • 状态标记:当 OBServer 启动完成后,Root Service 将节点标记为可服务状态
      • 此时DBA_OB_SERVERS视图的状态标识为:STATUS=ACTIVE, STOP_TIME IS NULL, START_SERVICE_TIME>0
    • 请求切回:OBProxy 识别 OBServer 的状态为可服务状态后,会将相应的业务请求路由到该节点上。
-- 手动启动刚刚停掉的 OBServer 进程 [root@oceanbase1 etc]# obd cluster start obcluster -s 192.168.182.23 Get local repositories ok Load cluster param plugin ok Cluster status check ok cluster scenario: htap Start observer ok observer program health check ok Connect to observer 192.168.182.21:2881 ok obshell start ok obshell program health check ok start obproxy ok obproxy program health check ok Connect to obproxy ok Connect to observer 192.168.182.21:2881 ok Wait for observer init ok -- 查看状态变成 ACTIVE,同时 START_SERVICE_TIME 更新为启动时间,LAST_OFFLINE_TIME 置为 NULL obclient(root@sys)[oceanbase]> SELECT ZONE, SVR_IP, SVR_PORT, SQL_PORT, WITH_ROOTSERVER, STATUS, START_SERVICE_TIME, STOP_TIME, LAST_OFFLINE_TIME FROM oceanbase.DBA_OB_SERVERS; +-------+----------------+----------+----------+-----------------+--------+----------------------------+----------------------------+-------------------+ | ZONE | SVR_IP | SVR_PORT | SQL_PORT | WITH_ROOTSERVER | STATUS | START_SERVICE_TIME | STOP_TIME | LAST_OFFLINE_TIME | +-------+----------------+----------+----------+-----------------+--------+----------------------------+----------------------------+-------------------+ | zone1 | 192.168.182.21 | 2882 | 2881 | YES | ACTIVE | 2026-08-03 08:22:42.996496 | NULL | NULL | | zone2 | 192.168.182.22 | 2882 | 2881 | NO | ACTIVE | 2026-08-03 08:24:42.536593 | NULL | NULL | | zone3 | 192.168.182.23 | 2882 | 2881 | NO | ACTIVE | 2026-08-03 11:15:59.308062 | 2026-08-03 11:04:11.726478 | NULL | +-------+----------------+----------+----------+-----------------+--------+----------------------------+----------------------------+-------------------+ 3 rows in set (0.001 sec)

因此,重启节点的主要流程为:停止服务->转储->关闭进程->启动进程->启动服务

-- 1. 使用 root 用户登录到集群的 SYS 租户 -- 2. 停止服务(Stop Server) ALTER SYSTEM STOP SERVER '192.168.182.23:2882'; -- 3. 对待重启的节点进行转储操作,以便缩短重启后回放 Redo Log 的时间,加速重启: ALTER SYSTEM MINOR FREEZE SERVER = ('192.168.182.23:2882'); -- 4. 在操作系统中使用 admin 用户停止 observer 进程 kill -9 $(pidof observer) -- 5. 在操作系统中使用 admin 用户启动 observer 进程 obd cluster start obcluster -s 192.168.182.23 --或者以 admin 用户 执行,如果进入 bin 目录 执行 ./observer 会报错,并且会把 log run etc audit 等目录放在 bin 目录下,正常是在 oceanbase 目录(上层目录) cd /home/admin/oceanbase && ./bin/observer -- 6. 启动服务 ALTER SYSTEM START SERVER '192.168.182.23:2882';

重启过程中节点的下线时间需要在配置项server_permanent_offline_time设置的时间以内,否则会被永久下线。集群核心参数:server_permanent_offline_time的作用如下:

  • 定义
    • 集群级配置项,用于设置节点心跳中断的时间阈值
    • 即节点心跳中断多久后,系统认为其已被永久下线
  • 永久下线的后果
    • 意味着节点上的副本从 Paxos Group 中剔除,数据宣告失效。
    • 当该节点再次上线时,OceanBase 数据库需要进行节点上的数据副本重建,通常是一个比较耗时的操作。
  • 参数基础属性
    • 参数类型:时间类型
    • 默认值:3600 s(1 小时)
    • 取值范围[20s, +∞)
    • 是否重启 OBServer 节点生效:否(即时动态生效)
  • 不同运维场景下的建议值
    • 版本升级场景:建议将该配置项的值设置为72h
    • 硬件更换场景:建议将该配置项的值设置为4h
    • 清空上线场景:建议将该配置项的值设置为10m,使集群快速上线。

2.3 添加节点

  • 定义:为指定 Zone 内添加新的 OBServer 节点,从而可以执行后续的迁移 Unit、调整租户的UNIT_NUM、新建租户等扩容操作。
  • 前提条件
    • 待添加的 OBServer 服务器按照 OceanBase 的部署要求进行相应的配置,并完成安装 OceanBase 数据库软件。
    • 待添加的 OBServer 服务器上已启动observer进程。
  • 执行命令ALTER SYSTEM ADD SERVER 'svr_ip:svr_port' [, 'svr_ip:svr_port' ...] [ZONE [=] 'zone_name'];

2.4 删除节点

  • 定义:删除指定的 OBServer 节点,通常用于集群缩容或者故障节点替换。
  • 底层资源迁移逻辑
    • Delete Server操作涉及到负载均衡。
    • 被删除的节点上的资源单元(称为 Unit)会在同一个 Zone 中进行迁移。
    • 待 Unit 迁移成功后,Delete Server操作即可执行成功。
    • 迁移触发机制:Unit 的迁移动作是 Unit 自动均衡的过程,主要由Root Service控制。
    • 手动干预:如果你想要选择待删除节点上 Unit 迁移的目标机器,也可以手动执行 Unit 迁移。
  • 执行命令ALTER SYSTEM DELETE SERVER 'svr_ip:svr_port' [, 'svr_ip:svr_port' ...] [ZONE [=] 'zone_name'];

2.5 替换节点

替换节点适用于硬件故障场景、容量场景(不同规格机器替换),替换后集群的节点数量不变。替换节点是一套运维操作的组合:即先添加新节点 并迁移副本,然后再删除旧节点,整体时间较长。

  1. 登录集群
  • 操作:使用root用户登录到集群的SYS租户。
  1. 添加新节点
  • 操作:在待替换节点所在的 Zone 上添加新节点(例如10.xx.xx.11)。
  • 执行命令ALTER SYSTEM ADD SERVER '10.xx.xx.11:2882' ZONE 'zone1';
  1. 查询旧节点上的 Unit
  • 操作:通过DBA_OB_UNITS视图查询旧节点(例如10.xx.xx.10)上的 Unit。
  • 执行命令SELECT UNIT_ID FROM oceanbase.DBA_OB_UNITS WHERE SVR_IP = '10.xx.xx.10';
  1. 执行 MIGRATE UNIT 命令迁移 Unit
  • 执行命令(以查到UNIT_ID1016为例):ALTER SYSTEM MIGRATE UNIT 1016 DESTINATION '10.xx.xx.11:2882';
    ⚠️ 注意事项:每次仅可迁移一个 Unit。如果旧节点上有多个 Unit,则需多次执行该命令。
  1. 删除旧节点
  • 操作:等待旧节点上的所有 Unit 迁移完成后,将旧节点删除。
  • 执行命令ALTER SYSTEM DELETE SERVER "10.xx.xx.10:2882" zone='zone1';
  1. 确认删除结果
  • 操作:查询DBA_OB_SERVERS视图,确认旧节点是否删除成功。
← 返回列表