更改数据库中的分片数

创建数据库时会设置初始分片数。出于以下原因,您可能会选择更改数据库中的分片数:

  • 提高大型子群集的性能。例如,如果您有一个包含 6 个分片的 24 节点子群集,则该子群集使用 Elastic Crunch Scaling (ECS) 将处理每个分片中数据的责任分配给各个节点。将数据库重新分片为 24 个分片消除了 ECS 的必要性并提高了性能,因为 ECS 不如一比一的分片与节点比率那样高效。有关详细信息,请参阅使用 Elastic Crunch Scaling 提高查询性能

  • 减小编录大小。如果您的编录大小由于数据库中的大量分片而增加,您可能选择减少分片的数量。

  • 从企业模式迁移到 Eon 模式后提高性能。当您将数据库从企业模式迁移到 Eon 模式时,Eon 数据库中的分片数最初设置为您在企业数据库中拥有的节点数。这个默认的分片数量可能并不理想。有关详细信息,请参阅选择分片数和初始节点数

  • 有效扩展您的数据库。为了在节点之间平均分配工作,数据库中的节点数量应当是分片数量的倍数或除数。如果您打算将子群集扩展到与本指南不兼容的大小,您可能需要将数据库重新分片。例如,对于有七个分片的数据库,其中的子群集包含的节点数必须为七的倍数。选择具有更多除数(例如 8 个)的分片数,可以让您在选择子群集中的节点数时具有更大的灵活性。

每次扩展子群集时,不应当将数据库重新分片。在重新分片过程中,可能会影响数据库的性能。重新分片后,子群集上的存储容器不会立即与新的分片订阅边界对齐。这种错位增加了查询执行的开销。

将 Eon 模式数据库重新分片

要将数据库重新分片,请使用新的分片计数作为实参调用 RESHARD_DATABASE 函数。此函数采用全局编录锁,因此请避免在繁忙时段或执行繁重的 ETL 负载时运行它。运行时取决于编录的大小。

RESHARD_DATABASE 完成后,群集中的节点使用新的编录分片定义。但是,重新分片过程不会立即更改公共存储中的存储容器。分片继续指向现有的存储容器。例如,如果您将数据库中的分片数量加倍,则每个存储容器现在有两个关联的分片。在查询期间,每个节点都会筛选掉存储容器中不适用于其订阅分片的数据。这为查询添加了少许开销。最终,Tuple Mover 的后台反身合并进程会自动更新存储容器,以便它们与新的分片定义保持一致。您可以调用 DO_TM_TASK 来运行让 Tuple Mover 立即重新对齐存储容器的 'RESHARDMERGEOUT' 任务。

以下查询返回 Tuple Mover 尚未重新对齐的任何存储容器的详细信息:

=> SELECT * FROM storage_containers WHERE original_segment_lower_bound IS NULL AND original_segment_upper_bound IS NULL;

示例

此示例演示了重新分片过程以及它如何影响分片分配和存储容器。为了说明重新分片的影响,我们比较了重新分片前后的分片分配和存储容器详细信息。以下三个查询返回有关数据库分片、节点订阅和存储容器编录对象的信息:

=> SELECT shard_name, lower_hash_bound, upper_hash_bound FROM shards ORDER BY shard_name;

shard_name  | lower_hash_bound | upper_hash_bound
------------+------------------+------------------
replica     |                  |
segment0001 |                0 |       1073741825
segment0002 |       1073741826 |       2147483649
segment0003 |       2147483650 |       3221225473
segment0004 |       3221225474 |       4294967295
(5 rows)

=> SELECT node_name, shard_name, is_primary, is_resubscribing, is_participating_primary FROM node_subscriptions;

node_name | shard_name  | is_primary | is_resubscribing | is_participating_primary
----------+-------------+------------+------------------+--------------------------
initiator | replica     | t          | f                | t
e0        | replica     | f          | f                | t
e1        | replica     | f          | f                | t
e2        | replica     | f          | f                | t
e0        | segment0002 | t          | f                | t
e1        | segment0003 | t          | f                | t
e2        | segment0004 | t          | f                | t
initiator | segment0001 | t          | f                | t
(8 rows)

=> SELECT node_name, projection_name, storage_oid, sal_storage_id, total_row_count, deleted_row_count, segment_lower_bound, segment_upper_bound, shard_name FROM storage_containers WHERE projection_name = 't_super';

node_name | projection_name |    storage_oid    |                  sal_storage_id                  | total_row_count | deleted_row_count | segment_lower_bound | segment_upper_bound | shard_name
----------+-----------------+-------------------+--------------------------------------------------+-----------------+-------------------+---------------------+---------------------+-------------
initiator | t_super         | 45035996273842990 | 022e836bff54b0aed318df2fe73b5afe00a0000000021b2d |               4 |                 0 |                   0 |          1073741825 | segment0001
e0        | t_super         | 49539595901213486 | 024bbf043c1ca3f5c7a86a423fc7e1e300b0000000021b2d |               3 |                 0 |          1073741826 |          2147483649 | segment0002
e1        | t_super         | 54043195528583990 | 02dac7dc405a1620c92bae1a17c7bbad00c0000000021b35 |               8 |                 0 |          2147483650 |          3221225473 | segment0003
e2        | t_super         | 54043195528583992 | 02dac7dc405a1620c92bae1a17c7bbad00c0000000021b31 |               6 |                 0 |          3221225474 |          4294967295 | segment0004
(4 rows)

以下对 RESHARD_DATABASE 的调用将分片数更改为八个:


=> SELECT RESHARD_DATABASE(8);

                RESHARD_DATABASE
----------------------------------------------------------
The database has been re-sharded from 4 shards to 8 shards
(1 row)

可以使用以下查询来查看数据库的新分片定义:


=> SELECT shard_name, lower_hash_bound, upper_hash_bound FROM shards ORDER BY shard_name;

shard_name  | lower_hash_bound | upper_hash_bound
-------------+------------------+------------------
replica     |                  |
segment0001 |                0 |        536870913
segment0002 |        536870914 |       1073741825
segment0003 |       1073741826 |       1610612737
segment0004 |       1610612738 |       2147483649
segment0005 |       2147483650 |       2684354561
segment0006 |       2684354562 |       3221225473
segment0007 |       3221225474 |       3758096385
segment0008 |       3758096386 |       4294967295
(9 rows)

数据库现在有八个分片。因为重新分片将每个分片的边界范围减半,所以每个分片负责大约一半的公共存储数据。

以下查询返回数据库的新节点订阅:


=> SELECT node_name, shard_name, is_primary, is_resubscribing, is_participating_primary FROM node_subscriptions;

node_name | shard_name  | is_primary | is_resubscribing | is_participating_primary
-----------+-------------+------------+------------------+--------------------------
initiator | replica     | t          | f                | t
e0        | replica     | f          | f                | t
e1        | replica     | f          | f                | t
e2        | replica     | f          | f                | t
initiator | segment0001 | t          | f                | t
e0        | segment0002 | t          | f                | t
e1        | segment0003 | t          | f                | t
e2        | segment0004 | t          | f                | t
initiator | segment0005 | t          | f                | t
e0        | segment0006 | t          | f                | t
e1        | segment0007 | t          | f                | t
e2        | segment0008 | t          | f                | t
(12 rows)

重新分片后,每个节点现在订阅两个分片而不是一个。

可以使用以下查询来查看重新分片如何影响数据库的存储容器编录对象:


=> SELECT node_name, projection_name, storage_oid, sal_storage_id, total_row_count, deleted_row_count, segment_lower_bound, segment_upper_bound, shard_name FROM storage_containers WHERE projection_name = 't_super';

node_name | projection_name |    storage_oid    |                  sal_storage_id                  | total_row_count | deleted_row_count | segment_lower_bound | segment_upper_bound | shard_name
----------+-----------------+-------------------+--------------------------------------------------+-----------------+-------------------+---------------------+---------------------+-------------
initiator | t_super         | 45035996273843145 | 02dac7dc405a1620c92bae1a17c7bbad00c0000000021b35 |               8 |                 0 |          2147483650 |          3221225473 | segment0005
initiator | t_super         | 45035996273843149 | 022e836bff54b0aed318df2fe73b5afe00a0000000021b2d |               4 |                 0 |                   0 |          1073741825 | segment0001
e0        | t_super         | 49539595901213641 | 02dac7dc405a1620c92bae1a17c7bbad00c0000000021b35 |               8 |                 0 |          2147483650 |          3221225473 | segment0006
e0        | t_super         | 49539595901213645 | 022e836bff54b0aed318df2fe73b5afe00a0000000021b2d |               4 |                 0 |                   0 |          1073741825 | segment0002
e1        | t_super         | 54043195528584141 | 02dac7dc405a1620c92bae1a17c7bbad00c0000000021b31 |               6 |                 0 |          3221225474 |          4294967295 | segment0007
e1        | t_super         | 54043195528584143 | 02dac7dc405a1620c92bae1a17c7bbad00c0000000021b31 |               6 |                 0 |          1073741826 |          2147483649 | segment0003
e2        | t_super         | 54043195528584137 | 024bbf043c1ca3f5c7a86a423fc7e1e300b0000000021b2d |               3 |                 0 |          3221225474 |          4294967295 | segment0008
e2        | t_super         | 54043195528584139 | 024bbf043c1ca3f5c7a86a423fc7e1e300b0000000021b2d |               3 |                 0 |          1073741826 |          2147483649 | segment0004
(8 rows)

分片指向与重新分片之前具有相同 sal_storage_id 的存储文件。最终,TM 的合并进程将自动更新存储容器。

将数据库重新分片后,您可以查询 DC_ROSES_CREATED 表以跟踪原始 ROS 容器和派生新存储容器的 DVMiniROS:

=> SELECT node_name, projection_name storage_oid, old_storage_oid, is_dv FROM DC_ROSES_CREATED;
     node_name       | projection_name  |    storage_oid    |   old_storage_oid  | is_dv
---------------------+------------------+-------------------+-----------------------------
initiator            | t_super          | 45035996273860625 | 45035996273843149  |  f
initiator            | t_super          | 45035996273860632 |                 0  |  f
e0                   | t_super          | 45035996273843149 |                 0  |  f
(3 rows)