本节主要介绍备集群读服务的概念及使用方法。

概述

备集群各个分区的全功能型副本或者只读副本会实时回放 REDO 日志,并且能够承载读服务。OceanBase 数据库支持单分区读和跨分区一致性读,始终保证读取结果是一个快照,从而保证事务的一致性。

由于不同分区以及不同副本的回放进度不同,默认情况下,可能导致先后两次读取的数据版本出现回退的情况。因此,OceanBase 数据库提供了单调读开关。开启单调读开关后,内部会维护租户级别单调递增的可读版本号,每次读取时都会获取全局最新的可读版本号作为快照版本,保证读取的数据越来越新,不会回退。

同时,OceanBase 数据库支持有界旧(Bounded Staleness)一致性读,保证读取的数据不会落后于主集群最新数据的特定时间,默认为 5 秒。如果备集群落后超过阈值,则读操作会重试等待,直到超时或者备集群追上。

在用户侧配置备集群的弱一致性读

备集群的普通租户仅支持弱一致性读,如果发起强一致性读、写或者 DDL 操作,则会报错。

可以通过以下两种方式来指定备集群的弱一致性读:

  • 登录备集群的普通租户,将 Session 变量 ob_read_consistency 的值设置为 WEAK

    1. obclient> SET ob_read_consistency = WEAK;

    注意

    全局系统变量ob_read_consistency不能在备集群上设置,只能在主集群上设置。

    该设置仅影响当前 Session,设置后,当前 Session 中后续的读默认都是弱一致性读。

  • 在 SQL 语句中指定 Hint

    如下所示,指定 WEAK Consistency,优先级高于 ob_read_consistency

    1. obclient> SELECT /*+READ_CONSISTENCY(WEAK) */ * FROM t1;

在租户侧配置备集群读服务

您也可以通过两个租户级配置项控制弱一致性读服务:

  • enable_monotonic_weak_read:单调读开关,默认为 False。

  • max_stale_time_for_weak_consistency:有界旧一致性读配置项,表示弱一致性读取的数据不会落后于指定时间的数据,默认值为 5 秒。

设置方法如下:

登录备集群的系统租户,调整特定租户或者所有租户的配置项。

  • 为所有租户或者特定租户开启单调读

    1. obclient> ALTER SYSTEM SET enable_monotonic_weak_read = true TENANT = [ALL|name];
  • 为所有租户或者特定租户设置有界旧一致性读

    1. obclient> ALTER SYSTEM SET max_stale_time_for_weak_consistency = '10s' TENANT = [ALL|name];