基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
通过 Primary Zone 设置负载均衡
更新时间:2024-06-24 10:10:39
Primary zone 表示 Leader 副本的偏好位置。指定 Primary zone 实际上是指定了 Leader 更趋向于被调度到哪个 Zone 上,即:假设某张表 t1 的 primary_zone = "zone1",则 RootService 会尽量将 t1 表的 Leader 调度到 zone1 上来。
Primary zone 实际上是一个 Zone 的列表,列表中包含多个 Zone。当 Primary zone 列表包含多个 Zone 时,用 ; 分隔的具有从高到低的优先级;用 , 分隔的具有相同优先级。
例如:‘hz1,hz2;sh1,sh2;sz1’ 表示 hz1 和 hz2 具有相同的优先级,并且优先级高于 sh1、sh2 和 sz1,sh1 和 sh2 具有相同优先级,并且优先级高于 sz1。
Region 信息
在 OceanBase 数据库中,Zone 有一个 Region 属性,表示该 Zone 所处的地区,每个 Zone 仅能配置一个 Region,但一个 Region 内可包含多个 Zone。Primary zone 的设置隐含的包含了 Leader 偏好的 Region 位置。具体指用户设置 Primary_zone 包含两层语义:
被指定的 Primary zone 为 Leader 的偏好 Zone 的位置。
被指定的 Primary zone 所在的 Region 为 Leader 偏好的 Region。
具体地讲,Leader 会被优先调度到最高优先级的 Zone,如果最高优先级的 Zone 上的副本不能成为 Leader,会优先选择同一个 Region 内的其他 Zone 作为 Leader 的位置。
Primary zone 改写
用户设置的 Primary zone 会由 OceanBase 数据库内部基于各个 Zone 所在的 Region 进行改写,改写规则如下:
将用户设置的 Primary zone 中的所有 Zone 对应的 Region 列出。
例如:primary_zone 为 ‘hz1,hz2;sh1,sh2;sz1’ 对应的 primary_region 的列表为 ‘hz,hz;sh,sh;sz’。
将 primary_region 中重复的 Region 去掉,去掉规则为保留第一个出现的 Region,其他 Region 后续重复的 Region 移除,则上述 primary_region 转化为 primary_region 列表 ‘hz;sh;sz’。
依据 primary_region 中各 Region 的优先级,对 primary_zone 进行补充,补充规则如下:将 Primary region 中各 Region 对应的 Zone 都取出,重新排列,高优先级 Region 内 Zone 比低优先级 Region 内 Zone 的优先级高,同一 Region 内 Zone 的优先级高低参考原始 Primary zone 中的优先级。
继承关系
当前有 Table 级、TableGroup 级、Database 级以及 Tenant 级的 primary_zone。
除 Tenant 级别外,每个级别均可以自由指定 primary_zone 的分布情况,如果不指定那么默认向上继承,Tenant 维度必须指定 primary_zone(租户级的 primary_zone 不能为空,如果创建时未指定 primary_zone,默认填写成 RANDOM,表示各个 Zone 优先级相同)。
Table 级
查看自身的 primary_zone,若不为空,则使用 Table 的 primary_zone。
若为空,则判断是否属于 TableGroup。
TableGroup 级
若属于 TableGroup,则查看 TableGroup 的 primary_zone 是否为空,若不为空,则使用 TableGroup 的 primary_zone。
若 TableGroup 为空或不属于 TableGroup,则查看 Database 的 primary_zone 是否为空。
Database 级
查看自身的 primary_zone,若不为空,则使用 Database 的 primary_zone。
若为空,则使用 Tenant 的 primary_zone。
示例
假设共有 9 个 Zone,sh1,sh2,sh3 三个 Zone 在 Region SH,hz1,hz2,hz3 三个 Zone 在 Region HZ,sz1,sz2,sz3 三个 Zone在 Region SZ。
示例一
用户设置的 primary_zone 为 ‘sh1;hz1;hz2;sz1’,按照改写规则 1 得到 primary_region 为 ‘SH;HZ;HZ;SZ’;按照改写规则 2 得到 primary_region 为 ‘SH;HZ;SZ’;按照改写规则 3 得到 primary_zone 为 ‘sh1;sh2,sh3;hz1;hz2;hz3;sz1;sz2,sz3’。
解释如下:三个 Region 的优先级为 SH > HZ > SZ。Region SH 中的 Zone 的优先级高于 Region HZ 和 Region SZ 中 Zone 的优先级。Region HZ 中的 Zone 的优先级高于 Region SZ 中 Zone 的优先级。各 Region 内每个 Zone 的优先级为:在 Region SH 中 sh1 > sh2 = sh3,在 Region HZ 中 hz1 > hz2 > hz3,在 Region SZ 中 sz1 > sz2 = sz3。因此最终得到新的 Primary zone 为 ‘sh1;sh2,sh3;hz1;hz2;hz3;sz1;sz2,sz3’。Leader 会优先分布在 sh1 上,当 sh1 发生故障时,Leader 会依照上面的 Primary zone 优先级依次分布在 sh2 和 sh3。
示例二
用户设置的 primary_zone 为 ‘sh1,sh2;hz1;hz2;sz1’,按照改写规则 1 得到 primary_region 为 ‘SH,SH;HZ;HZ;SZ’。按照改写规则 2 得到 primary_region 为 ‘SH;HZ;SZ’。按照改写规则 3 得到 primary_zone 为 ‘sh1,sh2;sh3;hz1;hz2;hz3;sz1;sz2,sz3’。
解释如下:三个 Region 的优先级为 SH > HZ > SZ。Region SH 中的 Zone 的优先级高于 Region HZ 和 Region SZ 中 Zone的优先级。Region HZ 中的 Zone 的优先级高于 Region SZ 中 Zone的优先级。各 Region 内每个 Zone 的优先级为:在 Region SH 中 sh1 = sh2 > sh3,在 Region HZ 中 hz1 > hz2 > hz3,在 Region SZ 中 sz1 > sz2 = sz3。因此最终得到新的 Primary zone 为 ‘sh1,sh2;sh3;hz1;hz2;hz3;sz1;sz2,sz3’。Leader 会优先平均分布在 sh1 和 sh2 上,当 sh1 和 sh2 发生故障时,Leader 会依照上面 Primary zone 优先级依次分布在 sh3。
示例三
用户设置的 primary_zone 为 ‘sh1,hz1;hz2;sz1’,按照改写规则 1 得到 primary_region 为 ‘SH,HZ;HZ;SZ’。按照改写规则 2 得到 primary_region 为 ‘SH,HZ;SZ’。按照改写规则 3 得到改写后 primary_zone 为 ‘sh1,hz1;hz2;sh2,sh3,hz3;sz1;sz2,sz3’。
解释如下:三个 Region 的优先级为 SH = HZ > SZ。Region SH 和 Region HZ 中的 Zone 的优先级高于 Region SZ 中 Zone 的优先级。Zone 的优先级为 sh1=hz1>hz2>sh2=sh3=hz3>sz1>sz2=sz3。因此最终得到新的 Primary zone 为 ‘sh1,hz1;hz2;sh2,sh3,hz3;sz1;sz2,sz3’。Leader 会优先平均分布在 sh1 和 hz1 上,当 sh1 和 hz1 发生故障时,Leader 会依照上面 Primary zone 优先级依次分布在 hz2。
Primary zone 的设置和修改
数据库管理员对 Primary Zone 进行设置或修改的 SQL 语法如下:
CREATE TENANT [IF NOT EXISTS] tenant_name PRIMARY_ZONE [=] zone;
CREATE TABLE [IF NOT EXISTS] table_name PRIMARY_ZONE [=] zone;
CREATE TABLEGROUP [IF NOT EXISTS] tablegroupname PRIMARY_ZONE [=] zone;
CREATE DATABASE [IF NOT EXISTS] database_name PRIMARY_ZONE [=] zone;
CREATE USER username IDENTIFIED BY ****** PRIMARY_ZONE 'zone_name'; -- 仅适用于 Oracle 模式
ALTER TENANT tenant_name [SET] PRIMARY_ZONE [=] zone;
ALTER TABLE [SET] PRIMARY_ZONE [=] zone;
ALTER TABLEGROUP tablegroup_namee SET PRIMARY_ZONE [=] zone;
ALTER DATABASE [database_name] [SET] PRIMARY_ZONE [=] zone;
ALTER USER username PRIMARY_ZONE 'zone_name'; -- 仅适用于 Oracle 模式
字段说明:
tenant_name:指定租户名。最长 128 个字符,只能有大小写英文字母,数字和下划线,而且必须以字母或下划线开头,并且不能是 OceanBase 数据库的关键字。table_name:指定数据库表名。tablegroupname:表组名称,最长 64 个字符,字符只能有大小写英文字母,数字和下划线,而且必须以字母或下划线开头,并且不能使用 OceanBase 数据库的关键字。如果要创建的表组名称已存在,并且没有指定
IF NOT EXISTS,则会出现错误。database_name:指定要修改属性的数据库名称。zone:指定数据库的 Primary Zone。
示例
创建租户并设置 PRIMARY_ZONE 为 zone2 的示例如下:
obclient> CREATE TENANT IF NOT EXISTS t1 charset='utf8mb4', replica_num=1, zone_list=('zone1'), primary_zone='zone2', resource_pool_list=('pool1');
创建数据库表 test ,并设置 PRIMARY_ZONE 为 zone2 的示例如下:
obclient> CREATE TABLE test (c1 INT PRIMARY KEY, c2 VARCHAR(50)) REPLICA_NUM = 3,
PRIMARY_ZONE = 'zone2';
Query OK, 0 rows affected
创建表组并设置 PRIMARY_ZONE 为 zone2的示例如下:
obclient> CREATE TABLEGROUP myTableGroup1 PRIMARY_ZONE = 'zone2';
Query OK, 0 rows affected
obclient> CREATE TABLE myt1 (c1 int, c2 int ) TABLEGROUP = myTableGroup1 PRIMARY_ZONE = 'zone2';
Query OK, 0 rows affected
obclient> CREATE TABLE myt2 (c1 int, c2 int ) TABLEGROUP = myTableGroup1 PRIMARY_ZONE = 'zone2';
Query OK, 0 rows affected
创建数据库并设置 PRIMARY_ZONE 为 zone2的示例如下:
obclient> CREATE DATABASE test2 DEFAULT CHARACTER SET UTF8 PRIMARY_ZONE = 'zone2';
Query OK, 1 row affected (0.00 sec)
修改租户 tenant1 的 PRIMARY_ZONE 为 zone2 的示例如下:
obclient> ALTER TENANT tenant1 PRIMARY_ZONE e='zone2';
修改表 t1 的 PRIMARY_ZONE 为 zone2 的示例如下:
obclient> ALTER TABLE t2 PRIMARY_ZONE ='zone2';
修改表组 tg1 的 PRIMARY_ZONE 为 zone2 的示例如下:
obclient> ALTER TABLEGROUP tgh SET PRIMARY_ZONE ='zone2';
修改数据库 test2 的 PRIMARY_ZONE 为 zone2 的示例如下:
obclient> ALTER DATABASE test2 PRIMARY_ZONE ='zone2';