[TOC] # Locality 管理概述 Locality 描述了表、表组或租户下副本的分布情况。这里的副本分布情况指在 Zone 或 Region 上包含的副本的数量以及副本的类型,不同的租户在同一个集群内可以配置不同的 Locality 并且彼此之间相互独立不受影响。 ## Locality 语义 Locality 基本语法结构型为如下所示: ~~~ replicas{量词}@location ~~~ 下述表格展示了语法中各元素的意义 <table data-tag="table" id="table-jwj-2qj-i6r" class="table"><colgroup width="360" span="1" data-tag="col" id="col-dsv-fi3-euy" colwidth="1*" colnum="1" colname="col1" style="width:25%" class="col"></colgroup><colgroup width="360" span="1" data-tag="col" id="col-bke-jg3-l3q" colwidth="3*" colnum="2" colname="col2" style="width:75%" class="col"></colgroup><thead id="thead-yyi-s0i-n3t" class="thead"><tr id="tr-xm9-yru-ent"><th id="td-sf7-9ov-8rd"><p id="p-gau-te7-rts"><b>元素</b></p></th><th id="td-w91-n8k-y2j"><p id="p-d5q-63f-cdp"><b>说明</b></p></th></tr></thead><tbody data-tag="tbody" id="tbody-mdu-oej-9sr" class="tbody"><tr data-tag="tr" id="tr-tgr-b5w-mrc" class="tr"><td data-tag="td" id="td-9qf-a4i-5hz" class="td"><p data-tag="p" id="p-zed-yld-soj" class="p">replicas</p></td><td data-tag="td" id="td-h4g-eei-zns" class="td"><p data-tag="p" id="p-79r-yy2-do5" class="p">表示副本类型,副本类型相关说明请参见<b> </b><a href="replica-overview" id="a-yqa-gyc-97z" data-tag="xref" baseurl="t1940577_v2_0_1.xdita" data-node="2784705" data-root="66771" class="xref">副本概述</a><b> </b>章节。 </p><p data-tag="p" id="p-79r-yy2-do5" class="p"><span data-mce-style="font-size: 11px" data-tag="span" id="span-nv1-49z-eh7" class="span"><code data-tag="code" class="code">replicas</code>的值为副本名称,您可以在副本类型说明表中的<b>名称</b>列获得支持的值(支持全名和简写)。</span></p></td></tr><tr data-tag="tr" id="tr-s0v-2ct-5mb" class="tr"><td data-tag="td" id="td-8ph-hsf-tvp" class="td"><p id="p-h95-an0-y5t">location</p></td><td data-tag="td" id="td-k40-cj8-txr" class="td"><p id="p-v5z-2bc-df3">表示位置。它是系统已知的一组枚举值。 </p><span data-mce-style="font-size: 11px" data-tag="span" id="span-o20-15i-sfn" class="span"><code data-tag="code" class="code">location</code>的值为 Zone 的名称。</span></td></tr><tr data-tag="tr" id="tr-08k-trs-gv3" class="tr"><td data-tag="td" id="td-r0d-puu-bxw" class="td"><p id="p-0lq-ije-xzy">量词</p></td><td data-tag="td" id="td-fhg-e2d-6n1" class="td"><p data-tag="p" id="p-45c-2i0-oqr" class="p">不指定量词的时候,表示一个副本。用 <code data-tag="code" class="code">{n}</code>表示 n 个副本。</p><p data-tag="p" id="p-h4s-c16-auc" class="p">有一种特殊的量词 <code data-tag="code" class="code">{all_server}</code>表示副本数和可用的 Server 的数量相同。一个分区在一个 Zone 中最多有一个全功能或日志型副本(这些类型的副本是 Paxos 复制组的成员),只读型副本在同一个 Zone 中可以有多个。</p></td></tr></tbody></table> **说明** * 表和表组的 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 迁到上海。