暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

OceanBase系统架构SQL路由

2024-01-03
247

ODP 会充分考虑用户请求涉及的副本位置、用户配置的读写分离路由策略、OceanBase 数据库多地部署的最优链路,以及 OceanBase 数据库各机器的状态及负载情况,将用户的请求路由到最佳的 OBServer,最大程度的保证了 OceanBase 数据库整体的高性能运转。

开始阅读本节内容之前,您可以先了解一些路由相关的概念(参见 附录:OceanBase 数据库基础概念),便于您更好的了解下面的内容。

  • Zone

  • Region

  • Server List

  • RS List

  • Location Cache

  • 副本

  • 合并

  • 强一致性读/弱一致性读

  • 读写Zone/只读Zone

  • 分区表

  • 分区键

OceanBase 数据库执行计划

执行计划分为三种:Local 、Remote 、Distribute。ODP 的作用主要是尽量避免 Remote 计划(效率低,性能差),将路由尽可能准确变为 Local 计划。

ODP 路由作用

理解了上述 AZ/Region/分区/副本的基本概念和物理含义后,就能理解 ODP 的路由思路了。从分区的设计到其物理分布,以及本地执行计划的高效性考虑,ODP 需要尽可能对 SQL 进行准确路由,主要过程将经历:SQL 解析、分区计算、分区信息获取、副本策略选择等。

非分区表路由

非分区表可以直接利用 Location Cache 中的副本信息。ODP 保存了分区和 OBServer 地址的映射,通过解析 SQL 中的表名,根据表名查询 ODP 缓存中的分区对应的机器 IP。缓存的有效性,有以下三种情况:

  • 缓存中找不到,此时需要访问 OBServer 查询最新映射并缓存。

  • 缓存中存在但不可用,此时需要重新去 OBServer 查询并更新。

  • 缓存中存在且可用,此时可以直接使用。

分区表路由

分区表的路由相比非分区表而言,增加了分区 ID 及其相关的计算和查询过程。在获取了 Location Cache 后,分区表需要继续判定表的一级/二级分区,根据不同分区键类型和计算方式,计算分区 ID 并获取对应主备副本信息。

做分区计算时,通过表结构可以得知分区键及其类型,之后通过解析 SQL 语句获取对应分区键的值,并根据表结构和分区键类型做分区计算,从而能转发到对应分区所在的机器。

正常情况下,通过分区计算,ODP 可以将 SQL 路由到分区对应的机器上,从而避免 Remote 执行,提升效率。在 ODP V3.2.0 版本,已针对分区表且无法计算分区路由的场景进行优化,由随机选择租户的机器路由,优化成随机从分布了分区的机器中随机路由,提升命中率,尽可能减少 Remote 执行。

副本路由选择(常规部署)

对于强一致性读,且 SQL 指定了表名,将路由到该表对应分区的 Leader OBServer;对于弱一致性读、登录认证请求、强一致性读但没有指定表名等情况,存在主备均衡路由(默认)、备优先路由、不合并备优先路由这三种路由策略。

主备均衡路由(默认)

将按照以下优先级进行路由选择:

  1. 相同 Region,相同 IDC,不在合并状态的 OBServer。

  2. 相同 Region,不同 IDC,不在合并状态的 OBServer。

  3. 相同 Region,相同 IDC,正在合并状态的 OBSserver。

  4. 相同 Region,不同 IDC,正在合并状态的 OBSserver。

  5. 不同 Region,不在合并状态的 OBServer。

  6. 不同 Region,正在合并状态的 OBSserver。

备优先路由

常规部署下,支持备优先读策略。通过用户级别的系统变量 proxy_route_policy 控制,仅在常规部署和弱一致性读的情况下生效,优先读 Follower 而非主备均衡路由。

在常规模式部署和弱一致性读时,设置 set @proxy_route_policy='follower_first';,路由将优先发往备 OBServer,即使 OBServer 处于正在合并状态。将按照以下优先级进行路由选择:

  1. 相同 Region,相同 IDC,不在合并状态的备 OBServer。

  2. 相同 Region,不同 IDC,不在合并状态的备 OBServer。

  3. 相同 Region,相同 IDC,正在合并状态的备 OBServer。

  4. 相同 Region,不同 IDC,正在合并状态的备 OBServer。

  5. 相同 Region,相同 IDC,不在合并状态的主 OBServer。

  6. 相同 Region,不同 IDC,不在合并状态的主 OBServer。

  7. 不同 Region,不在合并状态的备 OBServer。

  8. 不同 Region,正在合并状态的备 OBServer。

  9. 不同 Region,不在合并状态的主 OBServer。

  10. 不同 Region,正在合并状态的主 OBServer。

不在合并的备优先路由

常规部署下,弱一致性读,设置 set @proxy_route_policy='unmerge_follower_first'; 时,路由将优先发往不在合并的备 OBServer。将按照以下优先级进行路由选择:

  1. 相同 Region,相同 IDC,不在合并状态的备 OBServer。

  2. 相同 Region,不同 IDC,不在合并状态的备 OBServer。

  3. 相同 Region,相同 IDC,不在合并状态的主 OBServer。

  4. 相同 Region,不同 IDC,不在合并状态的主 OBServer。

  5. 相同 Region,相同 IDC,正在合并状态的备 OBServer。

  6. 相同 Region,不同 IDC,正在合并状态的备 OBServer。

  7. 不同 Region,不在合并状态的备 OBServer。

  8. 不同 Region,不在合并状态的主 OBServer。

  9. 不同 Region,正在合并状态的备 OBServer。

  10. 不同 Region,正在合并状态的主 OBServer。

其他

常规部署下,弱一致性读,当 proxy_route_policy 变量取其他值时,路由选择将退化为普通的弱一致性读主备均衡路由策略,即主备均衡路由(默认)。

副本路由选择(读写分离部署)

即使用了只读副本和只读Zone的部署模式。读写分离部署时,不存在备优先读的路由策略,路由依赖系统变量 ob_route_policy。主要存在以下几种情况:

  1. 对于强一致性读语句,且 SQL 指定了表名,那么直接路由到该表涉及的分区的 Leader OBServer 执行。

  2. 对于强一致性读语句,SQL 为"select 不指定表名/use database/set session 级别系统变量"时,忽略 Zone 属性,此时等同于常规部署下的主备均衡路由(默认)。

  3. 对于强一致性读语句,不包含登录认证请求,且去除 1 & 2 场景的请求,将按照以下策略进行路由:

    1. 相同 Region,相同 IDC,不在合并状态的读写 Zone 中的 OBServer。

    2. 相同 Region,不同 IDC,不在合并状态的读写 Zone 中的 OBServer。

    3. 相同 Region,相同 IDC,正在合并状态的读写 Zone 中的 OBServer。

    4. 相同 Region,不同 IDC,正在合并状态的读写 Zone 中的 OBServer。

    5. 不同 Region,不在合并状态的读写 Zone 中的 OBServer。

    6. 不同 Region,正在合并状态的读写 Zone 中的 OBServer。

只读 Zone 优先路由(默认)

对于弱一致性语句和登录认证请求,将根据系统变量 ob_route_policy 的不同取值进行路由。设置ob_route_policy = readonly_zone_first(默认值)时,将按照以下策略进行路由:

  1. 相同 Region,相同IDC,不在合并状态的只读 Zone 中的 OBServer。

  2. 相同 Region,不同IDC,不在合并状态的只读 Zone 中的 OBServer。

  3. 相同 Region,相同IDC,正在合并状态的只读 Zone 中的 OBServer。

  4. 相同 Region,不同IDC,正在合并状态的只读 Zone 中的 OBServer。

  5. 相同 Region,相同IDC,不在合并状态的读写 Zone 中的 OBServer。

  6. 相同 Region,不同IDC,不在合并状态的读写 Zone 中的 OBServer。

  7. 相同 Region,相同IDC,正在合并状态的读写 Zone 中的 OBServer。

  8. 相同 Region,不同IDC,正在合并状态的读写 Zone 中的 OBServer。

  9. 不同 Region,不在合并状态的只读 Zone 中的 OBServer。

  10. 不同 Region,正在合并状态的只读 Zone 中的 OBServer。

  11. 不同 Region,不在合并状态的读写 Zone 中的 OBServer。

  12. 不同 Region,正在合并状态的读写 Zone 中的 OBServer。

仅发送到只读 Zone 的路由

设置 ob_route_policy = only_readonly_zone 时,将按照以下策略进行路由:

  1. 相同 Region,相同 IDC,不在合并状态的只读 Zone 中的 OBServer。

  2. 相同 Region,不同 IDC,不在合并状态的只读 Zone 中的 OBServer。

  3. 相同 Region,相同 IDC,正在合并状态的只读 Zone 中的 OBServer。

  4. 相同 Region,不同 IDC,正在合并状态的只读 Zone 中的 OBServer。

  5. 不同 Region,不在合并状态的只读 Zone 中的 OBServer。

  6. 不同 Region,正在合并状态的只读 Zone 中的 OBServer。

不在合并状态的 Zone 优先路由

设置 ob_route_policy = unmerge_zone_first 时,将按照以下策略进行路由:

  1. 相同 Region,相同 IDC,不在合并状态的只读 Zone 中的 OBServer。

  2. 相同 Region,不同 IDC,不在合并状态的只读 Zone 中的 OBServer。

  3. 相同 Region,相同 IDC,不在合并状态的读写 Zone 中的 OBServer。

  4. 相同 Region,不同 IDC,不在合并状态的读写 Zone 中的 OBServer。

  5. 相同 Region,相同 IDC,正在合并状态的只读 Zone 中的 OBServer。

  6. 相同 Region,不同 IDC,正在合并状态的只读 Zone 中的 OBServer。

  7. 相同 Region,相同 IDC,正在合并状态的读写 Zone 中的 OBServer。

  8. 相同 Region,不同 IDC,正在合并状态的读写 Zone 中的 OBServer。

  9. 不同 Region,不在合并状态的只读 Zone 中的 OBServer。

  10. 不同 Region,不在合并状态的读写 Zone 中的 OBServer。

  11. 不同 Region,正在合并状态的只读 Zone 中的 OBServer。

  12. 不同 Region,正在合并状态的读写 Zone 中的 OBServer。

读写分离部署注意事项

不能仅仅在异地 Region 设置只读 Zone,否则可能导致每次请求都与 OBServer 进行建链,耗时增加。

原因是 OBProxy 内部有个策略,如果 Session 上设置了弱读,并且这个租户有只读 Zone,会判断上一次访问的 Server 是不是处于只读 Zone。如果不是的话,会关掉这个 Server Session。同时,根据上面的路由策略,如果同 Region 下是读写 Zone,异地是只读 Zone,OBProxy 始终会路由到同 Region 下的读写 Zone。因此,这样就可能会导致不断地与同 Region 下的读写 Zone 的 Server 建连,然后关闭链接,下次请求又继续重复。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论