首批通过分布式安全可靠测评,为关键业务系统打造
备副本延迟阈值
更新时间:2026-04-14 17:41:09
背景介绍
ODP 在转发弱读请求时,可能出现将弱读请求转发到备副本的情况,尤其是在读写分离的部署场景下,ODP 会优先将弱读请求转发到备副本。备副本所保存的数据和主副本的最新数据存在一定的延迟,弱读请求读取备副本的数据时读到的可能不是最新数据。
短时间的延迟在弱读的场景下一般是可以接受的,但是也会出现部分场景:延迟时间变长,实际的业务难以接受延迟时间过长的数据。比如下图场景中,备副本读到的数据的延迟时间超出客户端的预期,并且客户端难以感知和控制弱读数据的延迟时间。

针对该类场景,ODP 和 OceanBase 数据库提供了备副本延迟阈值的功能。
功能介绍
备副本延迟阈值功能即提供控制弱读数据最大延迟时间的能力,通过 OBServer 节点超时反馈,ODP 将超出延迟阈值的弱读请求转发到其他 OBServer 节点。
例如在上述场景,OBServer1 节点的延迟时间超出客户端的预期,当弱读请求被转发到 OBServer1 节点后,OBServer1 节点发出超时反馈,ODP 会将该弱读请求二次路由到 OBServer3 节点。展现结果如下图所示。

注意事项
您需通过设置 ODP 的相关配置来调整备副本延迟阈值的功能,需重点关注的配置有如下几个:
read_stale_retry_interval:ODP 中的配置项,用来控制副本的延迟洗白时间,即清洗数据分区延迟副本的延迟标记时间,默认值为 5s。
ob_max_read_stale_time:ODP 中的配置项,用来控制弱读请求数据允许的最大延迟时间,单位为微秒。默认值为 -1,即该功能处于默认关闭的状态。因为 OceanBase 数据库通过弱一致性读版本号来感知数据的延迟时间,因此该参数不能低于 OceanBase 数据库的弱一致性读版本号的刷新周期 weak_read_version_refresh_interval。
weak_read_version_refresh_interval:OceanBase 数据库中参数,用来控制弱一致性读版本号的刷新周期。在 OceanBase 数据库 V4.0.0 及之后版本中默认值为 100ms,在 OceanBase 数据库 V4.0.0 之前版本中默认值为 50ms。具体介绍可参见 OceanBase 数据库文档 weak_read_version_refresh_interval。
说明
该功能依赖 OceanBase 的 2.0 协议。
当某一数据分区在所有的备副本节点都延迟之后,ODP 会将访问该数据副本的请求转发到主副本。
使用示例
查询 OceanBase 数据库的 weak_read_version_refresh_interval,确保设置的 ob_max_read_stale_time 不低于该值。
obclient> show parameters like 'weak_read_version_refresh_interval'; | zone | svr_type | svr_ip | svr_port | name | data_type | value | info | section | scope | source | edit_level | +-------+----------+-------------+----------+------------------------------------+-----------+-------+----------------------------------------------------------------------------+----------+---------+---------+-------------------+ | zone1 | observer | 10.10.10.1 | 2882 | weak_read_version_refresh_interval | NULL | 100ms | the time interval to refresh cluster weak read version Range: [50ms, +∞) | OBSERVER | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE | | zone3 | observer | 10.10.10.3 | 2882 | weak_read_version_refresh_interval | NULL | 100ms | the time interval to refresh cluster weak read version Range: [50ms, +∞) | OBSERVER | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE | | zone2 | observer | 10.10.10.2 | 2882 | weak_read_version_refresh_interval | NULL | 100ms | the time interval to refresh cluster weak read version Range: [50ms, +∞) | OBSERVER | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE | +-------+----------+-------------+----------+------------------------------------+-----------+-------+----------------------------------------------------------------------------+----------+---------+---------+-------------------+使用 root 用户登录数据库的 proxysys 租户,打开弱读阈值相关配置。
obclient> alter proxyconfig set enable_ob_protocol_v2=true; Query OK, 0 rows affected obclient> alter proxyconfig set ob_max_read_stale_time='800000'; Query OK, 0 rows affected正常情况下数据的延迟时间并不会超过设置的 ob_max_read_stale_time 值(800ms),此处示例通过设置弱读副本所在节点的网卡延迟来实现数据的延迟。
obclient> select svr_ip, sql_port from oceanbase.__all_virtual_proxy_schema where tenant_name = 'mysql' and database_name = 'test' and table_name = 'test' and sql_port > 0 AND role = 2; +------------+----------+ | svr_ip | sql_port | +------------+----------+ | 10.10.10.2 | 2881 | | 10.10.10.3 | 2881 | +------------+----------+ 2 rows in set发起弱读请求
obclient> select /*+READ_CONSISTENCY(WEAK)*/ * from test where c2 = 10; Empty set查询弱读副本延迟标记记录
obclient> show proxysession read_stale; +-----------------+----------+--------------+----------------------------+ | server_addr | table_id | partition_id | feedback_time | +-----------------+----------+--------------+----------------------------+ | 10.10.10.2:2881 | 500003 | 200002 | 2023-06-25 11:18:03.129081 | +-----------------+----------+--------------+----------------------------+在副本的延迟洗白时间 read_stale_retry_interval 内,该分区的弱读请求不会再继续发给该副本
过了 read_stale_retry_interval 时间后,ODP 会尝试将请求发给被标记的副本,如果该副本仍处于延迟状态,则 OBServer 节点继续返回弱读延迟反馈,如果副本已经摆脱延迟状态,则请求继续正常执行。