注意中的问题:
- 指定了 弱读 hint 为什么还会转发到 leader 节点
- 备租户还分 leader 、follower 吗?为什么特别说明?难道指定备租户支持强读吗?
我的理解是,开启了事务,就是强一致性,不允许弱一致性读,指定也没有用;
备租户也是另一套新集群,是集群就是有leader和follower角色,应用也可以去链接上去做只读交易,这个时候会生效弱读,但隐含意思就是被租户不允许开事务,不具备强一致性。
以下是ai给的答案,更全面
即使指定了弱读 Hint(如 /*+read_consistency(weak)*/),请求仍可能被路由到 Leader 节点,原因如下:
proxy_route_policy 配置为空,表示采用“主备均衡路由”策略。在此模式下,弱读请求可以在 Leader 和 Follower 副本之间均匀分配流量,并不强制只访问 Follower。ALTER PROXYCONFIG SET proxy_route_policy = 'follower_first';
设置后,OBProxy 将优先将弱读请求路由到 Follower 副本。
是的,备租户(Standby Tenant)同样存在 Leader 和 Follower 角色。
尽管备租户主要用于容灾和数据同步,但其内部的日志流(Log Stream)依然构成一个 Paxos 复制组(Paxos Group),因此必须选举出一个 Leader 副本 来协调日志的接收与分发。
具体职责如下:
可以通过视图查看角色信息:
SELECT TENANT_ID, LS_ID, SVR_IP, ROLE FROM oceanbase.CDB_OB_LS_LOCATIONS
WHERE TENANT_ID = <standby_tenant_id>;
来源:日志存储服务
这个问题的关键在于理解“强读”的定义和备租户的设计目标。
根据文档定义:
严格来说,备租户本身不提供对外的“强一致性读”服务,原因如下:
不过,在某些特定场景下(如 Failover 后切换为主租户),系统会启用其读写能力,此时才具备强读语义。
之所以强调“备租户也有 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)与“服务语义”(强/弱读),避免混淆。
解释的好详细,学习了
V4版本事务内默认采用强读模式,因为如果事务内有强读弱读混合,可能会导致读取数据版本不一致引发问题。所以事务里面会默认将弱读转到Leader当强读。