OBProxy 中,执行 show proxyroute 中可以看到两类路由,为什么有的路由没有记录leader副本位置,odp如何找到leader 副本的?

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】obproxy
【 使用版本 】4.2.10
在obproxy 中,用root@sys 租户执行 show proxyroute ,可以看到两类路由:

cluster_name tenant_name database_name table_name state partition_num replica_num table_id cluster_version schema_version from_rslist create_time last_valid_time last_access_time last_update_time expire_time relative_expire_time server addr
SWHYGPFIS fbipv8etldb SWHY_FBIPETL ETL_WD_AINDEXMEMBERS AVAIL 1 3 500219 4 1751964543846976 N 2025-07-30 11:36:37 2026-05-26 08:05:19 2026-05-26 08:05:18 1970-01-01 08:00:00 1970-01-01 08:00:00 1970-01-01 08:00:00 server[0]=172.22.96.157:2881,leader,FULL; server[1]=172.22.96.155:2881,follower,FULL; server[2]=172.22.96.156:2881,follower,FULL;
SWHYGPFIS fbipv8db SWHY_FBIP ALONEID558026657 AVAIL 16 3 6166045 4 1773658026719472 N 2026-03-16 18:47:06 2026-03-16 18:47:06 2026-03-16 18:47:06 1970-01-01 08:00:00 1970-01-01 08:00:00 1970-01-01 08:00:00 part_level=1, first_func=HASH, first_space=0, first_num=16, sub_func=HASH, sub_space=0, sub_num=0

如表格所示,第一类表 leader 副本的位置可以看到,第二类看不到。
我的问题是:
为什么路由表中第二张表的路由信息里没有记录 leader 副本的位置(看起来是hash分区)?
对于第二类表,odp 又是怎么找到它的副本的位置的?

1 个赞

sys 租户本来就不是用来存放数据的,在存放数据后,有一些细节问题会出现!

@论坛小助手

对于第二类表,它是一个哈希分区表。哈希分区表的路由信息不记录每个分区的 leader 副本位置,因为这些信息会频繁变化。ODP 通过以下步骤来找到这些分区的 leader 副本位置:

  1. 当 SQL 请求到达 ODP 时,ODP 会解析 SQL 语句,确定需要访问的表名和分区键值。
  2. ODP 根据表名和分区键值计算出具体的分区 ID。
  3. ODP 会检查本地缓存(Location Cache)中是否有该分区的副本信息。如果有且有效,则直接使用这些信息进行路由。
  4. 如果本地缓存中没有该分区的信息,或者缓存信息无效,ODP 会向 OBServer 发送请求,获取最新的分区信息。
  5. 获取到分区信息后,ODP 会更新本地缓存,并根据最新的分区信息进行路由。
    这种方式可以减少对 OBServer 的频繁请求,提高路由效率。

更多信息请查看:

  1. 使用obclient执行sql文件怎么打印出日志
  2. ODP SQL 路由原理
  3. SQL 路由
  4. 无主