【活动】第八期直播教程学习笔记分享贴

活动时间 :

2022年 2 月 17 日 - 2022年 2 月 23 日

活动期间,可以在评论区中留言,分享你观看教程直播第八期—— OceanBase 社区版生态工具 ODP& OCP 介绍中遇到的问题、收获、学习笔记或心得。

学习资料参考:

“文档中心”-“入门教程”:

https://open.oceanbase.com/docs/tutorials/quickstart/V1.0.0/chapter-1-overview-of-the-oceanbase-database

“视频中心”:

https://open.oceanbase.com/docs/videoCenter

“视频回放合集”:

https://open.oceanbase.com/blog/10900164?currentPage=1

OceanBase 社区版入门到实战教程直播正在进行中~

快来一起学习、拿 OBCP 模拟实验券 & 考试 2.5 折的入场券啦~

加入教程直播群方式一:

钉钉群号3582 5151

加入教程直播群方式二:

扫码下方二维码加入

问卷反馈填写地址:

请问老师,开源版odp 和 obproxy 有什么区别?这里odp 支持 RDS/OceanBase/MySQL 的分库分表么?

场景:app -> lvs -> obproxy ->oceanbase

这个场景下,app端执行sql超时了,mysql驱动会新建一个连接,执行kill query thrdad_id(与obproxy创建连接的时候,连接的id),将超时SQL杀掉。lvs后的obproxy有多个,什么机器保证kill query是正确的?

两种情况:

lvs没有开会话保持,lvs将新建的链接发错到其他obproxy,会不会导致杀错session?




我理解的odp 和 obproxy是一个东西

1 个赞

路由错了,ODP去更新,那能不能主动刷新后再返回结果。不然就会有大量交易失败,交易损失太大了。

Observer发生了切主了,执行SQL会报错,但是这个SQL的交易就失败,这个影响范围太大了。还希望能发现是这个错就主动刷新locationcache。能容忍偶尔的慢SQL,但是交易损失大了,那就不能接受了。

ODP如何解决有前端app的全链路跟踪?比如适配skywalking

老师,我请问一下,如果我向OBproxy发送select /* parallel 100 */ * from table, 这条SQL是怎么路由到OBServer,以及OBServer如何并行执行,以及并行执行完,是怎么与OBProxy之间数据传输的?

通用解决方案:

开启会话保持,发往建立链接的obproxy.

另一种是thread_id是有标识作用,发给任何obproxy,都能找到正确的obproxy,转发过去kill query。

mysql驱动对超时的控制就是kill query,不能不用obproxy的啊。

ODP是产品名字,obproxy是进程名。目前开源版本功能都是全的,没有删减。

sharding方面,ODP sharding+OceanBase是一个成熟的方案,这里推荐。对于MySQL和RDS,我们做过适配,但实际使用的比较少。

目前策略:

路由错误(此时当前SQL执行完成),observer反馈给ODP,ODP将缓存标记为dirty,但不会此时去更新。

当下次请求到达时,发现缓存dirty,一种策略就是先去拉取最新的缓存,另一种就是当前SQL继续执行,执行完成后再去拉取新的。

之前我们遇到一个问题就是去主动刷新时,此时也是发送内部SQL去observer拉取,这个SQL执行慢了导致业务SQL受到了影响。ODP有个配置项enable_async_pull_location_cache,设置为false就是你要的效果。

交易失败应该不至于,observer也具有路由能力,只是效率没有ODP高,路由不准,一条SQL延迟可能从2ms变成几十几百ms,SQL还是可以正确执行的。

交易失败还需要看下,是不是路由错了执行时间变成几秒了?这种情况还是很少的

和上个回答类似,切主导致路由不准,执行变慢,但不会交易失败的,希望可以提供下更详细信息

一方面是监控信息生成,我们通过自研协议支持,同时jdbc+ODP+observer三个模块都需要改造。然后信息通过日志的方式记录下来。

另一方面是日志的采集,目前我们没有使用开源的skywalking,而是通过OCP模块实现日志的采集和处理

这里我假设你的表名是t1,如果t1不是分区表:在obs实现中,这个表只有一个parition分区,只会在一台机器上,他就是一个本地计划,ODP会缓存路由信息,将这条SQL发送到t1的leader副本所在的机器上面。然后就是并行执行部分,这个并行只需要在一个分区内并行扫表,结果通过该机器返回给ODP,ODP返回给客户端。

如果t1是分区表,并且分区分布在了多台机器:此时语句没有where条件,所以是全表扫描操作,计划为分布式计划,对于分布式计划,ODP没有很好的处理办法,目前会从有这个表数据的机器随机选择一台,将SQL转发给这台机器。这台机器生成分布式计划进行执行,结果也通过这台机器返回给ODP。关于observer如何并行执行,可以通过explain看下计划,简单解释是接收SQL的observer生成计划然后在计划执行阶段将任务发送给其它机器执行。

嗯,第一种赞同,另一种是超时可以通过设置jdbc参数sockettimeout或者通过ob_query_timeout合理设置超时时间。

第二种我们还没有实现,不同的ODP进程之间不会做感知,也不会进行信息转发,未来会考虑ODP集群的概念。

好的,谢谢老师,已经得到我们想要的答案了

OCP需要的资源有点,在笔记本环境上还没搭起来,待体验