OceanBase集群服务自启动流程的探索

一、 验证背景与目的

本次验证旨在确认在服务器意外或计划性重启后,OceanBase 企业版集群的核心组件(observerobproxyocp_agent)是否能正确且快速地实现服务自启动,同时梳理其双重自启动机制与底层保障。

  • 版本
    • OCP-V4.3.2
    • OB-V4.2.1.6
    • ODP-V4.3.1

二、 自启动脚本配置(rc.local 层面)

为确保机器重启后能拉起服务,系统已在 /etc/rc.d/rc.local 的末尾添加了自启动脚本:

/usr/local/bin/auto_start_ob.sh >> /var/log/ob.autostart.log 2>&1 &

图(1)

操作步骤: 注释掉 rc.local 中的自启动脚本,用于验证在原生脚本缺失的情况下,是否仍有其他机制触发 OB 服务启动。

三、 重启前服务状态基线检查

在执行重启操作前,对当前环境状态进行全面检查:

  1. 进程状态检查(ps -ef):确认 ocp_agent、observer、obproxy 等关键进程均已正常运行。

图(2)

  1. 端口监听检查(netstat -nlp | grep 288*):observer:负责数据库 SQL 端口 2881 及 RPC 端口 2882;obproxy:负责代理端口 2883 及管理端口 2884;ocp_agent:负责服务监控相关端口 62888、62889。

图(3)

  1. 平台侧状态确认:通过 OceanBase 云平台(OCP)确认集群整体拓扑结构(Zone、机器数量)、OBProxy 集群状态以及主机/Agent状态均显示“在线”且“正常运行”。
  • 集群状态

图(4)

  • 主机状态

图(5)

四、 执行重启及故障观察(reboot

输入 reboot 命令后,SSH 终端立即失去连接,表明服务器已进入重启流程。

图(6)

**服务器重启完成后的初步观察:**等待服务器启动完毕并登录后,在 OCP 平台发现 10.0.0.62 节点处于“不可用”状态,显示为红色异常标志。

图(7)

五、 异常恢复过程分析(RootService 视角)

针对 10.0.0.62 异常现象,通过查询 OceanBase 内部的 dba_ob_rootservice_event_history 系统表,复盘了组件恢复的底层过程:

  • 10.0.0.62 节点下线:在机器重启瞬间,RootService 检测到节点掉线,10.0.0.62 进行 RootService 卸任操作,系统自动将其设置为永久下线时间。
  • 节点重新上线:待机器操作系统启动完成后,observer 进程被拉起并重新注册。
  • 集群恢复:RootService 发生切换或重新平衡,执行 load_servers 及 server online 事件,最终将 10.0.0.62 重新加入集群,完成状态恢复。

图(8)

六、 服务恢复与速度分析

在机器重启后,从服务启动的时间戳及各组件状态来看:

  • 服务启动极快:机器启动后,系统在极短的时间内(约 4 秒左右)即完成了 observer、obproxy、ocp_agent 等核心服务的拉起。

图(9)

  • 端口与进程恢复正常:observer 进程与 2881/2882 端口恢复正常监听;obproxy 进程与 2883/2884 端口恢复正常监听,且进程树显示由 sudo 或特定守护脚本拉起;ocp_agent 进程恢复正常,并在 journalctl 中留下了 starting ocp_agent… 的启动日志。

图(10)

图(11)

七、 根因再验证(systemd 服务干扰排查)

**遇到的现象与疑问:**在注释掉了 /etc/rc.d/rc.local 的自启动脚本后,理论上不应再触发 observer 的拉起,但上述过程依然发生了自动恢复。因此,需要进行更深层级的排查。

**排查关键点:**检查系统服务配置,发现系统层面上(如 system.conf 或专门的 observer.service 服务文件)额外配置了 OB 服务的自启动指令。以 observer.service 为例,文件内定义了 ExecStart=/home/admin/oceanbase/bin/observer 等启动项。

图(12)

**验证操作与结果:**为进一步确认其他服务是否也具备类似机制,对 observer.service 进行注释处理后再次执行 reboot,并观察启动结果:

  1. 重启后,ocp_agent、obproxy 服务通过其自身的自启动机制依然正常启动了进程。
  2. observer 进程与对应端口也再次被成功拉起。

图(12)

  1. 平台中 10.0.0.62 节点的 zone1 状态恢复正常,数据库可以通过指定账号正常连接。

图(13)

八、 最终结论与机制解析

通过上述排查流程与最终现象,结合 OceanBase 企业版实际架构,确认 OB 集群在机器重启后具备双重(且防冲突)的自启动保护机制

1. 自启动实现方式一:OCP Agent Systemd 自愈机制(优先生效)

在 OceanBase OCP v4.2.0 及后续版本中,平台在主机上安装 ocp_agent 时,会将 ocp_agent.service 安装到 /usr/lib/systemd/system/ocp_agent.service。随后系统通过 systemctl enable ocp_agent 命令,在 /etc/systemd/system/multi-user.target.wants/ 下建立软链接:

/etc/systemd/system/multi-user.target.wants/ocp_agent.service -> /usr/lib/systemd/system/ocp_agent.service

核心逻辑:每次服务器重启时,ocp_agent.servicesystemd 驱动率先拉起,随后由 ocp_agent 进程负责“自动拉起” observerobproxy 服务。这就是为什么注释掉 rc.local 以及 observer.service 后,服务依然能正常自启的根本原因。

2. 自启动实现方式二:auto_start_ob.sh 脚本兜底机制

部分场景下,用户通过 /usr/local/bin/auto_start_ob.sh 脚本配合 rc.local 实现自启动,其启动序列为:wait_until_startup_finishedautostart_obproxyautostart_obautostart_ocp_agentautostart_obagent

3. 冲突规避逻辑(防止双重拉起)

为了防止方式一和方式二同时生效引发启动冲突,脚本内部自带了一套极为关键的冲突规避逻辑

  • 预检查:auto_start_ob.sh 在准备启动前,会先检测主机上是否存在 ocp_agent.service 的 Systemd 服务。
  • 条件触发:若主机上存在 ocp_agent.service(即确认方式一已生效),脚本会直接跳过整个自启动流程,不执行拉起动作。即使主机上的 agent 服务未被 Systemd 管理,只要 agent 版本 ≥ 4.2.0,auto_start_ob.sh 依然会跳过整个自启动步骤。

总结

OceanBase 企业版采用了**“OCP Agent 自愈优先,脚本兜底且具备冲突规避”**的精密设计。在日常运维中,我们无需额外在 rc.local 或 systemd 中重复设置自启动。只需定期检查 ocp_agent.service 状态,确认其处于 enable 状态,即可保证数据库组件在服务器意外断电或重启后的高可用自动恢复