当前位置: 首页 > news >正文

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

引言

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 =trueCREATE 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; 无分区条件,无法计算路由,直接将请求路由到上一个会话server1SELECT * FROM T WHERE C1=2; 请求准确路由到server2
SELECT * FROM T WHERE C2=2; 无分区条件,无法计算路由,直接将请求路由到上一个会话server2场景一:enable_primary_zone=true && enable_cached_server =true && leader在server1SELECT * FROM T WHERE C1=1; 请求准确路由到server1
SELECT * FROM T WHERE C2=1; 无分区条件,无法计算路由,直接将请求路由到server1SELECT * 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';

相关文章:

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

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

new/delete和malloc/free到底有什么区别

new和malloc 文章目录 new和malloc前言一、属性上的区别二、使用上的区别三、内存位置的区别四、返回类型的区别五、分配失败的区别六、扩张内存的区别七、系统调度过程的区别总结 前言 new和malloc的知识点,作为一个嵌入式工程师是必须要了解清楚的。new和malloc的…...

Flutter启动无法运行热重载

当出现这种报错时,大概率是flutter的NO_Proxy出问题。 请忽略上面的Android报错因为我做的是windows开发这个也就不管了哈,解决下面也有解决报错的命令大家执行一下就行。 着重说一下Proxy的问题, 我们看到提示NO_PROXY 没有设置。 这个时候我…...

CSS调整背景

一、设置背景颜色 通过 background-color 属性指定,值可以是十六进制 #ffffff,也可以是rgb(0, 255, 255),或是颜色名称 "red" div {background-color: red; /* 通过颜色名称设置 */background-color: #ff0000; /* 通过十六进制设…...

FinalShell连接Linux服务器并解决反复输入密码问题

FinalShell是一款由国人开发的SSH客户端工具,它支持多平台,包括Windows、Mac OS X和Linux。FinalShell主要用于一体化服务器管理,它不仅是一个SSH客户端,还具备强大的开发和运维功能,能够充分满足开发和运维的需求。 本…...

实用类工具!分享6款AI论文一键生成器免费8000字

在当前的学术研究和写作领域,AI论文生成工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿,还能进行内容优化、查重和排版等操作。千笔-AIPassPaper是一款备受推荐的AI论文一键生成器。 千笔-AIPassPaper是一个一站式…...

vue使用TreeSelect设置带所有父级节点的回显

Element Plus的el-tree-select组件 思路: 选中节点时,给选中的节点赋值 pathLabel,pathLabel 为函数生成的节点名字拼接,数据源中不包含。 在el-tree-select组件中设置 props“{ label: ‘pathLabel’ }” 控制选中时input框中回…...

智能机巢+无人机:自动化巡检技术详解

智能机巢与无人机的结合,在自动化巡检领域展现出了巨大的潜力和优势。以下是对这一技术的详细解析: 一、智能机巢概述 智能机巢,也被称为无人机机场或无人机机巢,是专门为无人机提供停靠、充电、维护等服务的智能化设施。它不仅…...

摩托车加装车载手机充电usb方案/雅马哈USB充电方案开发

长途骑行需要给手机与行车记录仪等设备供电,那么,加装USB充电器就相继在两轮电动车上应用起来了。摩托车加装usb充电方案主要应用于汽车、电动自行车、摩托车、房车、渡轮、游艇等交通工具。提供电动车USB充电器方案/摩托车加装usb充电方案/渡轮加装usb充…...

进阶岛 任务3: LMDeploy 量化部署进阶实践

进阶岛 任务3: LMDeploy 量化部署进阶实践 任务:https://github.com/InternLM/Tutorial/blob/camp3/docs/L2/LMDeploy/task.md 使用结合W4A16量化与kv cache量化的internlm2_5-1_8b-chat模型封装本地API并与大模型进行一次对话,作业截图需包…...

vue 使用jszip,file-saver下载压缩包,自定义文件夹名,文件名打包下载为zip压缩包文件,全局封装公共方法使用。

记录一下后台管理全局封装一个压缩包下载方法,文件夹名自定义,文件名自定义,压缩包名自定义。 安装必要的库 npm install jszip npm install file-saver自定义一个公共方法全局注入 页面使用 /** 下载按钮操作 */handleDownload() {const i…...

计网八股文

1.HTTP和HTTPS的区别 安全性: HTTP:是未加密的协议,意味着数据在传输过程中可以被截获、篡改或监听。它不提供任何数据加密。HTTPS:在HTTP的基础上加入了SSL/TLS协议,提供了数据加密、完整性校验和身份验证。这使得传输…...

[001-03-007].第07节:Redis中的事务

我的后端学习大纲 我的Redis学习大纲 1、Redis事务是什么: 1.可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化, 按顺序地串行化执行而不会被其他命令插入,不许加塞2.一个队列中,一次性、…...

WLAN实验简述

一:配置生产AP1上级接入层交换机LSW3 sys [Huawei]sysname LSW3 [LSW3]undo info-center enable [LSW3]vlan batch 10 100 [LSW3]int g0/0/2 [LSW3-GigabitEthernet0/0/2]port link-type trunk [LSW3-GigabitEthernet0/0/2]port trunk allow-pass vlan 10 100 [LSW…...

Docker简介在Centos和Ubuntu环境下安装Docker

文章目录 1.Docker简介2.Docker镜像与容器3.安装Docker3.1 Centos环境3.2 Ubuntu环境 1.Docker简介 Docker 是一个开源的应用容器引擎,它允许开发者将应用程序及其依赖项打包到一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 操作系统上。D…...

C:字符串函数(续)-学习笔记

穗 一些闲话: 最近玩了这款饿殍-明末千里行,不知大家是否有听过这款游戏,颇有感触!!! 游戏中最让我难以忘怀的便是饿殍穗线的故事,生在如今时代的我之前无法理解杜甫在目睹人间悲剧时的心情&…...

Depth靶机详解

靶机下载地址 https://www.vulnhub.com/entry/depth-1,213/ 主机发现 arp-scan -l 端口扫描 nmap -sV -A -T4 192.168.229.156 端口利用 http://192.168.229.156:8080/ 目录扫描 dirb "http://192.168.229.156:8080" dirsearch -u "http://192.168.229.15…...

go get -u @latest没有更新依赖模块

使用 go get -u gitee.com/qingfeng-169/hello-blatest 时,如果没有进行更新,可能有以下几种原因: 1. 没有发布稳定版本 (vX.X.X) latest 表示获取该模块最新的稳定版本(即带有 vX.X.X 形式的版本号),而不…...

介绍一些免费 的 html 5模版网站 和配色 网站

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、H5 网站介绍网站 二、配色网站个人推荐 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、H5 网站介绍 以下是一些提供免费…...

【C++】入门基础(下)

Hi!很高兴见到你~ 目录 7、引用 7.3 引用的使用(实例) 7.4 const引用 【第一分点】 【第二分点1】 【第二分点2】 7.5 指针和引用的关系(面试点) 8、inline 9、nullptr Relaxing Time! ———…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐)​​ 在 save_images 方法中,​​删除或注释掉所有与 metadata …...