“小强show科技”,不一样的感知,展示科技带来的魅力生活。感谢您的阅读!
前言
OceanBase是阿里巴巴和蚂蚁金服完全自主研发的通用的分布式关系型数据库,定位为商用企业级数据库。金融级别的可靠性,目前主要用于金融行业和其他行业。
OceanBase目前主要有1.x和2.x两个版本序列。1.x版本兼容MySQL常用语法,2.x版本以兼容Oracle常用语法为目标。OceanBae支持多租户,即在一个OceanBase集群里会划分出多个租户(即实例),而租户的类型是兼容MySQL或者Oracle。业务方使用的只是租户(实例),是集群能力的一个子集。在使用体验上会感觉租户像MySQL或Oracle,但又不完全一样。OceanBase并不是在重造一个MySQL或Oracle,而只是在功能接口上兼容它们,在底层架构上,不管哪种租户都有分布式能力。
OceanBase是什么?
Oracle软件是多进程程序,启动后会开辟一块共享内存。Oracle部署形态有单实例、集群RAC、主备Dataguard。MySQL软件是单进程,进程名叫mysqld,有的还会有守护进程mysql_safe。MySQL的部署形态有单实例、主从单向同步或主主双向同步和MySQL Cluster(用的比较少)。
OceanBase的软件是单进程,名字叫OBServer。OceanBase是分布式数据库,集群部署,通常每个机器(后面统一称为节点)上会启动一个OBServer进程,各个节点的OBServer进程组成一个集群运行。虽然应用可以直接访问任意一个节点的实例,但不推荐。
通常是在OceanBase集群前面启动一个或多个反向代理OBProxy。OBProxy只负责数据路由和传输,不涉及到数据运算(如连接、统计、合并或排序等)。OBProxy的作用类似Oracle的监听程序,不同的是数据返回的时候也是从OBProxy回去。这个以后再专门详细介绍。对于业务而言,OBProxy就是数据库的代表,可用性也很重要。所以一般会部署多个OBProxy挂载负载均衡设备或软件下面以VIP形式对外提供服务。
OceanBase的开发
锁、事务和超时机制
OceanBase的租户兼容MySQL或Oracle,常用的数据类型和语法都还支持。这点使用没什么问题。需要注意的是在锁和事务方面。
OceanBase的锁是行锁,也有表锁,但是没有锁升级策略。OceanBase的事务都有版本号,类似于Oracle的SCN,读默认是快照读,不阻塞写。OceanBase的事务隔离级别目前只支持读已提交(RC)。如果要规避不可重复读问题,则需要在读上加锁(支持SELECT ... FOR UPDATE)。
在租户内,如果事务修改的分区跨越节点了,就是分布式事务,OceanBase目前也是支持的,原理是两阶段提交,强一致。业务感知不到也不需要知道这个是分布式事务。如果业务事务跨越了租户边界,则这种分布式事务需要借助于分布式事务中间件产品解决。
OceanBase针对慢SQL有个超时机制,以防止慢SQL占用数据库资源,默认时间是10秒。慢SQL不仅包括查询慢的SQL,还包括SQL自身性能没问题但是被阻塞的DML SQL。在MySQL里对于锁等待也有超时机制,对于慢SQL也有强制中断机制(默认没有启用)。
OceanBase对于长事务(长时间不提交)采取的是强制超时机制,默认时间是100秒。由于OceanBase没有UNDO,并且事务未提交之前,Redo都在内存里,所以大事务会占用一定内存资源。
这两个超时参数都可以调整。调整为很大时效果就等同于不干预,跟Oracle/MySQL就一致了。我们并不建议简单调大。慢SQL和长事务是业务设计问题,需要业务层面尽可能的解决。
SQL调优
OceanBase的SQL执行设计参照了Oracle的设计,有硬解析、软解析,有执行计划缓存。执行计划目前也很丰富,连接算法有嵌套循环、哈希、归并连接、半连接(semi-join)、anti-jon。支持左连接或右连接,子查询等,支持SQL改写等等。这块以后再详细总结。
查看执行计划的命令是explain,这点跟MySQL保持一致(简洁)。
OceanBase提供一序列内部视图(gv$视图或v$视图)用于诊断性能。这点跟Oracle的性能视图比较类似。
同时OceanBase还有一个视图gv$sql_audit拥有集群执行过的全部SQL,无论SQL是否成功还是失败。从中可以查看SQL的执行时间、节点、执行计划类型、报错代码、执行时间、等待时间、读取块数、返回行数、影响行数等等。
更值得一提的是OceanBase也实现了Oracle的Outline功能,能在线干预执行计划。如调整连接算法、顺序或者索引等。对于那些不可调整的慢SQL,为了消除它的影响,Outline支持对该慢SQL做限流处理。如强制串行执行等。