通过克隆租户生成一个相同的新租户
基于租户克隆功能,在系统租户下执行一条租户克隆语句,就可以快速的基于源租户克隆出一个新租户。
正如克隆一词所描述的,新克隆出的租户,在初始时刻,它包含的数据就是源租户在语句执行时刻的一个快照。克隆租户的操作可以类比为进程的 fork 操作。 fork 操作是父进程把页表信息拷贝一份给子进程,使得子进程在初始时刻访问的是和父进程完全相同的物理页。克隆操作也一样,在克隆的过程中,将源租户的元数据拷贝一份给到新克隆租户,使得新克隆租户在初始时刻,访问的是和源租户完全相同的物理宏块。
因为整个克隆过程中,只拷贝了元数据,没有实际拷贝数据,所以克隆操作可以非常快速的完成。在我们的测试环境中,一个 8 核 64 G 包含 50 万张表 8TB 数据的租户,克隆出一个新的 8 核 64 G的租户,只要两分钟就可以完成。
新克隆出来的租户和源租户是两个完全独立的租户,它们具有各自的 CPU、内存和 IOPS 资源,不会互相影响。
对于报表任务,我们可以基于生产租户快速克隆出一个新的报表租户,这个新的报表租户有自己的 CPU、内存 和 IOPS 资源,我们可以放心地在报表租户上跑报表任务,尽可能减少对生产租户的影响。
OceanBase从 4.3 版本开始,支持行列混存模式,如果源租户是行列混存的结构,那么克隆出的新租户也是行列混存结构,可以非常好地支持 AP 负载。
对于“从生产租户移走复杂查询”,可以基于生产租户克隆出一个新租户,将新租户设置为生产租户的备租户,这样新租户就会主动从生产租户拉取日志进行回放,能够对外提供准实时的弱读服务。如此,就可以把来自内部运营系统中的复杂查询负载,转移到新克隆的只读备租户上了。
对于“应用版本升级”,在版本发布前预发验证时就可以基于生产租户快速克隆出一个预发测试租户,用预发测试租户进行发版前最后的预发验证。
通常版本发布的第一个步骤是备份数据库,在 4.3 版本,就可以调整为基于生产租户快速克隆出一个小规格的临时备份租户。 假如非常不幸,版本发布出现问题,那么便可以用新克隆出来的临时备份租户再克隆出一个新的生产租户,从而实现数据库的快速恢复。因为克隆操作非常快,所以租户克隆技术可以最大限度地减少版本发布的时间。
单个租户可以克隆出多个不同规格的租户,这些租户也可以应用在不同场景中。
使用租户克隆
1、登录用户租户。
obclient -h127.0.0.1 -P2881 -uroot@mysql_tenant -A
2、创建测试数据库。
create database testdb;
3、创建测试表。
use testdb
create table test(id int, code1 varchar(10),code2 varchar(10));
4、插入数据。
insert into test values(1,'apple','a');
insert into test values(2,'banana','b');
insert into test values(3,'carambola','c');
5、退出数据库,创建备份目录。
exit;
mkdir backup
6、在 OBserver 节点上,通过本地 Unix Socket 连接集群的 MySQL 租户。
obclient -S /home/admin/oceanbase/observer/run/sql.sock -uroot@mysql_tenant
7、配置数据库可以访问的路径 /root/backup。
SET GLOBAL secure_file_priv = "/root/backup";
8、退出后重新用用户租户的租户管理员登录到数据库。
exit;
obclient -h127.0.0.1 -P2881 -uroot@mysql_tenant -A
9、配置本租户的归档目的端。
ALTER SYSTEM SET LOG_ARCHIVE_DEST='LOCATION=file:///root/backup';
10、开启归档模式。
ALTER SYSTEM ARCHIVELOG;
11、查看归档进度。
SELECT * FROM oceanbase.DBA_OB_ARCHIVELOG\G
12、执行一次转储。
ALTER SYSTEM MINOR FREEZE;
13、退出用户租户,使用 root 用户登录到集群的 sys 租户。
当查看日志归档进度为 DOING,则登录 SYS 租户,进行租户克隆。
exit;
obclient -h127.0.0.1 -P2881 -uroot@sys -A -Doceanbase
14、创建克隆租户的 Unit。
CREATE RESOURCE UNIT clone_unit_config
MEMORY_SIZE = '2G',
MAX_CPU = 1, MIN_CPU = 1,
LOG_DISK_SIZE = '6G',
MAX_IOPS = 10000, MIN_IOPS = 10000, IOPS_WEIGHT=1;
15、克隆租户
CREATE TENANT clone_mysql001 FROM mysql_tenant
WITH
RESOURCE_POOL = clone_tnt_pool,
UNIT= clone_unit_config;
16、查看克隆任务状态。
SELECT * FROM oceanbase.DBA_OB_CLONE_HISTORY\G
exit
17、对比源租户与克隆的租户内容。
# 查看源租户的表及数据
obclient -h127.0.0.1 -P2881 -uroot@mysql_tenant -A -Dtestdb
SHOW TABLES;
SELECT * FROM test;
exit
#查看克隆的租户的表及数据。
obclient -h127.0.0.1 -P2881 -uroot@clone_mysql001 -A -Dtestdb
SHOW TABLES;
SELECT * FROM test;
通过对比源租户及克隆后的新租户,两者之间的表及数据都完全一致。




