路由缓存失效

问题1
假如在obproxy的路由缓存中,t1表的路由信息失效了,那么obproxy在更新路由缓存时,是只对t1进行更新嘛? 还是全部更新?

问题2
假如在obproxy的路由缓存中,t1表的路由信息失效了,但是obproxy还不想立即对缓存进行更新,那么此时将依据什么对t1表进行路由?

1 个赞

1.只对t1表进行更新
2.对于路由表的更新,ODP 采用触发更新机制。ODP 每次会把 SQL 根据路由表转发给相应的 OBServer 节点,当 OBServer 发现该 SQL 不能在本地执行时,会在回包时反馈给 ODP

2 个赞

ODP 会将获取到的租户信息保存在本地内存中,并根据一定策略进行缓存信息的更新。对于 sys 租户,通过每 15 秒一次的拉取任务获得最新的信息;ODP 会每 15 秒访问一次 DBA_OB_SERVERS,维护最新的路由信息,这样可以感知到集群发生的节点变更。除了集群机器列表,ODP 还会通过 sys 租户获取 partition 分布信息、Zone 信息、租户信息等。

对于普通租户,ODP 的刷新频率并不高,普通租户的路由缓存策略如下:

  • 创建:首次访问租户时,通过 __all_virtual_proxy_schema 获得普通租户路由信息并创建。
  • 淘汰:当 OBServer 节点返回错误码 OB_TENANT_NOT_IN_SERVER 时设置缓存失效。
  • 更新:当缓存失效后重新访问 __all_virtual_proxy_schema 获得普通租户路由信息。

总的来说,在多租户架构下,ODP 通过 sys 租户获得元数据信息(sys 租户本身路由信息就是集群的机器列表),然后通过元数据信息获得租户的路由信息。通过租户路由功能,ODP 支持了 OceanBase 数据库的多租户架构。

2 个赞

问题2
假如在obproxy的路由缓存中,t1表的路由信息失效了,但是obproxy还不想立即对缓存进行更新,那么此时将依据什么对t1表进行路由?

我的意思是在这个时候,obproxy就是顽固的不更新路由缓存,那么t1表的路由信息,在这个时候,该去哪里获取? 因为obproxy并不是每触发一次就更新一次。

1 个赞

__all_virtual_proxy_schema 是OB的sys租户的内部表哈 ?

1 个赞

在obproxy的路由缓存中,若t1表的路由信息失效,但obproxy仍未进行更新,通常会使用以下策略进行路由:

  1. 默认路由:obproxy可能会采用默认路由,指向某个默认的分片或节点,确保请求仍然能够被处理。
  2. 旧的路由信息:即使路由信息失效,obproxy可能仍会使用之前的路由信息进行路由,直到新的信息被更新。
  3. 重试机制:如果请求失败,obproxy可能会进行重试,可能通过不同的路由来寻找可用的节点。
  4. 其他缓存策略:对于某些请求,obproxy可能会有额外的策略(如请求的类型、负载均衡等),来决定如何路由。
  5. 探测机制:在某些情况下,obproxy可能会尝试去探测某个后端节点是否可用,在获取到新的有效路由信息之前临时使用这些信息。

可以学习下这篇文章
https://open.oceanbase.com/blog/10900389

2 个赞