关于4.x版本后主备租户之间关联性的疑问咨询

基本信息

  • 测试环境
  • 主备架构
  • 问题描述
    • 3.x版本主备是集群模式,有v$ob_cluster这类视图能看主备之间的状态和关系,4.x我知道有一个dba_ob_tenants视图能看租户的主备角色(TENANT_ROLE字段),但没法看到这个备租户对应的主租户是哪一个,咨询下社区,还有其他视图能关联查询到吗主备租户之间的关系吗。
-- 主租户
obclient [oceanbase]> select * from dba_ob_tenants\G
*************************** 1. row ***************************
                 TENANT_ID: 1006
               TENANT_NAME: ob_master_mysql
               TENANT_TYPE: USER
               CREATE_TIME: 2025-02-24 15:36:08.290707
               MODIFY_TIME: 2025-02-24 15:36:20.148844
              PRIMARY_ZONE: RANDOM
                  LOCALITY: FULL{1}@zone1
         PREVIOUS_LOCALITY: NULL
        COMPATIBILITY_MODE: MYSQL
                    STATUS: NORMAL
             IN_RECYCLEBIN: NO
                    LOCKED: NO
               TENANT_ROLE: PRIMARY
         SWITCHOVER_STATUS: NORMAL
          SWITCHOVER_EPOCH: 1740388998019850
                  SYNC_SCN: 1742523873766735581
            REPLAYABLE_SCN: 1742523873766735581
              READABLE_SCN: 1742523873766735580
        RECOVERY_UNTIL_SCN: 4611686018427387903
                  LOG_MODE: ARCHIVELOG
ARBITRATION_SERVICE_STATUS: DISABLED
                  UNIT_NUM: 1
                COMPATIBLE: 4.2.1.9
                 MAX_LS_ID: 1001
1 row in set (0.003 sec)


-- 备租户
obclient [oceanbase]> select * from dba_ob_tenants\G
*************************** 1. row ***************************
                 TENANT_ID: 1008
               TENANT_NAME: ob_slave_mysql
               TENANT_TYPE: USER
               CREATE_TIME: 2025-02-25 16:05:59.234424
               MODIFY_TIME: 2025-02-25 16:06:17.923541
              PRIMARY_ZONE: RANDOM
                  LOCALITY: FULL{1}@zone1
         PREVIOUS_LOCALITY: NULL
        COMPATIBILITY_MODE: MYSQL
                    STATUS: NORMAL
             IN_RECYCLEBIN: NO
                    LOCKED: NO
               TENANT_ROLE: STANDBY
         SWITCHOVER_STATUS: NORMAL
          SWITCHOVER_EPOCH: 0
                  SYNC_SCN: 1742523991897528029
            REPLAYABLE_SCN: 1742523991897528029
              READABLE_SCN: 1742523991397000147
        RECOVERY_UNTIL_SCN: 4611686018427387903
                  LOG_MODE: ARCHIVELOG
ARBITRATION_SERVICE_STATUS: DISABLED
                  UNIT_NUM: 1
                COMPATIBLE: 4.2.1.9
                 MAX_LS_ID: 1001
1 row in set (0.022 sec)

@论坛小助手

根据文档库中的信息,4.x 版本的 OceanBase 数据库确实可以通过 DBA_OB_TENANTS 视图查看租户的角色(通过 TENANT_ROLE 字段),但目前没有直接提供一个视图来显示主备租户之间的关联关系。

问题分析

在 3.x 版本中,可以通过 v$ob_cluster 视图查看主备集群之间的状态和关系。而在 4.x 版本中,虽然可以通过 DBA_OB_TENANTS 视图查看租户的角色(PRIMARYSTANDBY),但无法直接从该视图中获取主租户与备租户之间的对应关系。

解决方案

尽管没有直接的视图可以显示主备租户之间的关联关系,但可以通过以下方式间接查询:

  1. 通过 SYNC_SCN 字段关联主备租户
    DBA_OB_TENANTS 视图中,SYNC_SCN 字段表示当前租户同步到的 SCN(System Change Number)。主租户和备租户的 SYNC_SCN 值通常是相关的。可以通过比较不同租户的 SYNC_SCN 值来推测主备租户的关系。

    SELECT TENANT_NAME, TENANT_ROLE, SYNC_SCN 
    FROM DBA_OB_TENANTS;
    

    输出示例:

    +----------------+-------------+------------------+
    | TENANT_NAME    | TENANT_ROLE | SYNC_SCN        |
    +----------------+-------------+------------------+
    | ob_master_mysql| PRIMARY     | 1742523873766735581 |
    | ob_slave_mysql | STANDBY     | 1742523991897528029 |
    +----------------+-------------+------------------+
    

    如果两个租户的 SYNC_SCN 值接近,则可以推测它们之间存在主备关系。

  2. 通过 SWITCHOVER_STATUSSWITCHOVER_EPOCH 字段
    SWITCHOVER_STATUS 字段表示切换状态,SWITCHOVER_EPOCH 字段表示切换的时间戳。主租户和备租户的这些字段值通常是一致的。可以通过以下 SQL 查询:

    SELECT TENANT_NAME, TENANT_ROLE, SWITCHOVER_STATUS, SWITCHOVER_EPOCH 
    FROM DBA_OB_TENANTS;
    

    输出示例:

    +----------------+-------------+-------------------+---------------------+
    | TENANT_NAME    | TENANT_ROLE | SWITCHOVER_STATUS| SWITCHOVER_EPOCH   |
    +----------------+-------------+-------------------+---------------------+
    | ob_master_mysql| PRIMARY     | NORMAL           | 1740388998019850   |
    | ob_slave_mysql | STANDBY     | NORMAL           | 1740388998019850   |
    +----------------+-------------+-------------------+---------------------+
    

    如果两个租户的 SWITCHOVER_STATUSSWITCHOVER_EPOCH 值一致,则可以推测它们之间存在主备关系。

  3. 通过日志或配置文件
    主备租户的关系也可以通过日志或配置文件进行确认。例如,在创建备租户时,通常会指定主租户的信息。可以通过检查相关日志或配置文件来确认主备租户的对应关系。

总结

目前 4.x 版本的 OceanBase 数据库没有直接提供一个视图来显示主备租户之间的关联关系,但可以通过以下方式间接查询:

  • 比较 SYNC_SCN 值。
  • 检查 SWITCHOVER_STATUSSWITCHOVER_EPOCH 字段。
  • 查看日志或配置文件。

如果需要更直观的方式查看主备租户的关系,建议提交功能需求至 OceanBase 社区,以便后续版本中增加相关功能支持。

检索到的文档如下:

  1. 使用命令行进行运维
  2. 查看 OceanBase 集群资源的使用情况
  3. 使用 MySQL 租户做常见数据库开发
  4. 连接租户
  5. ODP SQL 路由原理
  6. 管理 OceanBase 数据库连接

助手给的回答都是预计或人工判断主从角色,好像没有一个通过SQL或者类似的方式能直接关联查询出来的方式

我能找到的一个从库查看主库信息的方式,不一定对,但能关联上

-- 在从库查询
SELECT T1.TENANT_ID,
       T1.TENANT_NAME,
       T1.TENANT_TYPE,
       T1.COMPATIBILITY_MODE,
       T1.STATUS,
       T1.TENANT_ROLE,
       T1.SWITCHOVER_STATUS,
       T2.VALUE AS PRIMARY_CONN_INFO
  FROM OCEANBASE.DBA_OB_TENANTS T1
 INNER JOIN OCEANBASE.CDB_OB_LOG_RESTORE_SOURCE T2
    ON T1.TENANT_ID = T2.TENANT_ID
 WHERE 1 = 1
   AND T1.TENANT_TYPE = 'USER'

-- 输出的信息能看到主库IP、TENANT_ID和CLUSTER_ID的信息
*************************** 1. row ***************************
         TENANT_ID: 1008
       TENANT_NAME: ob_slave_mysql
       TENANT_TYPE: USER
COMPATIBILITY_MODE: MYSQL
            STATUS: NORMAL
       TENANT_ROLE: STANDBY
 SWITCHOVER_STATUS: NORMAL
 PRIMARY_CONN_INFO: IP_LIST=10.186.58.15:2881,USER=STANDBYRO@ob_master_mysql,PASSWORD=AF2F444953B4785B4AFC98938496344CEB1D4216062EC727BDF0B691B2A074FF,TENANT_ID=1006,CLUSTER_ID=1740105588,COMPATIBILITY_MODE=MYSQL,IS_ENCRYPTED=true
1 row in set (0.037 sec)

除了一个查看租户视图DBA_OB_TENANTS和CDB_OB_LOG_RESTORE_SOURCE日志流信息的视图 没有一个视图能查看其对应主备租户角色的视图
DBA_OB_TENANTS 这个视图 可以分别在主备上查看角色信息
CDB_OB_LOG_RESTORE_SOURCE 这个查看备库日志恢复源信息的

找了一个主库和备库有关联信息的地方,备库会有一个STANDBYRO用户定期往主库发状态查询的SQL

-- 备库这个用户持续执行下面的SQL做主库状态采集
obclient [oceanbase]> select distinct SVR_IP,TENANT_NAME,USER_NAME,QUERY_SQL  from gv$ob_sql_audit where USER_NAME = 'STANDBYRO';
+--------------+-----------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
| SVR_IP       | TENANT_NAME     | USER_NAME | QUERY_SQL                                                                                                                                                     |
+--------------+-----------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 10.186.58.15 | ob_master_mysql | STANDBYRO | SELECT SVR_IP, SVR_PORT, ROLE, BEGIN_LSN, END_LSN FROM GV$OB_LOG_STAT WHERE tenant_id = 1006 AND ls_id = 1 ORDER BY tenant_id, ls_id, svr_ip, svr_port ASC    |
| 10.186.58.15 | ob_master_mysql | STANDBYRO | SELECT SVR_IP, SVR_PORT, ROLE, BEGIN_LSN, END_LSN FROM GV$OB_LOG_STAT WHERE tenant_id = 1006 AND ls_id = 1001 ORDER BY tenant_id, ls_id, svr_ip, svr_port ASC |
| 10.186.58.15 | ob_master_mysql | STANDBYRO | SELECT SVR_IP, SVR_PORT, ZONE, ZONE_TYPE, REGION FROM GV$OB_UNITS WHERE tenant_id = 1006                                                                      |
| 10.186.58.15 | ob_master_mysql | STANDBYRO | SELECT VALUE FROM GV$OB_PARAMETERS WHERE NAME='cluster_id'                                                                                                    |
| 10.186.58.15 | ob_master_mysql | STANDBYRO | SELECT TENANT_ID FROM DBA_OB_TENANTS WHERE TENANT_NAME='ob_master_mysql'                                                                                      |
| 10.186.58.15 | ob_master_mysql | STANDBYRO | SELECT SVR_IP, SQL_PORT AS SVR_PORT FROM DBA_OB_ACCESS_POINT WHERE TENANT_ID=1006                                                                             |
+--------------+-----------------+-----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
6 rows in set (0.016 sec)
-- 基于processlist中这个用户的信息能初步从主库的视角判断是否有备库以及备库的IP地址
SELECT DISTINCT SUBSTRING_INDEX(T2.HOST, ':', 1) AS STANDBY_HOST,
                T2.USER STANDBY_USER,
                T2.TENANT PRIMARY_TENANT,
                T1.TENANT_ID AS PRIMARY_TENANT_ID,
                T1.STATUS AS PRIMARY_STATUS,
                T1.COMPATIBILITY_MODE
  FROM OCEANBASE.DBA_OB_TENANTS T1
 INNER JOIN OCEANBASE.GV$OB_PROCESSLIST T2
    ON T1.TENANT_NAME = T2.TENANT
 WHERE 1 = 1
   AND T1.TENANT_TYPE = 'USER'
   AND T2.USER = 'STANDBYRO'

*************************** 1. row ***************************
      STANDBY_HOST: 10.186.58.16
      STANDBY_USER: STANDBYRO
    PRIMARY_TENANT: ob_master_mysql
 PRIMARY_TENANT_ID: 1006
    PRIMARY_STATUS: NORMAL
COMPATIBILITY_MODE: MYSQL
1 row in set (0.010 sec)

补充:基于归档日志的物理备库可能没法基于processlist观测关系,主备之间网络不一定连通

1、DBA_OB_TENANTS 可以监控主备租户的状态和同步进度。
2、主租户负责生成和归档 Redo 日志,但无法直接感知备租户的存在。
3、备租户通过配置日志恢复源,从主租户的日志归档中读取并应用日志,从而实现数据同步。