首批通过分布式安全可靠测评,为关键业务系统打造
减少副本
更新时间:2026-03-26 09:03:35
本文介绍如何减少租户下日志流的副本数。
通过修改 Locality 减少副本
通过修改集群中某个租户的 Locality,可以减少该租户下日志流的副本数。有关修改 Locality 的详细操作和注意事项,参见 修改 Locality。
前提条件
变更 Locality 之前,需要确认待变更的 Zone 上各节点的资源分配情况。如果 Zone 上的节点资源不足导致无法存放租户需要的资源单元,则将导致无法进行 Locality 变更。
有关 Zone 上各节点的资源分配情况,请参见 查看租户和资源信息。
注意事项
租户的 Locality 不可以为空。
当租户的 Locality 发生变更时,在该租户下,所有表的副本分布情况也会随之变化。
在旧一轮租户 Locality 没有完成变更时,新一轮的租户 Locality 变更不允许被执行。
减少副本后,如果要释放资源,还需要注意缩减目标租户的资源池。
以
z1,z2,z3为例,删除z3,有两种场景:
操作步骤
示例:通过修改租户 mysql001 的 Locality,由 FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 修改为 FULL{1}@zone1, FULL{1}@zone2,减少租户的副本数。
说明
此处仅以减少 1 个 Zone 为示例,实际操作中注意减少后的 Zone 的数量需要能够满足多数派原则。
使用
root用户登录到集群的 sys 租户。obclient -h172.30.xxx.xxx -P2883 -uroot@sys#obdemo -pxxxx -A进入
oceanbase数据库。obclient>use oceanbase;查看租户
mysql001修改前的 Locality。obclient> SELECT TENANT_ID,TENANT_NAME,TENANT_TYPE,PRIMARY_ZONE,LOCALITY FROM oceanbase.DBA_OB_TENANTS; +-----------+-------------+-------------+-------------------+---------------------------------------------+ | TENANT_ID | TENANT_NAME | TENANT_TYPE | PRIMARY_ZONE | LOCALITY | +-----------+-------------+-------------+-------------------+---------------------------------------------+ | 1 | sys | SYS | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1001 | META$1002 | META | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1002 | mysql001 | USER | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | +-----------+-------------+-------------+-------------------+---------------------------------------------+可以看到租户
mysql001在 zone1、zone2、zone3 上分别有一个全能型副本。修改租户
mysql001的 Locality。obclient>ALTER TENANT mysql001 locality="FULL{1}@zone1, FULL{1}@zone2";查看 Locality 变更任务的执行状态。
obclient>SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE = 'ALTER_TENANT_LOCALITY'; +--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+------------------------------------------------------------------------------+---------------------------------------------+----------------+-------------+ | JOB_ID | JOB_TYPE | JOB_STATUS | RESULT_CODE | PROGRESS | START_TIME | MODIFY_TIME | TENANT_ID | SQL_TEXT | EXTRA_INFO | RS_SVR_IP | RS_SVR_PORT | +--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+------------------------------------------------------------------------------+---------------------------------------------+----------------+-------------+ | 1 | ALTER_TENANT_LOCALITY | SUCCESS | 0 | 100 | 2023-01-05 19:33:46.730319 | 2023-01-05 19:33:46.920111 | 1002 | ALTER TENANT mysql001 locality='FULL{1}@zone1, FULL{1}@zone2' | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | xx.xx.xx.xx | 2882 | +--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+------------------------------------------------------------------------------+---------------------------------------------+----------------+-------------+当
JOB_STATUS为SUCCESS时,则说明 Locality 变更任务执行成功。查看租户
mysql001修改后的 Locality。obclient> SELECT TENANT_ID,TENANT_NAME,TENANT_TYPE,PRIMARY_ZONE,LOCALITY FROM oceanbase.DBA_OB_TENANTS; +-----------+-------------+-------------+-------------------+---------------------------------------------+ | TENANT_ID | TENANT_NAME | TENANT_TYPE | PRIMARY_ZONE | LOCALITY | +-----------+-------------+-------------+-------------------+---------------------------------------------+ | 1 | sys | SYS | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1001 | META$1002 | META | zone1;zone2 | FULL{1}@zone1, FULL{1}@zone2 | | 1002 | mysql001 | USER | zone1;zone2 | FULL{1}@zone1, FULL{1}@zone2 | +-----------+-------------+-------------+-------------------+---------------------------------------------+通过步骤 3 与步骤 6 的查询比较,租户
mysql001的 Locality 由原来的FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3变为FULL{1}@zone1, FULL{1}@zone2,租户mysql001的副本数减少。
手动删除副本
当通过修改 Locality 减少副本时,正常情况下,系统会自动删除多余的副本,但由于一些异常原因,导致系统未正常工作,可以通过 ALTER SYSTEM REMOVE REPLICA 命令手动删除多余的日志流副本。
使用限制
系统租户(sys 租户)可以管理所有租户的日志流,用户租户仅支持管理本租户的日志流。
租户的同一个日志流,除了副本迁移任务可以并行执行多个以外,其他容灾任务(包括添加副本、删除副本、转换副本类型、修改日志流的法定成员数等)每次只能执行一个。
sys 租户可以通过视图
CDB_OB_LS_REPLICA_TASKS确认是否有正在运行的容灾任务;用户租户可以通过视图DBA_OB_LS_REPLICA_TASKS确认是否有正在运行的容灾任务。
前提条件
在执行删除副本操作前,请确认当前用户拥有
ALTER SYSTEM权限,否则无法执行ALTER SYSTEM REMOVE REPLICA命令。在查询视图前,请确认当前用户拥有以下视图的
SELECT权限,否则无法查询相关信息。DBA_OB_TENANTSDBA_OB_LS/CDB_OB_LSDBA_OB_LS_LOCATIONS/CDB_OB_LS_LOCATIONS
操作步骤
假设当前有一个 tenant1 租户,其 Locality 为 F@zone1,F@zone3,同时,tenant1 租户的 1001 号日志流在 zone1、zone2 和 zone3 上各有一个 F 类型的副本。现在需要手动将 zone2 上的副本删除。
用户登录到集群对应的租户。
连接示例如下:
obclient -h172.30.xxx.xxx -P2883 -uroot@tenant1#obdemo -pxxxx -A有关更加详细的连接数据库的操作指引,参见 连接数据库概述(MySQL 模式) 和 连接数据库概述(Oracle 模式)。
获取待操作租户的租户 ID 及 Locality 信息。
系统租户
obclient [oceanbase]> SELECT TENANT_NAME,TENANT_ID,LOCALITY FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME='tenant1';用户租户
MySQL 模式Oracle 模式MySQL 模式下执行以下语句:
obclient [oceanbase]> SELECT TENANT_NAME,TENANT_ID,LOCALITY FROM oceanbase.DBA_OB_TENANTS;Oracle 模式下执行以下语句:
obclient [SYS]> SELECT TENANT_NAME,TENANT_ID,LOCALITY FROM SYS.DBA_OB_TENANTS;查询结果的示例如下:
+-------------+-----------+------------------------------+ | TENANT_NAME | TENANT_ID | LOCALITY | +-------------+-----------+------------------------------+ | tenant1 | 1002 | FULL{1}@zone1, FULL{1}@zone3 | +-------------+-----------+------------------------------+ 1 row in set根据查询结果,该租户对应的租户 ID 为
1002。有关视图
DBA_OB_TENANTS中各字段的详细说明,请参见 DBA_OB_TENANTS。
获取待操作租户的所有日志流信息。
系统租户
obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LS WHERE TENANT_ID=1002;有关视图
CDB_OB_LS中各字段的详细说明,请参见 CDB_OB_LS。用户租户
MySQL 模式Oracle 模式MySQL 模式下执行以下语句:
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_LS;Oracle 模式下执行以下语句:
obclient [SYS]> SELECT * FROM SYS.DBA_OB_LS;查询结果的示例如下:
+-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+ | LS_ID | STATUS | PRIMARY_ZONE | UNIT_GROUP_ID | LS_GROUP_ID | CREATE_SCN | DROP_SCN | SYNC_SCN | READABLE_SCN | FLAG | +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+ | 1 | NORMAL | zone1;zone3 | 0 | 0 | NULL | NULL | 1712136316868815003 | 1712136316868815003 | | | 1001 | NORMAL | zone1;zone3 | 1001 | 1001 | 1711951923021132001 | NULL | 1712136316868815003 | 1712136316868815003 | | +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+ 2 rows in set根据查询结果可知,tenant1 租户有一个 1 号日志流和一个 1001 号日志流。
有关视图
DBA_OB_LS中各字段的详细说明,请参见 DBA_OB_LS。
根据前面获取到的日志流信息,查看 1001 号日志流的副本分布。
系统租户
obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE LS_ID=1001 AND TENANT_ID=1002;有关视图
CDB_OB_LS_LOCATIONS中各字段的详细说明,请参见 CDB_OB_LS_LOCATIONS。用户租户
MySQL 模式Oracle 模式MySQL 模式下执行以下语句:
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_LS_LOCATIONS WHERE LS_ID=1001;Oracle 模式下执行以下语句:
obclient [SYS]> SELECT * FROM SYS.DBA_OB_LS_LOCATIONS WHERE LS_ID=1001;查询结果的示例如下:
+----------------------------+----------------------------+-------+----------------+----------+----------+-------+----------+----------------------------------------------------------------------------------+----------------------+--------------+--------------+---------+ | CREATE_TIME | MODIFY_TIME | LS_ID | SVR_IP | SVR_PORT | SQL_PORT | ZONE | ROLE | MEMBER_LIST | PAXOS_REPLICA_NUMBER | REPLICA_TYPE | LEARNER_LIST | REBUILD | +----------------------------+----------------------------+-------+----------------+----------+----------+-------+----------+----------------------------------------------------------------------------------+----------------------+--------------+--------------+---------+ | 2024-04-03 17:23:06.381521 | 2024-04-03 17:23:15.934957 | 1001 | 172.xx.xxx.192 | 2882 | 2881 | zone3 | FOLLOWER | NULL | NULL | FULL | | FALSE | | 2024-04-01 14:12:08.588944 | 2024-04-03 17:23:14.904070 | 1001 | 172.xx.xxx.212 | 2882 | 2881 | zone2 | FOLLOWER | NULL | NULL | FULL | | FALSE | | 2024-04-01 14:12:08.589084 | 2024-04-03 17:23:14.080074 | 1001 | 172.xx.xxx.226 | 2882 | 2881 | zone1 | LEADER | 172.xx.xxx.192:2882:1712136186291857,172.xx.xxx.212:2882:1,172.xx.xxx.226:2882:1 | 3 | FULL | | FALSE | +----------------------------+----------------------------+-------+----------------+----------+----------+-------+----------+----------------------------------------------------------------------------------+----------------------+--------------+--------------+---------+ 3 rows in set根据查询结果可知,租户的 1001 日志流在
172.xx.xxx.192:2882、172.xx.xxx.212:2882和172.xx.xxx.226:2882上均有一个 F 类型的副本。结合 Locality 信息,需要删除日志流在172.xx.xxx.212:2882(zone2) 上的副本。有关视图
DBA_OB_LS_LOCATIONS中各字段的详细说明,请参见 DBA_OB_LS_LOCATIONS。
执行删除副本的命令。
语句如下:
ALTER SYSTEM REMOVE REPLICA LS [=] ls_id SERVER [=] 'svr_ip:svr_port' [PAXOS_REPLICA_NUM [=] paxos_replica_num] [TENANT [=] 'tenant_name'];语句使用说明:
ls_id:指定待删除副本的日志流 ID。svr_ip:svr_port:指定待删除副本所在服务器的 IP 及端口号。示例:172.xx.xxx.212:2882。paxos_replica_num:指定修改后日志流的法定成员数,即租户 Locality 中全功能型(F)副本的数量。同时一个日志流的 F 副本数最多为 7 个。指定该参数的值时,需要满足以下条件:
修改后,
paxos_replica_num需要满足多数派。paxos_replica_num的值需要大于等于当前 Leader 副本中MEMBER_LIST的成员个数。paxos_replica_num值变化的绝对值不能大于 1。例如,本示例中,当前paxos_replica_num为3,只能将paxos_replica_num修改为2。
如果指定的值有以上任一条件不满足,则系统会报错。如果不显式指定该值,系统将使用当前默认的
paxos_replica_num。tenant_name:指定待操作的租户。系统租户可以指定其他租户,用户租户只能指定本租户。如果不显式指定待操作的租户,则默认租户名为当前租户。本语句不支持使用all、all_user、all_meta等指定所有租户、用户租户以及所有 Meta 租户。本语句一次只能删除一个副本。
删除 1001 号日志流在
172.xx.xxx.212:2882上的副本,且指定删除后PAXOS_REPLICA_NUM为 2,示例如下:obclient> ALTER SYSTEM REMOVE REPLICA LS = 1001 SERVER = '172.xx.xxx.212:2882' PAXOS_REPLICA_NUM = 2;执行成功后,再次查询日志流信息,可以看到该日志流删除了一个副本。
系统租户
obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE LS_ID=1001 AND TENANT_ID=1002;用户租户
MySQL 模式Oracle 模式MySQL 模式下执行以下语句:
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_LS_LOCATIONS WHERE LS_ID=1001;Oracle 模式下执行以下语句:
obclient [SYS]> SELECT * FROM SYS.DBA_OB_LS_LOCATIONS WHERE LS_ID=1001;查询结果的示例如下:
+----------------------------+----------------------------+-------+----------------+----------+----------+-------+----------+------------------------------------------------------------+----------------------+--------------+--------------+---------+ | CREATE_TIME | MODIFY_TIME | LS_ID | SVR_IP | SVR_PORT | SQL_PORT | ZONE | ROLE | MEMBER_LIST | PAXOS_REPLICA_NUMBER | REPLICA_TYPE | LEARNER_LIST | REBUILD | +----------------------------+----------------------------+-------+----------------+----------+----------+-------+----------+------------------------------------------------------------+----------------------+--------------+--------------+---------+ | 2024-04-03 17:23:06.381521 | 2024-04-03 17:32:49.079886 | 1001 | 172.xx.xxx.192 | 2882 | 2881 | zone3 | FOLLOWER | NULL | NULL | FULL | | FALSE | | 2024-04-01 14:12:08.589084 | 2024-04-03 17:32:49.124409 | 1001 | 172.xx.xxx.226 | 2882 | 2881 | zone1 | LEADER | 172.xx.xxx.192:2882:1712136186291857,172.xx.xxx.226:2882:1 | 2 | FULL | | FALSE | +----------------------------+----------------------------+-------+----------------+----------+----------+-------+----------+------------------------------------------------------------+----------------------+--------------+--------------+---------+ 2 rows in set根据查询结果可知,租户的 1001 日志流在
172.xx.xxx.192:2882和172.xx.xxx.226:2882上均有一个 F 类型的副本。原来172.xx.xxx.212:2882上的副本已删除。