基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
体验高可用与故障切换
更新时间:2026-10-27 15:56:46
高可用是分布式数据库的可靠性基础。OceanBase 数据库采用 Shared-Nothing 的分布式架构,数据以多副本方式存储在多个节点上,通过基于 Multi-Paxos 的分布式共识协议保证副本间数据的一致性。当节点发生宕机等故障时,系统能够自动选举新的主副本并继续提供服务,无需人工干预,容灾能力可以达到 RPO=0、RTO<8 秒。
本文将引导您完成以下体验:
- 理解高可用架构:掌握 Zone、副本、日志流、Leader/Follower、Paxos 多数派等核心概念。
- 观察副本与 Leader 分布:通过系统视图查看日志流副本的位置、角色与同步状态。
- 模拟进程异常:强制终止 observer 进程,观察服务可用性的变化。
- 体验服务恢复与数据零丢失:重新拉起进程恢复服务,验证故障前后数据完整一致。
说明
本文基于 OceanBase 数据库 V5.0.1(社区版)撰写,文中相关命令和功能说明均以 V5.0.1 版本为准。本文以 部署 OceanBase 中使用 All in One 安装包部署的单节点环境为例。单节点集群中的租户为单副本(每个日志流只有 1 个副本),因此本文体验的是"观察副本与 Leader 分布 + 模拟进程异常 + 服务恢复"。多副本集群在节点故障时自动切换主副本的能力,需要至少 3 节点集群,本文将在多副本集群的故障切换一节说明其行为,您也可以参考 使用命令行部署 OceanBase 数据库生产环境 部署多节点集群深入体验。
前提条件
在开始本文操作前,确保满足以下条件:
| 项目 | 描述 |
|---|---|
| OceanBase 数据库 | 已使用 All in One 安装包完成部署并成功启动(部署名为 demo),参见 部署 OceanBase。 |
| 机器资源 | 建议不低于 4 核 CPU、16 GB 内存。 |
| sys 租户访问 | 可使用 root 用户登录集群的 sys 租户执行管理操作。sys 租户 root 用户的密码为部署时随机生成的密码,可在部署输出或 obd cluster display demo 命令的输出中查看。 |
| obclient | 已安装 obclient 并可正常连接 OceanBase 数据库。使用 All in One 安装包部署时已自动安装。 |
| 多租户基础(可选) | 本文会创建一个体验租户,租户与资源池的概念参见 体验多租户与资源隔离。 |
高可用架构简介
OceanBase 数据库的体系架构和实现方式,保证了数据的强一致性、完整性和高可用。理解以下核心概念有助于开展后续体验:
| 概念 | 说明 |
|---|---|
| 集群(Cluster)与 Zone | 一个 OceanBase 集群由若干个 Zone 组成,一个 Zone 由多台物理机器组成,每台物理机器称之为数据节点(OBServer 节点)。一个分区(或日志流)的多个副本分散在多个不同的 Zone 里,从而实现服务器级、机房级甚至地区级的容灾能力。 |
| 副本(Replica) | 同一份数据在不同节点的拷贝。OceanBase 以 Paxos 协议的多副本架构作为高可用能力的基础,在少数派副本故障的情况下依然能够提供无损的数据库服务。 |
| 日志流(Log Stream,LS) | 由 OceanBase 数据库自动创建和管理的实体,代表一批数据的集合,包括若干数据分区及对其进行事务操作的日志和事务管理结构。每个日志流和它的副本构成一个独立的 Paxos 组。 |
| 主副本(Leader)/ 从副本(Follower) | 多个副本中有且只有一个副本接受修改操作,叫做主副本(Leader),其他叫做从副本(Follower)。Leader 提供强一致读写服务,Follower 提供弱一致读服务,并在 Leader 故障时可快速切换为 Leader。 |
| 多数派(Paxos) | 事务提交时,日志需要在多数派副本上持久化成功。任意少数派副本故障时,数据不会丢失、服务不会停止,系统总是可以自动选择新的副本作为主副本继续提供服务。 |
| Primary Zone | 租户级配置,指定 Leader 优先分布的 Zone。选举服务的优先级机制会参考 Primary Zone 及机器的异常状态等,选择更优的副本作为主副本。 |
在 OceanBase 数据库中,用户的读写请求由日志流的 Leader 副本提供服务:所有修改都会产生日志,并通过 Multi-Paxos 协议同步给其他 Follower 副本。当 Leader 所在节点发生故障时,一个 Follower 会被选举为新的 Leader 并继续提供服务。选举服务是高可用的基石:在 V4.x 版本中,选举服务的粒度是日志流,且不再依赖 NTP 等外部时钟同步服务,而是通过本地时钟以及经过改进的租约机制来保证一致性。
说明
根据部署方式的不同,OceanBase 可以实现服务器(Server)级、机房(Zone)级、地区(Region)级无损容灾。详细信息请参见 高可用架构概述。
观察副本与 Leader 分布
日志流具有位置信息(分布于哪些节点)和角色信息(LEADER 还是 FOLLOWER),本节在 sys 租户中通过系统视图查看集群中所有租户的日志流副本分布情况。
操作步骤
使用 root 用户登录集群的 sys 租户(密码为部署时随机生成的密码,获取方式见上文前提条件):
obclient -h127.0.0.1 -uroot@sys -P2881 -p -A oceanbase通过
CDB_OB_LS_LOCATIONS视图查看所有租户的日志流副本分布:obclient [oceanbase]> SELECT TENANT_ID, LS_ID, SVR_IP, ZONE, ROLE, PAXOS_REPLICA_NUMBER, REPLICA_TYPE FROM oceanbase.CDB_OB_LS_LOCATIONS;返回结果示例如下(示例环境已创建用户租户
ha_tenant并在其中建表,实际租户 ID 因创建顺序而异;如果您刚完成部署、尚未创建用户租户或业务表,此处返回的行数会更少,属正常现象):+-----------+-------+-----------+-------+--------+----------------------+--------------+ | TENANT_ID | LS_ID | SVR_IP | ZONE | ROLE | PAXOS_REPLICA_NUMBER | REPLICA_TYPE | +-----------+-------+-----------+-------+--------+----------------------+--------------+ | 1 | 1 | 127.0.0.1 | zone1 | LEADER | 1 | FULL | | 1001 | 1 | 127.0.0.1 | zone1 | LEADER | 1 | FULL | | 1002 | 1 | 127.0.0.1 | zone1 | LEADER | 1 | FULL | | 1002 | 1001 | 127.0.0.1 | zone1 | LEADER | 1 | FULL | +-----------+-------+-----------+-------+--------+----------------------+--------------+ 4 rows in set对结果的关键字段解读如下:
字段 结果解读 TENANT_ID租户 ID。 1为 sys 租户;每个用户租户都会伴随一个 Meta 租户(系统内部租户,用于存储和管理租户自身的元数据信息,用户无法直接访问),可通过DBA_OB_TENANTS视图中META$开头的租户名识别。示例中1001为 Meta 租户、1002为用户租户ha_tenant。LS_ID日志流 ID。每个租户都有 1号系统日志流;用户租户创建后并不会立即有用户日志流,在租户中创建用户表后,系统会自动创建1001号及之后的用户日志流,业务数据存储在用户日志流上(示例中1002号租户的1001号日志流即为其建表后出现)。SVR_IP/ZONE副本所在节点与 Zone。单节点集群所有副本均位于同一节点、同一 Zone。 ROLE副本角色,均为 LEADER:单副本日志流没有 Follower,其唯一副本就是 Leader。PAXOS_REPLICA_NUMBERPaxos 副本数,均为 1。多副本集群中该值通常为3(或5),此时同一日志流会输出多行,分布在不同的节点与 Zone 上,其中只有一行ROLE为LEADER。REPLICA_TYPE副本类型。 FULL为全功能型副本,拥有 RedoLog、MemTable 和 SSTable 等全部完整数据和功能,是必选副本。通过
V$OB_LOG_STAT视图查看日志流的角色与同步状态:obclient [oceanbase]> SELECT TENANT_ID, LS_ID, SVR_IP, SVR_PORT, ROLE, PAXOS_REPLICA_NUM, IN_SYNC FROM oceanbase.V$OB_LOG_STAT;在系统租户中查询此视图时,将展示所有租户日志流的状态。返回结果示例如下:
+-----------+-------+-----------+----------+--------+-------------------+----------+ | TENANT_ID | LS_ID | SVR_IP | SVR_PORT | ROLE | PAXOS_REPLICA_NUM | IN_SYNC | +-----------+-------+-----------+----------+--------+-------------------+----------+ | 1 | 1 | 127.0.0.1 | 2882 | LEADER | 1 | YES | | 1001 | 1 | 127.0.0.1 | 2882 | LEADER | 1 | YES | | 1002 | 1 | 127.0.0.1 | 2882 | LEADER | 1 | YES | | 1002 | 1001 | 127.0.0.1 | 2882 | LEADER | 1 | YES | +-----------+-------+-----------+----------+--------+-------------------+----------+ 4 rows in setV$OB_LOG_STAT展示的是日志流 Palf(基于 Paxos 的日志模块)的状态,常用于查询日志流是否有 Leader、成员列表及副本同步状态。结果中ROLE为LEADER表示该副本是日志流的主副本;IN_SYNC为YES表示副本与 Leader 完全同步。
说明
在多副本集群中,以上两个视图会为同一日志流输出多行记录(每个副本一行):CDB_OB_LS_LOCATIONS 的 MEMBER_LIST 字段展示成员列表,V$OB_LOG_STAT 的 PAXOS_MEMBER_LIST 字段展示 Paxos 成员列表,多行中仅一行 ROLE 为 LEADER,其余为 FOLLOWER。通过租户的 DBA_OB_LS_LOCATIONS 视图(不带 CDB 前缀)可查看本租户视角的副本分布。详细信息请参见 DBA_OB_LS_LOCATIONS 和 V$OB_LOG_STAT。
模拟进程异常并观察服务恢复
本节模拟 observer 进程异常崩溃的场景(例如进程被操作系统强制终止),观察服务可用性的变化,然后重新拉起进程恢复服务,并验证故障前后数据的一致性。
操作步骤
创建体验租户并准备验证数据。在 sys 租户中执行以下命令创建租户
ha_tenant(租户与资源池的详细说明请参见 体验多租户与资源隔离,如已有业务租户也可直接复用):obclient [oceanbase]> CREATE RESOURCE UNIT ha_unit MAX_CPU=1, MIN_CPU=1, MEMORY_SIZE='2G'; obclient [oceanbase]> CREATE RESOURCE POOL ha_pool UNIT='ha_unit', UNIT_NUM=1, ZONE_LIST=('zone1'); obclient [oceanbase]> CREATE TENANT IF NOT EXISTS ha_tenant CHARSET='utf8mb4', PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('ha_pool') SET ob_tcp_invited_nodes='%';使用 root 用户登录
ha_tenant(新创建租户的 root 用户默认密码为空,出现密码输入提示时直接回车即可),创建测试表并写入数据:obclient -h127.0.0.1 -uroot@ha_tenant -P2881 -p -A testobclient [test]> CREATE TABLE ha_demo_order (id INT PRIMARY KEY, item VARCHAR(50), amount DECIMAL(10,2)); Query OK, 0 rows affected obclient [test]> INSERT INTO ha_demo_order VALUES (1, 'keyboard', 149.00), (2, 'mouse', 79.00), (3, 'monitor', 999.00); Query OK, 3 rows affected obclient [test]> SELECT COUNT(*) FROM ha_demo_order; +----------+ | COUNT(*) | +----------+ | 3 | +----------+ 1 row in set记录当前的行数
3作为故障前的基线。保持当前 obclient 会话不要退出,后续将直接观察该会话在故障期间的表现。新开一个终端,查找 observer 进程并强制终止,模拟进程异常崩溃:
# 查找 observer 进程 ps -ef | grep observer | grep -v grep # 强制终止 observer 进程(PID 以上一步查询结果为准) kill -9 <PID>回到
ha_tenant的会话,再次执行查询:obclient [test]> SELECT COUNT(*) FROM ha_demo_order; ERROR 2013 (HY000): Lost connection to MySQL server during query No connection. Trying to reconnect... ERROR 2002 (HY000): Can't connect to OceanBase server on '127.0.0.1' (115)连接已中断,客户端尝试自动重连也失败,服务不可用。此时新开连接同样会失败:
obclient -h127.0.0.1 -uroot@ha_tenant -P2881 -p -A test ERROR 2002 (HY000): Can't connect to OceanBase server on '127.0.0.1' (115)单副本集群的唯一节点故障后,没有其他副本可以接管服务,服务将持续不可用,直到进程被重新拉起。
说明
报错信息可能因客户端版本与连接方式略有差异,例如部分环境下显示 ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1:2881' (111)。无论具体报错为何,核心现象一致:已有连接断开、新连接无法建立,说明服务当前不可用。
在终端中重新拉起集群(
obd demo部署的集群部署名固定为demo;如集群未通过 obd 管理,请按部署时记录的启动命令重新启动 observer 进程):obd cluster restart demo等待命令执行完成、各组件状态变为
running。回到
ha_tenant的会话,再次执行查询。客户端将自动重新连接,并返回结果:obclient [test]> SELECT COUNT(*) FROM ha_demo_order; No connection. Trying to reconnect... Connection id: 3221700101 Current database: test +----------+ | COUNT(*) | +----------+ | 3 | +----------+ 1 row in set查询恢复正常,行数与故障前基线一致,数据零丢失。输出中的
Connection id为重连后新会话的连接 ID(数值因环境而异),Current database表示重连后仍处于原来的数据库上下文。这是因为在单副本模式下,事务提交同样要求 RedoLog 持久化到磁盘后才返回成功,进程异常崩溃不会丢失任何已提交事务。
注意
kill -9仅用于本文的体验场景,生产环境严禁直接强杀 observer 进程。生产环境的运维操作请参见官网《OceanBase 数据库》文档中的运维管理章节。- 进程恢复时间取决于集群启动耗时(包含 Redo 回放等流程)。从执行
obd cluster restart到服务恢复通常在分钟级以内,本文实测直接重新拉起进程的场景下从进程启动到服务恢复约 15 秒。恢复期间请耐心等待,无需重复执行拉起命令。 - 如需观察恢复后的副本状态,可在服务恢复后重新执行本文观察副本与 Leader 分布一节中的视图查询,确认各日志流
ROLE恢复为LEADER、IN_SYNC为YES。
结果解读
| 观察项 | 预期现象 | 说明 |
|---|---|---|
| 故障期间已有会话 | 执行 SQL 报错 ERROR 2013,连接中断 |
服务进程崩溃,所有连接断开 |
| 故障期间新建连接 | 连接失败(如 ERROR 2002 / ERROR 2003) |
唯一节点不可用,无副本可接管 |
| 恢复后服务 | obclient 自动重连成功,查询正常返回 | 进程重新拉起后,日志流恢复服务 |
| 恢复后数据 | 行数与故障前基线一致,零丢失 | 已提交事务的 RedoLog 已持久化,重启后数据完全恢复 |
多副本集群的故障切换
本文的单节点环境为单副本部署,节点故障时服务中断并依赖人工恢复。而在生产环境常见的三副本集群中(3 个 Zone 各部署一个 OBServer 节点),同样的节点故障表现完全不同:
| 对比项 | 单副本集群(本文环境) | 三副本集群(多节点部署) |
|---|---|---|
| 节点故障时服务 | 中断 | 不中断,自动无损切换 |
| 恢复方式 | 人工执行 obd cluster restart |
自动选举新 Leader,继续提供服务 |
| 恢复指标 | 取决于人工介入时间 | RPO=0(数据零丢失),RTO<8 秒 |
| 数据丢失 | 已提交数据不丢失 | 已提交数据不丢失(多数派持久化) |
在三副本集群中,每个日志流的 3 个副本分布在 3 个 Zone 的不同节点上,构成一个 Paxos 组,同一时刻只有 1 个 Leader 对外提供读写服务。当 Leader 所在节点宕机时:
- 剩余的 2 个副本构成多数派,数据不丢失、多数派日志依然可提交;
- 选举服务在剩余副本中快速选举出新的 Leader(租约超时后触发,通常在秒级完成);
- 业务的后续请求被路由到新 Leader,服务自动恢复,无需人工干预;
- 故障节点恢复重新加入集群后,Root Service 会自动补齐缺失的副本,恢复三副本状态。
说明
如需亲身体验多副本自动切换,可参考 使用命令行部署 OceanBase 数据库生产环境 部署 3 节点集群后,停掉任意一个节点并观察 CDB_OB_LS_LOCATIONS 视图中 Leader 的迁移,以及业务连接的自动恢复情况。
下一步
完成本文的高可用与故障切换体验后,您可以继续以下探索之旅:
- 体验水平扩展与弹性伸缩:探索计算、存储和租户资源层面的扩展能力,观察扩容前后的资源变化与业务容量影响,参见 体验水平扩展与弹性伸缩。
- 体验并行导入与高压缩:使用并行导入能力完成大批量入库,并对比压缩前后的存储占用,参见 体验并行导入与高压缩。
- 深入多租户与资源隔离:在一个集群中为不同业务创建相互隔离的租户,参见 体验多租户与资源隔离。
相关文档
- 高可用的体系架构、Multi-Paxos 协议与选举服务的详细介绍请参见 高可用架构概述。
- 副本概念、副本类型(全功能型/只读型)的详细介绍请参见 副本介绍。
- 分区、分片、日志流与副本的关系请参见 日志流和副本概述。
- 查看日志流副本分布的视图说明请参见 DBA_OB_LS_LOCATIONS 和 CDB_OB_LS_LOCATIONS。
- 查看日志流角色与同步状态的视图说明请参见 V$OB_LOG_STAT。
- 多节点集群的部署方法请参见 使用命令行部署 OceanBase 数据库生产环境。