如何查询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
- 统计当前
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
- 统计当前
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') ;
- 统计 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
对不起,这篇文章暂时关闭评论。