数据平衡

数据平衡是指在一个集群中,数据在各个节点之间存储均匀。数据平衡直接关系到系统的性能、可用性和稳定性,因此在分布式架构设计中需要充分考虑如何进行数据平衡。DolphinDB 的分布式架构对数据存储进行了全局优化,可以集群内的数据均匀地存储到不同地节点上,充分利用集群中的物理资源。但在某些情况下,例如集群中节点/磁盘数量发生了变化,这些变化可能导致数据在节点之间分布不均,进而使得部分节点负载沉重,而其他节点相对空闲。这可能导致集群无法充分利用新增节点的计算资源,无法充分利用新增磁盘的 I/O。为了解决数据不均衡导致的问题,DolphinDB提供了函数方便用户手动进行数据再平衡。

数据再平衡场景

副本的位置对 I/O 性能、节点负载以及数据访问延迟都有着重要的影响。数据再平衡的主要目标是确保分区副本能够尽可能均衡地分布,从而更好地利用资源,提高集群性能。针对以下常见的场景,DolphinDB 提供了对应的数据再平衡方法:

  • 节点内数据再平衡:在节点内磁盘卷负载过高的情况下,通过增加新的磁盘卷来分担其他磁盘卷的负载是一种有效的性能优化手段。此时需要进行节点内数据再平衡,即将高负载磁盘卷上的分区数据向低负载的磁盘卷进行转移,从而提高节点的整体负载能力。

  • 节点间数据再平衡:指将磁盘负载重数据节点上的数据迁移至其他磁盘负载较低的节点上,以实现数据在节点上的均匀分布。这一优化手段有助于提高分布式计算的效率。以下两种情况需要进行节点间再平衡:

    • 副本的插入和删除操作涉及的分区数据均匀,导致部分数据节点磁盘负载过高,而部分节点磁盘负载过低。

    • 集群种新增了数据节点,考虑充分利用新增节点的存储和计算资源。

DolphinDB 数据再平衡算法基于以下的假设条件进行:

  • 所有分区数据都存储在旧磁盘上;

  • 所有新的磁盘都用来存储新的分区数据;

  • 所有分区数据的大小相同。

数据再平衡方法

DolphinDB 提供了一系列函数,用于数据再平衡和检查再平衡状态。这些函数可以帮助用户有效管理和优化数据分布,并且对再平衡状态进行实时监测。下文提到的函数必须由管理员在控制节点上执行。

系统生成再平衡计划

  • 节点内数据再平衡:调用 rebalanceChunksWithinDataNode 函数实现该功能。

  • 节点间数据再平衡:

    1. 调用 rebalanceChunksAmongDataNodes 函数实现节点间数据再平衡。

    2. 当配置分区粒度为表级分区时,同一个分区的所有表将分布在相同的节点下。当调用函数 rebalanceChunksAmongDataNodes 进行数据平衡时,若出现节点宕机或离线,可能出现同一个分区里部分表的数据转移成功,部分表的数据转移失败的情况,即同一个分区下的不同表会分布在不同的节点。此时需要调用 restoreDislocatedTablet 将同一个分区里的表转移到同一个节点下。

rebalanceChunksWithinDataNoderebalanceChunksAmongDataNodes 都有参数 exec,通过该参数控制在调用函数后是否执行平衡计划。当 exec=false 时,调用函数后将只显示数据平衡计划,而不会自动进行数据平衡。用户可以查看该计划,确保其正确无误后,再次执行该函数,并指定 exec=true,此时系统将按照平衡计划,进行数据平衡。

因为磁盘可能存储除 DolphinDB 数据库以外的数据,或者 DolphinDB 数据分区大小不相等。这些差异可能会导致出现意想不到的再平衡结果。可以通过多次执行再平衡,进一步优化再平衡的效果。

为了提高再平衡衡任务的执行效率,也可以通过配置项 dfsRebalanceConcurrency 设置再平衡任务执行的并发度。

自定义再平衡计划

除系统生成的数据再平衡计划外,用户还可以根据实际需求手动输入源路径和目标路径,从而执行定制化的数据再平衡操作。

  • moveChunksAcrossVolume(srcPath, destPath, chunkIds, [isDelSrc=true]):将磁盘卷源路径下一个或多个分区文件转移至目标路径。

  • moveReplicas(srcNode, destNode, chunkId):将源节点上一个或多个分区副本迁移至目标节点。

通过以上方法执行数据平衡后,可以调用 getRecoveryTaskStatus 查看任务执行的状态。

常见问题

以下是在数据平衡过程中可能发生的常见情况:

  • 数据迁移和重新平衡任务可能会消耗大量资源,正在被写入、修改或删除的分区可能由于分区锁定而无法迁移。

  • 对于耗时的计算任务,当缓存指向旧分区路径时可能会抛出异常。

因此,建议在没有执行写入或查询任务时执行数据再平衡操作,以避免潜在的失败。

有关数据再平衡的更多操作详情,请参考数据迁移与平衡 和运维手册中的《数据迁移与平衡》。