如何用 OBProxy 实现 OceanBase 的最佳路由策略

news2024/11/15 16:43:41

引言

OBProxy,即OceanBase Database Proxy,也简称为ODP,是 OceanBase数据库的专属服务代理。通过应用OBProxy,由后端OceanBase集群的分布式特性所带来的复杂性得以屏蔽,从而使得访问分布式数据库的体验如同访问单机数据库一般容易。

OBProxy的核心特性是最佳路由,基本逻辑就是ODP 接收用户发出的 SQL 请求,并将 SQL 请求转发至最佳目标 OBServer 节点,最后将执行结果返回给用户。为了满足客户在不同场景下的路由需求,实现最佳的路由效果,OBPrxoy 支持丰富的路由功能,这就涉及到路由配置项的设置及组合,本文基于业务中一类常见的路由问题展开,对路由功能及对应配置项做详细介绍,指导用户在业务实践中如何正确的配置路由策略及快速排查路由问题。

路由问题

问题描述

只读地址访问到主副本

云客户通过租户的只读地址执行大查询获取数据,结果访问到了主副本,影响了主副本的正常业务。

原因分析

开启了 enable_cached_server 和 enable_primary_zone

在设置 obproxy 的参数 enable_primary_zone = true 和 enable_cached_server =true 的情况下,路由逻辑:

enable_primary_zone= true,用户登录时,会将登录请求发往租户的主副本

enable_cached_server =true,在OBProxy没有解析出表名、表分区计算失败等情况下,请求会复用前一个连接,也就是登录时选择的主副本,这就导致请求无法根据只读地址信息对路由做优化,造成后续的所有请求都发往了主副本。

解决方法

关闭 enable_cached_server 和 enable_primary_zone

路由功能

OBProxy提供了丰富的路由功能,用户可以根据实际需要,设置对应的配置项来控制各种路由策略。

强制路由
  1. 指定IP路由:target_db_server ,OBProxy 将请求直接路由到指定的 OBServer,具有最高优先级,示例:
ALTER PROXYCONFIG SET target_db_server = '127.0.0.1:2993;11.124.5.193:50109';

OBProxy收到的所有请求都会路由到127.0.0.1:2993,如果127.0.0.1:2993节点不存在或者故障,则路由到11.124.5.193:50109

2. 指定zone路由:proxy_primary_zone_name,OBProxy 将请求直接路由到指定的 zone,示例:

ALTER PROXYCONFIG SET proxy_primary_zone_name='z2';

OBProxy收到的所有请求都会路由到 z2

指定IP路由和指定zone路由,是强制性的路由,不会区分是否强读,适用于不关心Leader位置,需要路由到指定节点的场景。
如果是交易支付等强读业务,希望路由到Leader的场景,需要保强制路由配置项没有设置,避免产生大量远程路由、二次路由等问题。

3. 特定场景强制路由

  • 非分布式事务路由,事务内语句强制路由至事务开启 OBServer 节点
  • 会话级临时表路由,对会话级临时表进行查询时,会强制路由至第一次查询临时表的 OBServer 节点
  • CURSOR/PIECES 路由,客户端使用 CURSOR/PIECES 流式获取/上传数据时,所有请求会强制路由至同一 OBServer 节点
强读路由
  1. 分区表路由

OBProxy 将 SQL 请求中的分区键值或表达式、分区名等条件解析为分区 ID,通过分区 ID 查找到分区的副本位置,将请求路由到Leader副本。

根据分区键值/表达式计算路由,示例:

CREATE TABLE T(C1 INT) PARTITION BY HASH(C1) PARTITIONS 8;

SELECT * FROM T WHERE C1=123;
SELECT * FROM T WHERE C1=ABS(123);

OBProxy将查询请求路由到对应分区Leader节点

根据分区名计算路由,示例:

CREATE TABLE T(C1 INT) PARTITION BY KEY(C1) PARTITIONS 8;

SELECT * FROM T PARTITION(P1);

OBProxy将查询请求路由到P1分区的Leader节点

在 OceanBase 数据库中,有 Local 计划、Remote 计划和 Distributed 计划三种表路由。Local 计划、Remote 计划均为单分区的路由。ODP 的作用就是尽量消除 Remote 计划,将路由尽可能的变为 Local 计划。如果表路由类型为 Remote 计划的 SQL 过多,说明该 ODP 的路由可能存在问题,需要排查。

2. 全局索引表路由

配置enable_reroute 和enable_index_route ,OBProxy 将语句中提供的索引值作为分区键来计算路由,示例:

ALTER PROXYCONFIG SET enable_reroute=true;
ALTER PROXYCONFIG SET enable_index_route = true;

CREATE TABLE T(C1 INT,C2 INT) PARTITION BY HASH(C1) PARTITIONS 8;
CREATE INDEX INDEX1 ON T(C2);

SELECT * FROM T WHERE C2=2;
SELECT * FROM T WHERE C2=2;

第一次使用索引查询,将随机路由,OBServer 将返回索引表的 Leader,OBProxy 会构建语句到索引表名称 [SELECT * FROM T WHERE C2=2;] -> [T_INDEX] 的映射
然后进行二次路由,直接获取 T_INDEX 表的映射,计算路由

3. 复制表路由

OBProxy对复制表采用随机路由的策略。示例:

CREATE TABLE T_DUP(C1 INT) DUPLICATE_SCOPE = 'cluster';

SELECT * FROM T_DUP WHERE C1=123;

OBProxy将查询请求随机路由到T_DUP表的任意副本

4. 计算失败后的路由

当OBProxy 无法获取SQL请求中的表名或者无法通过SQL请求中的条件计算出准确的分区位置信息时,无法准确的强读请求路由到Leader。此时有三种处理策略:

  • 按照租户primary zone路由:enable_primary_zone=True,将请求路由到租户的primary zone
  • 复用上一次的会话路由:enable_cached_server =true,将请求路由到上一个observer会话
  • 随机路由:enable_primary_zone=false 且 enable_cached_server =false,将请求随机路由

示例:

场景一:enable_primary_zone=false && enable_cached_server =true

CREATE TABLE T(C1 INT,C2 INT) PARTITION BY HASH(C1) PARTITIONS 8;

SELECT * FROM T WHERE C1=1; 请求准确路由到server1
SELECT * FROM T WHERE C2=1; 无分区条件,无法计算路由,直接将请求路由到上一个会话server1

SELECT * FROM T WHERE C1=2; 请求准确路由到server2
SELECT * FROM T WHERE C2=2; 无分区条件,无法计算路由,直接将请求路由到上一个会话server2


场景一:enable_primary_zone=true && enable_cached_server =true && leader在server1

SELECT * FROM T WHERE C1=1; 请求准确路由到server1
SELECT * FROM T WHERE C2=1; 无分区条件,无法计算路由,直接将请求路由到server1

SELECT * FROM T WHERE C1=2; 请求准确路由到server1
SELECT * FROM T WHERE C2=2; 无分区条件,无法计算路由,直接将请求路由到server1
生产和测试环境,一般情况下,建议enable_cached_server设置为false

如果需要分析 OBProxy 的路由策略,可以使用 EXPLAIN ROUTE executable sql 查看 OBProxy路由选取过程。

事务路由

事务路由分两种场景:

  • 分布式事务路由(OceanBase4.1开始支持),事务内的SQL请求准确路由到Leader节点。

配置enable_ob_protocol_v2=true 且 enable_transaction_INTernal_routing = true,示例:

ALTER PROXYCONFIG SET enable_ob_protocol_v2 = true;
ALTER PROXYCONFIG SET enable_transaction_INTernal_routing = true;

CREATE TABLE T1(C1 INT,C2 INT) PARTITION BY HASH(C1) PARTITIONS 8;
CREATE TABLE T2(C1 INT,C2 INT) PARTITION BY HASH(C1) PARTITIONS 8;

BEGIN;
INSERT INTO T1 VALUES(1,1);路由到server1
INSERT INTO T2 VALUES(11,11);路由到server2
SELECT * FROM T1 WHERE C1=1;路由到server1
SELECT * FROM T2 WHERE C1=11;路由到server2
COMMIT;
事务内的请求都能够准确路由到对应的Leader
  • 非分布式事务路由,事务内SQL请求强制路由至事务开启 OBServer 节点
ALTER PROXYCONFIG SET enable_ob_protocol_v2 = false;
ALTER PROXYCONFIG SET enable_transaction_INTernal_routing = false;

CREATE TABLE T1(C1 INT,C2 INT) PARTITION BY HASH(C1) PARTITIONS 8;
CREATE TABLE T2(C1 INT,C2 INT) PARTITION BY HASH(C1) PARTITIONS 8;

BEGIN;
INSERT INTO T1 VALUES(1,1);路由到server1
INSERT INTO T2 VALUES(11,11);路由到server1
SELECT * FROM T1 WHERE C1=1;路由到server1
SELECT * FROM T2 WHERE C1=11;路由到server1
COMMIT;
事务内的请求都路由到第一条INSERT的路由节点server1
弱读路由

OBProxy对弱读请求,有两种路由策略:

  • LDC路由,给 OceanBase 集群的每个 Zone 设置地区(Region)属性和机房(IDC)属性,并给 OBProxy 指定机房(IDC)配置项,OBProxy 将 弱读请求按“同机房>同地区>异地”的优先级顺序进行 OBServer 的选取。 通过配置项 proxy_idc_name 控制。 示例:
alter system modify zone "z1" set region = "region1";
alter system modify zone "z1" set idc = "idc1";

alter system modify zone "z2" set region = "region1";
alter system modify zone "z2" set idc = "idc2";

alter proxyconfig set proxy_idc_name='idc1';

CREATE TABLE T(C1 INT,C2 INT) PARTITION BY HASH(C1) PARTITIONS 8;
SELECT /*+READ_CONSISTENCY(WEAK) */ * FROM T;

OBProxy会将弱读请求路由到同idc的z1

  • 随机路由,OBProxy将弱读请求随机路由到Leader或者Follower副本,副本优先级由proxy_route_policy控制。对应路由策略:FOLLOWER_FIRST、 FOLLOWER_ONLY、 UNMERGE_FOLLOWER_FIRST。示例:
CREATE TABLE T(C1 INT,C2 INT) PARTITION BY HASH(C1) PARTITIONS 8;
#T表的leader在z1,follower在z2、z3

场景一:alter proxyconfig set proxy_route_policy='';

SELECT /*+READ_CONSISTENCY(WEAK) */ * FROM T;
OBProxy在z1、z2、z3 三个副本随机选择副本转发弱读请求


场景二:alter proxyconfig set proxy_route_policy='FOLLOWER_FIRST';

SELECT /*+READ_CONSISTENCY(WEAK) */ * FROM T;
OBProxy优先选择z2、z3 转发弱读请求,如果z2、z3都不可用,则转发到z1


场景三:alter proxyconfig set proxy_route_policy='FOLLOWER_ONLY';

SELECT /*+READ_CONSISTENCY(WEAK) */ * FROM T;
OBProxy只选择z2、z3 转发弱读请求,如果z2、z3都不可用,则请求报错

场景四:alter proxyconfig set proxy_route_policy='UNMERGE_FOLLOWER_FIRST';

SELECT /*+READ_CONSISTENCY(WEAK) */ * FROM T;
OBProxy优先选择没在做合并的z2、z3 转发弱读请求

LDC路由的优先级高于随机路由,OBProxy在选择副本的时候,先检查LDC路由,再走随机路由策略。

弱读的路由策略 LDC路由和随机路由,同样适用于计算分区失败的强读路由请求

典型场景

在不同的业务场景,需要综合考虑路由策略配置及优先级,合理配置,来实现指定的路由目标。下面以两个典型路由场景为例,介绍路由功能的应用实践。

读写分离
  • 路由场景

OLTP与OLAP业务混合负载场景下,希望将交易类请求发送到TP副本,将分析型请求发送到AP副本,TP、AP类业务请求需要部署独立的OBProxy,接收AP请求的OBProxy 需要支持将业务的强读请求转换为弱读,并只发送到AP副本。部署架构如图:

  • 路由配置实践

接收AP请求的OBProxy:

设置弱读:alter proxyconfig set obproxy_read_consistency='1';

设置路由目标副本:alter proxyconfig set proxy_primary_zone_name='zone_4'; 

注意:
确保没有设置过指定ip路由的配置,show proxyconfig like 'target_db_server';

接受TP请求的OBProxy:

ALTER PROXYCONFIG SET enable_cached_server = false;
ALTER PROXYCONFIG SET enable_primary_zone = true;

对交易类请求,需要准确路由到分区Leader,如果无法准确计算,则尽力路由到租户的primary zone,减少远程路由

OBProxy将交易类请求只发往ZONE_1、ZONE_2、ZONE_3的对应Leader副本

注意:
确保没有设置过指定ip路由及指定zone路由
show proxyconfig like 'target_db_server';
show proxyconfig like 'proxy_primary_zone_name';

只读副本
  • 路由场景

OceanBase支持的副本类型,除了全功能型副本,还有只读型副本,简称R副本,R副本只提供读能力,只能作为日志流的 Follower 副本,实际业务中,可以将实时性要求不高的分析类读请求发送到R副本,减轻Leader 副本的压力。

  • 路由配置实践
设置弱读:alter proxyconfig set obproxy_read_consistency='1';

设置LDC策略:只读副本同IDC的OBProxy和OBServer设置为相同IDC

设置路由策略:alter proxyconfig set proxy_route_policy='FOLLOWER_ONLY';

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2130469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux上用yolov8训练自己的数据集(pycharm远程连接服务器)

pycharm如何远程连接服务器,看之前的文章 首先去GitHub上下载项目地址,然后下载预训练模型放到项目主目录下 然后下载数据集,我这有个推荐的数据集下载网站,可以直接下载yolov8格式的数据集(还支持其他格式的数据集&a…

进程间通信-命名管道

目录 原理 代码 简单通信 回归概念 原理 mkfifo 是 Linux 系统中的一个命令,用于创建命名管道(named pipe),也称为 FIFO(First In, First Out)。命名管道是一种特殊类型的文件,用于进程间通…

从0到1!本地部署一个大语言模型!完整方法!

要想从零开始部署一个**大语言模型(LLM)**到本地,不仅仅是硬件上安装软件包,还需要对模型选择、优化和应用搭建有一定的理解。下面是一份完整教程,手把手带你走过如何在本地环境中部署LLM。 1. 了解部署需求与硬件准备…

交换机链路聚合

一、概述 通过链路聚合,可以提高链路的可靠性,提升链路带宽。链路具有一般有手工模式和LACP模式。 二、拓扑图 三、实操演练 1、手工模式 手工模式一般用于老旧、低端设备。 缺点: (1)为了使链路聚合接口正常工作…

brew install node提示:Error: No such keg: /usr/local/Cellar/node

打开本地文件发现Cellar目录下无法生成 node文件,应该是下载时出现问题,重复下载无法解决问题,只能重新安装brew。 步骤1(安装 brew): /bin/zsh -c “$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/ra…

打造高效实时数仓,从Hive到OceanBase的经验分享

本文作者:Coolmoon1202,大数据高级工程师,专注于高性能软件架构设计 我们的业务主要围绕出行领域,鉴于初期采用的数据仓库方案面临高延迟、低效率等挑战,我们踏上了探索新数仓解决方案的征途。本文分享了我们在方案筛选…

uniapp离线(本地)打包

安卓离线打包 注意:jdk建议选择1.8 下载Android Studio配置gradle仓库地址 第一步:先下载对应的版本,进行压缩包解压 第二步:在电脑磁盘(D盘),创建文件夹存放压缩包并进行解压,并创…

8.8canny算子检测

目录 实验原理 示例代码 运行结果 实验原理 在OpenCV中,Canny边缘检测是一种广泛使用的边缘检测算法。它是由John F. Canny在1986年提出的,并且因其性能优良而被广泛应用。在OpenCV中,Canny边缘检测是通过Canny函数实现的。 函数原型 v…

【爬虫软件】小红书按关键词批量采集笔记,含笔记正文、转评赞藏等!

一、背景介绍 1.1 爬取目标 熟悉我的小伙伴都了解,我之前开发过2款软件: 【GUI软件】小红书搜索结果批量采集,支持多个关键词同时抓取! 【GUI软件】小红书详情数据批量采集,含笔记内容、转评赞藏等! 现在…

HuggingFists算子能力扩展-PythonScript

HuggingFists作为一个低代码平台,很多朋友会关心如何扩展平台算子能力。扩展平台尚不支持的算子功能。本文就介绍一种通过脚本算子扩展算子能力的解决方案。 HuggingFists支持Python和Javascript两种脚语言的算子。两种语言的使用方式相同,使用者可以任选…

C++速通LeetCode简单第3题-相交链表

简单解: /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {Li…

ACL-latex模板中参考文献出现下划线---由于宏包的冲突

% \usepackage{ulem} %加入后造成参考文献有下划线,正常情况是没有的。 别的包也可能造成此情况,可以仔细检查。 如下图所示: \usepackage{ulem}在LaTeX中的作用主要是提供了一系列用于文本装饰和强调的命令。ulem宏包由Donald Arseneau…

移动订货小程序哪个好 批发订货系统源码哪个好

订货小程序就是依托微信小程序的订货系统,微信小程序订货系统相较于其他终端的订货方式,能够更快进入商城,对经销商而言更为方便。今天,我们一起盘点三个主流的移动订货小程序,看看哪个移动订货小程序好。 第一、核货宝…

Redis搭建集群

功能概述 Redis Cluster是Redis的自带的官方分布式解决方案,提供数据分片、高可用功能,在3.0版本正式推出。 使用Redis Cluster能解决负载均衡的问题,内部采用哈希分片规则: 基础架构图如下所示: 图中最大的虚线部分…

AI基础 L19 Quantifying Uncertainty and Reasoning with Probabilities I 量化不确定性和概率推理

Acting Under Uncertainty 1 Reasoning Under Uncertainty • Real world problems contain uncertainties due to: — partial observability, — nondeterminism, or — adversaries. • Example of dental diagnosis using propositional logic T oothache ⇒ C av ity • H…

Tomact的基本使用

一.Web服务器 Web服务器是一个软件程序,对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让web开发更加便捷.主要功能是"提供网上信息浏览服务" 二.将Demo程序部署到webapps 直接复制进webapps目录,然后打开浏览器来进行访问 基于tomact服务器部署的项…

PCL 读取STL文件转换为点云

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2数据显示 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新) 一、概述…

结构开发笔记(八):solidworks软件(七):装配图中让摄像头绕轴旋转起来

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/142176639 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

petalinux开发 添加iperf

如何把iperf编译到petalinux工程中去 目录: /home/xxx/7z020/project-spec/meta-user/conf 里面有一个user-rootfsconfig文件 它默认里面有 CONFIG_gpio-demo CONFIG_peekpoke 把iperf添加进去 #Note: Mention Each package in individual line #These packages w…

101.WEB渗透测试-信息收集-FOFA语法(1)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:100.WEB渗透测试-信息收集-网络空间搜索引擎shodan(2)-CSDN博客 F…