修改 OceanBase 集群参数
OceanBase 数据库以集群形态运行,提供多租户(也叫多实例)能力。集群初始化成功后,默认会有一个 sys 租户,用以保存集群的所有元数据、参数等。您也可通过登录 sys 租户管理 OceanBase 集群。
oceanbase部署请查看历史文章
https://www.modb.pro/db/324460 使用OBD自动部署三节点OceanBase文档
https://www.modb.pro/db/328171 OceanBase手动部署三节点OBserver文档
https://www.modb.pro/db/322997 OceanBase 单节点手动部署OB文档
https://www.modb.pro/db/250245 Docker单节点自动化部署OB集群
一、基础参数命令
1、部署集群
部署使用命令:obd cluster deploy [集群名] -c 集群配置文件 。
[admin@obce00 ~]$ obd cluster deploy obce-single -c obce-single.yaml
这里的集群名是配置文件在 OBD 里的唯一标识,可以跟配置文件中的集群名相同,也可以跟文件名相同,这里不作要求。
2、查看部署状态
[admin@obce00 ~]$ obd cluster list
[admin@obce00 ~]$ obd cluster list
3、启动和初始化集群boostrap
上文中 deploy 操作只安装了软件和准备初始化目录,还需使用 obd cluster start 命令启动集群节点并初始化集群。
[admin@obce00 ~]$ obd cluster start obce-single
第一次运行 start 命令会对集群进行初始化(boostrap),以后再使用 start 命令就只会启动集群中节点进程。
4、查看启动后的集群状态
[admin@obce00 ~]$ obd cluster list
[admin@obce00 ~]$ obd cluster list
5、检查进程
[admin@obce00 ~]$ ps -ef | grep observer | grep -v grep
[admin@obce00 ~]$ ps -ef | grep observer | grep -v grep
6、检查进程监听端口
[admin@obce00 ~]$ sudo netstat -ntlp |grep observer
[admin@obce00 ~]$ sudo netstat -ntlp |grep observer
7、检查进程id
[admin@obce00 ~]$ pidof observer
[admin@obce00 ~]$ pidof observer
8、停止一个运行中的集群
obd cluster stop <deploy name>
obd cluster stop <deploy name>
9、销毁已部署的集群
销毁已部署的集群。如果集群处于运行中的状态,该命令会先尝试执行 stop,成功后再执行 destroy。
obd cluster destroy <deploy name> [-f]
选项 -f 为 --force-kill。作用为:检查到工作目录下有运行中的进程时,强制停止。销毁前会做检查是有还有进程在运行中。如有其它原因导致工作目录下有进程未退出,destroy 都会直接停止。
10、清理目录和数据(手动部署)
手动安装部署失败后,安装部署失败后需要在清空目录和数据后重新部署。
kill -9 `pidof observer`
/bin/rm -rf ~/oceanbase/store/obdemo/*/*
11、给docker分配内存
docker run -m 200M --memory-swap=300M ubuntu
docker run -m 200M --memory-swap=300M ubuntu
-m 或 –memory:设置内存的使用限额,例如 200M, 2G。 –memory-swap:设置 内存+swap 的使用限额。
二、如何重启 OceanBase 集群
OceanBase 数据库自身并没有提供“重启集群”的命令。OceanBase 数据库的核心能力就是高可用(前提是三副本部署)。当少数派节点故障时,OceanBase 数据库内部会自动切换,依然可以为业务提供读写服务。OceanBase 数据库提供了停止和启动某个副本(zone 级别或者 server 级别)的功能,并且只允许停止少数派节点。
2.1、手动重启 OceanBase 集群节点
# ssh 到 节点 1
ssh 172.20.249.52
# 正常 kill 进程,除非是测试用或者评估过风险,否则不要用`kill -9` 。
kill `pidof observer`
# 等待 60s,等进程完全退出
sleep 60
# 反复确认进程完全退出
ps -ef | grep observer
# 配置 LIBRARY PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/oceanbase-ce/lib/
# 启动进程
cd /home/admin/oceanbase-ce && bin/observer
# 等待 10s 进程启动
sleep 10
# 反复确认进程启动时没有退出
ps -ef | grep observer | grep -v grep
# 等待 60s,等进程完全启动并恢复完毕
sleep 60
# 查看进程监听成功(默认监听 2881 和 2882 端口)
netstat -ntlp
# 在集群中查看节点状态(`status`)、开始服务时间(`start_service_time`)是否正常。
select a.zone,concat(a.svr_ip,':',a.svr_port) observer, cpu_total, (cpu_total-cpu_assigned) cpu_free, round(mem_total/1024/1024/1024) mem_total_gb, round((mem_total-mem_assigned)/1024/1024/1024) mem_free_gb, usec_to_time(b.last_offline_time) last_offline_time, usec_to_time(b.start_service_time) start_service_time, b.status, usec_to_time(b.stop_time) stop_time, b.build_version from __all_virtual_server_stat a join __all_server b on (a.svr_ip=b.svr_ip and a.svr_port=b.svr_port) order by a.zone, a.svr_ip;
# ssh 到 节点 1
ssh 172.20.249.52
# 正常 kill 进程,除非是测试用或者评估过风险,否则不要用`kill -9` 。
kill `pidof observer`
# 等待 60s,等进程完全退出
sleep 60
# 反复确认进程完全退出
ps -ef | grep observer
# 配置 LIBRARY PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/oceanbase-ce/lib/
# 启动进程
cd /home/admin/oceanbase-ce && bin/observer
# 等待 10s 进程启动
sleep 10
# 反复确认进程启动时没有退出
ps -ef | grep observer | grep -v grep
# 等待 60s,等进程完全启动并恢复完毕
sleep 60
# 查看进程监听成功(默认监听 2881 和 2882 端口)
netstat -ntlp
# 在集群中查看节点状态(`status`)、开始服务时间(`start_service_time`)是否正常。
select a.zone,concat(a.svr_ip,':',a.svr_port) observer, cpu_total, (cpu_total-cpu_assigned) cpu_free, round(mem_total/1024/1024/1024) mem_total_gb, round((mem_total-mem_assigned)/1024/1024/1024) mem_free_gb, usec_to_time(b.last_offline_time) last_offline_time, usec_to_time(b.start_service_time) start_service_time, b.status, usec_to_time(b.stop_time) stop_time, b.build_version from __all_virtual_server_stat a join __all_server b on (a.svr_ip=b.svr_ip and a.svr_port=b.svr_port) order by a.zone, a.svr_ip;
在第一个节点重启成功后,才可重复操作第二个节点。 如果只是测试,就可以忽略直接杀掉所有集群节点的进程,然后启动进程。
2.2、使用 OBD 重启集群
上面是手动重启 OceanBase 集群节点的原理,该章节介绍使用 OBD 工具自动化重启 OceanBase 集群节点。
注意
当前 OBD 的重启集群并没有包含必要的检查操作。所以,测试环境中可以使用,生产环境中需要谨慎使用。
[admin@obce00 oceanbase-ce]$ obd cluster restart obce-3zones
上面 OBD 重启集群的时候,默认重启了所有组件(包括 OBSERVER 和 OBPROXY )。您也可通过 -c 命令指定重启具体的组件。
三、停止 OBServer
通过 SQL 语句停止 OBServer
停止 OBServer 主要包含以下 2 个 操作:
- 停止节点服务,即 Stop Server 操作
- 停止 observer 进程
3.1、停止节点服务
语句如下:使用 root 用户登录数据库的 sys 租户
obclient> ALTER SYSTEM STOP SERVER "10.10.10.1:2882" zone='z1';
此外,执行 Stop Server 操作时,还需要注意以下事项:
不能跨 Zone 执行 Stop Server 操作,同一个 Zone 可以同时 Stop 多个 Server。
一个 Stop 操作发起没有结束前,不能发起第二个操作。
如果命令很快执行失败,那么可能是日志不同步,需要检查
__all_rootservice_event_history表,确认是否有 Stop Server 的记录。如果没有记录,则说明在 RS 没执行 Stop Server 操作前就失败了;如果有记录,则说明是日志不同步导致 Stop Server 操作执行失败。查询示例如下:
obclient> SELECT rs_svr_ip FROM oceanbase.__all_rootservice_event_history WHERE event='stop_server';
3.2、停止 observer 进程
登录 OBServer 所在的机器。
通过命令行工具进入 /home/admin/oceanbase/bin 目录。
运行以下命令,停止 observer 进程。
kill `pidof observer`
运行以下命令,停止 observer 进程。运行以下命令,确认进程是否已停止。
ps -ef | grep observer | grep -v grep
登录 OBServer 所在的机器。
通过命令行工具进入 /home/admin/oceanbase/bin 目录。
运行以下命令,停止 observer 进程。
kill `pidof observer`
运行以下命令,停止 observer 进程。运行以下命令,确认进程是否已停止。
ps -ef | grep observer | grep -v grep
四 、启动 OBServer
启动 OBServer 主要包含以下 2 个操作:
- 启动 observer 进程
- 启动节点服务,即 Start Server 操作
4.1、启动 observer 进程
- 登录 OBServer 所在的机器。
- 通过命令行工具进入
/home/admin/oceanbase/bin 目录。 - 运行以下命令,启动 observer 进程。
/home/admin/oceanbase/bin 目录。第一次启动 observer 进程的命令示例如下:
cd /home/admin/oceanbase/bin
./observer -p 2881 -P 2882 -z 'zone_1' -d '/data/1/prod_data/' -r '10.10.10.1:2882:2881;10.10.10.2:2882:2881;10.10.10.3:2882:2881' -l WARN -d '/data/1/prod_data' -o 'memory_limit=100GB,datafile_disk_percentage=85'
通常仅在第一次启动时,需要添加启动参数,其他时候启动时,可直接使用 ./bin/observer 命令启动 observer 进程。同时,您还可以运行 ./bin/observer --help 查看 observer 启动参数的详细信息。
确认进程是否已存在,示例如下:
[root@xx oceanbase]#ps -ef | grep observer | grep -v grep
确认端口监听是否成功,示例如下:
[root@xxx oceanbase]#netstat -ntlp | grep `pidof observer`
4.2、启动节点服务
一般情况下,您可以通过 Start Server 操作来启动节点服务。Start Server 操作对应 Stop Server 操作。集群中的 OBServer 启动后,通常默认状态为 started。如果执行过 Stop Server 操作,则需要通过 Start Server 操作将 Server 状态置为 started。
启动节点服务的语句如下:使用 root用户登录数据库的 sys 租户(仅在 sys 租户中执行。)
obclient> ALTER SYSTEM START SERVER 'ip:port' [,'ip:port'...] [ZONE='zone'];
启动节点服务示例:
obclient> ALTER SYSTEM START SERVER "10.10.10.1:2882";
查看节点服务是否已经正常,示例如下:
obclient> SELECT a.zone, concat(a.svr_ip,':', a.svr_port) observer, cpu_total, (cpu_total-cpu_assigned) cpu_free, round(mem_total/1024/1024/1024) mem_total_gb, round((mem_total-mem_assigned)/1024/1024/1024) mem_free_gb, usec_to_time(b.last_offline_time) last_offline_time, usec_to_time(b.start_service_time) start_service_time, b.status, usec_to_time(b.stop_time) stop_time, b.build_version
FROM oceanbase.__all_virtual_server_stat a join oceanbase.__all_server b on (a.svr_ip=b.svr_ip and a.svr_port=b.svr_port)
ORDER BY a.zone, a.svr_ip\G
4.3、查看和修改 OceanBase 集群参数
您可通过命令 show parameters [ like '%参数名特征%' ] ; 或 show parameters where name in ( '参数名1' , '参数名2' ) ; 查看 OceanBase 集群参数。 在命令 show parameters [ like '%参数名特征%' ] ; 中不带 like 子句表示查看所有参数。
MySQL [oceanbase]> show parameters like 'memory_limit%';
MySQL [oceanbase]> show parameters where name in ('memory_limit','memory_limit_percentage')\G
OceanBase 集群参数可通过命令 alter system set 参数名='参数值' [ server = '节点IP:节点RPC端口' ] ; 进行修改。不指定 server 子句表示参数修改应用于所有 OceanBase 集群节点。 例如:调整参数 syslog_level 值为 USER_ERROR 。
MySQL [oceanbase]> alter system set syslog_level = 'USER_ERR'
MySQL [oceanbase]> show parameters like 'syslog_level'\G
五、隔离故障的 OBServer
当 OBServer 发生故障时,您可以隔离故障 OBServer。隔离后,新的读写请求不会路由到该故障的 OBServer 上。 当 OBServer 故障后,您可以通过隔离操作将故障 OBServer 上的 Leader 切换到其他 OBServer 上,以此尝试恢复用户的写服务和日志同步。待集群恢复正常后,再尝试通过 STOP SERVER 命令停止 OBServer 的服务后,重启该故障的 OBServer 来解决问题。
使用 root用户登录数据库的 sys 租户
obclient> ALTER SYSTEM ISOLATE SERVER '10.10.10.10:2882' ZONE='zone1';
隔离故障的 OBServer 后,如果需要解除隔离状态,您可以通过执行 ALTER SYSTEM START SERVER '10.10.10.10:2882' 命令来完成。
六、删除 OBServer
6.1、Delete Server 操作
您可以通过 Delete Server 操作来删除 OBServer。Delete Server 操作用于从集群中删除节点。
使用 root用户登录数据库的 sys 租户(仅在 sys 租户中执行)
obclient> ALTER SYSTEM DELETE SERVER "192.168.100.1:2882" zone='z1'
查看 __all_server 内部表,确认列表中已经查询不到该 OBServer 则表示删除成功。
obclient> SELECT * FROM oceanbase.__all_server;
6.2、Cancel Delete Server 操作
如果您希望取消 Delete Server 操作,可以通过 Cancel Delete Server 操作来实现。
语句如下:使用 root用户登录数据库的 sys 租户(仅在 sys 租户中执行)
obclient> ALTER SYSTEM CANCEL DELETE SERVER '10.10.10.1:2882' zone='zone1';
七、设置参数集群和租户配置项
OceanBase 数据库的配置项分为集群级配置项和租户级配置项。
7.1、通过 SQL 语句修改配置项
确认一个配置项为集群级别还是租户级别,可根据 SHOW PARAMETERS 语句执行结果中的 scope 列对应的值来判断:
scope 值为 CLUSTER 则表示为集群级配置项。scope 值为 TENANT 则表示为租户级配置项。
确认一个配置项为集群级别还是租户级别,可根据 SHOW PARAMETERS 语句执行结果中的 scope 列对应的值来判断:
scope值为CLUSTER则表示为集群级配置项。scope值为TENANT则表示为租户级配置项。
修改 clog_max_unconfirmed_log_count 配置项的示例如下:
obclient> ALTER SYSTEM SET clog_max_unconfirmed_log_count = 400;
修改指定 Zone 的 clog_max_unconfirmed_log_count 配置项的示例如下:
obclient> ALTER SYSTEM SET clog_max_unconfirmed_log_count = 400 ZONE='z1';
修改指定 OBServer 的 clog_max_unconfirmed_log_count 配置项的示例如下:
obclient> ALTER SYSTEM SET clog_max_unconfirmed_log_count = 400 SERVER='XXX.XXX.XXX.XXX:XXXXX';
在系统租户下,修改所有或指定租户的租户级配置项。示例如下:
obclient> ALTER SYSTEM SET clog_max_unconfirmed_log_count = 400 TENANT='ALL';
obclient> ALTER SYSTEM SET clog_max_unconfirmed_log_count = 400 TENANT='Oracle';
7.2、通过 SQL 语句查看配置项
obclient> SHOW PARAMETERS WHERE scope = 'tenant';
obclient> SHOW PARAMETERS WHERE svr_ip != 'XXX.XXX.XXX.XXX';
obclient> SHOW PARAMETERS WHERE INFO like '%ara%';
obclient> SHOW PARAMETERS LIKE 'large_query_threshold';
obclient> SHOW PARAMETERS WHERE scope = 'tenant';
obclient> SHOW PARAMETERS WHERE svr_ip != 'XXX.XXX.XXX.XXX';
obclient> SHOW PARAMETERS WHERE INFO like '%ara%';
obclient> SHOW PARAMETERS LIKE 'large_query_threshold';
八、修改用户及资源配置
8.1、修改资源单元的配置
修改资源单元配置时,可修改 CPU、内存、存储空间和 IOPS 中的若干项,没有被修改的值将保持不变。
示例:修改资源单元 unit1 的配置。使用 root 用户登录数据库的 sys 租户
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;
8.2、删除资源单元
删除资源单元前必须确保当前资源单元未被租户使用。如果资源单元正在被租户使用,则需要先将资源单元从资源池中移出后再删除资源单元。删除资源单元主要有以下两个场景:
资源单元未被使用
如果资源单元未被指定给资源池,您可以直接执行以下语句,删除资源单元。示例语句如下:
obclient> DROP RESOURCE UNIT unit1;
资源单元正在被使用
如果资源单元已被指定给资源池,需要为原资源池指定新的资源单元后,再删除资源单元。
obclient> CREATE RESOURCE UNIT unit2 MAX_CPU 4, MAX_MEMORY '5G', MAX_IOPS 128,MAX_DISK_SIZE '10G', MAX_SESSION_NUM 64, MIN_CPU=4, MIN_MEMORY= '5G', MIN_IOPS=128; obclient> ALTER RESOURCE POOL pool1 UNIT='unit2'; obclient> DROP RESOURCE UNIT unit1;
假设待删除的资源单元为 unit1,unit1 被指定给了资源池 pool1,如果要移除资源单元 unit1,则需要先创建资源单元 unit2,并将 unit2 指定给 pool1 后,再删除 unit1。
8.3、管理资源池
01、修改资源池
修改资源池是实现租户扩容或缩容的另一种方式。例如,在每个 Zone 中增加或减少节点数量,可以通过修改参数 UNIT_NUM 来实现。
仅支持由 sys 租户的管理员执行。假设当前环境中存在如下所示的资源单元和资源池。
obclient> CREATE RESOURCE UNIT unit1 MAX_CPU 6,MIN_CPU 6, MAX_MEMORY '36G', MIN_MEMORY '36G', MAX_IOPS 128, MIN_IOPS 128, MAX_DISK_SIZE '2T', MAX_SESSION_NUM 64;
obclient> CREATE RESOURCE POOL pool1 UNIT 'unit1', UNIT_NUM 2, ZONE_LIST ('z1','z2','z3');
则修改资源池的示例如下:
修改资源池
pool1的资源单元,修改后,unit2替代unit1属于资源池pool1。obclient> CREATE RESOURCE UNIT unit2 MAX_CPU 8, MAX_MEMORY '40G', MAX_IOPS 128, MAX_DISK_SIZE '10G', MAX_SESSION_NUM 64, MIN_CPU=8, MIN_MEMORY='40G', MIN_IOPS=128; obclient> ALTER RESOURCE POOL pool1 unit='unit2';不指定
unit_id,将资源池pool1中每个 Zone 下的资源单元个数修改为 1 个。obclient>ALTER RESOURCE POOL pool1 UNIT_NUM = 1;指定删除资源池
pool1中unit_id为1001、1003、1005的资源单元,使每个 Zone 下的资源单元个数为 1 个。obclient> ALTER RESOURCE POOL pool1 UNIT_NUM 1 DELETE UNIT = (1001, 1003,1005);修改资源池
pool1, 使资源池pool1中ZONE_LIST的范围扩大到'z1','z2','z3','z4'。obclient> ALTER RESOURCE POOL pool1 ZONE_LIST=('z1','z2','z3','z4');每次只能修改资源池的一个参数,同时修改资源池的两个参数时,会报错。
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
02、合并资源池
- 被合并的资源池的
unit_num 需要都相等。 - 被合并的资源池的资源配置必须是同一个。
unit_num 需要都相等。合并资源池的 SQL 语法如下:该语句仅支持由 sys 租户的管理员执行
obclient>ALTER RESOURCE POOL MERGE ('pool0','pool1','pool2') INTO ('pool3');
03、从租户中移除资源池
对于 RESOURCE_POOL_LIST,一次仅支持删除一个资源池。从租户中移除资源池的场景通常使用在租户副本数降级的场景中。
假设集群中当前有 z1、z2、z3、z4、z5 合计5 个 Zone,且 5 个 Zone 都属于同一个 Region,每个 Zone 内一台 OBServer。集群中有一个普通租户 tenant1,当前副本分布情况 locality='F@z1,F@z2,F@z3,F@z4,F@z5', resource_pool_list=('pool1','pool2'),资源池的资源分布情况 CREATE RESOURCE POOL pool1 UNIT 'uc1', UNIT_NUM 1, ZONE_LIST ('z1', 'z2', 'z3') 和 CREATE RESOURCE POOL pool2 UNIT 'uc2', UNIT_NUM 1, ZONE_LIST ('z4', 'z5')。
根据业务需要,需要将租户 tenant1 由 5 副本调整为 3 副本,且资源池调整为 1 个,即租户的 Locality 变成 locality='F@z1,F@z2,F@z3,', resource_pool_list=('pool1')。
示例操作
使用
root用户登录数据库的sys租户。通过修改租户
tenant1的 Locality 来删除副本。根据 Locality 的变更规则,每次只能删除一个 Zone 内的 Locality。
obclient>ALTER TENANT tenant1 LOCALITY='F@z1,F@z2,F@z3,F@z4'; obclient>ALTER TENANT tenant1 LOCALITY='F@z1,F@z2,F@z3';删除
z4、z5上的资源池pool2。obclient>ALTER TENANT tenant1 RESOURCE_POOL_LIST =('pool1') ;
04、删除资源池
删除资源池前,请确认该资源池当前未被任何租户使用。如果资源池正在被租户使用,则需要将资源池从租户中移除后再删除资源池。仅支持由 sys 租户的管理员执行。
查看待删除的资源池 resource_pool1 是否被租户使用。
obclient> SELECT tenant_id,tenant_name FROM oceanbase.gv$unit WHERE resource_pool_name='resource_pool1';
确认未被租户使用,执行以下命令,删除资源池。
obclient> DROP RESOURCE POOL resource_pool1;
确认是否删除成功。
obclient> SELECT * FROM oceanbase.__all_resource_pool;
查询结果中没有 resource_pool1,则表示资源池删除成功。
8.4、管理租户
01、修改租户
租户创建成功后,您可以通过 SQL 语句修改租户的信息,包括修改租户的副本数、Zone 列表、主 Zone 以及系统变量值等。
不支持直接替换租户的资源池。假设租户原来使用的资源池为 pool1,通过以下命令直接将租户的资源池替换为 pool2 时,系统会报错。
obclient> ALTER TENANT tenant1 resource_pool_list=('pool2');
ERROR 1210 (HY000): Incorrect arguments to resource pool list
示例:
修改租户
tenant1的 Primary Zone 为zone2。obclient> ALTER TENANT tenant1 primary_zone='zone2';LOCALITY用于描述副本在 Zone 间的分布情况,例如:F@z1,F@z2,F@z3,R@z4表示z1、z2和z3为全功能型副本,z4为只读副本。
修改租户 tenant1 的 Locality,增加副本数。
其中 F 表示副本类型为全功能型副本,B_4 为新增的 Zone 名称。
obclient> ALTER TENANT tenant1 locality="F@B_1,F@B_2,F@B_3,F@B_4"
02、删除租户
删除租户后,租户下的数据库和表也同时被删除。但是租户使用的资源配置不会被删除。资源配置可以继续给其他租户使用。 注意只有系统管理员(sys 租户的 root 用户)才能执行 DROP TENANT 命令。
obclient> DROP TENANT tenant_name [FORCE]
或者
obclient> DROP TENANT tenant_name PURGE;
系统租户开启回收站功能后,删除租户 t1,删除的租户可进入回收站。系统租户关闭回收站功能时,删除租户 t1,租户被延迟删除。
obclient> DROP TENANT t1;
延迟删除租户 t1,删除的租户不进入回收站。
obclient> DROP TENANT t1 PURGE;
立刻删除租户 t1。
obclient> DROP TENANT t1 FORCE;
8.5、修改用户权限
当前用户必须拥有被授予的权限(例如,user1 把表 t1 的 SELECT 权限授予 user2,则 user1 必须拥有表 t1 的 SELECT 的权限),并且拥有 GRANT OPTION权限,才能授予成功。
进行授权前,需要注意以下事项:
给特定用户授予权限时,如果用户不存在,可以直接创建用户。如果
sql_mode='no_auto_create_user',且语句中没有IDENTIFIED BY指定密码时,不可以直接创建用户。授予用户级权限
用户级权限即全局权限,该权限适用于所有数据库。通常使用
GRANT ... ON *.*授予用户级权限。 * 将所有数据库的所有对象的权限授予用户user。obclient> GRANT ALL ON *.* TO user;- 将所有数据库中所有表的
INSERT、SELECT权限授予用户user。
obclient> GRANT SELECT, INSERT ON *.* TO user;- 将所有数据库中所有表的
授予数据库级权限
数据库级权限是指某个指定的数据库中所有对象的操作权限。通常使用
GRANT ... ON db_name.*授予数据库级权限。 * 将数据库db1的所有对象的操作权限授予用户user。obclient> GRANT ALL ON db1.* TO user;- 将数据库
db1的所有表的INSERT、SELECT权限授予用户user。
obclient> GRANT SELECT, INSERT ON db1.* TO user;- 将数据库
授予表级权限
对象权限是指某个指定的数据库中的指定表的操作权限。通常使用
GRANT ... ON db_name.tb1_name授予对象权限。 * 将数据库db1的表tb1_name的INSERT、SELECT权限授予用户user。obclient> GRANT SELECT, INSERT ON db1.tb1_name TO user;- 将数据库
db1的表tb1_name的操作权限授予用户user。
obclient> GRANT ALL ON db1.tb1_name TO user;- 将数据库
8.6、撤销权限
当前用户必须拥有被撤销的权限(例如,user1 要撤销 user2 对表 t1 的 SELECT 权限,则 user1 必须拥有表 t1 的 SELECT权限),并且拥有 GRANT OPTION 权限。
撤销 ALL PRIVILEGES 和 GRANT OPTION 权限时,当前用户必须拥有全局 GRANT OPTION 权限,或者对权限表的 UPDATE 及 DELETE 权限。
撤销用户级权限
撤销用户 user 操作所有数据库中所有表的 INSERT 、SELECT 权限。
obclient> REVOKE SELECT, INSERT ON *.* FROM 'user';
撤销数据库级权限
撤销用户 user 操作数据库 db1 的所有表的 INSERT 、SELECT 权限。
obclient> REVOKE SELECT, INSERT ON db1 FROM 'user';
撤销表级权限
撤销用户 user 操作数据库 db1 的表 tb1_name 的 INSERT 、SELECT 权限。
obclient> REVOKE SELECT, INSERT ON db1.tb1_name FROM 'user';
当前用户必须拥有被撤销的权限(例如,user1 要撤销 user2 对表 t1 的 SELECT 权限,则 user1 必须拥有表 t1 的 SELECT权限),并且拥有 GRANT OPTION 权限。
撤销 ALL PRIVILEGES 和 GRANT OPTION 权限时,当前用户必须拥有全局 GRANT OPTION 权限,或者对权限表的 UPDATE 及 DELETE 权限。
撤销用户级权限
撤销用户 user 操作所有数据库中所有表的 INSERT 、SELECT 权限。
obclient> REVOKE SELECT, INSERT ON *.* FROM 'user';
撤销数据库级权限
撤销用户 user 操作数据库 db1 的所有表的 INSERT 、SELECT 权限。
obclient> REVOKE SELECT, INSERT ON db1 FROM 'user';
撤销表级权限
撤销用户 user 操作数据库 db1 的表 tb1_name 的 INSERT 、SELECT 权限。
obclient> REVOKE SELECT, INSERT ON db1.tb1_name FROM 'user';
8.7、删除用户
您可以通过 DROP USER 语句删除一个或多个 OceanBase 数据库用户。
DROP USER user_name [, user_name...];
当前用户必须拥有全局的 CREATE USER 权限,才可以成功执行 DROP USER命令。
删除名为 sqluser02 的用户的示例如下:
obclient> DROP USER sqluser02;
8.8、修改租户参数
租户参数即租户级配置项,系统租户(即 sys 租户)和普通租户都可以设置租户级配置项。系统租户可以设置本租户和其他租户的租户级配置项,普通租户只能设置本租户的租户级配置项。
系统租户设置租户
mytenant的配置项。obclient> ALTER SYSTEM SET clog_max_unconfirmed_log_count=1600 TENANT='mytenant';系统租户设置本租户的配置项。
obclient> ALTER SYSTEM SET clog_max_unconfirmed_log_count=1600;普通租户的租户管理员设置本租户的配置项。
obclient> ALTER SYSTEM SET clog_max_unconfirmed_log_count=1600 SCOPE=SPFILE; obclient> ALTER SYSTEM SET clog_max_unconfirmed_log_count=1600; obclient> ALTER SYSTEM SET clog_max_unconfirmed_log_count=1600 SERVER='192.168.100.1:2882'; obclient> ALTER SYSTEM SET clog_max_unconfirmed_log_count=1600 ZONE='z1';
九、集群的扩缩容
OceanBase 集群的分布式架构可以方便地完成集群的扩容和缩容操作。
可用区(Zone)的动态调整,当集群的容灾需求发生变化时,可通过调整可用区数量,即增加或者减少 Zone 的方式来提高或降低集群的容灾能力。
物理机(OBServer)的扩缩容,当集群的外部负载发生变化时,可通过调整可用区内物理机的数量,即增加或减少 OBServer 的方式来改变集群的负载能力。
扩容
1、集群级别的扩容和缩容
1.1、在集群中增加 Zone
您可以通过 SQL 语句向集群中增加 Zone 的方式来进行集群的扩容。该扩容方式通常用于将集群中租户的 3 副本升级为 5 副本的场景。在集群中增加 Zone,同时为新增的 Zone 添加与其他 Zone 等量的物理机台数。
假设集群中当前仅有 z1、z2、z3 三个 Zone,且三个 Zone 都属于同一个 Region,每个 Zone 内一台 OBServer。集群中有一个普通租户 tenant1,当前副本分布情况 locality='F@z1,F@z2,F@z3', resource_pool_list=('pool1');,根据业务需要,需要将租户 tenant1 由 3 副本调整为 5 副本,即租户的 Locality 由 F@z1,F@z2,F@z3 变为 F@z1,F@z2,F@z3,F@z4,F@z5。
使用
root用户登录到数据库的sys租户。集群中当前仅
z1、z2、z3三个 Zone,需要在集群中增加z4、z5两个 Zone。在集群中增加 Zone 的具体操作请参见 增加或删除 Zone。
在
z4、z5两个 Zone 上各添加一台 OBServer。向 Zone 内添加 OBServer 的具体操作请参见 添加 OBServer。
为租户
tenant1在z4、z5上添加资源。创建可用的资源单元和资源池。
obclient>CREATE RESOURCE UNIT unit2 MAX_CPU 1, MAX_MEMORY '5G', MAX_IOPS 128,MAX_DISK_SIZE '10G', MAX_SESSION_NUM 64, MIN_CPU=1, MIN_MEMORY='5G', MIN_IOPS=128; obclient>CREATE RESOURCE POOL pool2 unit = 'unit2', unit_num = 1, zone_list=('z4','z5');完成后,为租户在
z4、z5上添加资源。obclient>ALTER TENANT tenant1 RESOURCE_POOL_LIST =('pool1', 'pool2') ;
通过修改租户的 Locality 来增加副本。
根据 Locality 的变更规则,每次只能增加一个 Zone 内的 Locality
obclient>ALTER TENANT tenant1 LOCALITY='F@z1,F@z2,F@z3,F@z4'; obclient>ALTER TENANT tenant1 LOCALITY='F@z1,F@z2,F@z3,F@z4,F@z5';
1.2、向 Zone 内添加 OBServer 节点
假设当前集群中,包含 3 个可用区 z1、z2、z3,每个 Zone 内包含 2 台 OBServer。集群中有一个普通租户 tenant1,其资源分布情况如下:
obclient> CREATE RESOURCE UNIT unit1 MAX_CPU 5,MIN_CPU 4, MAX_MEMORY '36G', MIN_MEMORY '32G', MAX_IOPS 128, MIN_IOPS 128, MAX_DISK_SIZE '2T', MAX_SESSION_NUM 64;
obclient> CREATE RESOURCE POOL pool1 UNIT 'unit1', UNIT_NUM 2, ZONE_LIST ('z1','z2','z3');
obclient>CREATE TENANT tenant1 resource_pool_list=('pool1');
现在希望向每个 Zone 内添加 1 台 OBServer 来扩容,则扩容后,3 个 Zone 内均包含 3 台 OBServer。
使用
root用户登录到数据库的sys租户。依次在
z1、z2、z3内各添加一台 OBServer。向一个 Zone 内添加 OBServer 的具体操作请参见 添加 OBServer。
添加成功后,根据业务实际情况,调整租户的资源配置。
调大资源规格
一个 Unit 只能分布在一台 OBServer 上,不能分布在多台 OBServer 上,如果在集群扩容前,您已经通过租户扩容将 Unit 规格设置到最大配置,那么通过该方式进行集群扩容时,只能通过增加 Unit 数量来完成本次扩容。
obclient> CREATE RESOURCE UNIT unit2 MAX_CPU 10, MAX_MEMORY '50G', MAX_IOPS 128,MAX_DISK_SIZE '10G', MAX_SESSION_NUM 64, MIN_CPU=10, MIN_MEMORY='50G', MIN_IOPS=128; obclient> ALTER RESOURCE POOL pool1 UNIT='unit2';调大
UNIT_NUM示例如下:
obclient> ALTER RESOURCE POOL pool1 UNIT_NUM 3;
缩容
1.1、从集群中减少 Zone
本方案仅适用于 Zone 数量大于 3 的场景,如果集群中 Zone 的数量小于 3,则会出现不满足多数派的情况,数据一致性无法得到保证。
您可以通过 SQL 语句向集群中减少 Zone 的方式来进行集群的缩容,该缩容方式通常用于将集群中租户的 5 副本降为 3 副本的场景。从集群中减少 Zone,同时减少集群中的机器台数。
假设当前集群中,包含 5 个可用区 z1、z2、z3、z4、z5,且 5 个 Zone 都属于同一个 Region,每个 Zone 内 1 台 OBServer。集群中有一个普通租户 tenant1,当前副本分布情况 locality='F@z1,F@z2,F@z3,F@z4,F@z5', resource_pool_list=('pool1','pool2'),资源池的资源分布情况 CREATE RESOURCE POOL pool1 UNIT 'uc1', UNIT_NUM 1, ZONE_LIST ('z1', 'z2', 'z3') 和 CREATE RESOURCE POOL pool2 UNIT 'uc2', UNIT_NUM 1, ZONE_LIST ('z4', 'z5')。
根据业务需要,需要将租户 tenant1 由 5 副本降为 3 副本,且资源池调整为 1 个,即租户的 Locality 变成 locality='F@z1,F@z2,F@z3,', resource_pool_list=('pool1')。
使用
root用户登录数据库的sys租户。执行以下命令,停止
z4、z5。obclient> ALTER SYSTEM STOP ZONE z4; obclient> ALTER SYSTEM STOP ZONE z5;为防止其他租户的 Primary Zone 为
z4和z5,此时可以将所有租户的 Primary Zone 修改为z1。修改后,您可以待缩容完成后再重新设置各租户的 Primary Zone。
obclient> ALTER TENANT tenant_name PRIMARY_ZONE='z1';通过修改租户
tenant1的 Locality 来删除副本。根据 Locality 的变更规则,每次只能删除一个 Zone 内的 Locality。
obclient>ALTER TENANT tenant1 LOCALITY='F@z1,F@z2,F@z3,F@z4'; obclient>ALTER TENANT tenant1 LOCALITY='F@z1,F@z2,F@z3';删除
z4、z5上的资源池pool2。obclient>ALTER TENANT tenant1 RESOURCE_POOL_LIST =('pool1') ;执行以下语句,从集群中删除 Zone 及 Zone 中的 OBServer。
obclient> ALTER SYSTEM DELETE SERVER 'xxx.xxx.x.xx4:2882'; obclient> ALTER SYSTEM DELETE ZONE z4; obclient> ALTER SYSTEM DELETE SERVER 'xxx.xxx.x.xx5:2882'; obclient> ALTER SYSTEM DELETE ZONE z5;删除后,可以执行以下语句,确认列表中已查询不到这些 Zone 和 OBServer 则表示删除成功。
obclient> SELECT * FROM oceanbase.__all_zone; obclient> SELECT * FROM oceanbase.__all_server;结束后,本次缩容完成。
1.2、从 Zone 中减少 OBServer 节点
您可以通过 SQL 语句从 Zone 中减少 OBServer 的方式来进行集群的缩容。通常需要从每个 Zone 内减少相等数量的 OBServer。
例如,假设当前集群中,包含 3 个可用区 z1、z2、z3,每个 Zone 内包含 2 台 OBServer。集群中有一个普通租户 tenant1,其资源分布情况如下:
obclient> CREATE RESOURCE UNIT unit1 MAX_CPU 6,MIN_CPU 6, MAX_MEMORY '36G', MIN_MEMORY '36G', MAX_IOPS 128, MIN_IOPS 128, MAX_DISK_SIZE '2T', MAX_SESSION_NUM 64;
obclient> CREATE RESOURCE POOL pool1 UNIT 'unit1', UNIT_NUM 2, ZONE_LIST ('z1','z2','z3');
obclient>CREATE TENANT tenant1 resource_pool_list=('pool1');
现在希望从每个 Zone 内减少 1 台 OBServer 来缩容,则缩容后,3 个 Zone 内均只包含 1 台 OBServer。
使用
root用户登录到数据库的sys租户。根据业务实际情况,缩小租户的资源配置。
缩小资源规格
一个 Unit 只能分布在一台 OBServer 上,不能分布在多台 OBServer 上,如果在集群缩容前,您已经通过租户缩容将 Unit 规格设置到最佳配置,那么通过该方式进行集群缩容时,只能通过减少 Unit 数量来完成本次缩容。
obclient> CREATE RESOURCE UNIT unit3 MAX_CPU 5, MAX_MEMORY '10G', MAX_IOPS 128,MAX_DISK_SIZE '10G', MAX_SESSION_NUM 64, MIN_CPU=5, MIN_MEMORY='10G', MIN_IOPS=128; obclient> ALTER RESOURCE POOL pool1 UNIT='unit3';减少
UNIT_NUMobclient> ALTER RESOURCE POOL pool1 UNIT_NUM 1;
执行以下命令,从集群中删除各 Zone 中的 OBServer。
其中,
xxx.xxx.x.xx1、xxx.xxx.x.xx2、xxx.xxx.x.xx3分别表示待删除的 OBServer 的 IP 地址。obclient> ALTER SYSTEM DELETE SERVER 'xxx.xxx.x.xx1:2882' ZONE='z1'; obclient> ALTER SYSTEM DELETE SERVER 'xxx.xxx.x.xx2:2882' ZONE='z2'; obclient> ALTER SYSTEM DELETE SERVER 'xxx.xxx.x.xx3:2882' ZONE='z3';删除后,可执行以下语句,确认列表中已查询不到这些 OBServer 则表示删除成功。
obclient> SELECT * FROM oceanbase.__all_server;
2、租户内资源的扩容和缩容
2.1通过修改 unit_config
在进行租户的扩容和缩容操作前,需要进行以下操作:
- 由于空闲的资源池会被计算为占用的资源,故在扩容前,如果有租户被删除,建议与租户对应的资源池也一并删除,以便释放资源。
- 进行租户缩容前,建议进行一轮转储以便释放租户正在使用的内存。
2.2、修改租户的资源单元配置
在通过调大和调小租户资源单元的配置进行扩容和缩容时,有以下两种场景:
- 当前租户配置了独立的资源单元配置,可以直接修改租户的资源单元配置。
- 多个租户使用了相同的资源单元配置,需要切换租户的资源单元配置。
以下将通过这两种场景提供租户扩容和缩容的操作指导。
在调大资源规格时,无论是通过修改资源配置还是切换资源配置,调整后的资源总量都必须满足以下要求:
Sum(min_cpu) <= CPU_CAPACITY;
Sum(min_memory) <= MEM_CAPACITY;
Sum(max_cpu) <= CPU_CAPACITY * resource_hard_limit;
Sum(max_mem) <= MEM_CAPACITY * resource_hard_limit;
否则,系统会报错,提示扩容失败。
CPU_CAPACITY:表示 CPU 总的容量。MEM_CAPACITY:表示内存总的容量。resource_hard_limit:是一个配置项的值。在分配 Unit 时,系统会根据配置项
resource_hard_limit的值来决定资源是否允许超卖。该配置项的默认值为100,表示不允许超卖,取值范围为 [1, 10000]。例如,如果该配置项的值设置为resource_hard_limit=200则表示允许超卖成 2 倍。
假设当前集群中,包含 3 个可用区 z1、z2、z3,每个 Zone 内包含 3 台 OBServer。集群中有一个普通租户 tenant1,其资源分配情况如下:
obclient> CREATE RESOURCE UNIT unit1 MAX_CPU 6,MAX_MEMORY '36G',MAX_IOPS 128, MAX_DISK_SIZE '2T', MAX_SESSION_NUM 64, MIN_CPU 6, MIN_MEMORY '36G', MIN_IOPS 128;
obclient> CREATE RESOURCE POOL pool1 UNIT 'unit1', UNIT_NUM 2, ZONE_LIST ('z1','z2','z3');
obclient>CREATE TENANT tenant1 resource_pool_list=('pool1');
2.3、租户配置了独立的资源单元配置的场景
如果当前租户配置了独立的资源单元配置,您可以直接通过修改租户的 unit_config 来完成租户的扩容和缩容。
使用
root用户登录数据库的sys租户。进入
oceanbase数据库。obclient>USE oceanbase;执行以下语句,获取租户的资源配置信息。
obclient>SELECT * FROM gv$unit;根据查询结果,找到当前租户对应的所有资源池信息及 unit_config 信息。
根据获取的资源单元配置信息,修改
unit1的配置。调大 unit1 的配置
- OceanBase 数据库当前版本仅严格限制了内存和 CPU,未对磁盘空间和连接数进行严格的租户隔离。
- 内存和 CPU 的最大和最小值在设计上满足最小值。即在高并发场景中,保证满足租户的最小设定值。建议设置相同的最大和最小值。
obclient> ALTER RESOURCE UNIT unit1 MAX_CPU 8, MAX_MEMORY '40G', MAX_IOPS 128, MAX_DISK_SIZE '10G', MAX_SESSION_NUM 64, MIN_CPU=8, MIN_MEMORY='40G', MIN_IOPS=128;调小
unit1的配置obclient> ALTER RESOURCE UNIT unit1 MAX_CPU 5, MAX_MEMORY '20G', MAX_IOPS 128, MAX_DISK_SIZE '10G', MAX_SESSION_NUM 64, MIN_CPU=5, MIN_MEMORY='20G', MIN_IOPS=128;
2.4、多个租户使用了相同的资源单元配置的场景
如果多个租户合用了同一个资源单元配置模版,则不能通过简单的调大资源单元配置来实现租户的扩容和缩容。因为一旦修改,将导致使用相同资源单元配置模版的所有租户同时进行了扩容或缩容。
此场景下,需要先创建独立的资源单元配置后,再为租户切换资源单元配置。
例如,待扩容或缩容的租户为 tenant1,但由于 tenant1、tenant2 均使用了 unit1 作为资源单元配置,因此需要创建一个新的资源单元。
使用
root用户登录数据库的sys租户。进入
oceanbase数据库。创建一个独立的资源单元配置。
其中,
unit2为新建的资源单元的名称,名称需要保证全局唯一。 * 创建比当前资源单元配置高的unit2obclient> CREATE RESOURCE UNIT unit2 MAX_CPU 8, MAX_MEMORY '40G', MAX_IOPS 128, MAX_DISK_SIZE '10G', MAX_SESSION_NUM 64, MIN_CPU=8, MIN_MEMORY='40G', MIN_IOPS=128;创建比当前资源单元配置低的
unit3obclient> CREATE RESOURCE UNIT unit3 MAX_CPU 5, MAX_MEMORY '20G', MAX_IOPS 128, MAX_DISK_SIZE '10G', MAX_SESSION_NUM 64, MIN_CPU=5, MIN_MEMORY='20G', MIN_IOPS=128;
修改租户的资源池,将资源池的资源单元配置替换为刚刚新创建的 Unit。
其中,
unit2和unit3为刚刚新创建的 Unit。obclient> ALTER RESOURCE POOL pool1 unit='unit2'; obclient> ALTER RESOURCE POOL pool1 unit='unit3';
2.5、检查租户配置
操作结束后,您可以通过 gv$unit 视图,确认当前租户的 unit_config 是否修改成功。
obclient> SELECT * FROM oceanbase.gv$unit
2.6、通过修改 UNIT_NUM
在进行租户的扩容和缩容操作前,需要进行以下操作:
- 由于空闲的资源池会被计算为占用的资源,故在扩容前,如果有租户被删除,建议与租户对应的资源池也一并删除,以便释放资源。
- 进行租户缩容前,建议进行一轮转储以便释放租户正在使用的内存。
- 查看集群中资源的分配情况,了解集群中资源的使用情况。
2.7修改租户的 UNIT_NUM
假设当前集群中,包含 3 个可用区 z1、z2、z3,每个 Zone 内包含 3 台 OBServer。集群中有一个普通租户 tenant1,其资源分配情况如下:
obclient> CREATE RESOURCE UNIT unit1 MAX_CPU 6,MIN_CPU 6, MAX_MEMORY '36G', MIN_MEMORY '36G', MAX_IOPS 128, MIN_IOPS 128, MAX_DISK_SIZE '2T', MAX_SESSION_NUM 64;
obclient> CREATE RESOURCE POOL pool1 UNIT 'unit1', UNIT_NUM 2, ZONE_LIST ('z1','z2','z3');
obclient>CREATE TENANT tenant1 resource_pool_list=('pool1');
2.8、调大 UNIT_NUM
随着业务量的不断变大,每个 Zone 上 2 个资源单元已经无法承载当前的业务量,因此需要考虑调大 UNIT_NUM 来提高租户的服务能力,以满足新的业务需求。
使用
root用户登录到数据库的sys租户。进入
oceanbase数据库。obclient>USE oceanbase;查询
oceanbase.gv$unit视图,获取当前租户中的资源配置信息。obclient> SELECT * FROM oceanbase.gv$unit;更多
gv$unit视图的字段及说明信息请参见 gv$unit。执行以下语句,调大
UNIT_NUM的数量。不支持通过指定
unit_id的方式调大UNIT_NUM的数量。obclient>ALTER RESOURCE POOL pool1 UNIT_NUM = 3;
2.9、调小 UNIT_NUM
调小 UNIT_NUM 实际就是删除资源单元,由于被删除的资源单元上可能存在对应租户的数据,因此,在执行删除资源单元的语句成功返回后,系统还需要将租户数据从被删除的资源单元上迁移出去。具体表现为,OceanBase 数据库会将本次删除资源单元的操作记录到 __all_rootservice_job 内部表中,查询该表可以观察本次资源单元的删除进度。
UNIT_NUM 被调小后,即将被删除的资源单元会被标记为 DELETING 状态,可以通过查询 __all_unit 表的 status 列来获取资源单元的状态。当租户数据从被删除资源单元全部迁移后,OceanBase 数据库会更新 __all_rootservice_job 表,标记本次删除资源单元的任务完成,同时清理 __all_unit 表,将处于 DELETING 状态的资源单元删除。
使用
root用户登录到数据库的sys租户。进入
oceanbase数据库。obclient>USE oceanbase;查询
oceanbase.gv$unit视图,获取当前租户中的资源配置信息。obclient> SELECT * FROM oceanbase.gv$unit;执行以下语句,调小
UNIT_NUM的数量。通过不指定
unit_id的方式调小UNIT_NUM的数量obclient>ALTER RESOURCE POOL pool1 UNIT_NUM = 1;语句执行后,系统会自动在每个 Zone 内选取 1 个资源单元进行删除。
通过指定
unit_id调小UNIT_NUM的数量其中,
1001、1003、1005表示待调小的 Unit 的unit_id。obclient> ALTER RESOURCE POOL pool1 UNIT_NUM 1 DELETE UNIT = (1001, 1003,1005);语句执行后,系统会直接删除指定的资源单元。
3、通过修改 ZONE_LIST对租户内资源的扩容和缩容,
扩大 Zone 维度的使用范围
您可以通过扩大 Zone 维度的使用范围的方式来进行租户的扩容,该扩容方式通常出现在租户副本数升级的场景中。
假设集群中当前仅有 z1、z2、z3 三个 Zone,且三个 Zone 都属于同一个 Region,每个 Zone 内 1 台 OBServer。集群中有一个普通租户 tenant1,当前副本分布情况 locality='F@z1,F@z2,F@z3', resource_pool_list=('pool1');。
租户的具体创建信息如下:
obclient> CREATE RESOURCE POOL pool1 UNIT 'unit1', UNIT_NUM 1, ZONE_LIST ('z1', 'z2', 'z3');
obclient> CREATE TENANT tenant1 RESOURCE_POOL_LIST = ('pool1');
根据业务需要,需要将租户 tenant1 由 3 副本调整为 5 副本,租户的数据范围从 'z1', 'z2', 'z3' 扩大到 'z1','z2','z3','z4','z5',以便提高租户的可用性。
使用
root用户登录到数据库的sys租户。集群中当前仅
z1、z2、z3三个 Zone,需要在集群中增加z4、z5两个 Zone。在集群中增加 Zone 的具体操作请参见 增加或删除 Zone。
在
z4、z5两个 Zone 上各添加一台 OBServer。向 Zone 内添加 OBServer 的具体操作请参见 添加 OBServer。
将资源池
pool1中ZONE_LIST的范围扩大到'z1','z2','z3','z4'。obclient> ALTER RESOURCE POOL pool1 ZONE_LIST=('z1','z2','z3','z4');为租户
tenant1在z4上增加数据副本。obclient>ALTER TENANT tenant1 LOCALITY='F@z1,F@z2,F@z3,F@z4';将资源池
pool1中ZONE_LIST的范围扩大到'z1','z2','z3','z4','z5'。obclient> ALTER RESOURCE POOL pool1 ZONE_LIST=('z1','z2','z3','z4','z5');为租户
tenant1在z5上增加数据副本。obclient>ALTER TENANT tenant1 LOCALITY='F@z1,F@z2,F@z3,F@z4,F@z5';
4、缩小 Zone 维度的使用范围
您可以通过缩小 Zone 维度的使用范围的方式来进行租户的缩容。
假设当前集群中,包含 5 个可用区 z1、z2、z3、z4、z5,且 5 个 Zone 都属于同一个 Region,每个 Zone 内 1 台 OBServer。集群中有一个普通租户 tenant1,当前副本分布情况 locality='F@z1,F@z2,F@z3,F@z4,F@z5', resource_pool_list=('pool1')。
该租户的具体创建信息如下:
obclient> CREATE RESOURCE POOL pool1 UNIT 'unit1', UNIT_NUM 1, ZONE_LIST ('z1','z2','z3','z4','z5');
obclient> CREATE TENANT tenant1 RESOURCE_POOL_LIST = ('pool1');
根据业务需要,需要将租户 tenant1 由 5 副本降为 3 副本,租户的数据范围从 'z1','z2','z3','z4','z5' 缩小到 'z1','z2','z3',减少租户存储资源使用量。
使用
root用户登录到数据库的sys租户。删除租户在
z5上的数据副本。obclient>ALTER TENANT tenant1 LOCALITY='F@z1,F@z2,F@z3,F@z4';将资源池
ZONE_LIST的范围缩小到'z1','z2','z3','z4'。obclient> ALTER RESOURCE POOL pool1 ZONE_LIST=('z1','z2','z3','z4');删除租户在
z4上的数据副本。obclient> ALTER TENANT tenant1 locality='F@z1,F@z2,F@z3';将资源池
ZONE_LIST的范围缩小到'z1','z2','z3'。obclient> ALTER RESOURCE POOL pool1 ZONE_LIST=('z1','z2','z3');执行以下语句,从集群中删除 Zone 及 Zone 中的 OBServer。
obclient> ALTER SYSTEM DELETE SERVER 'xxx.xxx.x.xx4:2882'; obclient> ALTER SYSTEM DELETE ZONE z4; obclient> ALTER SYSTEM DELETE SERVER 'xxx.xxx.x.xx5:2882'; obclient> ALTER SYSTEM DELETE ZONE z5;删除后,可以执行以下语句,确认列表中已查询不到这些 Zone 和 OBServer 则表示删除成功。
obclient> SELECT * FROM oceanbase.__all_zone; obclient> SELECT * FROM oceanbase.__all_server;结束后,本次缩容完成。




