介绍如何确认无主,以及造成无主的原因的排查方法。
适用版本
OceanBase 数据库所有版本
确认无主状态
对于容灾场景的测试过程中,经常会出现无主的情况,Election 模块的正常工作依赖于集群多数派副本进程正常且多数派与 Leader 间的网络连通。可以搜索
election.log
日志查看当前是否有副本无主。
[admin@hostname log]$ grep ‘lease is expire’ election.log
如果上述日志具有内容,则表示当前存在副本无主。
此外,还可以通过以下方式确认是否有副本处于无主状态。
-
通过
table_id
、
partition_idx
查询
__all_meta_table
(对于 OceanBase 数据库 V2.X 及后续版本,查询
-
__all_virtual_meta_table
)、
__all_virtual_clog_stat
、
__all_virtual_election_info
表,查看
role
或
leader
列的情况。
-
如果所有分区的
role
均为 2,则表示该分区无主;如果
leader
为空,也表示无主。
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;
-
如果无法查询内部表,可以通过
partition_key
搜索
observer.log
日志,如果有 Clog 日志打印的
ERROR
日志中包含
reconfirm
、
leader_active_need_swtich
等关键词,也表示有分区无主。
[admin@hostname log]$ grep ‘{tid:xxxxxxxxxxxxxxx, partition_id:x, part_cnt:x}’ observer.log
-
通过
partition_key
搜索
election.log
日志,如果出现 ERROR 级别的
leader_revoke
信息,表示有 Leader 卸任,此时有分区无主。
[admin@hostname log]$ grep ‘{tid:xxxxxxxxxxxxxxxx, partition_id:x, part_cnt:x}’ election.log