均衡分片(Rebalance)

Hologres从V2.0.21版本开始支持Rebalance函数,用于触发均衡分片操作。本文为您介绍Rebalance函数及均衡分片的使用方法。

背景信息

正常情况下,Hologres实例在运行时,Worker节点会均匀的加载数据分片(Shard)的元数据。但是在某些场景下(例如触发了快速恢复等),数据分片在Worker节点上分布不均,此时就需要触发均衡分片操作,使系统主动的重新分配数据分片,最终让实例的Worker节点均匀加载Shard的元数据。

使用限制

仅Hologres V2.0.21及以上版本支持Rebalance函数,如果您的实例是 V2.0.21以下版本,请您使用自助升级或加入实时数仓Hologres交流群申请升级实例,详情请参见如何获取更多的在线支持?

命令语法

不同类型实例触发均衡切片操作的语法如下。

通用型实例和只读从实例

Rebalance函数用于触发通用型或只读从实例上的Worker节点重新分配分片。语法如下:

SELECT hg_rebalance_instance();
  • 返回结果:

    • true:表示Rebalance触发成功,系统开始进行Rebalance操作。

    • false:表示无需Rebalance。

    • 报错:表示Rebalance触发失败。例如存在Pod故障时,触发Rebalance操作会报错。

  • 执行Rebalance过程中,系统会计算是否需要Rebalance,最终达到均衡状态,即每个Worker加载的Shard数量差异小于等于1。例如:

    • 如果有2个Worker,2个Shard,那么最终每个Worker都会分到1个Shard。

    • 如果有2个Worker,3个Shard,那么最终其中1个Worker会分到1个Shard,另一个Worker会分到2个Shard。

  • Rebalance操作通常需要2~3分钟,实际执行时长和实例中Table Group的数量有关,Table Group越多,Rebalance耗时越长。Rebalance过程中您的写入会中断15秒。

  • 由于Rebalance是异步执行,您可以使用如下SQL查看执行进度:

  • SELECT hg_get_rebalance_instance_status();
  • 返回结果:

    • DOING:表示正在执行Rebalance操作。

    • DONE:表示Rebalance操作已完成。

计算组型实例

与通用型实例和只读从实例不同,计算组型实例可将计算资源分解为多个计算组。因此,要实现计算组型实例的均衡分片,需要对其中每个计算组单独执行均衡分片操作。具体操作,请参见计算组均衡分片(Rebalance)

常见问题

如何发现分片分布不均衡?

通常执行查询时,每个Worker的负载应该是较为均衡的,但如果有Worker节点没有分片时,该Worker节点的负载则会远低于其他Worker。

  • 分片分布均衡示例:如下图有10个Worker节点的实例执行查询和写入时,在监控信息中可以看到10个Worker的CPU使用率都很相近。image.png

  • 分片分布不均衡示例:如下图有Worker节点没有分片时,监控信息中会出现如下类似情况,有Worker节点的负载远低于其他Worker。image.png

    使用如下SQL查询Worker加载分片元数据情况:

    SELECT DISTINCT worker_id FROM hologres.hg_worker_info;
    • 返回结果:image.png

    • 结果分析:仅有9个Worker加载了分片的元数据,有一个Worker没有加载到分片的元数据。

    • 措施:此时执行Rebalance操作,待Rebalance完毕后,从监控信息中可以看到原先CPU使用率较低的Worker,利用率已经明显上升,且和其他Worker基本相近。image.png

    • 再次查询Worker加载分片元数据情况。发现10个Worker都加载了分片的元数据。image.png