本节主要介绍了 OceanBase 数据库仲裁服务的工作原理以及仲裁服务相关的一些常见问题。
对于分布式数据库而言,当多个数据副本间发生半数异常即一半副本故障或与另一半网络隔离时,可以通过集群之外的仲裁服务来参与变更决策(选主或成员组变更),进而恢复服务。
OceanBase 数据库企业版从 V4.1.0.0 开始支持仲裁服务(Arbitratrion Service),这是一种基于 Paxos 多副本容灾方案提出的新型高可用方案。仲裁服务独立于 OceanBase 集群部署,是一个以特殊模式启动的轻量级 observer 进程,它承载着日志流级别的仲裁成员。
仲裁成员具备如下特征:
仅参与选举、成员变更投票,不参与日志同步投票。
不存储日志,无 MemTable 和 SStable,资源开销极小。
不能当选为主提供服务。
当半数全功能副本故障导致日志同步失败并且达到日志流降级控制时间时,仲裁服务会自动执行日志流降级流程,将故障副本从成员列表中剔除,从而恢复服务,且能做到 RPO = 0。待故障的全功能副本恢复时,仲裁服务又会执行日志流升级流程,将被降级的副本重新加入成员列表,提供更高的可用性保证。
仲裁服务相关的视图
| 视图名 | 描述 |
|---|---|
| DBA_OB_TENANTS | 展示租户的仲裁服务状态。 |
| GV$OB_LOG_STAT/V$OB_LOG_STAT | 展示仲裁副本成员及降级副本列表。 |
| DBA_OB_ARBITRATION_SERVICE | 展示当前集群内仲裁服务的配置信息。 |
| CDB_OB_LS_ARB_REPLICA_TASKS/DBA_OB_LS_ARB_REPLICA_TASKS | 展示当前租户及对应用户租户正在运行中的仲裁服务任务。 |
| CDB_OB_LS_ARB_REPLICA_TASK_HISTORY/DBA_OB_LS_ARB_REPLICA_TASK_HISTORY | 展示当前租户及对应用户租户执行过的仲裁服务任务历史。 |
| GV$OB_ARBITRATION_MEMBER_INFO/V$OB_ARBITRATION_MEMBER_INFO | 展示仲裁成员的详细信息,该视图从 V4.2.0.0 版本开始支持。 |
| GV$OB_ARBITRATION_SERVICE_STATUS/V$OB_ARBITRATION_SERVICE_STATUS | 展示当前集群内 OBServer 节点与仲裁 Server 之间的联通状态,该视图从 V4.2.0.0 版本开始支持。 |
1.单个 OceanBase 集群是否支持部署多个仲裁 Server 节点?
不支持,单个仲裁服务仅支持单节点部署,且单个 OceanBase 集群同时只能使用一个仲裁服务,因此部署多个仲裁 Server 没有太大意义,替换仲裁服务时才需要部署新的仲裁 Server,替换完成后将旧的仲裁 Server 下线即可。
2.OceanBase 数据库运行过程中,如何发现并处理日志流降级场景?
OceanBase 数据库运行过程中,您可以通过如下方式来查询日志流降级事件:
如果使用了 OCP 等管控平台,可以直接为租户开启降级事件监控,发生降级时,系统会自动报警。
如果未使用 OCP 等管控平台,可登录
sys租户通过查询视图DBA_OB_SERVER_EVENT_HISTORY来确认是否发生了降级,语句如下。obclient> SELECT * FROM oceanbase.DBA_OB_SERVER_EVENT_HISTORY WHERE EVENT LIKE "%DEGRADE%" ORDER BY 1 DESC LIMIT 10;如果查询结果为空,则表示当前未发生日志流降级事件,否则,查询结果中会显示发生了日志流降级的副本信息。
如果确认发生了日志流降级事件,您可以参考如下方式进行处理:
如果被降级的副本短时间可以恢复,则无需处理。
如果被降级的副本在短时间内无法恢复(例如,机器宕机无法启动、机器硬件故障等场景),可通过如果方法进行恢复:
使用
root用户登录集群的sys租户。调小 Server 永久下线的超时时间,让故障机器尽快永久下线,同时需要确保同一 Zone 内有其他可用的机器,然后等待 Root Service 发起补副本操作。
Server 永久下线的超时时间由集群级配置项
server_permanent_offline_time控制,默认为 3600s。示例如下:obclient> ALTER SYSTEM SET server_permanent_offline_time='60s';将故障机器上的 Unit 手动迁移到同 Zone 内的其他机器上。
语句如下:
ALTER SYSTEM MIGRATE UNIT unit_id DESTINATION "srv_ip:srv_port";示例如下:
obclient> ALTER SYSTEM MIGRATE UNIT = 1006 DESTINATION = 'xx.xx.xx.158:2882';
以上操作结束后,可以通过
oceanbase.DBA_OB_UNIT_JOBS视图查看数据补全进度。obclient> SELECT * FROM oceanbase.DBA_OB_UNIT_JOBS WHERE JOB_TYPE = 'MIGRATE_UNIT';如果查询结果为空,则表示 Unit 迁移完成,数据补全成功。
3. 发生了日志流降级,但是之后降级列表变空了,同时视图中又查不到仲裁升级事件,这是什么原因?
发生日志流降级后,被降级的日志流副本可能会经历如下场景:
故障恢复后触发了仲裁升级,系统将被降级的日志流副本从
GV$OB_LOG_STAT视图的DEGRADED_LIST中删除。被降级的日志流副本被迁移走了,迁移流程将其从
GV$OB_LOG_STAT视图的degraded_list中删除,同时将迁移目的端加入到PAXOS_MEMBER_LIST中。被降级的日志流副本所在的 Server 发生了永久下线,Root Service 发起了 Remove Member 流程,将其从
GV$OB_LOG_STAT视图的PAXOS_MEMBER_LIST和DEGRADED_LIST中删除,之后 Root Service 又补了一个新的 Paxos 副本到其他 Server。
4.为租户开启仲裁服务后,租户的仲裁服务状态(ARBITRATION_SERVICE_STATUS)一直卡在 enabling,如何分析并处理?
租户为 enabling 状态通常表示在执行创建仲裁成员的任务,卡在该状态有以下几种可能:
仲裁成员一直没有创建成功,例如,用户租户对应的 Meta 租户与日志流 Leader 之间或集群与仲裁 Server 之间的 RPC 通信异常。
可以通过以下方法进行排查:
使用
root用户登录集群的sys租户。查询
GV$OB_LOG_STAT视图中,该租户日志流 Leader 的ARBITRATION_MEMBER列是否已经有值。obclient> SELECT * FROM oceanbase.GV$OB_LOG_STAT WHERE tenant_id=100x AND ROLE='LEADER';
如果查询结果为空,则说明对应日志流的仲裁成员还未创建成功,否则,说明仲裁成员已创建成功。
如果日志流的仲裁成员未创建成功,则需要继续查询视图
oceanbase.DBA_OB_LS_ARB_REPLICA_TASK_HISTORY进一步确认相关任务的执行状态后,联系技术支持人员协助处理。仲裁副本已经创建成功,但用户租户对应的 Meta 租户的后台线程尝试将租户的状态从
enabling推进到enabled时发生了异常,例如,Meta 租户的内存耗尽导致无法查询虚拟表来确认各个日志流的状态。如果出现该场景,您需要登录到 Meta 租户日志流 Leader 所在的机器,查看相关日志。