Locality 管理概述 
==================================

Locality 描述了表、表组或租户下副本的分布情况。这里的副本分布情况指在 Zone 或 Region 上包含的副本的数量以及副本的类型，不同的租户在同一个集群内可以配置不同的 Locality 并且彼此之间相互独立不受影响。

Locality 语义 
--------------------

Locality 基本语法结构型为如下所示：

```sql
replicas{量词}@location
```



下述表格展示了语法中各元素的意义：


|  **元素**  |                                                                                  **说明**                                                                                   |
|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| replicas | 表示副本类型，副本类型相关说明请参见[副本概述](../../../6.administrator-guide/5.data-distribution-and-link-management/2.replica-management/1.replica-overview.md)章节。  `replicas`的值为副本名称，您可以在副本类型说明表中的 **名称** 列获得支持的值（支持全名和简写）。                        |
| location | 表示位置。它是系统已知的一组枚举值。  `location`的值为 Zone 的名称。                                                                                                               |
| 量词       | 不指定量词的时候，表示一个副本。用 `{n}`表示 n 个副本。 有一种特殊的量词 `{all_server}`表示副本数和可用的 Server 的数量相同。一个分区在一个 Zone 中最多有一个全功能或日志型副本（这些类型的副本是 Paxos 复制组的成员），只读型副本在同一个 Zone 中可以有多个。 |


**说明**



* 表和表组的 Locality 可以为空，表示继承自所属租户。租户的 Locality 不可以为空。

  

* 当租户的 Locality 发生变更时，在该租户下，所有 Locality 为空的表的副本的分布情况也会随之变化。Locality 不为空的表在租户的 Locality 变更时，其对应副本的分布情况不会改变。

  




**示例:** 

下述示例展示了在一个拥有五个 Zone（z1\~z5）的 OceanBase 集群中，可以容纳不同 Locality 的多个租户和它们的 Locality 情况：

* sys tenant 的 Locality： `F@z1,F@z2,F@z3,F@z4,F@z5`

  

* tenant1 的 Locality： `F@z1,F@z2,F,R{ALL_SERVER}@z3`

  

* tenant2 的 Locality： `F@z1`

  




Locality 变更规则 
----------------------

Locality 的变更需要遵循以下规则：

* 变更进度与 tenant/table 级变更限制

  * 在旧的一轮租户 Locality 没有完成变更时，新一轮的租户 Locality 变更不允许被执行。

    
  
  * 表级 Locality Zone List 必须是租户级 Locality Zone List 的子集。

    
  

  

* Paxos 副本数变更规则

  * Locality 变更的类型转换目前仅支持 F-\>R、R-\>F 和 F-\>L 三种：

    * F-\>R 从 full 副本转换为 readonly 副本，是减 Paxos 副本操作，每次减的 Paxos 副本数需小于变更后 Paxos 的副本数。

      
    
    * R-\>F 从 readonly 副本转换为 full 副本，是加 Paxos 副本操作，每次加的 paxos 副本数需小于变更前 Paxos 的副本数。

      
    
    * F-\>L 从 full 副本转换为 logonly 副本，不涉及 Paxos 副本数量的变化。F-\>L 的变更不能与任何加或减 Paxos 副本的操作同时发生。

      
    

    
  
  * 非 Paxos 副本的变化可以和上述任何变更同时发生，没有数量限制。

    
  

  




Locality 应用场景 
----------------------

Locality 的设置通常用于集群的副本数升级、降级或集群的搬迁：

* 集群副本数升级

  以租户为粒度，对集群中的每一个租户，增加租户下 Partition 的副本数。例如，将 Locality 由 `F@z1,F@z2,F@z3`变更为 `F@z1,F@z2,F@z3,F@z4,F@z5`，租户从 3 副本变为 5 副本。
  

* 集群副本数降级

  以租户为粒度，对集群内的每一个租户减少其中 Partition 的副本数。例如，将 Locality 由 `F@z1,F@z2,F@z3,F@z4,F@z5 `变更为 `F@z1,F@z2,F@z3,F@z4`，租户从 5 副本变为 4 副本。
  

* 集群搬迁

  以租户为粒度，对集群内的每一个租户通过若干次 Locality 变更。比如，将 Locality 从 `F@hz1,F@hz2,F@hz3`变更为 `F@hz1,F@sh1,F@sh2`即代表将原集群中属于杭州的两个 Zone 迁到上海。
  



