Goldilocks的REBALANCE基本工作原理

2022-04-28 00:00:00 语句 执行 事务 节点 死锁

设定需要做REBALANCE的表分别为T1, T2, T3,具体执行过程如下:

  1. ALTER DATABASE REBALANCE 在内部会按照ALTER TABLE REBALANCE 执行

  2. ALTER TABLE T1 REBALANCE是DDL语句,会在T1表加个IX-LOCK。
    (此时如果有事务执行,DDL_TIMEOUT = 0时会出现错误)

  3. 执行REBALANCE时,会标记T1表以便能执行日志。

  4. 标记后,新的事务记录在日志中,并且标记时刻active的事务执行完成后,REBALANCE BEGIN开始。

  5. REBALANCE BEGIN开始后,T1表原来的数据会发生sync。此时会对记录进行IX-LOCK

  6. 数据SYNC完成后,将反映2~3步骤中发生的日记帐事务。

  7. 反映执行4期间产生的日记帐事务。
    4~5步骤会根据MAXIMUM_JOURNAL_REPLAY_COUNT, ONLINE_JOURNAL_REPLAY_THRESHOLD等参数决定。

  8. 后日记帐事务的反映会在所有节点加X-LOCK并执行,然后表会变为ON-LINE。
    (此时其他事务会等待。所以需要设置参数以便能把时间压到小,也是为什么负载达到高值时很难执行的原因。)

  9. 1~6按照表顺序执行。

  10. 需要使用20c正式版的理由是6号步骤。
    6中RABALANCE语句可能会死锁。
    (APP事务为IX,反映日志的事务也是IX,同级的LOCK可能会交叉。)
    出现死锁REBALANCE会rollback,需要重复直到正常执行完成。
    正式版中修正了这部分。(参数设置后执行)

=========================================

参考

  • ALTER TABLE … REBALANCE, ALTER DATABASE REBALANCE 为DDL语句。
    GOLDILOCKS CLUSTER 环境中DDL语句在某个节点执行,会自动传到所有节点执行。
    所以在某个单个节点执行是正确方式。

  • 通常DDL语句是error or success,而有些集群语句为success or success with info。

  • 执行alter system join database时如果出现下面错误信息,需要rebalance。
    (可以理解为已经join,但表需要rebalance。)

gSQL> alter system join database;

ERR-42000(16405): of the total ‘1’ tables in the database, ‘1’ tables need to be rebalanced
System altered.

  • 需要rebalance的表,可以在表为offline时,通过dba_tab_place, all_tab_place, user_tab_place的MEMBER_OFFLINE is true确认。
    大部分字典视图不会输出offline状态的信息。
    所以需要在非join的,open状态的其他节点执行。

gSQL> select * from dba_tab_place where member_offline is true;

OWNER TABLE_SCHEMA TABLE_NAME GROUP_ID GROUP_NAME MEMBER_ID MEMBER_NAME MEMBER_OFFLINE DROPPED SCN NUM_ROWS BLOCKS LAST_ANALYZED


SYS PUBLIC T1 1 G1 2 G1N2 TRUE NO 7.0.1046 null 992 null

1 row selected.

  • alter database rebalance如果执行结果如下,那就表示执行失败。
    这里的例子中DDL_LOCKTIMEOUT = 0 ,所以执行后马上发生了错误。
    ( 可以理解为alter database rebalance语句虽然执行了,但是部分表执行失败。)

gSQL> alter database rebalance;

ERR-42000(16379): of the total ‘4’ tables, ‘1’ tables failed to rebalance
Database altered.

  • 通过执行表语句可以看到发生错误

gSQL> alter table t1 rebalance;

ERR-HYT00(14026): resource busy or timeout expired

  • 通常大小比较大或者事务较多时,可以使用上述表进行确认。
    目标表的负载比较大或者记录较多,则先执行alter table ~ rebalance。
    之后再执行alter database ~ rebalance。

来源 https://www.modb.pro/db/41390

相关文章