能不能修改表的leader所在机器

【 使用环境 】生产环境
【 OB or 其他组件 】OB
【 使用版本 】 4.2.1-10BP
【问题描述】
1-1-1集群。primary zone采用的 随机分布。

如果部分业务量大的表集中在同一台机器,会导致这台机器负载过高。
能不能迁移部分表的leader到其他机器。

2 个赞

@论坛小助手

1 个赞

根据文档库中的信息,可以迁移部分表的 Leader 到其他机器以均衡负载。以下是具体的操作和相关信息:

1. 背景信息

在 OceanBase 数据库中,Leader 副本承担了强一致性场景下事务中的读写请求,因此每个分区 Leader 的分布决定了流量在每个节点上的分布(参考文档:OceanBase 数据库性能的影响因素 → 资源分配 → Primary Zone)。如果某些业务量大的表的 Leader 集中在同一台机器上,可能会导致该机器负载过高。

2. 解决方案

OceanBase 数据库通过 RootService 管理租户内各个资源单元间的负载均衡。RootService 提供了两种主要方式来实现数据均衡(参考文档:OceanBase 数据库性能的影响因素 → 负载均衡):

  • 副本均衡:通过 Unit 迁移、日志流副本复制或迁移的方式,调整租户在各机器上的资源占用情况。
  • Leader 均衡:在副本均衡的基础上,RootService 根据租户的 Primary Zone 等因素,自动创建并均衡各机器日志流的 Leader 的数目。

对于您的问题,可以通过以下步骤将部分表的 Leader 迁移到其他机器:

2.1 手动触发 Leader 均衡

您可以手动触发 Leader 均衡操作,让 RootService 自动调整 Leader 分布。命令如下:

ALTER SYSTEM BALANCE LEADER;

此命令会根据当前集群的负载情况重新分配 Leader,尽量使每台机器的负载均衡。

2.2 指定表的 Leader 分布

如果您希望更精细地控制某些表的 Leader 分布,可以使用 ALTER TABLE 命令将特定表的 Leader 迁移到指定的 Zone 或机器上。例如:

ALTER TABLE table_name MOVE PARTITION partition_name TO zone_name;

需要注意的是,MOVE PARTITION 操作可能会涉及数据搬迁,请确保在低峰期执行以减少对业务的影响。

2.3 调整 Primary Zone 设置

如果您的 Primary Zone 设置为 RANDOM,RootService 会自动将不同分区的 Leader 分散在不同 Zone 的节点上。您也可以通过修改 Primary Zone 的设置来影响 Leader 的分布。例如:

ALTER TENANT tenant_name SET PRIMARY_ZONE='zone1,zone2';

此命令会调整租户的 Primary Zone 设置,从而影响 Leader 的分布。

3. 注意事项

  • 在生产环境中进行 Leader 迁移或负载均衡操作时,请务必选择业务低峰期,以避免对业务造成影响。
  • 如果您的集群版本为 V4.2.0 或更高版本,支持单机分布式一体化架构,能够动态调整分区分布,进一步提升负载均衡能力(参考文档:OceanBase 数据库 V4.2.0 版本特性 → 租户级别的负载均衡)。

通过以上方法,您可以有效迁移部分表的 Leader 到其他机器,从而降低某台机器的负载压力。

检索到的文档如下:

  1. 选举
  2. 高可用 FAQ
  3. 在 OceanBase 数据库上进行 TPC-C 测试
  4. OceanBase 术语
  5. 分布式事务
  6. 日志流副本概述
  7. OceanBase 数据库性能的影响因素
  8. 日志流和副本概述
  9. ODP 性能分析
  10. OceanBase 数据库社区版 V4.2.0
1 个赞

@论坛小助手
没有move partition的操作

请参考 TRANSFER PARTITION
迁移表分区到指定日志流

1 个赞

根据文档库中的信息,您提到的 ALTER TABLE ... MOVE PARTITION 确实不适用于 OceanBase 数据库的操作场景。针对您的需求,可以使用 ALTER SYSTEM TRANSFER PARTITION 语句将指定分区迁移到指定的日志流(Log Stream),从而实现调整 Leader 分布的目的。

以下是具体操作步骤和相关信息:


1. 背景信息

在 OceanBase 数据库中,分区的数据存储在日志流(Log Stream)上,而日志流的 Leader 副本决定了该分区的读写流量分布。如果某些业务量大的表的分区集中在同一台机器上,可能会导致该机器负载过高。通过 ALTER SYSTEM TRANSFER PARTITION 语句,可以将分区从当前的日志流迁移到其他日志流,从而实现负载均衡。


2. 使用 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;

3. 查找目标日志流(LS)ID

在执行迁移之前,需要确定目标日志流的 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 及其副本分布情况,选择一个合适的日志流作为迁移目标。


4. 注意事项

  1. 低峰期操作
    分区迁移涉及数据搬迁,可能对性能产生一定影响,请务必选择业务低峰期进行操作。

  2. 确认目标日志流状态
    在迁移前,确保目标日志流的状态正常,并且有足够的资源承载新的分区数据。

  3. 验证迁移结果
    迁移完成后,可以通过以下查询验证分区是否已成功迁移到目标日志流:

    SELECT tablet_id, ls_id 
    FROM oceanbase.CDB_OB_TABLET_TO_LS 
    WHERE tenant_id = <租户ID> AND tablet_id = <分区对应的Tablet_ID>;
    

5. 总结

通过 ALTER SYSTEM TRANSFER PARTITION 语句,您可以将特定分区迁移到其他日志流,从而调整 Leader 分布,达到负载均衡的目的。请严格按照上述步骤操作,并注意选择合适的时间窗口以减少对业务的影响。

如需进一步帮助,请随时联系 OceanBase 的技术支持团队!

具体信息可参考以下文档:

  1. 日志流和副本概述
  2. oceanbase.CDB_OB_TABLE_LOCATIONS
  3. TRANSFER PARTITION
  4. 日志流
  5. 转储管理概述
  6. 转储
  7. 日志归档概述
  8. 分区交换
  9. 租户内均衡
1 个赞

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;
打开自动负载均衡

2 个赞

迁移完,再打开自动负载均衡, 会不会被 迁移回去

2 个赞

应该不会 哈哈哈

2 个赞

有没有想过这个问题,你那primary zone的设置明显不符合你当前的业务特点。

1 个赞