助贷获客系统,快速优化排名公司推荐,wordpress固定链接设置自定义结构,ftp服务器怎么搭建引言
OBProxy#xff0c;即OceanBase Database Proxy#xff0c;也简称为ODP#xff0c;是 OceanBase数据库的专属服务代理。通过应用OBProxy#xff0c;由后端OceanBase集群的分布式特性所带来的复杂性得以屏蔽#xff0c;从而使得访问分布式数据库的体验如同访问单机数…引言
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提供了丰富的路由功能用户可以根据实际需要设置对应的配置项来控制各种路由策略。
强制路由
指定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_nameOBProxy 将请求直接路由到指定的 zone示例
ALTER PROXYCONFIG SET proxy_primary_zone_namez2;OBProxy收到的所有请求都会路由到 z2 指定IP路由和指定zone路由是强制性的路由不会区分是否强读适用于不关心Leader位置需要路由到指定节点的场景。 如果是交易支付等强读业务希望路由到Leader的场景需要保强制路由配置项没有设置避免产生大量远程路由、二次路由等问题。 3. 特定场景强制路由
非分布式事务路由事务内语句强制路由至事务开启 OBServer 节点会话级临时表路由对会话级临时表进行查询时会强制路由至第一次查询临时表的 OBServer 节点CURSOR/PIECES 路由客户端使用 CURSOR/PIECES 流式获取/上传数据时所有请求会强制路由至同一 OBServer 节点
强读路由
分区表路由
OBProxy 将 SQL 请求中的分区键值或表达式、分区名等条件解析为分区 ID通过分区 ID 查找到分区的副本位置将请求路由到Leader副本。 根据分区键值/表达式计算路由示例
CREATE TABLE T(C1 INT) PARTITION BY HASH(C1) PARTITIONS 8SELECT * FROM T WHERE C1123;
SELECT * FROM T WHERE C1ABS(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_reroutetrue;
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 C22;
SELECT * FROM T WHERE C22;第一次使用索引查询将随机路由OBServer 将返回索引表的 LeaderOBProxy 会构建语句到索引表名称 [SELECT * FROM T WHERE C22;] - [T_INDEX] 的映射
然后进行二次路由直接获取 T_INDEX 表的映射计算路由 3. 复制表路由
OBProxy对复制表采用随机路由的策略。示例
CREATE TABLE T_DUP(C1 INT) DUPLICATE_SCOPE cluster;SELECT * FROM T_DUP WHERE C1123;OBProxy将查询请求随机路由到T_DUP表的任意副本 4. 计算失败后的路由
当OBProxy 无法获取SQL请求中的表名或者无法通过SQL请求中的条件计算出准确的分区位置信息时无法准确的强读请求路由到Leader。此时有三种处理策略
按照租户primary zone路由enable_primary_zoneTrue将请求路由到租户的primary zone复用上一次的会话路由enable_cached_server true将请求路由到上一个observer会话随机路由enable_primary_zonefalse 且 enable_cached_server false将请求随机路由
示例
场景一enable_primary_zonefalse enable_cached_server trueCREATE TABLE T(C1 INT,C2 INT) PARTITION BY HASH(C1) PARTITIONS 8SELECT * FROM T WHERE C11; 请求准确路由到server1
SELECT * FROM T WHERE C21; 无分区条件无法计算路由直接将请求路由到上一个会话server1SELECT * FROM T WHERE C12; 请求准确路由到server2
SELECT * FROM T WHERE C22; 无分区条件无法计算路由直接将请求路由到上一个会话server2场景一enable_primary_zonetrue enable_cached_server true leader在server1SELECT * FROM T WHERE C11; 请求准确路由到server1
SELECT * FROM T WHERE C21; 无分区条件无法计算路由直接将请求路由到server1SELECT * FROM T WHERE C12; 请求准确路由到server1
SELECT * FROM T WHERE C22; 无分区条件无法计算路由直接将请求路由到server1
生产和测试环境一般情况下建议enable_cached_server设置为false 如果需要分析 OBProxy 的路由策略可以使用 EXPLAIN ROUTE executable sql 查看 OBProxy路由选取过程。 事务路由
事务路由分两种场景
分布式事务路由OceanBase4.1开始支持事务内的SQL请求准确路由到Leader节点。
配置enable_ob_protocol_v2true 且 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 8BEGIN;
INSERT INTO T1 VALUES(1,1);路由到server1
INSERT INTO T2 VALUES(11,11);路由到server2
SELECT * FROM T1 WHERE C11;路由到server1
SELECT * FROM T2 WHERE C111;路由到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 8BEGIN;
INSERT INTO T1 VALUES(1,1);路由到server1
INSERT INTO T2 VALUES(11,11);路由到server1
SELECT * FROM T1 WHERE C11;路由到server1
SELECT * FROM T2 WHERE C111;路由到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_nameidc1;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在z1follower在z2、z3场景一alter proxyconfig set proxy_route_policy;SELECT /*READ_CONSISTENCY(WEAK) */ * FROM T;
OBProxy在z1、z2、z3 三个副本随机选择副本转发弱读请求场景二alter proxyconfig set proxy_route_policyFOLLOWER_FIRST;SELECT /*READ_CONSISTENCY(WEAK) */ * FROM T;
OBProxy优先选择z2、z3 转发弱读请求如果z2、z3都不可用则转发到z1场景三alter proxyconfig set proxy_route_policyFOLLOWER_ONLY;SELECT /*READ_CONSISTENCY(WEAK) */ * FROM T;
OBProxy只选择z2、z3 转发弱读请求如果z2、z3都不可用则请求报错场景四alter proxyconfig set proxy_route_policyUNMERGE_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_consistency1;设置路由目标副本alter proxyconfig set proxy_primary_zone_namezone_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_consistency1;设置LDC策略只读副本同IDC的OBProxy和OBServer设置为相同IDC设置路由策略alter proxyconfig set proxy_route_policyFOLLOWER_ONLY;