OBProxy是如何将SQL发给指定分区的?

【产品名称】OB

【产品版本】OB3.0

【问题描述】产品选型调研,看到OB的架构介绍,OBProxy是无状态的,可以将SQL发给指定的分区,避免OBServer二次转发,想问下OBProxy是启动的时候需要到rootserver上获取表的分片元信息吗?如果是,那rootserver刷新元信息时,如何同步给OBProxy呢?

这个问题, 我让proxy的同学回答你一下

不是启动的时候,是在第一次访问某个表的时候,会去获取这个表的元信息,就包括是否是分区表,分区键等等。

如果某个分区的主发生了变更,OBProxy 是被动通知。OBProxy 会发给老的主,老的主会告诉 OBProxy 路由错误,OBProxy 会重新获取最新的元信息

跟redis的moved机制有点类似。

3 个赞

1:如果是发错了,再重新请求,那么业务的性能是否会抖动呢?

2:这个重新请求是连接rootserver?如果分区主切换多了,rootserver是否会成为瓶颈?

  1. 当发生错误时, 重定向后, 会更新obproxy的最新元数据
  2. 分区切主是一个低频事件, 集群稳定运行时, 不会发生, 因此这块性能不用担心
  1. 这个会发给老的主,然后老的主会转发到新的主。这个确实会有性能损耗,但损耗不大,在分布式环境下,没有一个实时通知机制,就算 OBServer 主动告诉 OBProxy,在发生变化到告诉之间也有时间差,也会发到老的主。要么就是通知成功后,OBServer 才切换,这个系统耦合性太强,也不合理。所以这是一个工程上的折中
  2. 重新获取元信息是会随机访问整个集群所有机器中的一台,这些机器上也有缓存,所以这个获取元数据的请求对系统影响较小
1 个赞

重新获取元信息是会随机访问整个集群所有机器中的一台,这些机器上也有缓存,所以这个获取元数据的请求对系统影响较小---------怎么确保选择的这台机器上的路由信息是最准确的呢?

这里获取的元信息是指全量的元信息还是刚才路由发生错误的特定记录/特定表的元信息

我理解是这样:理论上永远都不需要保证路由信息是最准确的。因为 proxy 即使发错了,observer 也有能力把这个 SQL 执行出来。

observer 更进一步,不光把这个 SQL 执行出来,还顺便告诉 proxy 发错了(回包协议中,is_partition_hit 标记设置为 false)。 proxy 利用这个信息去拿新的 location 信息,尽量保证下次不发错。

针对你的担心(proxy 总拿不到最新的 location 信息)这里其实还可以做一个改进:observer 不光告诉 proxy 发错了,还告诉 proxy 应该发给谁才是对的(毕竟 observer 刚刚实际执行了一把,肯定知道正确的 location 信息)。但是考虑到 proxy 一般总是可以拿到正确的 location 信息,这个优化做的必要性不大。