【产品名称】OB
【产品版本】OB3.0
【问题描述】产品选型调研,看到OB的架构介绍,OBProxy是无状态的,可以将SQL发给指定的分区,避免OBServer二次转发,想问下OBProxy是启动的时候需要到rootserver上获取表的分片元信息吗?如果是,那rootserver刷新元信息时,如何同步给OBProxy呢?
【产品名称】OB
【产品版本】OB3.0
【问题描述】产品选型调研,看到OB的架构介绍,OBProxy是无状态的,可以将SQL发给指定的分区,避免OBServer二次转发,想问下OBProxy是启动的时候需要到rootserver上获取表的分片元信息吗?如果是,那rootserver刷新元信息时,如何同步给OBProxy呢?
这个问题, 我让proxy的同学回答你一下
不是启动的时候,是在第一次访问某个表的时候,会去获取这个表的元信息,就包括是否是分区表,分区键等等。
如果某个分区的主发生了变更,OBProxy 是被动通知。OBProxy 会发给老的主,老的主会告诉 OBProxy 路由错误,OBProxy 会重新获取最新的元信息
跟redis的moved机制有点类似。
1:如果是发错了,再重新请求,那么业务的性能是否会抖动呢?
2:这个重新请求是连接rootserver?如果分区主切换多了,rootserver是否会成为瓶颈?
重新获取元信息是会随机访问整个集群所有机器中的一台,这些机器上也有缓存,所以这个获取元数据的请求对系统影响较小---------怎么确保选择的这台机器上的路由信息是最准确的呢?
这里获取的元信息是指全量的元信息还是刚才路由发生错误的特定记录/特定表的元信息
我理解是这样:理论上永远都不需要保证路由信息是最准确的。因为 proxy 即使发错了,observer 也有能力把这个 SQL 执行出来。
observer 更进一步,不光把这个 SQL 执行出来,还顺便告诉 proxy 发错了(回包协议中,is_partition_hit 标记设置为 false)。 proxy 利用这个信息去拿新的 location 信息,尽量保证下次不发错。
针对你的担心(proxy 总拿不到最新的 location 信息)这里其实还可以做一个改进:observer 不光告诉 proxy 发错了,还告诉 proxy 应该发给谁才是对的(毕竟 observer 刚刚实际执行了一把,肯定知道正确的 location 信息)。但是考虑到 proxy 一般总是可以拿到正确的 location 信息,这个优化做的必要性不大。