[转帖]OceanBase 中租户管理
https://zhuanlan.zhihu.com/p/464504887
概述
租户的概念类似于传统数据库的数据库实例。租户也叫实例,拥有一定的资源能力(如CPU、内存和空间)。租户下可以建立数据库,在租户的数据库下可以建立表。
支持租户级别的转储、租户级别的分区主切换和租户级别的扩容缩容。
资源
资源指的是 CPU、内存和磁盘空间。在OceanBase集群中,进程 observer 取得的资源中 CPU 个数是声明式的,内存资源是独占的,磁盘空间是独占的(预分配)。
可以通过下面的参数去设置资源的使用
OceanBase 的租户资源定义是包含 CPU、内存、空间、IOPS 和会话数,目前产品只实现了 CPU 和 内存的资源隔离,空间、IOPS 和会话数不起作用。
支持两种类型租户
- MySQL 租户
- Oracle 租户
OceanBase 集群初始内置了一个系统租户 sys, 可以用来管理 OceanBase 集群。
新建租户
只有用 root 用户连接到 sys 租户(root@sys)才能执行 CREATE TENANT 命令去创建租户。创建新租户后,可以指定创建租户的类型和白名单。
语法
CREATE TENANT [IF NOT EXISTS] tenantname
     [tenant_characteristic_list] [opt_set_sys_var]
tenant_characteristic_list:
tenant_characteristic [, tenant_characteristic...]
tenant_characteristic:
COMMENT 'string'
|{CHARACTER SET | CHARSET} [=] charsetname
|COLLATE [=]  collationname
|REPLICA_NUM [=] num
|ZONE_LIST [=] (zone [, zone…])
|PRIMARY_ZONE [=] zone
|DEFAULT TABLEGROUP [=] {NULL | tablegroup}
|RESOURCE_POOL_LIST [=](poolname [, poolname…])
|LOGONLY_REPLICA_NUM [=] num
|LOCALITY [=] 'locality description'
opt_set_sys_var:
{ SET | SET VARIABLES | VARIABLES } system_var_name = expr [,system_var_name = expr] ...
说明
- 如果要创建的租户名已存在,并且没有指定 IF NOT EXISTS,则会出现错误。
- 租户名的合法性和变量名一致,最长 30 个字符,字符只能是大小写英文字母、数字和下划线,而且必须以字母或下划线开头,并且不能是 OceanBase 数据库的关键字。
- 在租户下可以指定资源池。
- RESOURCE_POOL_LIST为创建租户时的必填项。
- CREATE TENANT命令中的- RESOURCE_POOL_LIST中,暂时仅支持一个资源池。
示例
配置说明
- primary_zone指该租户的表的分区 Leader 所在的 Zone ,例如,- primary_zone ='zone1; zone2, zone3'表示该租户的表的分区 Leader 在- zone1上, 这时通过分号来分隔。
- zone2和- zone3通过逗号分割,表示- zone2和- zone3是同一优先级,但是比- zone1优先级低。
- primary_zone设置时,其值可以为- RANDOM(必须大写),表示随机选择最高优先级内的任一一个 Zone 作为 Primary Zone。
创建 mysql 租户
创建名为
test_tenant的一个 3 副本的 MySQL 租户(创建新租户默认是 MySQL 租户)
CREATE TENANT IF NOT EXISTS test_tenant charset='utf8mb4', replica_num=3, zone_list=('zone1','zone2','zone3'), primary_zone='zone1;zone2,zone3', resource_pool_list=('pool1');
-- 设置远程访问客户端
ALTER TENANT test_tenant SET VARIABLES ob_tcp_invited_nodes='%';
创建 oracle 租户
创建名为
test_tenant的一个 3 副本 Oracle 租户。通过参数ob_compatibility_mode设置租户模式,并且必须使用 OBClient 或 ODC 连接 Oracle 租户进行创建。
CREATE TENANT IF NOT EXISTS test_tenant charset='utf8mb4', replica_num=3, zone_list=('zone1','zone2','zone3'), primary_zone='zone1;zone2,zone3', resource_pool_list=('pool1') SET ob_compatibility_mode='oracle';
创建可从远程客户端IP地址访问 OceanBase 数据库的租户
创建租户后,直接通过修改变量 ob_tcp_invited_nodes 的值为 % 以便允许任何客户端 IP 连接该租户。如果不调整 ob_tcp_invited_nodes 的值,则默认租户的连接方式为只允许本机的 IP 连接数据库。
CREATE TENANT IF NOT EXISTS test_tenant charset='utf8mb4', replica_num=3, zone_list=('zone1','zone2','zone3'), primary_zone='zone1;zone2,zone3', resource_pool_list=('pool1') SET ob_tcp_invited_nodes='%';
注意事项
普通租户的内存最小规格必须大于等于 5 GB,否则创建租户失败。如果希望建立租户进行非常简单的功能测试,可以修改参数 alter system __min_full_resource_pool_memory 的值为 1073741824 来允许以最小 1 GB 内存的规格创建租户。
alter system __min_full_resource_pool_memory=1073741824;
查看租户信息
在 OBClient 中使用 sys 租户登录集群
查看当前集群的租户信息
SELECT * FROM oceanbase.gv$tenant;
 
查看当前租户
SHOW TENANT;
查看租户白名单
系统变量 ob_tcp_invited_nodes 用于设置租户的 IP 白名单,是租户全局的白名单限制参数。默认值为 127.0.0.1,::1,表示仅允许本机的 IP 连接该租户。
查看该变量确认白名单设置
SHOW VARIABLES LIKE 'ob_tcp_invited_nodes';
值为 %,表示允许任何客户端 IP 连接该租户
系统变量配置规则
ob_tcp_invited_nodes 用于设置租户的 IP 白名单,支持百分号(%) 、短横线(_) 和 IP(多个 IP 之间用逗号分隔),支持 IP 列表匹配、掩码匹配和模糊匹配。
租户会话管理
查看租户会话
-- 查看租户当前会话
SHOW PROCESSLIST;
 
终止租户会话
KILL session_id;
-- 或者
KILL CONNECTION session_id;
修改租户
可以通过 SQL 语句修改租户的信息,包括修改租户名、副本数、Zone 列表、主 Zone 以及系统变量值等。
语法
ALTER TENANT {tenant_name | ALL}
    [SET] [tenant_option_list] [opt_global_sys_vars_set]
tenant_option_list:
    tenant_option [, tenant_option ...]
tenant_option:
            COMMENT [=]'string'
            |{CHARACTER SET | CHARSET} [=] charsetname
            |COLLATE [=]  collationname
            |REPLICA_NUM [=] num
            |ZONE_LIST [=] (zone [, zone…])
            |PRIMARY_ZONE [=] zone
            |RESOURCE_POOL_LIST [=](poolname [, poolname…])
            |DEFAULT TABLEGROUP [=] {NULL | tablegroupname}
            |{READ ONLY | READ WRITE}
      |LOGONLY_REPLICA_NUM [=] num
      |LOCALITY [=] 'locality description'
      |LOCK|UNLOCK;
opt_global_sys_vars_set:
      VARIABLES system_var_name = expr [,system_var_name = expr] ...
锁定租户
租户被锁定后,不能在该租户上创建新的连接,已有的链接保持不变。
语法
ALTER TENANT tenant_name LOCK;
删除租户
删除租户后,租户下的数据库和表也同时被删除。但是租户使用的资源配置不会被删除。资源配置可以继续给其他租户使用。
对于主备库配置场景,仅支持在主集群上删除租户,不支持在备集群上执行租户删除操作。
语法
DROP TENANT tenant_name [FORCE]
-- 或者
DROP TENANT tenant_name PURGE;
说明
- 对于 DROP TENANT操作:
- 当租户开启回收站功能时,DROP TENANT操作表示删除的租户会进入回收站。租户实际占用的空间并没有释放,只是不能再向该租户建立新的连接。对于回收站中的租户,后续您可以通过租户级回收站功能进一步删除或恢复该租户
- 执行 FLASHBACK时,可以使用租户原始的名称,也可以使用回收站中的名称,回收站中的名称全局唯一,因此使用回收站中的名称,可以明确恢复的是哪个租户。当多个租户存在相同的原始名称时,此时恢复的租户是这些租户中最后进入回收站中的租户。
-- 查看回收站中租户信息
SHOW RECYCLEBIN;
--将系统租户回收站中的 tenant_name 闪回为正常租户
FLASHBACK TENANT <tenant_name> TO BEFORE DROP;
- 执行 PURGE TENANT时,同样可以使用原始名称和回收站中的名称。与FLASHBACK不同,PURGE TENANT时,如果多个原始名称相同,则删除的是最早进入回收站中的租户。
-- 将租户 tenant_name 从回收站中彻底清除
PURGE TENANT tenant_name;
-- 将回收站中的全部对象全部彻底清除
PURGE RECYCLEBIN;
- 当租户关闭回收站功能时,DROP TENANT操作表示延迟删除租户,后台线程会进行 GC(Garbage Collection)动作,租户的信息仍然可以通过内部表查询。租户具体延迟删除的时间由配置项schema_history_expire_time控制,默认为 7 天
- DROP TENANT PURGE操作表示仅延迟删除租户,且无论回收站功能是否开启,删除的租户均不进入回收站。
- FORCE参数表示无论回收站功能是否开启,均可以立刻删除租户。
示例
延迟删除租户 t1,删除的租户可进入回收站
 DROP TENANT t1;
延迟删除租户 t1,删除的租户不进入回收站
DROP TENANT t1 PURGE;
立刻删除租户 t1
DROP TENANT t1 FORCE;
管理变量
分类
租户的变量分为 Global 级别和 Session 级别。
- Session 级别的变量继承自 Global 级别的变量。同时,Session 建立后可以设定 Session 级别的变量。Session 级别的变量在 Session 中覆盖 Global 级别的变量。
查看变量
查询 Session/Global 级别变量语句的语法
SHOW [GLOBAL] VARIABLES [SHOW_VARIABLES_OPTS]
SHOW_VARIABLES_OPTS:
[LIKE 'pattern' | WHERE expr]
示例
SHOW VARIABLES LIKE 'ob_query_timeout';
SHOW GLOBAL VARIABLES WHERE variable_name LIKE 'ob_query_timeout';
 
sys 租户可以通过内部表 __all_virtual_sys_variable查询其他所有普通租户的 Global 变量。
select * from __all_virtual_sys_variable;

如果连接 sys 租户后再切换到普通租户,此时查询的 Session 级别变量仍然是 sys 租户的 Session 级别的变量。查询的 Global 级别的变量是切换后普通租户的 Global 级别变量。
设置变量
设置 Session 级别的变量仅对当前 Session 有效,对其他 Session无效。设置 Global 级别的变量对当前 Session 无效,需要重新登录建立新的 Session 才会生效。
语法
SET [GLOBAL] VARIABLE_NAME = 'VALUE'
示例
SET ob_query_timeout = 20000000;
SET GLOBAL ob_query_timeout = 20000000;
说明
变量中类型为 INT, 并且在 SHOW VARIABLE命令中显示 ON/OFF或者 True/False的变量,可以通过如下任意方法设置值:
SET @@foreign_key_checks = ON;
SET @@foreign_key_checks = 1;
SET @@foreign_key;
以上三种方式的 Session 级别变量的设置是等效的。
[转帖]OceanBase 中租户管理的更多相关文章
- ABP Zero 多租户管理
		ABPZero - 多租户管理 启用多租户 ASP.NET Boilerplate和module-zero可以运行多租户或单租户模式.多租户默认为禁用.我们可以在我们的模块PreInitialize方 ... 
- 番外篇--Moddule Zero多租户管理
		番外篇--Moddule Zero多租户管理 2.1.1 关于多租户 强烈建议阅读这个文件前阅读多租户文档. 2.1.2 启用多租户 ASP.NET Boilerplate和module-zero可以 ... 
- X-Admin&ABP框架开发-租户管理
		软件即服务概念的推动,定制化到通用化的发展,用一套代码完成适应不同企业的需求,利用多租户技术可以去做到这一点.ABP里提供了多租户这一概念并且也在Zero模块中实现了这一概念. 一.多租户的概念 单部 ... 
- 初识ABP vNext(7):vue身份认证管理&租户管理
		Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 按钮级权限 身份认证管理 R/U权限 权限刷新 租户管理 租户切换 效果 最后 前言 上一篇介绍了vue+ABP国际化 ... 
- 吐槽一下Abp的用户和租户管理模块
		1. 背景 ASP.NET Core 基于声明的访问控制到底是什么鬼? 聊到基于声明的身份认证将 身份和签发机构分离,应用程序信任签发机构,故认可签发的身份信息. -- --- --- --- Cla ... 
- 深入理解Linux中内存管理
		前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看 ... 
- Git 在小团队中的管理流程(转)
		目标读者:了解 Git 的基本概念,能够使用 Git 进行基本的本地和远程操作. 有关 Git 的基础知识可以参见 知乎回答-怎样使用 GitHub?,天猪(刘勇)给出了一些很好的学习资料. 本文介绍 ... 
- SQL Server中TempDB管理(version store的逻辑结构)
		原文:SQL Server中TempDB管理(version store的逻辑结构) 原文来自: http://blogs.msdn.com/b/sqlserverstorageengine/arch ... 
- SQL Server中TempDB管理(版本存储区的一个example)
		原文:SQL Server中TempDB管理(版本存储区的一个example) 原文来自: http://blogs.msdn.com/b/sqlserverstorageengine/archive ... 
- 【转】Linux中包管理与定时任务
		[转]Linux中包管理与定时任务 第1章 软件查询 1.1 查询软件是否安装 rpm -qa |grep cron 查询是否安装了这个软件. [root@znix ~]# rpm -qa |grep ... 
随机推荐
- 玩转Python:处理音频文件,两个非常重要的库,很实用,附代码
			pyaudio和sounddevice都是用于Python中音频处理和流的库,允许用户通过他们的API录制.播放和处理音频数据.下面是对这两个库的简要介绍: PyAudio PyAudio 提供了 P ... 
- 提取 PE文件 / 目标程序 的各种信息
			前段时间项目需要实现对 Windows PE 文件版本信息的提取,如文件说明.文件版本.产品名称.版权.原始文件名等信息.获取这些信息在 Windows 下当然有一系列的 API 函数供调用,简单方便 ... 
- 开源云原生网关Linux Traefik本地部署结合内网穿透远程访问
			开源云原生网关Linux Traefik本地部署结合内网穿透远程访问 前言 Træfɪk 是一个云原生的新型的 HTTP 反向代理.负载均衡软件,能轻易的部署微服务.它支持多种后端 (Docker ... 
- 文心一言 VS 讯飞星火 VS chatgpt (37)-- 算法导论5.4 1题
			一.一个屋子里必须要有多少人,才能让某人和你生日相同的概率至少为1/2? 必须要有多少人,才能让至少两个人生日为 7月 4 日的概率大于 1/2? 文心一言: 一个屋子里必须要有多少人,才能让某人和你 ... 
- 华为云GaussDB圈层活动走进香港,以技术创新构筑金融政企数智发展基石
			摘要:近日,华为云GaussDB圈层活动在中国·香港如期举办,活动聚集了22家香港金融政企客户和合作伙伴. 本文分享自华为云社区<华为云GaussDB圈层活动走进香港,赋能金融政企数字化转型&g ... 
- 带你了解TensorFlow pb模型常用处理方法
			摘要:TensorFlow 模型训练完成后,通常会通过frozen过程保存一个最终的pb模型. 本文分享自华为云社区<TensorFlow pb模型修改和优化>,作者:luchangli. ... 
- Java的这个强大功能,很多人都不知道
			摘要:大多数框架采用单一的语言所开发.JNI这项Java中提供的强大功能,却逐渐的被人遗忘了. 本文分享自华为云社区<Java中一个逐渐被遗忘的强大功能,强到你难以置信!!>,作者:冰 河 ... 
- Flutter加固原理及加密处理
			 引言 为了保护Flutter应用免受潜在的漏洞和攻击威胁,加固是必不可少的措施之一.Flutter加固原理主要包括代码混淆.数据加密.安全存储.反调试与反分析.动态加载和安全通信等多个方面.通过综 ... 
- DataLeap的全链路智能监控报警实践(二):概念介绍
			更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 概念介绍 基线监控 根据监控规则和任务运行情况,DataLeap的基线监控能够决策是否报警.何时报警.如何报警以及 ... 
- 1个案例读懂——游戏产品如何用 A/B 测试做增长
			更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 随着国内游戏用户数量趋于饱和,中国游戏产业也从高速成长期逐渐转型,市场成熟度提升,竞争趋于精细化. 随着游戏出海以 ... 
