概述
本文主要演示OceanBase集群常用SQL用法。如建租户(实例)、建库建表、分析执行计划、扩容缩容、内部视图分析等等。非常适合初学者入门OceanBase。
如果您是第一次接触OceanBase,请先看前文《OceanBase数据库实践入门——手动搭建OceanBase集群》了解OceanBase集群安装过程。即使没有条件安装OceanBase,也可以通过本文的示例了解OceanBase特征。
集群资源管理
OceanBase的创新之一在于支持多租户,具体来说就是对集群资源进行二次管理。
每个节点的OBServer进程撷取了主机的大部分资源后,通过集群聚合成一个很大的资源池,这就是集群的最大能力。然后在这个大的资源池里可以分配出小的资源池给某个业务用,这个就是租户(也叫实例)。
分配资源和创建租户
备注:
- 在创建资源池的时候分配资源,
unit_num
决定了能否使用多台机器的能力。 - OceanBase 2.1版本支持两种兼容模式的租户类型:一是兼容
mysql
,一是兼容oracle
。 - 创建租户的时候可以设定
primary_zone
决定租户内数据(分区)的leader
副本默认位置,设定白名单特征限制租户访问的客户端。
查看资源利用率
备注:
- 目前OceanBase只对
CPU
和Memory
资源进行分配,所以重点关注这两项资源的分配比例(百分数,pct
字段)。 - 默认情况下,
cpu_total
和mem_total
资源都取自节点进程启动时从主机撷取的资源然后按 resource_hard_limit/100
展示。
备注:
- 资源池由每个
Zone
里的资源单元(Unit
)组合而成。这里可以看到租户具体的资源单元分布位置。 - 各个资源单元是彼此隔离的。
业务租户使用
连接业务租户(mysql租户)
使用mysql
客户端或者OB客户端obclient
连接mysql
类型租户,默认密码是空。注意用户名格式是:集群名:租户名:用户名
或者 用户名@租户名#集群名
。 应用代码建议用前者格式。
连接业务租户(oracle租户)
使用obclient连接oracle
类型租户,默认密码也是空。
mysql租户建表
备注:
- 业务上有强关联的表如果要拆分,可以选择同一个拆分策略和分片数。然后利用OceanBase的
tablegroup
机制可以将这些分区表的同号分区(即分区组PartitionGroup
)聚合到同一个节点内部。 - 分区组的分区策略和分片数必须跟分区表的分区策略和分片数一致。
- 分区表支持全局索引,需要指定
GLOBAL
。本地索引类型是LOCAL
。
分区负载均衡和租户扩容
备注:
-
role
为1表示leader
副本,svr_ip:svr_port
是副本所在的位置。此时租户资源池还是1-1-1
布局,所以所有分区的leader
都在同一个节点内部。 - 虽然集群拓扑是
2-2-2
,这个租户只能使用到其中3个节点的能力。 - 跟
tablegroup
的连接必须是外连接,因为可能有些表没有关联到任何tablegroup
。
下面将租户资源扩容为2-2-2
布局。随后我们再看看分区分布。
备注:
- 这三个表的同号分区在同一个节点内部,不同分区在不同的节点上。这是分区负载均衡机制生效了。
备注:
- 各个节点上的
cpu
和memory
利用率基本均等。 - 每个节点上都有
leader
副本,虽然数量不均衡并没有关系,因为均衡策略是综合租户、分区组、分区空间、资源(cpu
和memory
)利用率的。1136里大部分是sys
租户的内部表。 
备注:
- 当把一个资源池的
unit_num
设置为2个时,意味着每个Zone
里有2个Unit
,这两个资源单元不能在一个节点内部。这样设置后这个mysql
租户理论上就可以发挥多个节点的能力了。
oracle租户建表
同样也对oracle
租户资源进行扩容
下面看看负载均衡的效果。
备注:
-
ORACLE
里的表默认都是大写的,tablegroup
机制将三个表的同号分区约束在同一个节点内部。
备注:
- 可以观察到
leader_count
有了变化。
查看执行计划
无论是mysql
租户,还是oracle
租户,查看执行计划的命令都很简单,就是 explain [sql]...
。
不过同样的sql,在mysql租户里执行计划略有不同
备注:
- 用了
t2
和t3
的merge join
,不是很合理,估计是跟数据量有关。实际执行性能也不差。 - 可以用
HINT
修改执行计划,如下:
内部视图
OceanBase提供了非常丰富的内部视图,方便运维和开发了解内部原理、性能诊断等等。
gv$视图(仿ORACLE)
视图详细定义可以查看官网(oceanbase.alipay.com/docs
)。
其中视图gv$sql_audit
是OceanBase全量SQL运行日志的。详情参见前文《阿里数据库性能诊断的利器——SQL全量日志》。
OceanBase特有视图(__all_)
其中视图__all_rootservice_event_history
可以查看内部事件日志。详情参见前面文章《OceanBase数据库实践入门——了解总控服务》。
备注:
- 通过这个
sql
可以观察到资源分配、分区负载均衡(迁移)、leader
副本切换的过程等等。
参数和变量
参数(Parameter)变更
OceanBase的参数变更影响的是集群级别的设置,只能在sys
租户下变更。操作方式非常类似ORACLE的参数变更。
变量(variables)变更
OceanBase的变量变更影响的是租户(实例)的设置,只能在具体租户下变更(sys
租户也可以),影响范围是当前租户。这点跟MySQL运维操作非常类似。
总结
OceanBase的SQL兼容性既支持MySQL(5.6)又支持ORACLE,在运维操作上部分功能很像ORACLE,部分功能又像MySQL。所以传统ORACLE/MySQL DBA在接触OceanBase过程中会很容易入手。
其他
- 个人理解,难免有误。我会在月底集中对当月文章里的错误进行修正。敬请关注。
- 更多分享请查阅公众号