---
title: "通过 Primary Zone 设置负载均衡 | OceanBase 文档中心"
description: 通过 Primary Zone 设置负载均衡 Primary zone 表示 Leader 副本的偏好位置。指定 Primary zone 实际上是指定了 Leader 更趋向于被调度到哪个 Zone 上，即：假设某张表 t1 的 primary_zone = &quot;zone1&quot; ，则 RootService 会尽量将 …
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 3.1.2 企业版

# 通过 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 语法如下：

```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` 的示例如下：

```sql
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` 的示例如下：

```sql
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`的示例如下：

```sql
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`的示例如下：

```sql
obclient> CREATE DATABASE test2 DEFAULT CHARACTER SET UTF8 PRIMARY_ZONE = 'zone2';
Query OK, 1 row affected (0.00 sec)

```

修改租户 `tenant1` 的 `PRIMARY_ZONE` 为 `zone2` 的示例如下：

```sql
obclient> ALTER TENANT tenant1 PRIMARY_ZONE e='zone2';

```

修改表 `t1` 的 `PRIMARY_ZONE` 为 `zone2` 的示例如下：

```sql
obclient> ALTER TABLE t2 PRIMARY_ZONE ='zone2';

```

修改表组 `tg1` 的 `PRIMARY_ZONE` 为 `zone2` 的示例如下：

```sql
obclient> ALTER TABLEGROUP tgh SET PRIMARY_ZONE ='zone2';

```

修改数据库 `test2` 的 `PRIMARY_ZONE` 为 `zone2` 的示例如下：

```sql
obclient> ALTER DATABASE test2 PRIMARY_ZONE ='zone2';

```

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
