当前位置: 首页 > 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! ———…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

线程同步:确保多线程程序的安全与高效!

全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...