这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

弹性群集

您可以根据数据库需要,扩大或缩减群集。最常见的情况是向数据库群集添加节点以容纳更多数据,并提供更好的查询性能。但是,如果发现群集过度配置或需要将硬件用于其他用途,您也可以缩减群集。

您可以通过添加或移除节点来对群集进行扩展或缩减。添加或移除节点时无需关闭或重新启动数据库。添加节点后或移除节点前,Vertica 会开始重新平衡过程,即在群集中移动数据,以填充新节点或将数据从要从数据库移除的节点中移出。在此过程中,数据也可能在未在添加或移除的节点之间交换,以此来维持强大的智能 K-safety。如果 Vertica 确定由于磁盘空间不足,数据不能在一次迭代中重新平衡,则会在多次迭代中完成重新平衡。

为确保在扩展或缩减群集时更高效地实现数据重新平衡,Vertica 会在每个节点本地对数据存储进行分段,以便它能够轻松移动到群集中的其他节点。将新节点添加到群集时,群集中的现有节点会放弃某些数据段以填充新节点并交换数据段,从而将任何一个节点所依赖的节点数量保持为最低。此策略会将节点出现故障时成为关键节点的节点数量保持为最低(请参阅 关键节点/企业模式数据库中的 K-safety)。从群集中移除节点时,该节点的所有存储容器都会移动到群集中的其他节点(这时也会重新迁移数据段来最大限度减少节点出现故障时成为关键节点的节点数量)。这种将数据拆分为便于迁移的数据段的方式称为弹性群集,因为它有利于轻松扩展或缩减群集。

弹性群集的替代方案是对投影中的所有数据进行重新分段,并在添加或移除节点时将这些数据均匀分布到数据库中的所有节点。此方法需要处理的工作量更多,占用的磁盘空间也更多,因为它实质上需要转储并重新加载所有投影中的所有数据。

弹性群集伸缩系数

在新安装中,每个节点都有一个指定本地数据段数量的伸缩系数(请参阅伸缩系数)。重新平衡可以通过重新迁移本地数据段来高效地重新分布数据,前提是在添加或移除节点后,群集中具有足够的本地数据段来均匀地重新分布数据(由 MAXIMUM_SKEW_PERCENT 确定)。例如,如果伸缩系数 = 8,并且最初有 5 个节点,那么整个群集中总共有 40 个本地数据段。

如果添加两个额外的节点(7 个节点),Vertica 会在 2 个节点上重新定位 5 个本地分段,在 5 个节点上重新定位 6 个此类分段,从而导致大约 16.7% 的偏差。只有当得到的偏差率低于允许的阈值(这由 MAXIMUM_SKEW_PERCENT 确定)时,重新平衡机制才重新定位本地分段。否则,重新平衡机制会在这 7 个节点上均匀分布分段空间(进而均匀分布数据,如果数据在此空间中均匀分布的话),并为每个节点划定新的本地数据段边界,确保每个节点再次拥有 8 个本地数据段。

启用弹性群集

使用 ENABLE_ELASTIC_CLUSTER 启用弹性群集。查询 ELASTIC_CLUSTER 系统表来验证弹性群集是否已启用:

=> SELECT is_enabled FROM ELASTIC_CLUSTER;
 is_enabled
------------
 t
(1 row)

1 - 伸缩系数

为避免 ROS 容器数量增加,请不要启用局部分段,也不要更改伸缩系数。

2 - 查看伸缩系数设置

要查看伸缩系数,请查询 ELASTIC_CLUSTER 表:

=> SELECT scaling_factor FROM ELASTIC_CLUSTER;
scaling_factor
---------------
            4
(1 row)

=> SELECT SET_SCALING_FACTOR(6);
 SET_SCALING_FACTOR
--------------------
 SET
(1 row)

=> SELECT scaling_factor FROM ELASTIC_CLUSTER;
 scaling_factor
---------------
             6
(1 row)

3 - 设置伸缩系数

比例因子决定了在启用局部分段时,Vertica 在重新平衡期间用于跨数据库存储每个投影的存储容器的数量。在设置比例因子时,请遵循以下准则:

  • 存储容器的数量应大于或等于分区数量与本地分段数量的积:

    num‑storage‑containers >= ( num‑partitions * num‑local‑segments )

  • 若将比例因子设置得足够高,以便重新平衡可以传输本地分段以满足偏移阈值,但将值设置得很小,以便存储容器数量将不会产生过多的 ROS 容器,并导致 ROS 推回)。ROS 容器的最大数量(默认为 1024)由配置参数 ContainersPerProjectionLimit 设置。

使用 SET_SCALING_FACTOR 函数可以更改数据库的伸缩系数。伸缩系数可以为 1 到 32 之间的整数。

=> SELECT SET_SCALING_FACTOR(12);
SET_SCALING_FACTOR
--------------------
 SET
(1 row)

4 - 局部数据分段

默认情况下,只有当 Vertica 重新平衡数据库时,伸缩系数才会发挥作用。在重新平衡期间,节点会将其包含的投影分段分解到多个存储容器中,以便它们能够快速移动到其他节点。

与对整个投影进行重新分段相比,此过程更加高效(特别是,它需要更少的可用磁盘空间),但是仍然需要较大开销,因为必须将存储容器分离到多个局部分段中,然后将其中一些局部分段传输到其他节点。如果您很少从数据库中添加或移除节点,此开销并不算是一个问题。

但是,如果您的数据库增长快速并且持续处于繁忙状态,则可能会发现添加节点的过程将变得具有破坏性。这种情况下,您可以启用局部分段,这会告诉 Vertica 始终根据伸缩系数对其数据进行分段,因此始终将数据分解到多个易于移动的容器中。通过这种方式对数据进行分段会显著提高添加或删除节点的速度,因为数据始终处于一种可以快速重新定位到另一个节点的状态。Vertica 在添加或移除节点后执行的重新平衡过程只需要决定要重新定位的存储容器即可,无须首先将数据分解到存储容器中。

局部数据分段会增加存储在每个节点上的存储容器数量。除非表包含许多分区,否则这算不上一个问题。(例如,如果表按天进行分区并包含一个或多个年份。)如果启用局部数据分段,则会将其中每个表分区分解到多个局部存储分段中,这可能会生成大量文件,进而可能导致 ROS“推回”。请先考虑表分区以及启用局部数据分段可能造成的影响,然后再启用此功能。

4.1 - 启用和禁用局部分段

要启用局部分段,请使用 ENABLE_LOCAL_SEGMENTS 函数。要禁用局部分段,请使用 DISABLE_LOCAL_SEGMENTATION 函数:

=> SELECT ENABLE_LOCAL_SEGMENTS();
ENABLE_LOCAL_SEGMENTS
-----------------------
 ENABLED
(1 row)


=> SELECT is_local_segment_enabled FROM elastic_cluster;
 is_enabled
------------
 t
(1 row)

=> SELECT DISABLE_LOCAL_SEGMENTS();
 DISABLE_LOCAL_SEGMENTS
------------------------
 DISABLED
(1 row)

=> SELECT is_local_segment_enabled FROM ELASTIC_CLUSTER;
 is_enabled
------------
 f
(1 row)

5 - 弹性群集最佳实践

下面是一些关于局部分段的最佳实践。

何时启用局部数据分段

局部数据分段 可以显著加快调整群集大小的过程。在以下情况下,应当启用局部数据分段:

  • 数据库不包含具有数百个分区的表。

  • 数据库群集中的节点数为 2 的幂次方。

  • 计划扩大或缩小群集大小。

局部分段可能会导致具有数百个分区的表或节点数不是 2 的幂次方的群集的存储容器数量过多。如果您的数据库具有这两个特征,在启用局部分段时请小心。