ODP如何实现负载均衡,详见问题描述

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】ODP
【 使用版本 】最新版
【问题描述】ODP如何实现负载均衡,开发环境中用OCP部署一个3副本的OB集群,也用OCP部署了ODP集群3个ODP。然后客户端连接某一台ODP连接,但是发现ODP只会去连接一个同一个OBserver,并不会均衡的往3个集群节点发送SQL请求。请问这个是什么原因,有什么解决方法
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

用户问题总结:ODP 在负载均衡时仅连接到一个 OBServer,未将 SQL 请求均衡分发至三个 OB 集群节点。

推荐使用 obdiag 工具进行日志采集,以便我们分析为什么 SQL 请求没有被均衡分发。

日志采集场景: 集群基础信息
日志采集命令: obdiag gather scene run --scene=observer.base

为了更好地帮助您解决问题,请您按照上述命令采集日志并提供给我们。同时,请您回答以下问题以便进一步诊断:

  1. 您的 OceanBase 集群当前有多少个 OBServer 节点?是否所有节点都处于正常状态?
  2. ODP 的配置中是否有指定特定的 OBServer 进行连接?如果有,请提供相关配置。
  3. 您是否对 ODP 或 OceanBase 集群进行了任何最近的配置更改或升级操作?
  4. 您能否提供一些具体的 SQL 请求示例,这些请求未能被均衡分发?
  5. 您是否观察到任何与负载均衡相关的错误日志或警告信息?如果有,请提供具体内容。

附上敏捷诊断工具 obdiag 使用帮助链接

ODP本身是无状态的服务,没有负载均衡的能力,他只会把SQL发送到对应的OBserver节点上,所以需要检查下租户的primary_zone设置,是否集中在一个zone
其次再查下dba_ob_table_location看看你执行SQL的表leader是否刚好也在同一台上

zone优先级改了,之前是有高到低。
那怎么样让ODP能够均衡的往各个节点发SQL命令呢。

根据文档库中的信息,ODP 的负载均衡与 OceanBase 集群的配置密切相关,尤其是 Zone 和 Primary Zone 的设置。以下是针对您的问题的具体解答和建议:


1. Zone 和 Primary Zone 的作用

  • Zone 是 OceanBase 数据库中用于描述地理位置或机房的概念。
  • Primary Zone 决定了 Leader 副本(主副本)的分布偏好位置。Leader 副本承担了强一致性场景下的读写请求,因此 Primary Zone 的设置直接影响流量在各个节点上的分布。

文档依据:

  • 片段标题: OceanBase 数据库性能的影响因素 → 资源分配 → Primary Zone
  • 内容: Leader 分布通过 Primary Zone 来控制,Primary Zone 描述了 Leader 副本的偏好位置,而 Leader 副本承载了业务的强一致读写流量。

2. 为什么 ODP 只连接一个 OBServer?

ODP 的 SQL 路由策略会根据以下因素决定请求分发到哪个 OBServer:

  • 数据副本的位置:ODP 会优先将请求路由到包含所需数据副本的 OBServer。
  • Primary Zone 的设置:如果 Primary Zone 设置为某个特定 Zone,则大部分流量会被路由到该 Zone 的 OBServer。
  • 负载均衡状态:OceanBase 集群内部的负载均衡模块会尝试将分区 Leader 和日志流(LS)均衡分布在各个 Zone 上。

如果您修改了 Zone 的优先级(从高到低),但发现 ODP 仍然只连接一个 OBServer,可能是因为:

  1. Leader 副本未重新分布:即使修改了 Primary Zone,OceanBase 集群需要时间调整 Leader 副本的分布。
  2. LS 均衡未完成:V4.x 版本中,负载均衡模块首先对 LS 进行均衡,然后再进行分区均衡。如果 LS 均衡未完成,可能导致流量集中在一个 OBServer 上。

文档依据:

  • 片段标题: 租户内均衡 → LS 均衡 → LS Leader 均衡
  • 内容: 当 Primary Zone 发生变更时,OceanBase 集群会动态调整 LS Leader 的分布,以保证流量均匀分布在指定的 Zone 上。

3. 如何让 ODP 均衡地往各个节点发送 SQL 请求?

方法 1: 确保 Primary Zone 设置合理

  • 检查当前租户的 Primary Zone 设置是否符合预期。可以通过以下 SQL 查询租户的 Primary Zone 配置:
    SHOW TENANT WHERE tenant_name = 'your_tenant_name';
    
  • 如果希望流量均匀分布在所有 Zone 上,可以将 Primary Zone 设置为 RANDOM 或者包含所有 Zone 的列表(如 Z1,Z2,Z3)。
    • 示例命令:
      ALTER TENANT your_tenant_name PRIMARY_ZONE='RANDOM';
      

方法 2: 等待 LS 均衡完成

  • 修改 Primary Zone 后,OceanBase 集群需要时间完成 LS 均衡。可以通过以下 SQL 查看 LS 的分布情况:
    SELECT * FROM oceanbase.__all_virtual_ls WHERE tenant_id = (SELECT tenant_id FROM oceanbase.__all_tenant WHERE tenant_name = 'your_tenant_name');
    
  • 如果发现某些 Zone 的 LS 数量明显偏少,可以等待一段时间,或者手动触发均衡操作。

方法 3: 检查 ODP 的路由策略

  • ODP 的路由策略会影响 SQL 请求的分发。确保 ODP 的配置中没有强制指定某个 OBServer 或 Zone。
  • 您可以通过以下方式检查 ODP 的路由行为:
    • 查看 ODP 的日志文件,确认是否有异常或警告信息。
    • 使用 OCP 的监控功能,观察 ODP 的请求分发情况。

方法 4: 手动调整资源分布

  • 如果集群资源分布不均衡,可以使用以下 SQL 手动调整资源单元的分布:
    ALTER SYSTEM MIGRATE UNIT unit_name TO server_ip;
    
  • 注意:此操作仅支持在 sys 租户下执行。

文档依据:

  • 片段标题: 资源单元迁移
  • 内容: 使用 ALTER SYSTEM MIGRATE UNIT 语句可以调整租户使用的资源分布,以便集群资源使用均衡。

4. 总结

为了让 ODP 均衡地往各个节点发送 SQL 请求,请按照以下步骤操作:

  1. 确保 Primary Zone 设置合理,避免流量集中在一个 Zone 上。
  2. 等待 LS 均衡完成,或者手动触发均衡操作。
  3. 检查 ODP 的路由策略,确保没有强制指定某个 OBServer 或 Zone。
  4. 如果资源分布不均衡,可以手动调整资源单元的分布。

如果问题仍未解决,建议采集诊断日志并联系 OceanBase 技术支持团队进一步分析。

日志采集命令:

obdiag gather scene run --scene=observer.base

希望以上信息对您有所帮助!

详情请参考:

  1. 使用命令行进行运维
  2. SQL 路由
  3. ODP 性能分析
  4. 资源单元迁移
  5. 租户内均衡
  6. 负载均衡
  7. 代理层高可用
  8. ODP SQL 路由原理
  9. OceanBase 数据库性能的影响因素

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

现在primary_zone已经是打散到3个zone上了请求还是发到一台上,你查到是单表么?
具体的测试场景描述下