OceanBase 配置文件、集群资源租户管理

一、基础管理

OceanBase v3.1.1 官方详细说明书:
https://www.bookstack.cn/read/OceanBase-3.1.1-zh/bc66c60a4672fd61.md
OceanBase v3.1.2 官方详细说明书:
https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.2/what-is-oceanbase

1.配置文件详解

# 集群配置文件位置在安装目录下:
.obd/cluster/集群名称/config.yaml
## 集群节点之间远程登录密码(需要配置秘钥互通)
user:
  username: oceanbase
  password: oceanbase.2021
  # key_file: your ssh-key file path if need 
  # port: your ssh port, default 22 
  # timeout: ssh 连接超时, default 30s
oceanbase-ce:
  servers:
  - name: server1
  # 请不要使用主机名,只能支持IP
    ip: 192.168.99.77
  - name: server2
    ip: 192.168.99.115
  - name: server3
    ip: 192.168.99.158
  global:
    # 请将devname设置为ip处于服务器设置中的网络适配器的名称
    # 如果将服务器设置为“127.0.0.1”,请将devname设置为“lo”
    # 如果当前ip为192.168.1.10,且ip的网络适配器名称为“eth0”,请使用“eth0”
    devname: enp1s0
    cluster_id: 1
    # 请将内存限制设置为与资源匹配的适当值
    memory_limit: 8G # 最大运行内存
    system_memory: 4G # 保留的系统内存。系统内存是为sys租户保留的。默认值为30G
    stack_size: 512K  # 程序函数调用栈的大小
    cpu_count: 16     # 系统CPU总数。如果设置为0,系统将自动检测CPU数量
    cache_wash_threshold: 1G #用于设置触发缓存清理的容量阈值。如果内存空间小于指定值时,内存空间将被清理。
    __min_full_resource_pool_memory: 268435456 # 最小全资源池内存
    workers_per_cpu_quota: 10   # 分配给每个CPU配额的工作线程数量
    schema_history_expire_time: 1d # 元数据历史数据过期时间。   
    net_thread_count: 4   # 净线程数,净线程数的值最好与cpu的核心数相同
    major_freeze_duty_time: Disable  # 每日定时冻结和合并的触发时刻
    minor_freeze_times: 10  # minor_freeze_times 配置项与 major_compact_trigger 配置项具有相同功能。用于设置多少次小合并触发一次全局合并。值为0时,表示关闭小合并。
    enable_separate_sys_clog: 0  # 是否把系统事务日志与用户事务日志分开存储。
    enable_merge_by_turn: false  # 是否开启轮转合并策略。
    datafile_disk_percentage: 20 # 数据空间占磁盘总空间的百分比。此值仅在数据文件大小为0时生效。默认值为90(90%)
    syslog_level: INFO # 系统日志级别。默认值是INFO
    enable_syslog_wf: false # 将级别高于警告的系统日志打印到单独的日志文件中。默认值为true
    enable_syslog_recycle: true # 是否启用自动系统日志回收。默认值为false
    max_syslog_file_count: 4 # 启用自动回收之前保留日志文件的最大数量。默认值为0,每个日志文件最多可以占用 256 MB 的磁盘空间。 当该配置项的值为0时,不会删除任何日志文件
    # 集群名称同obproxy的集群名称
    appname: obcluster
    # root用户密码,可以为空
    # proxyro用户密码与obproxy的observer_sys_password密码一致,可以为空
  server1:
    mysql_port: 2881 # 数据库的外部端口。默认2881。启动群集后,请勿更改此值
    rpc_port: 2882   # 内部端口。默认2882。启动群集后,请勿更改此值。
    home_path: /usr/local/observer
    # OceanBase数据库的工作目录。在此目录下启动。这是必填字段。
    # 用于数据存储的目录。默认值为 $home_path/store
    data_dir: /data  # clog、ilog和slog的目录。默认值与数据目录相同
    # redo_dir: /redo 
    zone: zone1    
    syslog_level: INFO
    enable_syslog_recycle: true
    enable_syslog_wf: true  # 是否把WARN以上级别的系统日志打印到一个单独的日志文件中
    max_syslog_file_count: 4
    system_memory: 4G
    cpu_count: 16
    datafile_size: 107G   # 数据文件的大小,一般不需要设置
    clog_disk_utilization_threshold: 95 # 控制clog或ilog磁盘空间复用的水位值
    clog_disk_usage_limit_percentage: 98 # 事务日志的磁盘 I/O 最大使用百分比
----------------------zone2 略
server2:
    ...
    zone: zone2
    ...
----------------------zone3 略
server3:
    ...
    zone: zone3
    ...
obproxy:
# 为组件设置从属组件。
# 当相关配置未完成时,OBD将自动从相关部件获取这些配置的信息。
  depends:
  - oceanbase-ce
  servers:
  - 192.168.99.77
  global:
    listen_port: 2883 # 外部端口默认为2883.
    prometheus_listen_port: 2884 # 普罗米修斯监控端口2884
    home_path: /usr/local/obproxy
    # Oceanbase根服务器列表
    # 格式如下: 
    # ip:mysql_port;              
    # ip:mysql_port. 
    # 当存在依赖项时,OBD从依赖项的oceanbase ce获取该值。
    # rs_list: 192.168.1.2:2881;192.168.1.3:2881;192.168.1.4:2881
    enable_cluster_checkout: false
    # observer群集名称,与oceanbase-ce的appname一致。当存在依赖项时,OBD从依赖项的oceanbase-ce获取该值。
    # cluster_name: obcluster
    skip_proxy_sys_private_check: true # 跳过个人代理检验
# obproxy_sys用户密码,可以为空。当存在依赖项时,OBD从依赖项的oceanbase ce获取该值。
# observer_sys_password用户密码与oceanbase-ce的proxyro_密码一致,可以为空。当存在依赖项时,OBD从依赖项的oceanbase ce获取该值。
auto_create_tenant: true   # 自动创建租户

2.集群管理

0) 常用命令

# obd cluster [命令] [集群名]
autodeploy     Deploy a cluster automatically by using a simple configuration file.
deploy         Deploy a cluster by using the current deploy configuration or a deploy yaml file.
destroy        Destroy a deployed cluster.
display        Display the information for a cluster.
edit-config    Edit the configuration file for a specific deployment.
list           List all the deployments.
redeploy       Redeploy a started cluster.
reload         Reload a started cluster.
restart        Restart a started cluster.
start          Start a deployed cluster.
stop           Stop a started cluster.
tenant         Create or drop a tenant.
upgrade        Upgrade a cluster.

# 例如:
obd cluster list
obd cluster restart test
obd cluster edit-config test

1)集群扩容

借助 OBD 把 1-1-1 的集群扩容成 2-2-2 的集群

1. 连接 OceanBase 数据库
obclient -h 127.0.1 -uroot@sys -P2888 -A -c

2. 查看机器列表
use oceanbase;
select svr_ip,id,zone,status from __all_server;
--通过此命令返回结果,您可以看到此时有 3 台机器。

3. 写一份新的配置文件amber2.yaml,使用 OBD 进行部署
obd cluster deploy amber2 -c amber2.yaml
--说明--
这里的 `amber2` 是部署配置名称,并不固定.

4. 把新的配置文件复制一份到原本配置文件中
- 1) 查看配置路径
obd cluster list

- 2) 打开原本配置文件,将新配置文件的内容复制到原本配置文件中
vim .obd/cluster/amber/config.yaml
--新配置文件的内容需放在原本配置文件对应内容之后。

5. 再次启动集群
obd cluster start amber

6. 重新连接 OceanBase,添加新的进程
ALTER SYSTEM ADD SERVER 'server_ip:port_num' ZONE 'zone1';
ALTER SYSTEM ADD SERVER 'server_ip:port_num' ZONE 'zone2';
ALTER SYSTEM ADD SERVER 'server_ip:port_num' ZONE 'zone3';

7. 查看扩容结果
select svr_ip,id,zone,status from __all_server;
--返回结果中可以看到每个 ZONE 都有两个进程,则表示扩容成功。

8. 创建一个资源池 pool1(unit1)
obclient> CREATE RESOURCE POOL pool1 unit='unit1',unit_num=1, zone_list=('zone1','zone2','zone3');

9. 创建一个普通租户 amber_babe
obd cluster tenant create -n amber_babe
ALTER TENANT amber_babe SET VARIABLES ob_tcp_invited_nodes='%';

10. 查看租户是否创建成功
SELECT * FROM oceanbase.gv$tenant;

11. 为业务租户 amber_babe 扩容
# 执行此命令,添加 UNIT 数量
MySQL [oceanbase]> alter resource pool amber_babe_pool unit_num=2;
Query OK, 0 rows affected (0.146 sec)

2)查看集群信息

查看集群

MySQL [oceanbase]> USE oceanbase; 
MySQL [oceanbase]> SELECT * FROM __all_server;

查看租户
系统租户和普通租户查询集群参数的语句如下所示:

  • 系统租户查询集群参数的语法
    SHOW PARAMETERS [SHOW_PARAM_OPTS] [tenant='tenant'];
    
  • 普通租户查询集群参数的语法
    SHOW PARAMETERS [SHOW_PARAM_OPTS]
    

其中各参数的含义如下:

  • [SHOW_PARAM_OPTS] :值可指定为 [LIKE 'pattern' | WHERE expr]
  • [tenant='tenant'] :系统租户查看集群参数时需指定租户名。

  • SHOW PARAMETERS 返回结果中的列属性如下表所示。

列名 含义
zone 所在的 Zone。
svr_ip 机器 IP。
svr_port 机器的端口。
name 配置项名。
data_type 配置项的数据类型,包括 NUMBERSTRINGCAPACITY 等。
value 配置项的值。
info 配置项的说明信息,
section 配置项所属的分类。
scope 配置项范围属性:TENANT:租户级别CLUSTER:集群级别
source 当前值来源:TENANT``CLUSTER``CMDLINE``OBADMIN``FILE``DEFAULT
edit_level 定义该配置项的修改行为:READONLY:表示该参数不可修改。STATIC_EFFECTIVE:表示该参数可修改但需要重启 OBServer 才会⽣效。DYNAMIC_EFFECTIVE:表示该参数可修改且修改后动态⽣效。

示例:

SHOW PARAMETERS LIKE 'sql_work_area'  --查看租户集群
SHOW PARAMETERS WHERE edit_level='static_effective' AND NAME='sql_work_area'  
SHOW TENANT;   --查看租户
SELECT * FROM oceanbase.gv$tenant;

3)修改租户集群参数

集群参数即配置项,修改配置项的语法如下所示,同时修改多个系统配置项时,请用逗号(,)分隔。

 ALTER SYSTEM SET param_name = expr
      [COMMENT 'text']
      [PARAM_OPTS]
      [TENANT = 'tenantname']

PARAM_OPTS:
[ZONE='zone' | SERVER='server_ip:rpc_port']

参数修改语句说明如下(集群级别与租户级别的配置项设置会有所不同):

  • PARAM_OPTS 是修改配置项时所指定的其它限定条件,例如,指定 Zone、指定 Server 等。
  • ALTER SYSTEM 语句不能同时指定 Zone 和 Server。并且在指定 Zone 时,仅支持指定一个 Zone;指定 Server 时,仅支持指定一个 Server。
  • 集群级别的配置项(Scope) 不能通过普通租户设置,也不可以通过 sys 租户指定普通租户来设置。例如,ALTER SYSTEM SET memory_limit='100G' TENANT='test_tenant' 将导致报错,因为 memory_limit 是集群级别(Scope)的配置项。

示例如下:

ALTER SYSTEM SET mysql_port=8888;
ALTER SYSTEM SET mysql_port=8888 ZONE='z1';
ALTER SYSTEM SET mysql_port=8888 SERVER='192.168.100.1:2882';

3.Zone管理

一个 OceanBase 集群,由若干个 Zone 组成。Zone 是可用区(Availability Zone)的简写。Zone 本身是一个逻辑概念,是对物理机进行管理的容器,一般是同一机房的一组机器的组合。

OceanBase 集群通常会分布在同城的3个机房中,同一份数据的三个副本分别分布在3个机房中(即三个 Zone 中)。

增加或删除 Zone

  • 在集群中增加或删除 Zone 的操作通常用于集群扩容或缩容等需求场景。
    增加或删除 Zone 的 SQL 语句如下:
    ALTER SYSTEM {ADD|DELETE} ZONE zone_name;
    
    --其中,参数 `zone_name` 为目标Zone的名称
    --在删除 Zone 前,需要保证该 Zone 下已不存在 OBServer,否则可能会导致删除失败。
    

示例:

  • 在集群中新增一个名为 zone1 的 Zone。
    obclient> ALTER SYSTEM ADD ZONE zone1;
    
  • 在集群中删除名为 zone1 的 Zone。
    obclient> ALTER SYSTEM DELETE ZONE zone1;
    

4.OBserver管理

OceanBase Server(简称 OBServer) 是一个 OceanBase 数据库的节点(节点不完全等同于物理机器)。 observer 是节点上运行的分布式数据库内核进程的名字。

每一个observer 由 IP 和端口作为唯一标识(默认2881/2882一组内外端口)。通常一台物理服务器运行一个 observer 进程,负责几乎所有数据库内核功能。

1)启动 observer 进程

登录 OBServer 所在的宿主机,通过命令行工具进入 `/home/admin/oceanbase/bin` 目录,运行下述命令启动 observer 进程:

cd /home/admin/oceanbase/
./bin/observer [启动参数]

# 同时,可以运行 `./bin/observer --help` 查看 observer 启动参数的详细信息。
## 启动observer进程的命令:
cd /home/admin/oceanbase/bin

./observer -p 2881 -P 2882 -z 'zone_1' -d '/data/1/prod_data/' -r '192.168.1.1:2882:2881;192.168.1.2:2882:2881;192.168.1.3:2882:2881' -l WARN -d '/data/1/prod_data' -o 'memory_limit=100GB,datafile_disk_percentage=85'

## 其中:
- `2881`:表示 MySQL 的访问端口。
- `2882`:表示远程访问端口。
- `zone_1`:表示 Zone 名称。
- `/data/1/prod_data`:表示数据盘目录。
- `datafile_disk_percentage=85`:表示数据盘的占用比率为 85%。
- `192.168.1.1和``192.168.1.2` 和 `192.168.1.3`:表示 rs_list。
- `memory_limit=100GB`:表示进程启动内存上限为 100 GB。
- `WARN`:表示 log_level 为 WARNING 级别。
- 使用 `-o` 参数时,需满足以下条件:
  - 不分大小写,但是推荐按照 `observer.config.bin` 中的变量名称来写。
  - 参数不能包含以下特殊字符:
    - 空格
    - \r
    - \n
    - \t
  - 参数名和参数值中间必须有等号(=)。
  - 参数之间使用逗号(,)进行分割。

2)查看 observer 进程

# 登录 OBServer 所在的宿主机。
在命令行工具中运行以下任一语句以查看 observer 进程。
ps -ef |grep observer
netstat -lntup

3)停止 observer 进程

OBServer 的 stopped 状态并非等价于进程退出,进程可能仍然在运行,仅仅是集群的状态标志认为该节点为 stopped 状态。
系统将内部标记 Server 为 stopped 状态,客户端请求不会再次发送到该 Server,该 Server 也不会再对外提供服务。

> ALTER SYSTEM STOP SERVER 'ip:port' [,'ip:port'…] [ZONE='zone']
  • Stop Server 操作执行过程中,系统会检查停止 OBServer 后的副本数是否满足多数派、等待 Clog 日志同步完成,并等待 Leader 副本切换到其他节点(即 Leader 改选)。

  • Stop Server 操作的使用限制如下:

- 不能跨 Zone 执行 Stop Server 操作,同一个 Zone 可以同时 Stop 多个 Server。
- 一个 Stop 操作发起没有结束前,不能发起第二个操作。
- `enable_auto_leader_switch` 参数必须设置为开启。
- 分区副本满足多数派。
- 如果分区数多,或者被 Stop Server 的节点分区的 Leader 数量多, Stop Server 操作时间会比较长,如果超时,可以加大 SQL 超时时间。
- 如果命令很快失败,那么可能是日志不同步,可以检查 `__all_rootservice_event_history` 确认是否有 Stop Server 动作。
- Stop Server 后该 Server 的状态仍为 `Active` ,但 `stop_service_time` 的值由 `0` 变为 Stop Server 的时间点。
--示例:
lient> ALTER SYSTEM STOP SERVER "10.10.10.1:2882" zone='z1'; 

4)Add/Delete Server

  • **Add Server ** 操作目的是添加节点到集群,是扩容的操作。被添加的新节点要求是空的,即 CLog 和 ILog 目录下为空。Add Server 操作的命令如下所示:
ALTER SYSTEM ADD SERVER 'ip:port' [,'ip:port'…] [ZONE [=] 'zone']

--示例语句如下所示:
obclient> ALTER SYSTEM ADD SERVER "10.10.10.1:2882" zone='z1'
  • **Delete Server ** 用于从集群中删除节点。Delete Server 操作的命令如下所示:
ALTER SYSTEM DELETE SERVER 'ip:port' [,'ip:port'…] [ZONE [=] 'zone']

--示例语句如下所示:
obclient> ALTER SYSTEM DELETE SERVER "192.168.100.1:2882" zone='z1'
  • Cancel Delete Server 操作
    Delete Server 的动作会涉及到负载均衡。被删除的 Server 上的资源单元会在同一个 Zone 中进行资源单元(Unit)迁移。Unit 的迁移动作是 Unit 自动均衡过程由 RootService 控制。Unit 均衡过程中可能发生资源不足,其他同 Zone 的机器资源不足容纳这个新迁移的 Unit。这样将导致 Unit 迁移失败,通过 /home/admin/oceanbase/log/rootservice.log 可以看到迁移 Unit 失败的错误代码 -4624。如果希望取消 Delete Server 动作,可以通过 Cancel Delete Server 操作实现。 Cancel Delete Server 操作的命令如下所示:
ALTER SYSTEM CANCEL DELETE SERVER 'ip:port' [,'ip:port'…] [ZONE [=] 'zone']

--示例语句如下所示:
obclient> ALTER SYSTEM CANCEL DELETE SERVER "10.10.10.1:2882" zone='z1'
  • 操作限制说明
# 对节点执行操作时:
- 不能跨 Zone 执行 Stop Server 操作,同一个 Zone 可以同时 Stop 多个 Server。
- 一个 Stop 操作发起没有结束前,不能发起第二个操作。
- `enable_auto_leader_switch`参数必须设置为开启。
- 分区副本满足多数派。
- 如果分区数多,或者被 Stop Server 的节点分区的 Leader 数量多, Alter System Stop Server 操作时间会比较长,如果超时,可以加大 SQL 超时时间。
- 如果命令很快失败,那么可能是日志不同步。
- 检查 `__all_rootservice_event_history`可以确认是否有 Stop Server 动作。
- Stop Server 后该 Server 的状态仍为 `Active` ,但 `stop_service_time`的值由 0 变为 Stop Server 的时间点。


二、资源管理

资源池包含了资源单元,而资源单元则规定了具体资源的量化(如 CPU、Memory、Disk_Size 和 IOPS 等)。 创建租户前,必须规定租户使用的资源范围,资源池和资源单元就是为了满足租户资源隔离和负载均衡而存在的。

资源管理中的概念:

  • 资源单元(Resource Unit,Unit)
    资源单元是一个容器。副本是存储在资源单元之中的,资源单元包含了计算存储资源(Memory、CPU 和 IO 等)同时资源单元也是集群负载均衡的一个基本单位,在集群节点上下线,扩容缩容时会动态调整资源单元在节点上的分布进而达到资源的使用均衡。

  • 资源池 (Resource Pool)
    一个租户拥有若干个资源池,这些资源池的集合描述了这个租户所能使用的所有资源。一个资源池由具有相同资源规格(Unit Config)的若干个资源单元组成。一个资源池只能属于一个租户。每个资源单元描述了位于一个 Server 上的一组计算和存储资源,可以视为一个轻量级虚拟机,包括若干 CPU 资源、内存资源、磁盘资源等。一个租户在同一个 Server 上最多有一个资源单元。

  • 资源配置(Resource Config)
    资源配置是资源单元的具体配置,包含资源单元所属的资源池信息、使用资源的租户信息、资源单元的配置信息(如 CPU 核数和内存资源)等。修改资源配置可以动态调整资源单元的计算资源,进而调整对应租户的资源。

SELECT * FROM __all_virtual_server_stat --查看总资源
SELECT * FROM __all_unit_config; --查看unit

以下两条条命令少符号 " "
SELECT * FROM gvunit; --查看pool
SELECT * FROM oceanbase.gv$tenant; --查看租户  


--删除对应顺序
DROP TENANT 租户名 FORCE;
DROP RESOURCE POOL 资源池名;
DROP RESOURCE UNIT 单元名;

1.资源单元

1)新建资源单元

--创建资源单元语句的语法:
CREATE RESOURCE UNIT unitname 
    MAX_CPU [=] cpunum, 
    MAX_MEMORY [=] memsize, 
    MAX_IOPS [=] iopsnum, 
    MAX_DISK_SIZE [=] disksize, 
    MAX_SESSION_NUM [=] sessionnum, 
    [MIN_CPU [=] cpunum,]
    [MIN_MEMORY [=] memsize,] 
    [MIN_IOPS [=] iopsnum] ;

--参数说明和取值范围:
- 语法中提及的参数不能省略,必须指定 CPU、Memory、IOPS、Disk Size 和 Session Num 的大小。
- 为参数指定值时,可以采用纯数字不带引号的方式,也可以使用带单位加引号的方式(例如:`'1T'`、`'1G'`、`'1M'`、`'1K'`)。
(例如: `max_memory='10G'` 等效于 `max_memory=10737418240`)。

--说明
为参数指定值时,不建议使用纯数字带引号的方式。
- `MAX_MEMORY` 的取值范围为 [1073741824,+∞),单位为字节,即最小值为 1 G。
- `MAX_IOPS` 的取值范围为 [128,+∞)。
- `MAX_DISK_SIZE` 的取值范围为 [536870912,+∞],单位为字节,即最小值为 512 M。
- `MAX_SESSION_NUM` 的取值范围为 [64,+∞)。

创建资源单元 unit1 示例如下:

obclient> CREATE RESOURCE UNIT unit1 MAX_CPU 1, MAX_MEMORY '1G', MAX_IOPS 128,MAX_DISK_SIZE '10G', MAX_SESSION_NUM 64, MIN_CPU=1, MIN_MEMORY='1G', MIN_IOPS=128;

obclient> CREATE RESOURCE UNIT unit1 MAX_CPU 1, MAX_MEMORY 1073741824, MAX_IOPS 128, MAX_DISK_SIZE 10737418240, MAX_SESSION_NUM 64, MIN_CPU=1, MIN_MEMORY=1073741824, MIN_IOPS=128;

--创建的资源单元实际上是资源单元的模版。可以被其他多个不同的资源池使用。比如,资源单元 `unit1` 创建后,可以创建资源池 `pool1` 和 `pool2` 并且 `pool1` 和 `pool2` 均使用 `unit1` 资源单元的配置。

--实际使用中unit可以随意创建,但是配置资源池时会判断实际资源是否足够,所以实际创建需满足以上图红框内cpu总和和内存总和主要条件。max硬盘容量可以设置超限额。

2)查看配置

1. 使用 `root` 用户登录 OceanBase 数据库的 `sys` 租户。

2. 进入 `oceanbase` 数据库。
obclient> use oceanbase;

3.执行以下语句,查看资源单元的配置。
obclient> SELECT * FROM __all_unit_config;

3)修改配置

--在增加资源的过程中必须保证 OBServer 有足够的剩余资源可用于分配。可以通过内部表 `__all_virtual_server_stat` 查询节点总资源和已经分配的资源,然后通过计算可知是否可以修改资源单元。

修改资源单元的语句如下:
ALTER RESOURCE UNIT unitname 
    MAX_CPU [=] cpunum, 
    MAX_MEMORY [=] memsize, 
    MAX_IOPS [=] iopsnum, 
    MAX_DISK_SIZE [=] disksize, 
    MAX_SESSION_NUM [=] sessionnum, 
    [MIN_CPU [=] cpunum,]
    [MIN_MEMORY [=] memsize,] 
    [MIN_IOPS [=] iopsnum] ;

修改资源单元 unit1 的示例如下:

obclient> ALTER RESOURCE UNIT unit1  MAX_CPU 15, MAX_MEMORY '20G', MAX_IOPS 128,max_disk_size '100G', MAX_SESSION_NUM 64, MIN_CPU=10, MIN_MEMORY='10G', MIN_IOPS=128;

4)删除配置

--删除资源单元前必须确保当前资源单元未被使用。如果资源单元正在被使用,则需要先将资源单元从资源池中移除后再删除资源单元。

删除资源单元的示例语句如下:
obclient> DROP RESOURCE UNIT unitname;

--说明
使用 `DROP RESOURCE UNIT` 语句删除资源单元时,仅支持删除单个资源单元,不支持批量删除多个资源单元。

2.资源池

1)创建资源池

--创建资源池语句的语法如下:
CREATE RESOURCE POOL poolname 
UNIT [=] unitname,
UNIT_NUM [=] unitnum, 
ZONE_LIST [=] ('zone' [, 'zone'…]);

--其中:
- 参数 `unit_num` 表示在集群的一个 Zone 里面包含的资源单元个数。该值小于等于一个 Zone 中的 OBServer 的个数。
- 参数 `zone_list` 表示资源池的 Zone 列表,显示该资源池的资源在哪些 Zone 中被使用。

示例:

创建资源池 `pool1` 并为其指定资源配置:
obclient> CREATE RESOURCE POOL pool1 unit='unit1',unit_num=1, zone_list=('zone1','zone2','zone3');

2)查看资源池

1. 使用 `root` 用户登录 OceanBase 数据库的 `sys` 租户。
2. 进入 oceanbase 数据库。
3. 执行以下命令,查看集群中所有租户的资源分配情况。
obclient> USE oceanbase;
obclient> SELECT * FROM gv$unit;

3)修改资源池

通过修改参数 unit_num 来实现。

--修改资源池语句的语法如下:
ALTER RESOURCE POOL poolname 
    UNIT [=] unitname, 
    UNIT_NUM [=] unitnum, 
    ZONE_LIST [=] ('zone'[, 'zone' …]);

--修改说明:
- 修改资源池的命令每次仅支持修改一个参数值。
- 新创建的资源池不能更改 `zone_list`。

示例如下:

--修改资源池 `pool1` 的资源单元,修改后 `unit2` 替代 `unit1` 属于资源池`pool1`。
obclient> ALTER RESOURCE POOL pool1 unit='unit2';

--同时修改资源池的两个参数时,会报错,需要分开修改。
obclient> ALTER RESOURCE POOL pool1 unit='unit1', zone_list=('HANGZHOU_1');
ERROR 1235 (0A000): alter unit_num, resource_unit, zone_list in one cmd not supported

4)删除资源池

--删除资源池的语句:
obclient> DROP RESOURCE POOL poolname;

--已经被租户使用的资源池无法删除
查询:DROP RESOURCE POOL test_pool
错误代码: 4626
resource pool 'test_pool' has already been granted to a tenant

三、租户管理

1.新建租户

  • 通过SQL语句新建

OceanBase 数据库支持两种类型的租户: MySQL 和 Oracle。只有用 root 用户连接到 sys 租户(root@sys)才能执行 CREATE TENANT 命令去创建租户。创建新租户后,可以指定创建租户的类型和白名单。

下述展示了创建租户命令的语法:

CREATE TENANT [IF NOT EXISTS] tenantname
     [tenant_characteristic_list]
     [tenant_variables_list]
tenant_characteristic_list:
    tenant_characteristic [, tenant_characteristic...]
tenant_characteristic:
    COMMENT 'string'
    | {CHARACTER SET | CHARSET} [=] value
    | REPLICA_NUM [=] num
    | ZONE_LIST [=] (zone [, zone])
    | PRIMARY_ZONE [=] zone
    | RESOURCE_POOL_LIST [=] (poolname)
    | {READ ONLY | READ WRITE}
tenant_variables_list:
    SET sys_variables_list
    | SET VARIABLES sys_variables_list
    | VARIABLES sys_variables_list
sys_variables_list:
    sys_variables [, sys_variables...]
sys_variables:
    sys_variable_name = expr


--参数说明:
- 如果要创建的租户名已存在,并且没有指定 `IF NOT EXISTS`,则会出现错误。
- 租户名的合法性和变量名一致,最长 30 个字符,字符只能是大小写英文字母、数字和下划线,而且必须以字母或下划线开头,并且不能是 OceanBase 数据库的关键字。
- 在租户下可以指定资源池。
- `RESOURCE_POOL_LIST` 为创建租户时的必填项。
- `CREATE TENANT` 命令中的 `RESOURCE_POOL_LIST` 中,暂时仅支持一个资源池。

示例 1

下述语句展示了创建名为 test_tenant 的一个 3 副本的 MySQL 租户(创建新租户默认是 MySQL 租户)。

obclient> 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')

示例 2

下述语句展示了创建名为 test_tenant 的一个 3 副本 Oracle 租户。通过参数 ob_compatibility_mode 设置租户模式,并且必须使用 OBClient 或 ODC 连接 Oracle 租户进行创建。

obclient> 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'

示例 3

下述语句展示了创建租户后,直接通过修改变量 ob_tcp_innvited_nodes 的值为 % 以便允许任何客户端 IP 连接该租户。如果不调整,默认租户的连接方式为只允许本机的 IP 连接数据库。

obclient> 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='%'

--示例说明如下:
- `primary_zone` 指该租户的表的分区 Leader 所在的 Zone ,例如,`primary_ zone =' zone1; zone2, zone3'` 表示该租户的表的分区 Leader 在 `zone1` 上, 这时通过分号来分隔。
- `zone2` 和 `zone3` 通过逗号分割,表示 `zone2` 和 `zone3` 是同一优先级,但是比 `zone1` 优先级低。
- `primary_zone` 设置时,其值可以为 `RANDOM`(必须大写),表示随机。

普通租户的内存最小规格必须大于等于 5 GB,否则创建租户失败。如果希望建立租户进行非常简单的功能测试,可以修改参数 alter system __min_full_resource_pool_memory 的值为 1073741824 来允许以最小 1 GB 内存的规格创建租户。


# 一个资源池只能配置给一个租户,否则会报错:
错误代码: 4626
resource pool 'pool1' has already been granted to a tenant

2.查看/修改

  • 查看租户
# 通过SQL语句查看

在 OBClient 中登录集群的 sys 租户并执行以下语句,查看当前集群的租户信息。
obclient> SELECT * FROM oceanbase.gv$tenant;

普通租户还可以执行以下语句快速查看当前有哪些租户。
obclient> SHOW TENANT;


查看和终止用户对话

--查看当前租户会话
obclient> SHOW PROCESSLIST;

--通过 `KILL` 语句终止租户会话。
KILL [CONNECTION] 'session_id'

--说明
如果您拥有 `PROCESS` 权限,则您可以查看所有会话。如果您拥有 `SUPER` 权限,您可以终止所有会话和语句。否则,您只能查看和终止您自己的会话和语句。

--示例:
obclient> KILL session_id;
或者
obclient> KILL CONNECTION session_id;
  • 修改租户

  • ALTER TENANT

该语句用来修改租户信息。

  • 格式
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] ...
  • 参数解释
参数 描述
tenant_name 指定要修改的租户名。
ALTER TENANT ALL 同时修改所有租户。
RESOURCE_POOL_LIST 资源池列表,为创建租户时的必填项,暂时只支持一个 RESOURCE POOL。
DEFAULT TABLEGROUP 设置租户默认表组信息,NULL 表示取消数据库默认表组。
LOCK|UNLOCK 租户锁定和解锁。对租户进行锁定后,不能在该租户上创建新的连接,已有连接保持不变。通常在客户费用到期未续费的场景下使用,客户费用到期后对租户进行锁定,客户续费后再进行解锁。
COMMENT 修改注释。
CHARACTER SET | CHARSET 修改租户的字符集。
COLLATE 指定校对规则。
REPLICA_NUM 指定副本数。
ZONE_LIST 指定要修改的 Zone 列表。
PRIMARY_ZONE 指定主 Zone。
READ ONLY | READ WRITE 指定租户的只读或读写属性。
LOGONLY_REPLICA_NUM 指定日志副本数。
LOCALITY 描述副本在 Zone 间的分布情况,如:F@z1,F@z2,F@z3,R@z4 表示 z1, z2, z3 为全功能副本,z4 为只读副本。
system_var_name 修改租户的系统变量值。
  • 示例

  • 锁定租户 TENANT1。

ALTER TENANT TENANT1 LOCK;
  • 注意事项

ALTER TENANT 语句系统租户有权限执行,同时本租户的管理员能执行。


3.删除租户

# 注意
删除租户后,租户下的数据库和表也同时被删除。
但是租户使用的资源配置不会被删除。资源配置可以继续给其他租户使用。

1.删除租户命令的语法:
DROP TENANT | FORCE
或者
DROP TENANT $tenant_name PURGE;
# 说明:

- 对于`DROP TENANT`操作:
- 当租户开启回收站功能时,`DROP TENANT`操作表示删除的租户会进入回收站。对于回收站中的租户,后续您可以通过租户级回收站功能进一步删除或恢复该租户.
租户级回收站相关操作请参见,租户级回收站:
https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.2/tenant-level-recycle-bin

- 当租户关闭回收站功能时,`DROP TENANT`操作表示延迟删除租户,后台线程会进行 GC 动作,租户的信息仍然可以通过内部表查询。租户具体延迟删除的时间由配置项`schema_history_expire_time`控制,默认为 7 天,`schema_history_expire_time`配置项更多信息请参见 [schema_history_expire_time](https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.2/schema_history_expire_time-1)。
- `DROP TENANT PURGE`操作表示仅延迟删除租户,且无论回收站功能是否开启,删除的租户均不进入回收站。
- `FORCE`参数表示无论回收站功能是否开启,均可以立刻删除租户。

示例语句如下所示:

1.延迟删除租户 t1,删除的租户可进入回收站
obclient> DROP TENANT t1;

2.延迟删除租户 t1,删除的租户不进入回收站
obclient> DROP TENANT t1 PURGE;

3.立刻删除租户 t1
obclient> DROP TENANT t1 FORCE;

4.租户使用

OceanBase 数据库中的用户分为两类:系统租户下的用户和普通租户下的用户。创建用户时,如果当前会话的租户为系统租户,则新建的用户为系统租户用户,反之为普通租户下的用户。

1.通过root用户登陆到sys租户 
obclient -h127.0.0.1 -P2881 -uroot@sys -p

2.登陆业务租户test_tenant
obclient -h127.0.0.1 -P2881 -uroot@test_tenant -p

3.登录租户后,可以创建当前租户下的账户:
grant all on *.* to admin1@'%' identified by '密码';

4.使用该账户远程登录
obclient -h远程地址 -P2881 -uadmin1@test_tenant -p

使用第三方工具链接OceanBase方式:


5.管理变量

租户的变量分为 Global 级别和 Session 级别。Session 级别的变量继承自 Global 级别的变量。同时,Session 建立后可以设定 Session 级别的变量。Session 级别的变量在 Session 中覆盖 Global 级别的变量。

1)查询变量

下述展示查询 Session/Global 级别变量语句的语法:

SHOW [GLOBAL] VARIABLES [SHOW_VARIABLES_OPTS]
SHOW_VARIABLES_OPTS:
[LIKE 'pattern' | WHERE expr]

--示例:
obclient> SHOW VARIABLES LIKE 'ob_query_timeout';
obclient> SHOW GLOBAL VARIABLES WHERE variable_name LIKE 'ob_query_timeout';

sys 租户可以通过内部表 __all_virtual_sys_variable 查询其他所有普通租户的 Global 变量。

如果连接 sys 租户后再切换到普通租户,此时查询的 Session 级别变量仍然是 sys 租户的 Session 级别的变量。查询的 Global 级别的变量是切换后普通租户的 Global 级别变量。


2)设置变量

设置 Session 级别的变量仅对当前 Session 有效,对其他 Session 无效。设置 Global 级别的变量对当前 Session 无效,需要重新登录建立新的 Session 才会生效。

下述展示设置 Session/Global 级别变量语句的语法:

SET [GLOBAL] VARIABLE_NAME = 'VALUE'

--示例:
obclient> SET ob_query_timeout = 20000000;
obclient> 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 级别变量的设置是等效的。

四、用户管理

1.租户和用户

数据库用户权限管理包括新建用户、删除用户、修改密码、修改用户名、锁定用户、用户授权和撤销授权等:

# OceanBase中用户分为两类:
系统租户下的用户,一般租户下的用户。创建用户时,如果Session当前租户为系统租户,则新建的用户为系统租户下的用户,反之为一般租户下的用户。

1. 用户名称在租户内是唯一的,不同租户下的用户可以同名。用户名@租户名在系统全局唯一。为区别系统租户和一般租户下的用户,系统租户下的用户名称使用特定前缀。系统租户和普通租户都有一个内置用户root,系统租户的root为系统管理员和普通租户的root为租户管理员,购买了某个普通租户的客户得到普通租户root和密码,进行本租户范围的管理工作。

2. 一般租户下的用户只能拥有该租户下对象的访问权限,权限和MySQL兼容;系统租户下的用户可以被授予跨租户的对象访问权限。当前系统租户下的用户不允许访问一般租户下的用户表数据。用户在登录OceanBase系统时需指定唯一的租户名。对于系统租户下的用户,在登录后,可以使用CHANGE EFFECTIVE TENANT tenantname语句来切换当前访问的租户;对于一般租户下的用户,不能切换到其他租户。

2.新建用户

CREATE USER用于创建新的OceanBase用户。创建新用户后,可以使用该用户连接OceanBase。
格式 CREATE USER user_specification_list;
user_specification_list:
    user_specification [, user_specification]…;
user_specification:
    user IDENTIFIED BY 'authstring'
    user IDENTIFIED BY PASSWORD 'hashstring'
必须拥有全局的CREATE USER权限,才可以使用CREATE USER命令。
新建用户后,“mysql.user”表会新增一行该用户的表项。如果同名用户已经存在,则报错。
使用自选的IDENTIFIED BY子句,可以为账户给定一个密码。
user IDENTIFIED BY ‘authstring’此处密码为明文,存入“mysql.user”表后,服务器端会变为密文存储。
user IDENTIFIED BY PASSWORD ‘hashstring’此处密码为密文。
同时创建多个用户时,用“,”隔开。

举例 Oceanbase>CREATE USER 'sqluser01' IDENTIFIED BY '123456', 'sqluser02' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.07 sec)
Oceanbase>select user from user;
+-----------+
| user      |
+-----------+
| root      |
| test      |
| sqluser01 |
| sqluser02 |
+-----------+
4 rows in set (0.01 sec)

3.删除用户

DROP USER语句用于删除一个或多个OceanBase用户。
格式 DROP USER username [, username...];

必须拥有全局的CREATE USER权限,才可以使用DROP USER命令。

不能对“mysql.user”表进行DELETE方式进行权限管理。

成功删除用户后,这个用户的所有权限也会被一同删除。

同时删除多个用户时,用“,”隔开。

举例
执行以下命令,删除“sqluser02”用户。 DROP USER 'sqluser02';

4.修改密码

修改OceanBase登录用户的密码。
格式 SET PASSWORD [FOR user] = password_option;
password_option: {
    PASSWORD('authstring')
    |'hashstring'}

或者 ALTER USER username IDENTIFIED BY 'password';

如果没有For user子句,则修改当前用户的密码。任何成功登录的用户都可以修改当前用户的密码。

如果有For user子句,或使用第二种语法,则修改指定用户的密码。必须拥有全局CREATE USER权限,才可以修改指定用户的密码。

举例
执行以下命令将“sqluser01”的密码修改为“abc123”。 ALTER USER sqluser01 IDENTIFIED BY 'abc123';

使用 SET PASSWORD修改密码如下: Oceanbase>set password for test = password('abc123');
Query OK, 0 rows affected (0.03 sec)

- 不指定password函数,会报错如下:
Oceanbase>set password for test = 'abc123';
ERROR 1827 (42000): The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function.

5.修改用户名

用于修改OceanBase登录用户的用户名。
格式 RENAME USER
    'oldusername' TO 'newusername'
    [,'oldusername' TO 'newusername'...];

必须拥有全局CREATE USER权限,才可以使用本命令。

同时修改多个用户名时,用“,”隔开。

修改前后,新旧用户权限保持一致。

用户名长度限制:用户名占用字节小于等于16。

举例 Oceanbase>select user from user;
+---------+
| user    |
+---------+
| root    |
| testall |
+---------+
2 rows in set (0.00 sec)

修改用户名 Oceanbase>rename user testall to test;
Query OK, 0 rows affected (0.03 sec)
Oceanbase>select user from user;
+------+
| user |
+------+
| root |
| test |
+------+
2 rows in set (0.00 sec)

6.锁定用户

锁定或者解锁用户。被锁定的用户不允许登录。
格式 ALTER USER user [lock_option]
lock_option:{
    ACCOUNT LOCK
    | ACCOUNT UNLOCK}

必须拥有全局UPDATE USER权限,才可以执行本命令。
举例
锁定用户 Oceanbase>alter user test account lock;
Query OK, 0 rows affected (0.04 sec)

解锁用户 Oceanbase>alter user test account unlock;
Query OK, 0 rows affected (0.02 sec)

7.用户授权

GRANT语句用于系统管理员授予User某些权限。
格式 GRANT priv_type
    ON priv_level
    TO user_specification [, user_specification]...
    [WITH with_option ...]
priv_level:
     *
    | *.*
    | db_name.*
    | db_name.tbl_name
    | tbl_name
user_specification:
    user [IDENTIFIED BY [PASSWORD] ‘password’]
with_option:
     GRANT OPTION
  • 权限可以分为以下几个层级:
全局层级:适用于所有的数据库。使用GRANT ALL ON *.*授予全局权限。
数据库层级:适用于一个给定数据库中的所有目标。使用GRANT ALL ON db_name.*授予数据库权限。
表层级:表权限适用于一个给定表中的所有列。使用GRANT ALL ON db_name.tbl_name授予表权限。

给特定用户授予权限。如果用户不存在,可以直接创建用户。(sql_mode=’no_auto_create_user’,同时没有identified by指定密码时候,不可以直接创建用户。)

当前用户必须拥有被授予的权限(例如,user1把表t1的SELECT权限授予user2,则user1必须拥有表t1的SELECT的权限),并且拥有GRANT OPTION权限,才能授予成功。

用户授权后,该用户只有重新连接OceanBase,权限才能生效。

用“*”代替table_name,表示赋予全局权限,即对数据库中的所有表赋权。

同时把多个权限赋予用户时,权限类型用“,”隔开。

同时给多个用户授权时,用户名用“,”隔开。

priv_type的值如下表所示。
权限  说明
ALL PRIVILEGES  除GRANT OPTION以外所有权限。
ALTER   ALTER TABLE的权限。
CREATE  CREATE TABLE的权限。
CREATE USER CREATE USER,DROP USER,RENAME USER和REVOKE ALL PRIVILEGES的权限。
CREATE TABLEGROUP   全局CREATE TABLEGROUP的权限。
DELETE  DELETE的权限。
DROP    DROP的权限。
GRANT OPTION    GRANT OPTION的权限。
INSERT  INSERT的权限。
SELECT  SELECT的权限。
UPDATE  UPDATE的权限。
SUPER   SET GLOBAL修改全局系统参数的权限。
SHOW DATABASES  全局 SHOW DATABASES的权限。
INDEX   CREATE INDEX, DROP INDEX的权限
CREATE VIEW 创建、删除视图的权限
SHOW VIEW   SHOW CREATE VIEW权限

说明:目前没有change effective tenant的权限控制,sys租户下的用户都可以。
  • 撤销权限
REVOKE语句用于系统管理员撤销User某些权限。
格式 REVOKE priv_type
     ON database.tblname
    FROM 'user';

用户必须拥有被撤销的权限(例如,user1要撤销user2对表t1的SELECT权限,则user1必须拥有表t1的SELECT的权限),并且拥有GRANT OPTION权限。

撤销“ALL PRIVILEGES”和“GRANT OPTION”权限时,当前用户必须拥有全局GRANT OPTION权限,或者对权限表的UPDATE及DELETE权限。

撤销操作不会级联。例如,用户user1给user2授予了某些权限,撤回user1的权限不会同时也撤回user2的相应权限。

用“*”代替table_name,表示撤销全局权限,即撤销对数据库中所有表的操作权限。

同时对用户撤销多个权限时,权限类型用“,”隔开。

同时撤销多个用户的授权时,用户名用“,”隔开。

priv_type的值如上表所示。

举例
执行以下命令撤销“obsqluser01”的所有权限。 REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'obsqluser01';
  • 查看权限
SHOW GRANTS语句用于系统管理员查看User的操作权限。
格式
SHOW GRANTS [FOR username];SHOW GRANTS [FOR username];

如果不指定用户名,则缺省显示当前用户的权限。对于当前用户,总可以查看自己的权限。
如果要查看其他指定用户的权限,必须拥有对“mysql.user”的SELECT权限。

举例 Oceanbase>show grants for test;
+------------------------------+
| Grants for test              |
+------------------------------+
| GRANT USAGE ON *.* TO 'test' |
+------------------------------+
1 row in set (0.01 sec)

8.用户的使用

系统租户下的用户和普通租户下的用户:

默认root不加租户的话登录的是系统sys租户
等同于如下方式一
1.通过root用户登陆到sys租户 
obclient -h127.0.0.1 -P2881 -uroot@sys -p

2.登陆业务租户test_tenant
obclient -h127.0.0.1 -P2881 -uroot@test_tenant -p

3.登录租户后,可以创建当前租户下的账户:
grant all on *.* to admin1@'%' identified by '密码';

4.使用该账户远程登录
obclient -h远程地址 -P2881 -uadmin1@test_tenant -p

使用第三方工具链接OceanBase方式:


Copyright © 2009 - Now . XPBag.com . All rights Reserved.
夜心的小站 » OceanBase 配置文件、集群资源租户管理

提供最优质的资源集合

立即查看 了解详情