【 使用环境 】生产环境
【 OB or 其他组件 】OB
【 使用版本 】 4.2.1-10BP
【问题描述】
1-1-1集群。primary zone采用的 随机分布。
如果部分业务量大的表集中在同一台机器,会导致这台机器负载过高。
能不能迁移部分表的leader到其他机器。
【 使用环境 】生产环境
【 OB or 其他组件 】OB
【 使用版本 】 4.2.1-10BP
【问题描述】
1-1-1集群。primary zone采用的 随机分布。
如果部分业务量大的表集中在同一台机器,会导致这台机器负载过高。
能不能迁移部分表的leader到其他机器。
根据文档库中的信息,可以迁移部分表的 Leader 到其他机器以均衡负载。以下是具体的操作和相关信息:
在 OceanBase 数据库中,Leader 副本承担了强一致性场景下事务中的读写请求,因此每个分区 Leader 的分布决定了流量在每个节点上的分布(参考文档:OceanBase 数据库性能的影响因素 → 资源分配 → Primary Zone)。如果某些业务量大的表的 Leader 集中在同一台机器上,可能会导致该机器负载过高。
OceanBase 数据库通过 RootService 管理租户内各个资源单元间的负载均衡。RootService 提供了两种主要方式来实现数据均衡(参考文档:OceanBase 数据库性能的影响因素 → 负载均衡):
对于您的问题,可以通过以下步骤将部分表的 Leader 迁移到其他机器:
您可以手动触发 Leader 均衡操作,让 RootService 自动调整 Leader 分布。命令如下:
ALTER SYSTEM BALANCE LEADER;
此命令会根据当前集群的负载情况重新分配 Leader,尽量使每台机器的负载均衡。
如果您希望更精细地控制某些表的 Leader 分布,可以使用 ALTER TABLE
命令将特定表的 Leader 迁移到指定的 Zone 或机器上。例如:
ALTER TABLE table_name MOVE PARTITION partition_name TO zone_name;
需要注意的是,MOVE PARTITION
操作可能会涉及数据搬迁,请确保在低峰期执行以减少对业务的影响。
如果您的 Primary Zone 设置为 RANDOM
,RootService 会自动将不同分区的 Leader 分散在不同 Zone 的节点上。您也可以通过修改 Primary Zone 的设置来影响 Leader 的分布。例如:
ALTER TENANT tenant_name SET PRIMARY_ZONE='zone1,zone2';
此命令会调整租户的 Primary Zone 设置,从而影响 Leader 的分布。
通过以上方法,您可以有效迁移部分表的 Leader 到其他机器,从而降低某台机器的负载压力。
检索到的文档如下:
根据文档库中的信息,您提到的 ALTER TABLE ... MOVE PARTITION
确实不适用于 OceanBase 数据库的操作场景。针对您的需求,可以使用 ALTER SYSTEM TRANSFER PARTITION
语句将指定分区迁移到指定的日志流(Log Stream),从而实现调整 Leader 分布的目的。
以下是具体操作步骤和相关信息:
在 OceanBase 数据库中,分区的数据存储在日志流(Log Stream)上,而日志流的 Leader 副本决定了该分区的读写流量分布。如果某些业务量大的表的分区集中在同一台机器上,可能会导致该机器负载过高。通过 ALTER SYSTEM TRANSFER PARTITION
语句,可以将分区从当前的日志流迁移到其他日志流,从而实现负载均衡。
ALTER SYSTEM TRANSFER PARTITION
迁移分区ALTER SYSTEM TRANSFER PARTITION partition_name OF table_name TO ls_id;
partition_name
: 需要迁移的分区名称。table_name
: 包含分区的表名。ls_id
: 目标日志流的 ID。假设有一张分区表 orders
,其中分区 p2023
的 Leader 分布在某台高负载机器上,目标是将其迁移到日志流 LS_1001
上:
ALTER SYSTEM TRANSFER PARTITION p2023 OF orders TO 1001;
在执行迁移之前,需要确定目标日志流的 ID。可以通过以下系统视图查询相关信息:
SELECT tablet_id, ls_id
FROM oceanbase.CDB_OB_TABLET_TO_LS
WHERE tenant_id = <租户ID> AND tablet_id = <分区对应的Tablet_ID>;
tenant_id
: 租户 ID,可以通过 SHOW TENANTS
查询。tablet_id
: 分区对应的分片 ID,可以通过以下查询获取:SELECT object_id AS tablet_id
FROM oceanbase.CDB_OBJECTS
WHERE object_type IN ('TABLE PARTITION', 'TABLE SUBPARTITION')
AND object_name = '<分区名称>';
SELECT *
FROM oceanbase.CDB_OB_LS_LOCATIONS
WHERE tenant_id = <租户ID> AND ls_id = <日志流ID>;
通过上述查询,可以找到目标日志流的 ID 及其副本分布情况,选择一个合适的日志流作为迁移目标。
低峰期操作
分区迁移涉及数据搬迁,可能对性能产生一定影响,请务必选择业务低峰期进行操作。
确认目标日志流状态
在迁移前,确保目标日志流的状态正常,并且有足够的资源承载新的分区数据。
验证迁移结果
迁移完成后,可以通过以下查询验证分区是否已成功迁移到目标日志流:
SELECT tablet_id, ls_id
FROM oceanbase.CDB_OB_TABLET_TO_LS
WHERE tenant_id = <租户ID> AND tablet_id = <分区对应的Tablet_ID>;
通过 ALTER SYSTEM TRANSFER PARTITION
语句,您可以将特定分区迁移到其他日志流,从而调整 Leader 分布,达到负载均衡的目的。请严格按照上述步骤操作,并注意选择合适的时间窗口以减少对业务的影响。
如需进一步帮助,请随时联系 OceanBase 的技术支持团队!
具体信息可参考以下文档:
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002016872
可以使用手动迁移分区到其他LS上的方法。建议你现在测试环境测试一下
操作方案:
修改租户配置项,关闭自动负载均衡:
ALTER SYSTEM SET enable_rebalance=false;
ALTER SYSTEM SET enable_transfer=true;
执行分区迁移
ALTER SYSTEM TRANSFER PARTITION TABLE_ID = 500383, OBJECT_ID = 500383 TO LS 1002;
查看迁移分区任务执行状态:
SELECT TASK_ID, BALANCE_JOB_ID, TRANSFER_TASK_ID, STATUS FROM oceanbase.DBA_OB_TRANSFER_PARTITION_TASKS;
打开自动负载均衡
迁移完,再打开自动负载均衡, 会不会被 迁移回去
应该不会 哈哈哈
有没有想过这个问题,你那primary zone的设置明显不符合你当前的业务特点。