首批通过分布式安全可靠测评,为关键业务系统打造
路由策略路由
更新时间:2026-04-14 17:41:09
本文介绍路由策略路由相关的概念,并结合示例讲解如何配置路由策略路由。
概念介绍
本节介绍路由策略路由相关的概念,如 LDC、路由策略、路由类型等。
Logical Data Center
逻辑数据中心(Logical Data Center,LDC)路由可用于解决分布式关系型数据库中多地多中心部署时产生的异地路由延迟问题。
OceanBase 数据库作为典型的高可用分布式关系型数据库,使用 Paxos 协议进行日志同步,天然支持多地多中心的部署方式以提供高可靠的容灾保证。但当真正多地多中心部署时,任何数据库都会面临异地路由延迟问题。逻辑数据中心(Logical Data Center,LDC)路由正是为了解决这一问题而设计的。在为 OceanBase 集群的每个 Zone 设置地区(Region)属性和机房(IDC)属性,并为 ODP 指定机房(IDC)名称配置项的情况下,当数据请求发到 ODP 时,ODP 将按“同机房>同地区>异地”的优先级顺序进行 OBServer 节点的选取。
说明
ODP 不提供单独使用 LDC 路由的方式,而是与路由策略融合使用,LDC 优先级仅是路由策略路由要考虑的一个维度。
路由策略
在以下情况中 ODP 将使用路由策略规则进行路由:
弱读
强读 Primary Zone
强读分区表计算分区失败
在路由策略路由中,OBServer 节点在 ODP 中的逻辑优先级由路由策略决定。路由策略可以通过配置 ODP 配置项 proxy_route_policy 或者设置用户变量(@proxy_route_policy)指定,仅可以指定如下路由策略。
FOLLOWER_FIRST:优先发往备副本,如果无备副本可用则发往主副本。
FOLLOWER_ONLY:只能发往备副本,如果无备副本可用则报错。
UNMERGE_FOLLOWER_FIRST:优先发不在集群合并状态的备副本。
TARGET_REPLICA_TYPE_WITH_LEADER:指定副本路由,主副本与备副本优先级相同。备副本的类型由
route_target_replica_type决定。TARGET_REPLICA_TYPE_FOLLOWER_FIRST:指定副本路由,优先选择备副本,当所有备副本不可用时会选择主副本。备副本的类型由
route_target_replica_type决定。TARGET_REPLICA_TYPE_FOLLOWER_ONLY:指定副本路由,只会选择备副本,当备副本都不可用时,断开和客户端的连接。备副本的类型由
route_target_replica_type决定。WEAKREAD_WEIGHT_LOAD_BALANCE:基于权重进行负载均衡路由,可通过配置
weakread_weight_zone为集群中的各个 Zone 设置权重。
route_target_replica_type 的详细介绍可参见 route_target_replica_type,weakread_weight_zone 的详细介绍可参见 weakread_weight_zone。
注意
当
route_target_replica_type配置为ColumnStore时,ODP 只会将请求路由到列存副本,不会路由到主副本。只读 Zone 相关路由策略已经废弃,请勿使用。
路由类型
路由策略对应着一组逻辑优先级,其由若干个路由类型组成。路由类型由副本的五个维度属性构成。
Paxos 类型:主副本(LEADER)、备副本(FOLLOWER)
分区表类型:分区副本(PARTITION)、不考虑分区副本(NONPARTITION)
Zone 类型:读写 Zone(READWRITE)、只读 Zone(READONLY)
SSTable 合并状态:已合并(UNMERGE)、合并中(MERGE)
地理位置:同机房(LOCAL)、同地区(REGION)、异地(REMOTE)
复制表副本:复制表副本(DUP)、非复制表副本(-)
以使用 FOLLOWER_FIRST 路由策略为例,其对应的部分优先级如下,优先级依次递减。
FOLLOWER_PARTITION_UNMERGE_LOCAL:备副本、分区副本、已合并、同机架
FOLLOWER_PARTITION_UNMERGE_REGIO:备副本、分区副本、已合并、同地区
FOLLOWER_PARTITION_MERGE_LOCAL:备副本、分区副本、合并中、同机架
FOLLOWER_PARTITION_MERGE_REGION:备副本、分区副本、合并中、同地区
LEADER_PARTITION_UNMERGE_LOCAL:主副本、分区副本、已合并、同机架
LEADER_PARTITION_UNMERGE_REGIO:主副本、分区副本、已合并、同地区 ...
使用
路由策略路由使用步骤如下。
配置 OceanBase 集群 LDC。
配置 ODP 实例级配置项
proxy_idc_name。注意
proxy_idc_name配置为空时,LDC 路由将失效。配置 ODP 实例级配置项
proxy_route_policy以提供更细节的优先级控制。如果仅控制路由到某 Zone 或某 IDC,可以跳过该配置,不配置的情况下,ODP 使用默认路由策略MERGE_IDC_ORDER。执行请求。
示例一:路由至指定机房(IDC)
步骤一:配置 OceanBase 集群 IDC
使用 root@sys 登录 OceanBase 集群,执行如下命令配置 OceanBase 集群 LDC。此处以集群中包含三个 Zone,且每个 Zone 下包含一个 OBServer 节点的 OceanBase 集群作为示范。
配置 z1 所处的地区,参数 REGION 表示 Zone 所在的地域信息,通常设置为城市名(大小写敏感)。
obclient [oceanbase]> ALTER SYSTEM MODIFY ZONE "z1" SET REGION = "SHANGHAI";
配置 z1 所处的机房,参数 IDC 代表该 Zone 所处的机房信息,通常设置为机房名(小写)。
obclient [oceanbase]> ALTER SYSTEM MODIFY ZONE "z1" SET IDC = "zue";
说明
一个 OceanBase 集群中有若干个 Region,一个 Region 有若干个 Zone,一个 Zone 对应一个 IDC 属性。
配置好的集群部署情况如下表所示。
| OBServer 节点 IP | Zone | IDC | REGION |
|---|---|---|---|
| 10.10.10.1 | z1 | zue | SHANGHAI |
| 10.10.10.2 | z2 | xue | SHANGHAI |
| 10.10.10.3 | z3 | yue | HANGZHOU |
步骤二:配置 ODP 配置项
通过配置 proxy_idc_name 指定 ODP 在 LDC 逻辑中所处的位置,本示例中以将弱读请求全部路由到 z1 为例,可执行如下命令配置 proxy_idc_name 为 zue。
obclient [oceanbase]> ALTER PROXYCONFIG SET PROXY_IDC_NAME ='zue';
步骤三:执行请求
创建一张表 t1,执行一个弱读请求
obclient [test]> SELECT /*+READ_CONSISTENCY(WEAK) */ * FROM test.t1;使用 EXPLAIN ROUTE 命令观察 ODP 路由情况。
obclient [test]> EXPLAIN ROUTE SELECT /*+READ_CONSISTENCY(WEAK) */ * FROM test.t1\G输出如下,idc_type 值为 SAME_IDC,表示副本所在位置与 ODP 同机房,也就是 z1。
*************************** 1. row *************************** ... Route Plan ----------------- > SQL_PARSE:{cmd:"COM_QUERY", table:"t1"} > ROUTE_INFO:{route_info_type:"USE_PARTITION_LOCATION_LOOKUP"} > TABLE_ENTRY_LOOKUP_DONE:{table:"t1", table_id:500006, table_type:"USER TABLE", entry_from_remote:false} > ROUTE_POLICY:{replica:"10.10.10.1:50109", idc_type:"SAME_IDC", zone_type:"ReadWrite", role:"LEADER", type:"FULL", is_partition_server:true, chosen_route_type:"ROUTE_TYPE_PARTITION_UNMERGE_LOCAL", route_policy:"MERGE_IDC_ORDER", trans_consistency:"WEAK", session_consistency:"STRONG", proxy_idc_name:"zue"} > CONGESTION_CONTROL:{svr_addr:"10.10.10.1:50109"}
说明
可通过配置 proxy_idc_name 将弱读请求路由到其他地区,例如若想将弱读请求路由到 HANGZHOU 地区,可配置 proxy_idc_name 为 yue。
示例二:路由到指定机房(IDC)的表备副本(FOLLOWER)
步骤一:配置 OceanBase 集群
使用 root@sys 登录 OceanBase 集群,执行如下命令配置 OceanBase 集群 LDC。此处以集群中包含三个 Zone,且每个 Zone 下包含一个 OBServer 节点的 OceanBase 集群作为示范。
配置 z1 所处的地区,参数 REGION 表示 Zone 所在的地域信息,通常设置为城市名(大小写敏感)。
obclient [oceanbase]> ALTER SYSTEM MODIFY ZONE "z1" SET REGION = "SHANGHAI";
配置 z1 所处的机房,参数 IDC 代表该 Zone 所处的机房信息,通常设置为机房名(小写)。
obclient [oceanbase]> ALTER SYSTEM MODIFY ZONE "z1" SET IDC = "zue";
说明
一个 OceanBase 集群中有若干个 Region,一个 Region 有若干个 Zone,一个 Zone 对应一个 IDC 属性。
创建表 t1,通过如下命令查看表中的主备副本情况。
obclient [oceanbase]> select * from oceanbase.DBA_OB_TABLE_LOCATIONS where DATABASE_NAME='test' and TABLE_NAME like 't1'\G
配置好的集群部署情况如下表所示。
| OBServer 节点 IP | 主备情况 | Zone | IDC | REGION |
|---|---|---|---|---|
| 10.10.10.1 | Leader | z1 | zue | SHANGHAI |
| 10.10.10.2 | Follower | z2 | xue | SHANGHAI |
| 10.10.10.3 | Follower | z3 | yue | HANGZHOU |
步骤二:配置 ODP 配置项
通过配置 proxy_idc_name 指定 ODP 在 LDC 逻辑中所处的位置,并通过配置 proxy_route_policy 指定路由策略,本示例中以将弱读请求全部路由到同机房的备副本为例,可执行如下命令进行配置。
obclient [oceanbase]> ALTER PROXYCONFIG SET PROXY_IDC_NAME ='zue';
obclient [oceanbase]> ALTER PROXYCONFIG SET proxy_route_policy = FOLLOWER_FIRST;
步骤三:执行请求
使用 EXPLAIN ROUTE 命令观察 ODP 路由情况。
obclient [oceanbase]> EXPLAIN ROUTE SELECT /*+READ_CONSISTENCY(WEAK) */ * FROM test.t1\G
输出如下,idc_type 值为 SAME_IDC,表示副本所在位置与 ODP 同机房,role 值为 FOLLOWER,表示路由到了表备副本。
...
Route Plan
-----------------
> SQL_PARSE:{cmd:"COM_QUERY", table:"t1"}
> ROUTE_INFO:{route_info_type:"USE_PARTITION_LOCATION_LOOKUP"}
> TABLE_ENTRY_LOOKUP_DONE:{table:"t1", table_id:500006, table_type:"USER TABLE", entry_from_remote:false}
> ROUTE_POLICY:{replica:"10.10.10.2:50110", idc_type:"SAME_IDC", zone_type:"ReadWrite", role:"FOLLOWER", type:"FULL", is_partition_server:true, chosen_route_type:"ROUTE_TYPE_FOLLOWER_PARTITION_UNMERGE_LOCAL", route_policy:"FOLLOWER_FIRST", trans_consistency:"WEAK", session_consistency:"STRONG", proxy_idc_name:"zue"}
> CONGESTION_CONTROL:{svr_addr:"10.10.10.2:50110"}