本节主要介绍备集群读服务的概念及使用方法。
概述
备集群各个分区的全功能型副本或者只读副本会实时回放 REDO 日志,并且能够承载读服务。OceanBase 数据库支持单分区读和跨分区一致性读,始终保证读取结果是一个快照,从而保证事务的一致性。
由于不同分区以及不同副本的回放进度不同,默认情况下,可能导致先后两次读取的数据版本出现回退的情况。因此,OceanBase 数据库提供了单调读开关。开启单调读开关后,内部会维护租户级别单调递增的可读版本号,每次读取时都会获取全局最新的可读版本号作为快照版本,保证读取的数据越来越新,不会回退。
同时,OceanBase 数据库支持有界旧(Bounded Staleness)一致性读,保证读取的数据不会落后于主集群最新数据的特定时间,默认为 5 秒。如果备集群落后超过阈值,则读操作会重试等待,直到超时或者备集群追上。
在用户侧配置备集群的弱一致性读
备集群的普通租户仅支持弱一致性读,如果发起强一致性读、写或者 DDL 操作,则会报错。
可以通过以下两种方式来指定备集群的弱一致性读:
登录备集群的普通租户,将 Session 变量
ob_read_consistency
的值设置为WEAK
obclient> SET ob_read_consistency = WEAK;
注意
全局系统变量
ob_read_consistency
不能在备集群上设置,只能在主集群上设置。该设置仅影响当前 Session,设置后,当前 Session 中后续的读默认都是弱一致性读。
在 SQL 语句中指定 Hint
如下所示,指定
WEAK Consistency
,优先级高于ob_read_consistency
。obclient> SELECT /*+READ_CONSISTENCY(WEAK) */ * FROM t1;
在租户侧配置备集群读服务
您也可以通过两个租户级配置项控制弱一致性读服务:
enable_monotonic_weak_read
:单调读开关,默认为 False。max_stale_time_for_weak_consistency
:有界旧一致性读配置项,表示弱一致性读取的数据不会落后于指定时间的数据,默认值为 5 秒。
设置方法如下:
登录备集群的系统租户,调整特定租户或者所有租户的配置项。
为所有租户或者特定租户开启单调读
obclient> ALTER SYSTEM SET enable_monotonic_weak_read = true TENANT = [ALL|name];
为所有租户或者特定租户设置有界旧一致性读
obclient> ALTER SYSTEM SET max_stale_time_for_weak_consistency = '10s' TENANT = [ALL|name];