首页 » OceanBase » 如何查询oceanbase的Table主节点(Leader),或无主问题

如何查询oceanbase的Table主节点(Leader),或无主问题

在 OceanBase 数据库中,主备副本(Replica)的概念对于理解和优化查询性能非常重要。OceanBase 作为一个分布式数据库系统,通过多副本机制来保证数据的高可用性和容错性。每个数据分区(Partition)都有一个或多个副本,其中一个是主副本(Leader),其他为备副本(Follower)。本篇讨论如何确认某张表的leader 节点?如异常时无leader节点什么原因?

如何查询主备副本

要在 OceanBase 中查询主备副本的信息,提供了一些系统视图来查看集群中的副本信息。以下是一些常用的系统视图,(对于 OceanBase 数据库 V2.X 及后续版本,查询__all_virtual_meta_table)、__all_virtual_clog_stat、__all_virtual_election_info 表来查询当前主副本或是否存在副本无主情况。具体命令如下:

obclient> select table_id,primary_zone,zone_list from __all_virtual_table where table_name='TABLE NAME';

obclient> SELECT * FROM __all_meta_table WHERE table_id=xxx;
obclient> SELECT * FROM __all_virtual_meta_table WHERE table_id=xxx;
obclient> SELECT * FROM __all_virtual_clog_stat WHERE table_id=xxx AND partition_idx=xxxx;
obclient> SELECT * FROM __all_virtual_election_info WHERE table_id=xxx AND partition_idx=xxxx;

对于 __all_meta_table 和 __all_virtual_meta_table 请查看table_id、partition_idx ;__all_virtual_clog_stat、__all_virtual_election_info 表, role 为 2 或 leader 列为空的分区表示分区无主。

您可以使用如下 SQL 查询分区的主副本的分布情况:

ob-sys xx.xx.xx.xx (root@oceanbase)> select tenant_name,concat(svr_ip,svr_port) as node,role,count(*) as cnt 
from __all_virtual_meta_table t1,__all_tenant t2 
where t1.role=1 and t1.tenant_id=t2.tenant_id 
group by t2.tenant_name,concat(t1.svr_ip,t1.svr_port),t1.role;
+---------------+-------------------+------+------+
| tenant_name   | node              | role | cnt  |
+---------------+-------------------+------+------+
| sys           | xx.xxx.xx.1307702 |    1 |    5 |
| tenant_mysql  | xx.xxx.xx.1737702 |    1 |    2 |
| tenant_mysql  | xx.xxx.xx.1307702 |    1 |    2 |
| tenant_mysql  | xx.xxx.xx.1587702 |    1 |    2 |
| tenant_oracle | xx.xxx.xx.1307702 |    1 |    4 |
| tenant_oracle | xx.xxx.xx.1737702 |    1 |    4 |
| tenant_oracle | xx.xxx.xx.1587702 |    1 |    4 |
+---------------+-------------------+------+------+
7 rows in set (0.01 sec)

查看租户的 primary zone 设置

ob-sys xx.xx.xx.xx (root@oceanbase)> select tenant_name,primary_zone from __all_tenant;
+---------------+-------------------+
| tenant_name   | primary_zone      |
+---------------+-------------------+
| sys           | zone1;zone2,zone3 |
| tenant_mysql  | zone1,zone2,zone3 |
| tenant_oracle | zone1,zone2,zone3 |
+---------------+-------------------+
3 rows in set (0.00 sec)

查询切主历史日志

obclient> select table_id,primary_zone,zone_list from __all_virtual_table where table_name='TABLE NAME';

obclient>  select * from __all_virtual_election_event_history
   where table_id=xxxxx
   order by gmt_create;

OceanBase无主问题

OceanBase 在正常状况下是不会出现副本无主的情况的。在运维过程中如果直接将 OB 的多数派副本所在的机器进行宕机,会造成副本无主,这是符合预期的行为,应当继续执行运维动作,无需干预。但是如果在 OceanBase 正常运行的过程中,OceanBase 的数据副本产生了无主的情况,是需要进行问题排查的。当副本出现了无主的现象,在 observer.log 中可以发现在调用时返回 -4038、-7006 的报错,表明需要进一步诊断OB无主的原因。

排查思路

  • observer.log 日志有明显的报错信息
  • 时钟偏差
  • 有租户、表或分区被删除
  • 多数派副本宕机
  • 网络问题
  • Clog 模块恢复日志失败
  • Load 过高
  • Clog 盘满

常用的查询无主的 SQL

  1. 统计当前 election 模块无主的分区列表。
    SELECT table_id, partition_idx 
    FROM __all_virtual_election_info GROUP BY table_id, partition_idx) except (SELECT table_id, partition_idx FROM __all_virtual_election_info WHERE role = 1
    
  2. 统计当前 clog 层无主的分区列表。
    SELECT table_id, partition_idx 
    FROM __all_virtual_clog_stat GROUP BY table_id, partition_idx) except (SELECT table_id, partition_idx FROM __all_virtual_clog_stat WHERE role = 'LEADER') ;
    
  3. 统计 RS 视角无主的分区列表(有schema,meta 表无主)。
    SELECT tenant_id, table_id, partition_id 
    FROM __all_virtual_partition_table GROUP BY 1,2,3 having min(role) = 2;

总结
通过使用 OceanBase 提供的系统视图和工具,您可以轻松地查询主备副本的信息。这些信息对于理解数据分布、优化查询性能以及进行故障排查都非常重要。根据实际需求选择合适的方法进行查询,可以帮助您更好地管理和优化 OceanBase 数据库的性能。

References
https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000362141

打赏

对不起,这篇文章暂时关闭评论。