OceanBase作为一款分布式关系型数据库,随着Observer集群的规模不断扩大,如果直连 ObServer,停机/上下线机器的概率也会随之增加,OBProxy便是在这种情况下应运而生,以解决分布式数据库系统的 SQL 路由、高可用等问题。
OBProxy全称为OceanBase Database Proxy,是OceanBase数据库专用的服务代理。使用 OBProxy 可以屏蔽后端 ObServer 集群本身的分布式带来的复杂性,让访问分布式数据库像访问单机数据库一样简单。
那么,OBProxy究竟是如何提升OceanBase数据库性能的呢?我们今天就来好好聊聊。
链路对性能的影响
引入OBProxy后,虽然整体链路上多了一个模块,但对性能影响不大。
通过比较连接OBProxy和连接OBServer1两种情况,假设数据分布在OBServer2上面,那么两种方式都需要两次网络交互。所以大部分情况下连接OBProxy和连接 OBServer的性能差距不大,并且因为OBProxy转发效率更高,有时性能更好。
访问 OceanBase 数据库时,链路长度和模块的部署方式有很大关系。OBProxy部署到应用端时性能最好,而为了大家更方便地享受这种部署的好处,研发团队也研发了富客户端功能。所谓富客户端功能,就是指把OBProxy的功能打包成一个so动态库,JDBC/C驱动等加载该so就可以使用富客户端能力,而无需部署运维OBProxy。使用富客户端只需要修改下配置的URL即可,不需要修业务的代码,非常方便上手。
扩展性
当排查发现分布式系统中某个模块达到单机性能瓶颈时,此时再去想提升单机性能是一件非常困难的事情,而通过增加机器进行扩容可以快速解决性能瓶颈问题,因此扩展性就是一个影响性能的重要因素。
OBProxy本身是无状态的,并且启动速度特别快,可以实现秒级提供服务,因此 OBProxy的扩展性特别好。根据真实测试数据,OBProxy可以在1~2s内完成启动提供服务。
另一方面,在双十一等高并发场景,OBServer 本身也经常做云上的弹入和弹出操作,本质就是OBServer的机器变更(上下线、扩缩容等)。OBProxy感知OBServer 的副本位置变更操作,在路由时选择正确的OBServer为用户提供服务,帮助用户有丝滑的使用体验。
数据路由
为了更好的性能,研发团队实现了丰富的路由算法如LDC路由、Primary Zone路由、读写分离路由等。而在OBServer的新版本,还将要上线事务路由功能,事务内的SQL都可以发往数据所在的节点,性能也会变得更好。假设事务有两条SQL:
之前版本事务路由:
新版本事务路由:
通过比较可以发现新的事务路由更加的简单高效,减少TCP通信次数,并且可以更高效发挥每一台OBServer能力,性能提升有50%左右。
另外,大家也可以记录一些OBProxy常用性能数据,包括OBProxy单核性能在2~4w之间,云上16c测试约有40w QPS;OBProxy没有明显性能热点函数,使用perf top观察每个函数CPU消耗都在5%以下;OBProxy工作线程建议配置和CPU核数一样,更多的线程数不会再带来性能提升。
对于OBProxy使用的协议,性能数据如下:MySQL协议>2.0协议>压缩协议。将压缩协议改为MySQL协议后性能会带来明显提升。
以上,就是OBProxy对于OceanBase数据库的性能影响。可以看出,不管是OBProxy的分区位置计算功能、LDC路由功能还是读写分离功能等,其产生的积极影响都比较明显。
领取专属 10元无门槛券
私享最新 技术干货