当前位置: 首页 > news >正文

OceanBase v4.2 解读:tenant=all 语义优化,提升易用性

1 背景

1.1 租户类型及特点

OceanBase中有三种类型的租户:

  • sys租户:集群默认创建,生命周期与集群相一致,管理集群和其他租户,具有较高的地位。
  • 用户租户:用户创建的业务租户或普通租户,用于运行用户业务并提供完整的数据库功能。
  • meta租户:与用户租户对应的内部租户,用于存储和管理用户租户的集群私有数据。

可见,sys租户和meta租户都具有“角色关键,但不跑业务”的特点,因此,用户在运维中也往往不会刻意关注这些租户,而是将重点放在用户租户上。

1.2 tenant=all 的已知问题

目前,租户级配置项修改命令支持tenant=all语法,即alter system set xxx=yyy tenant=all,语义是对所有租户,包括sys、meta租户,都生效。这种设计存在两个问题。

一是易用性问题,即可能使用户做出不符合本身意愿的误操作。当用户使用tenant=all时,可能仅仅是想对所有用户租户生效,也没有清楚而深刻地认识到“我这个动作,已经顺带把sys租户和meta租户的配置项一起改了,这可能会有问题,我需要特别留心这一点”。

二是稳定性问题,即可能会引发observer故障。如果有些配置项对sys租户很重要,不可轻易修改,那么,一旦这些配置项被tenant=all“顺带”修改了,就可能引发ObServer的故障,并增加问题排查的难度。

cpu_quota_concurrency为例说明,sys租户默认配置成10,其余租户默认值为4,如果用户执行了alter system set cpu_quota_concurrency=5 tenant=all;,可能导致sys租户出现问题。而用户很可能仅仅是想改跑业务的用户租户的配置项,sys、meta被连带修改,非用户本意。

1.3 解决方案

变更tenant=all的语义,彻底杜绝用户误操作的风险,同时新增语法兼容旧语义,详见下文变更细节。

2 tenant=all语义变更

2.1 变更细节

首先,修改tenant=all语义,改为“仅包括所有用户租户,排除sys和meta租户”,以彻底杜绝用户误操作风险,提升产品稳定性。

除了配置项修改语法,其它使用tenant=all的语法,如合并转储相关语法,也要一起修改,为了保持产品行为统一,避免用户疑惑。

其次,新增语法,tenant=all_usertenant=all_meta,分别对应所有用户租户和所有meta租户。理由是兼容原有语义,提供更细粒度的控制,在保证操作安全的前提下尽量方便用户使用。如果用户想使操作对所有用户租户生效,可以使用tenant=all_user,而不必一一列举租户名称;如果用户确实想要使操作对所有租户都生效,可以依次使用tenant=all_usertenant=all_metatenant=sys,详见使用说明。

修改后,tenant=alltenant=all_user的语义完全相同,后面会在恰当时机废弃tenant=all

2.2 影响到的模块和命令

模块命令
配置项修改alter system set xxx=yyy tenant=all
合并转储alter system {major|minor} freeze tenant=allalter system {suspend|resume} merge tenant=allalter system clear merge error tenant=all

2.3 性能影响

无影响。本特性只是缩小了tenant=all的生效范围,同时新增了两个与tenant=all类似的命令,即(tanant=all_usertenant=all_meta),且实现上没有新增开销大的操作,因此不会增加额外的运行负担,对数据库性能无影响。

3 使用说明及特性限制

  • 仅支持在sys租户下使用tenant=systenant=all_usertenant=all_meta
  • 对配置项修改语法和合并转储语法,均建议再使用tenant=all
  • 如果只想对sys租户生效,使用tenant=sys;如果只想对所有的用户租户生效,使用tenant=all_user;如果只想对所有的meta租户生效,使用tenant=all_meta
  • 如果确实想对所有的租户生效,则需依次使用tenant=systenant=all_usertenant=all_meta
  • 对于配置项设置语法,tenant后不支持list形式;对于合并转储语法,all_user和all_meta只能单独使用,其它名称可以组合成list形式使用。
  • sys不能大写,因为sys是租户名,是区分大小写的。而all_user和all_meta是关键字,不区分大小写。

# 配置项设置示例
# 以下三句实现原有all语义
alter system set ob_compaction_schedule_interval = '10s' tenant = sys; # sys不能大写
alter system set ob_compaction_schedule_interval = '10s' tenant = all_user;
alter system set ob_compaction_schedule_interval = '10s' tenant = all_meta;# 以下示例不可以,tenant后只能是单个名称,不能是list
obclient> alter system set ob_compaction_schedule_interval = '10s' tenant = mysql,sys;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near 'sys' at line 1obclient> alter system set ob_compaction_schedule_interval = '10s' tenant = all_user,all_meta;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near 'all_meta' at line 1obclient> alter system set ob_compaction_schedule_interval = '10s' tenant = mysql,all_user;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near 'all_user' at line 1obclient> alter system set ob_compaction_schedule_interval = '10s' tenant = mysql,all_meta;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near 'all_meta' at line 1# 合并转储示例
# 以下三句实现原有all语义
alter system major freeze tenant = sys; # sys不能大写
alter system major freeze tenant = all_user;
alter system major freeze tenant = all_meta;# 以下示例不可以,all_user/all_meta只能单独使用
obclient> alter system major freeze tenant = all_user,all_meta;
ERROR 1235 (0A000): all/all_user/all_meta in combination with other names is not supportedobclient> alter system major freeze tenant = mysql,all_user;
ERROR 1235 (0A000): all/all_user/all_meta in combination with other names is not supportedobclient> alter system major freeze tenant = mysql,all_meta;
ERROR 1235 (0A000): all/all_user/all_meta in combination with other names is not supported# 以下示例是可以的,all_user/all_meta外的名称可以组合使用
alter system major freeze tenant = tt1,sys;

在使用该特性的过程中,存在一些限制。

第一,不能再创建名为all_user或者all_meta(不区分大小写)的租户,因为all_user和all_meta变成保留字了。

第二,低版本升级4.2.1版本前,需要先检查集群中是否有名为all_user或者all_meta(不区分大小写)的租户,如有,需要先重命名租户再升级。

第三,因为没有实际风险,故以下语法中tenant=all语义暂未变更,且暂无计划在未来版本做变更,会维持原有语义不变,且不支持tenant=all_usertenant=all_meta

# 升级相关命令,不显示指定TENANT,或指定TENANT = ALL,都会对所有租户生效,无风险
ALTER SYSTEM RUN UPGRADE JOB "CMD" [TENANT = ALL|tenant_list];
# 这里TENANT = ALL只包含用户租户,sys租户和meta租户没有对应功能
ALTER SYSTEM ARCHIVELOG|NOARCHIVELOG TENANT = ALL;

相关文章:

  • Java Web学习笔记4——HTML、CSS
  • PyTorch 的 torch.nn 模块学习
  • 正则表达式----IP地址合法性判断
  • 啵啵啵啵啵啵啵啵啵啵啵啵啵啵啵
  • Java面试——中间件
  • 嵌入式Linux系统编程 — 2.1 标准I/O库简介
  • cs与msf权限传递
  • 最大矩形问题
  • 如何给 MySQL 表和列授予权限?(官方版)
  • HBuilderX编写APP一、获取token
  • Polar Web【简单】upload1
  • 【Meetup】探索Apache SeaTunnel的二次开发与实战案例
  • 数据结构初阶 堆(一)
  • PostgreSQL的视图pg_class
  • 【STM32】STM32F103C6T6标准外设库
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • js 实现textarea输入字数提示
  • leetcode-27. Remove Element
  • php中curl和soap方式请求服务超时问题
  • react 代码优化(一) ——事件处理
  • Redux系列x:源码分析
  • zookeeper系列(七)实战分布式命名服务
  • 大数据与云计算学习:数据分析(二)
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 类orAPI - 收藏集 - 掘金
  • 前端性能优化——回流与重绘
  • 使用common-codec进行md5加密
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 我从编程教室毕业
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 译米田引理
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​如何防止网络攻击?
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (145)光线追踪距离场柔和阴影
  • (4.10~4.16)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (MATLAB)第五章-矩阵运算
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (SpringBoot)第二章:Spring创建和使用
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (一)Thymeleaf用法——Thymeleaf简介
  • (一)基于IDEA的JAVA基础10
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • .form文件_SSM框架文件上传篇
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET中统一的存储过程调用方法(收藏)