ODP 七层模式下,事务内多条 SQL 如何保证路由到同一台 OBServer?中途切主会怎样

【使用版本】OceanBase 社区版 V4.2.x + OBProxy

【问题描述】

  1. 七层模式(OBProxy 解析 SQL 做路由)下,事务开启后是否会做「会话绑定」,把后续 SQL 强制固定到同一台 OBServer?还是仍然按分区 Leader 重新路由?
  2. 如果事务执行到一半,某个分区的 Leader 发生切换(或那台 OBServer 挂掉),事务会被回滚还是自动重试?客户端看到的具体错误是什么?
  3. 四层(LVS/F5 那种纯 TCP 转发)和七层在「会话保持」上的差异,实际会在什么场景踩坑?比如长事务、临时表、prepared statement 复用?
  4. 强一致性读和弱一致性读的路由策略差别在哪?弱读会不会读到明显滞后的数据,有没有延迟上限?

@论坛小助手

事务内多条 SQL 的路由策略

在 OceanBase 社区版 V4.2.x 和 OBProxy 的七层模式下,事务内的多条 SQL 需要保证路由到同一台 OBServer。以下是针对您问题的具体回答:

会话绑定与分区 Leader 路由

  • 事务开启后的路由策略:
    • 在七层模式(OBProxy 解析 SQL 做路由)下,当一个事务开启后,为了确保事务的一致性和原子性,OBProxy 会尝试将事务内的所有 SQL 请求路由到同一个 OBServer 节点上执行。这种机制通常被称为“会话绑定”或“事务绑定”。
    • 如果事务内的 SQL 语句涉及多个分区,并且这些分区的主副本不在同一个 OBServer 上,则 OBProxy 仍然会按照分区的 Leader 进行路由。但为了保证事务的一致性,OceanBase 会在内部进行协调,以确保所有操作在同一个事务上下文中完成。

中途切主的情况

  • Leader 切换的影响:
    • 如果在事务执行过程中,某个分区的 Leader 发生切换(或者 OBServer 挂掉),事务可能会遇到以下情况:
      • 事务回滚:如果 Leader 切换导致当前事务无法继续执行,OceanBase 会自动回滚该事务。
      • 自动重试:OceanBase 的分布式事务采用两阶段提交(2PC),具有失败重试机制。因此,如果在 Leader 切换后,新的 Leader 可以接替继续处理事务,事务可能会被自动重试。
    • 客户端看到的具体错误:
      • 客户端可能会看到类似于“连接中断”、“事务失败”或“超时”的错误信息。具体错误信息取决于具体的实现和配置。

四层与七层模式下的会话保持差异

  • 四层模式:
    • 四层模式(如 LVS/F5)通常是基于 TCP 层的负载均衡,不具备解析 SQL 的能力。因此,在四层模式下,SQL 语句会被直接转发到后端 OBServer,不会进行复杂的路由逻辑。这种方式在长事务、临时表、prepared statement 复用等场景下容易出现问题,因为无法保证事务的一致性和会话的绑定。
  • 七层模式:
    • 七层模式(如 OBProxy)可以解析 SQL 语句并根据实际情况进行智能路由。这种模式可以更好地支持长事务、临时表、prepared statement 处理,因为它可以在事务内保持会话绑定,确保所有操作在同一 OBServer 上执行。

强一致性读与弱一致性读的路由策略差别

  • 强一致性读:
    • 强一致性读会路由到指定表或分区的 Leader 节点。如果 SQL 指定了表名,将会直接路由到该表对应分区的 Leader 节点。
    • 文档片段 1 提供了详细说明。
  • 弱一致性读:
    • 弱一致性读可能会路由到备节点(Follower),这样可以提高读取性能,但可能会读到稍微滞后的数据。
    • 文档片段 1 和 文档片段 10 提供了详细说明。
    • 弱一致性读可能会读到明显滞后的数据,具体延迟上限取决于系统的复制延迟。通常情况下,OceanBase 通过各种优化手段尽量减少复制延迟,但没有明确的延迟上限。

总结

  • 在七层模式下,事务开启后,OBProxy 会尽量将后续的 SQL 请求路由到同一台 OBServer 节点。
  • 如果事务执行过程中发生 Leader 切换,事务可能会被回滚或自动重试,客户端会看到相应的错误信息。
  • 四层模式在处理长事务、临时表、prepared statement 等场景时不如七层模式可靠,因为缺乏智能路由的能力。
  • 强一致性读会路由到 Leader 节点,弱一致性读可能会路由到 Follower 节点,存在一定的数据滞后风险。

具体信息可参考以下文档:

  1. SQL 路由
  2. 数据路由影响因素
  3. ODP SQL 路由原理
  4. 事务相关规范
  5. SQL 调优常见问题
  6. 函数分区键路由概述
  7. 路由策略路由