暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OceanBase数据库副本常见操作流量分布

Tonyhacks 2023-12-11
607

流量分布

在 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 和 sz1sh1 和 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 进行改写,改写规则如下:

  1. 将用户设置的 Primary Zone 中的所有 Zone 对应的 Region 列出。例如:primary_zone 为 hz1,hz2;sh1,sh2;sz1 对应的 primary_region 的列表为 hz,hz;sh,sh;sz 。
  2. 将 primary_region 中重复的 Region 去掉,去掉规则为保留第一个出现的 Region,其他 Region 后续重复的 Region 移除,例如 hz1,hz2;sh1,sh2;sz1 ,其 primary_region 转化为列表 hz;sh;sz 。
  3. 依据 primary_region 中各 Region 的优先级,对 primary_zone 进行补充,补充规则如下:将 Primary Zone 中各 Region 对应的 Zone 都取出,重新排列,高优先级 Region 内 Zone 比低优先级 Region 内 Zone 的优先级高,同一 Region 内 Zone 的优先级高低参考原始 Primary Zone 中的优先级。

例如:假设共有 9 个 Zone,sh1sh2sh3 三个 Zone 在 Region SHhz1hz2hz3 三个 Zone 在 Region HZsz1sz2sz3 三个 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 的优先级。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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论