流量分布
在 OceanBase 数据库中,Leader 承担事务中的读写请求,因此每个分区 Leader 的分布决定了流量在每个节点上的分布。
流量介绍
数据库系统在应用架构中承担了数据存储和查询的功能,应用的读写请求称为数据库流量。数据库流量分为写流量、强一致读流量和弱一致读流量,写流量和强一致读流量由 OceanBase 数据库的 Leader 副本提供服务,弱一致读流量由 Leader 副本和 Follower 副本提供服务。ODP 提供了数据库流量的路由选择能力,ODP 实现了一个简单的 SQL Parser 模块,解析出 SQL 中的库名、表名及 hint ,从而根据业务 SQL、路由规则、及 OBServer 节点的状态,选择最合适的一个 OBServer 节点转发请求。
Primary Zone 介绍
流量分布通过 Primary Zone 来描述,Primary Zone 描述了 Leader 副本的偏好位置,而 Leader 副本承载了业务的强一致读写流量,即 Primary Zone 决定了 OceanBase 数据库的流量分布。假设某张表 t1 的 primary_zone="Zone1",则 RootService 会尽量将 t1 表的 Leader 调度到 Zone1 上来。
说明
副本描述的对象是数据,而 Primary Zone 描述的对象是承载数据的容器,从而该容器下的数据继承容器的 Primary Zone 属性所描述的 Leader 偏好位置。OceanBase 数据库当前版本仅支持租户级别的 Primary Zone,而 OceanBase 数据库 V3.x 还支持表级、DB级、Table Group 级别配置 Primary Zone。
Primary Zone 实际上是一个 Zone 的列表,列表中包含多个 Zone。该列表用如下方式为 Zone 配置优先级:
当 Primary Zone 列表包含多个 Zone 时,用 ‘;’ 分隔的具有从高到底的优先级;用 ‘,’ 分隔的具有相同优先级,表示流量打散在多个 Zone 上,这几个 Zone 同时提供服务。
例如:'hz1,hz2;sh1,sh2;sz1' 表示 hz1 和 hz2 具有相同的优先级,并且优先级高于 sh1/sh2 和 sz1;sh1 和 sh2 具有相同优先级,并且优先级高于 sz1。
OceanBase 数据库当前版本仅支持租户级别的 Primary Zone,不再支持表级、DB 级、Table Group 级配置 Primary Zone 。如果创建租户时未指定 primary_zone,默认填写为 RANDOM,表示各个 Zone 优先级相同。
租户的 Primary Zone 属性可以通过系统租户下 oceanbase.DBA_OB_TENANTS 视图的 PRIMARY_ZONE 字段查看。示例如下:
obclient> SELECT * FROM oceanbase.DBA_OB_TENANTS limit 10;
+-----------+-------------+-------------+----------------------------+----------------------------+--------------+---------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+---------------------+---------------------+---------------------+---------------------+--------------+----------------------------+
| TENANT_ID | TENANT_NAME | TENANT_TYPE | CREATE_TIME | MODIFY_TIME | PRIMARY_ZONE | LOCALITY | PREVIOUS_LOCALITY | COMPATIBILITY_MODE | STATUS | IN_RECYCLEBIN | LOCKED | TENANT_ROLE | SWITCHOVER_STATUS | SWITCHOVER_EPOCH | SYNC_SCN | REPLAYABLE_SCN | READABLE_SCN | RECOVERY_UNTIL_SCN | LOG_MODE | ARBITRATION_SERVICE_STATUS |
+-----------+-------------+-------------+----------------------------+----------------------------+--------------+---------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+---------------------+---------------------+---------------------+---------------------+--------------+----------------------------+
| 1 | sys | SYS | 2023-05-17 18:10:19.940353 | 2023-05-17 18:10:19.940353 | RANDOM | FULL{1}@zone1 | NULL | MYSQL | NORMAL | NO | NO | PRIMARY | NORMAL | 0 | NULL | NULL | NULL | NULL | NOARCHIVELOG | DISABLED |
| 1001 | META$1002 | META | 2023-05-17 18:15:21.455549 | 2023-05-17 18:15:36.639479 | zone1 | FULL{1}@zone1 | NULL | MYSQL | NORMAL | NO | NO | PRIMARY | NORMAL | 0 | NULL | NULL | NULL | NULL | NOARCHIVELOG | DISABLED |
| 1002 | mysql001 | USER | 2023-05-17 18:15:21.461276 | 2023-05-17 18:15:36.669988 | zone1 | FULL{1}@zone1 | NULL | MYSQL | NORMAL | NO | NO | PRIMARY | NORMAL | 0 | 1684398681521302749 | 1684398681521302749 | 1684398681345969089 | 4611686018427387903 | NOARCHIVELOG | DISABLED |
| 1003 | META$1004 | META | 2023-05-17 18:18:19.927859 | 2023-05-17 18:18:36.443233 | zone1 | FULL{1}@zone1 | NULL | MYSQL | NORMAL | NO | NO | PRIMARY | NORMAL | 0 | NULL | NULL | NULL | NULL | NOARCHIVELOG | DISABLED |
| 1004 | oracle001 | USER | 2023-05-17 18:18:19.928914 | 2023-05-17 18:18:36.471606 | zone1 | FULL{1}@zone1 | NULL | ORACLE | NORMAL | NO | NO | PRIMARY | NORMAL | 0 | 1684398681335427475 | 1684398681335427475 | 1684398681144712832 | 4611686018427387903 | NOARCHIVELOG | DISABLED |
| 1005 | META$1006 | META | 2023-05-18 15:48:57.441320 | 2023-05-18 15:49:12.820051 | zone1 | FULL{1}@zone1 | NULL | MYSQL | NORMAL | NO | NO | PRIMARY | NORMAL | 0 | NULL | NULL | NULL | NULL | NOARCHIVELOG | DISABLED |
| 1006 | mq_t1 | USER | 2023-05-18 15:48:57.447657 | 2023-05-18 15:49:12.857944 | zone1 | FULL{1}@zone1 | NULL | MYSQL | NORMAL | NO | NO | PRIMARY | NORMAL | 0 | 1684398680916392609 | 1684398680916392609 | 1684398680742451346 | 4611686018427387903 | NOARCHIVELOG | DISABLED |
+-----------+-------------+-------------+----------------------------+----------------------------+--------------+---------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+---------------------+---------------------+---------------------+---------------------+--------------+----------------------------+
7 rows in set
Region 属性
在 OceanBase 数据库中,Zone 有一个 Region 属性(DBA_OB_ZONES 视图的 REGION 字段),表示该 Zone 所处的地区,每个 Zone 仅能配置一个 Region,但一个 Region 内可包含多个 Zone。Primary Zone 的设置隐含的包含了 Leader 偏好的 Region 位置。具体指用户设置 Primary Zone 时包含两层语义:
- 被指定的 Primary Zone 为 Leader 的偏好 Zone 的 Region。
- 被指定 Primary Zone 所在的 Region 为 Leader 偏好的 Region。
具体地,Leader 会被优先调度到最高优先级的 Zone 上去,如果最高优先级的 Zone 上的副本不能成为 Leader,会优先选择同一个 Region 内的其他 Zone 作为 Leader 的位置,从而保证业务访问 OceanBase 数据库尽量不跨城。
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 移除,例如hz1,hz2;sh1,sh2;sz1,其primary_region转化为列表hz;sh;sz。 - 依据
primary_region中各 Region 的优先级,对primary_zone进行补充,补充规则如下:将 Primary Zone 中各 Region 对应的 Zone 都取出,重新排列,高优先级 Region 内 Zone 比低优先级 Region 内 Zone 的优先级高,同一 Region 内 Zone 的优先级高低参考原始 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。RegionSH中的 Zone 的优先级高于 RegionHZ和 RegionSZ中 Zone 的优先级。RegionHZ中的 Zone 的优先级高于 RegionSZ中 Zone 的优先级。各 Region 内每个 Zone 的优先级为:在 RegionSH中sh1>sh2=sh3,在 RegionHZ中hz1>hz2>hz3,在 RegionSZ中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。RegionSH中的 Zone 的优先级高于 RegionHZ和 RegionSZ中 Zone 的优先级。RegionHZ中的 Zone 的优先级高于 RegionSZ中 Zone 的优先级。各 Region 内每个 Zone的优先级为:在 RegionSH中sh1=sh2>sh3,在 RegionHZ中hz1>hz2>hz3,在 RegionSZ中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。RegionSH和 RegionHZ中的 Zone 的优先级高于 RegionSZ中 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。




