关于再平衡
在Vertica群集中添加或删除一个或多个节点后,必须调整现有节点和新节点上的数据。为了获得佳性能,应在所有节点之间平衡数据。Vertica称此过程为平衡过程。
重新平衡群集后,群集中所有节点之间的数据存储和工作负载将达到平衡。重新平衡是复杂的:CPU,磁盘和网络密集型。由于重新平衡需要大量的数据移动,因此该过程可能需要很长时间。
这是关于再平衡的两部分系列文章的第1部分。第1部分介绍了重新平衡过程中发生的情况。
了解再平衡,第2部分:优化再平衡描述了重新平衡之前,之中和之后要采取的步骤
- 准备重新平衡
- 监视重新平衡操作
- 查看重新平衡结果
何时在群集中添加或删除节点
在以下情况下,您可能需要向Vertica群集中添加一个或多个节点:
- 数据库中的数据量已大大增加。如果您的数据磁盘存储空间不足,则性能可能会下降。
- 数据库中的分析工作量已大大增加。这种情况可能会导致性能下降。
- 您需要提高群集中的K安全性,以确保高可用性。
- 您需要从群集中交换节点以进行维护,升级或更换。交换节点不需要Vertica在节点之间重新平衡数据。
删除节点要比添加节点少。如果群集超额配置或需要将硬件用于其他目的,则可以删除节点。
重要
如果删除节点违反系统K安全性,则Vertica不允许您从群集中删除节点。
重新平衡过程中会发生什么?
以下主题描述了在添加或删除节点后重新平衡群集时发生的情况:
- 平衡期间的数据移动
- 刷新资源池
- 再平衡阶段
平衡期间的数据移动
在群集之间重新平衡数据很复杂。Vertica在将适当的线段传送到其各自的目标节点之前,先对分段的投影进行分割。重新平衡完成后,在目标节点上,Tuple Mover在下一次执行合并时会合并数据段。
为了有效地进行重新平衡,现有节点需要具有可用空间。如果现有节点的可用空间很少,则重新平衡仍然可以进行。但是,Vertica必须分多个阶段执行重新平衡,这可能需要更长的时间:
- 在阶段,Vertica将数据分发到新节点。
- 在下一阶段,Vertica将数据分发到将数据发送到新节点的节点。
- 在后续阶段中,Vertica继续将数据发送到通过卸载前一阶段分发的数据来释放空间的节点。
例如,考虑一个具有N个节点的集群。将节点添加到群集时,Vertica尝试减少需要在所有节点上平均分配数据的数据移动量。为此,Vertica会在现有节点之间分配新节点。有关此的说明,请参阅本节后面的图形。
Vertica在重新平衡期间移动的数据量取决于:
- 您拥有的节点数。
- 您要添加的节点数。
- 未分段投影与分段投影的数量。例如,Vertica从伙伴节点复制未分段的投影,因为每个节点都包含数据的完整副本。
下图显示了此过程对主投影和好友投影的工作方式。蓝色矩形代表现有节点,红色矩形代表新节点:
- Vertica将节点插入群集中的位置,以大程度地减少数据移动。
- Vertica将数据传输到新节点和现有节点。图形中的箭头指示数据传输的方向以及数据移动的百分比。
例如,图形的行显示将一个节点添加到四节点群集中。Vertica将新节点分布在小化数据移动的位置。
在四节点群集中,每个节点包含1/4的数据。对于具有五个节点的群集,每个节点必须包含1/5的数据。当群集从4个节点加倍到8个节点时,将应用相同的概念。
刷新资源池
重新平衡始终使用内置的REFRESH资源池运行。在此池中,您可以使用PLANNEDCONCURRENCY参数指定Vertica可以随时重新平衡的投影伙伴组的数量。MAXCONCURRENCY池参数对REFRESH资源池。
将默认设置用于REFRESH资源池。
再平衡阶段
由于大量数据移动,为节省磁盘空间,Vertica一次重新平衡了表组和投影组。组的数量取决于PLANNEDCONCURRENCY配置参数的值。
重新平衡的阶段包括:
在重新平衡过程中,不会发生合并数据的后阶段。元组移动器下次执行合并时将合并数据。
有关详细信息,请参阅以下主题:
添加节点
为了大程度地减少在群集节点之间移动数据所需的时间,Vertica将新节点插入群集中的位置,以大程度地减少数据移动。新节点的位置会影响重新平衡的性能。对于大型集群尤其如此。
将一个节点添加到三节点群集时,它的外观如下:
重新分割数据
Vertica从所有节点读取现有数据,并查看每个表和投影。
对于非分段的投影,Vertica:
- 对每个投影进行X锁定。
- 使用以下命令在目标节点上复制这些投影:=>创建投影...未分类所有节点
- 从伙伴投影中刷新投影。
对于分段投影,Vertica:
- 在桌子上采用S锁,在投影上采用X锁。
- 分别针对主要,好友和实时聚合预测细分。
- 刷新投影。
对数据进行分段需要一个暂存区域,因此重新平衡将使用临时存储。为了有效地使用该存储,Vertica一次只能重新平衡一些表和投影。
将节点添加到三节点群集后,重新分段可能如下所示:
将数据传输到目标节点
为了平衡新大小的群集,Vertica使用哈希函数来确定如何在新节点和现有节点之间分配数据。传输数据时,Vertica会使用S锁并复制未分段和分段的数据。
由于未分段的投影是彼此的副本,因此源节点读取数据,而目标节点写入数据。如果您有多个新节点,Vertica可以将未分段的投影从多个源节点并行传输到多个目标节点。此过程几乎不占用CPU成本。
对于分段投影,这些步骤更加复杂。在源节点上,Vertica读取,拆分和写入分段的投影。Vertica需要时间和磁盘空间才能执行这些操作。
重新平衡完成后,终在目标节点上,元组移动器将数据段合并。
在三节点示例中,您可以看到Vertica使用来自相邻节点的数据填充新节点,以大程度地减少数据传输量。传输后,数据在所有四个节点之间保持平衡。
在此示例中:
- 节点1将数据库中总数据的1/12传输到节点4。
- 节点2将数据库中总数据的2/12传输到节点4。
- 节点3将数据库中总数据的1/12传输到节点2。
结果是,所有节点拥有Vertica数据库中总数据的1/4 。
合并数据
重新平衡完成后,在目标节点上,Tuple Mover将在下一个合并操作期间合并数据段。
下图说明了添加第四个节点后的三节点群集的这种情况。
元组移动器合并数据后,它将刷新所有投影。如果要删除节点,则在临时节点上,Vertica会丢弃不需要的未分段的投影。
重新平衡需要多长时间?
重新平衡群集可能需要很长时间。以下任何因素都可能影响重新平衡完成所需的时间:
- 投影数。
- 每个表的分区数。
- 数据量和投影中的行数。
- 在目标节点上合并数据所花费的时间
- 繁忙节点的总数据移动(读取和写入)
- 数据偏斜
- 网络吞吐量
- 如果重新平衡过程是I / O绑定或网络绑定的
- 集群上的其他工作负载
重新分割分段的投影并分离ROS容器可能要花费总重新平衡时间的80%。
在添加或删除节点之前
在群集中添加或删除节点之前,请执行以下步骤以优化重新平衡的性能并大程度地减少数据丢失的风险:
- 备份数据库。
- 删除旧的或未使用的表分区。
- 验证是否禁用了本地分段,这是默认设置。你必须开始重新平衡之前禁用局部分割。要禁用本地分段,请使用以下命令:
=> SELECT DISABLE_LOCAL_SEGMENTS(); - 找出有多少CPU和网络带宽可用于运行重新平衡操作。为此,请使用以下Vertica工具:
vioperf
:测量硬盘驱动器的速度和一致性。vnetperf
:测量节点之间的网络延迟和吞吐量。
- 检查是否有足够的可用磁盘空间(至少是数据库大小的40%)来执行重新平衡。在节点之间移动数据时,重新平衡操作将大量磁盘空间用于中间操作。
如果可用空间不足,Vertica必须分多个阶段执行重新平衡,这可能需要更长的时间。
检查以下系统表中的可用磁盘空间:
- DISK_STORAGE-数据库在每个节点上使用的磁盘存储量。
- COLUMN_STORAGE-每个投影的每个列在每个节点上使用的磁盘存储量。
- PROJECTION_STORAGE-每个投影在每个节点上使用的磁盘存储量。
要查看Linux文件系统上的可用和已用磁盘空间,请使用Linux 命令: df
$ df -h
要获取每个节点的快照,请查看HOST_RESOURCES系统表中的以下字段:
=>从host_resources中选择host_name,disk_space_used_mb,disk_space_total_mb;
- 要检查内置REFRESH资源池的设置,请输入以下语句。如有必要,请调整设置:
=>选择名称,is_internal,计划并发,maxmemorysize FROM resource_pools WHERE name ='REFRESH'; - 小化要重新平衡的表上的任何DML操作(COPY,INSERT,UPDATE,DELETE)。如果重新平衡表已锁定,则加载将失败。如果负载在表上有锁,则重新平衡会暂停。
- 如清除已删除的数据中所述清除已删除的数据。
- 使用“ 连接负载平衡”中的说明配置要添加到群集中的主机 。
- 使用将主机添加到集群中描述的过程将主机添加到集群。
- 如将节点添加到数据库中所述,将节点添加到数据库。
来源
https://zhuanlan.zhihu.com/p/108483740