关于教材“一致性级别的指定方式”的问题

注意中的问题:

  1. 指定了 弱读 hint 为什么还会转发到 leader 节点
  2. 备租户还分 leader 、follower 吗?为什么特别说明?难道指定备租户支持强读吗?

我的理解是,开启了事务,就是强一致性,不允许弱一致性读,指定也没有用;

备租户也是另一套新集群,是集群就是有leader和follower角色,应用也可以去链接上去做只读交易,这个时候会生效弱读,但隐含意思就是被租户不允许开事务,不具备强一致性。

以下是ai给的答案,更全面

指定了弱读 Hint 为什么还会转发到 Leader 节点?

即使指定了弱读 Hint(如 /*+read_consistency(weak)*/),请求仍可能被路由到 Leader 节点,原因如下:

  • 默认路由策略为“主备均衡”:OBProxy 默认的 proxy_route_policy 配置为空,表示采用“主备均衡路由”策略。在此模式下,弱读请求可以在 Leader 和 Follower 副本之间均匀分配流量,并不强制只访问 Follower。
  • 可优化为优先读 Follower:若希望弱读请求优先发送至 Follower 副本以减轻 Leader 负载,可通过以下命令设置备优先策略:
ALTER PROXYCONFIG SET proxy_route_policy = 'follower_first';

设置后,OBProxy 将优先将弱读请求路由到 Follower 副本。

来源:sql hint 级别弱读路由到 leader 副本

备租户是否还分 Leader 和 Follower?

是的,备租户(Standby Tenant)同样存在 Leader 和 Follower 角色

尽管备租户主要用于容灾和数据同步,但其内部的日志流(Log Stream)依然构成一个 Paxos 复制组(Paxos Group),因此必须选举出一个 Leader 副本 来协调日志的接收与分发。

具体职责如下:

  • Leader 副本:负责通过日志传输服务(Log Transport Service)从主租户拉取日志,并在备租户内部将日志同步给其他 Follower 副本。
  • Follower 副本:仅接收来自 Leader 的日志并回放,保持数据一致。

可以通过视图查看角色信息:

SELECT TENANT_ID, LS_ID, SVR_IP, ROLE FROM oceanbase.CDB_OB_LS_LOCATIONS 
WHERE TENANT_ID = <standby_tenant_id>;

来源:日志存储服务

为什么特别说明?难道指定备租户支持强读吗?

这个问题的关键在于理解“强读”的定义和备租户的设计目标。

:question: 什么是强一致性读?

根据文档定义:

  • 强一致性读(Strong Read Consistency):SQL 请求必须转发到分区的 Leader 副本 执行,确保读取最新实时数据。
  • 弱一致性读(Weak Read Consistency):可在任意副本执行,不要求最新数据,适用于统计、报表类业务。

来源:OceanBase 术语 - 强/弱一致性读

:white_check_mark: 备租户是否支持“强读”?

严格来说,备租户本身不提供对外的“强一致性读”服务,原因如下:

  1. 数据延迟性:备租户的数据是从主租户异步或准同步复制而来,存在一定延迟,无法保证“实时最新”。
  2. 不可写入:备租户通常处于只读状态,不能接受写操作,因此也无法成为外部事务的一致性读锚点。
  3. 角色定位不同:虽然备租户有内部的 Leader/Follower,但这个 Leader 是为了管理日志回放流程,并非用于对外提供强一致性读服务

不过,在某些特定场景下(如 Failover 后切换为主租户),系统会启用其读写能力,此时才具备强读语义。

:mag: 特别说明的原因

之所以强调“备租户也有 Leader/Follower”,是为了澄清一个常见误解:

“只有主租户才有 Leader”。

实际上,任何基于 Paxos 协议的复制组都必须选出 Leader 来协调日志复制。即便是在备租户中,也需要一个 Leader 来统一接收和广播日志,保证数据一致性。这是分布式系统底层机制的要求。

总结

问题 回答
弱读 Hint 为何还走 Leader? OBProxy 默认使用“主备均衡”策略,允许弱读在 Leader/Follower 间均衡负载;可通过 proxy_route_policy='follower_first' 改为优先读 Follower。
备租户是否分 Leader/Follower? 是的,备租户的日志流也遵循 Paxos 协议,需选举 Leader 来协调日志同步。
为何要特别说明这一点? 避免误解“只有主租户才有 Leader”,强调分布式一致性协议的基本原理。
备租户支持强读吗? 不支持。备租户数据有延迟且不可写,不符合强一致性读要求;其内部 Leader 仅用于日志分发,非对外服务角色。

建议:对于读写分离或容灾架构设计,应明确区分“物理角色”(Leader/Follower)与“服务语义”(强/弱读),避免混淆。

2 个赞

解释的好详细,学习了

V4版本事务内默认采用强读模式,因为如果事务内有强读弱读混合,可能会导致读取数据版本不一致引发问题。所以事务里面会默认将弱读转到Leader当强读。

1 个赞