在数据库分片组中拆分一个分片 - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

在数据库分片组中拆分一个分片

您可以手动将数据库分片组中的分片拆分为两个较小的分片。这称为用户发起的分片拆分。

当分片的数据量非常大或使用率非常高时,Aurora PostgreSQL Limitless Database 也可以对其进行拆分。这称为系统发起的分片拆分。

先决条件

用户发起的分片拆分有以下先决条件:

  • 您必须拥有一个数据库分片组。

  • 数据库分片组不能为空:它必须至少包含一个分片表。

  • 用户必须具有 rds_aurora_limitless_cluster_admin 权限。rds_superuser 拥有此权限;因此主用户也拥有该权限。rds_superuser 可以将该权限授予其他用户:

    /* Logged in as the master user or a user with rds_superuser privileges */ CREATE USER username; GRANT rds_aurora_limitless_cluster_admin to username;
  • 您必须知道要拆分的分片的子集群(节点)ID。您可以通过以下查询获取 ID:

    SELECT * FROM rds_aurora.limitless_subclusters; subcluster_id | subcluster_type ---------------+----------------- 1 | router 2 | router 3 | shard 4 | shard 5 | shard 6 | shard

要启用系统发起的分片拆分,请在与数据库集群相关联的自定义数据库集群参数组中设置以下数据库集群参数:

参数

rds_aurora.limitless_enable_auto_scale

on

rds_aurora.limitless_auto_scale_options

split_shardadd_router,split_shard

rds_aurora.limitless_finalize_split_shard_mode

该参数决定系统发起的分片拆分如何结束。值可以是以下之一:

  • user_initiated – 由您决定何时结束分片拆分。这是默认值。

  • immediate – 立即结束分片拆分。

有关更多信息,请参阅 结束分片拆分

注意

此参数仅适用于系统发起的分片拆分。

有关更多信息,请参阅 Amazon Aurora 数据库集群的数据库集群参数组

拆分分片

要拆分数据库分片组中的分片,请使用 rds_aurora.limitless_split_shard 函数。该函数启动异步运行的分片拆分任务。

SELECT rds_aurora.limitless_split_shard('subcluster_id');

在成功提交任务后,等待返回的任务 ID,例如:

SELECT rds_aurora.limitless_split_shard('3'); job_id --------------- 1691300000000 (1 row)

跟踪分片拆分

您可以使用任务 ID 跟踪分片拆分任务。要描述特定任务并获取有关它的更多详细信息,请运行以下查询:

SELECT * FROM rds_aurora.limitless_list_shard_scale_jobs(job_id);

例如:

SELECT * FROM rds_aurora.limitless_list_shard_scale_jobs(1691300000000); job_id | action | job_details | status | submission_time | message ---------------+-------------+-----------------------+---------+------------------------+------------------------------------------- 1691300000000 | SPLIT_SHARD | Split Shard 3 by User | SUCCESS | 2023-08-06 05:33:20+00 | Scaling job succeeded. + | | | | | New shard instance with ID 7 was created. (1 row)

当您将不存在的任务作为输入传递时,查询会返回错误。

SELECT * from rds_aurora.limitless_list_shard_scale_jobs(1691300000001); ERROR: no job found with the job ID provided

您可以使用不带任务 ID 的相同查询来跟踪所有分片拆分任务的状态,例如:

SELECT * FROM rds_aurora.limitless_list_shard_scale_jobs(); job_id | action | job_details | status | submission_time | message ---------------+-------------+-----------------------+-------------+------------------------+-------------------------------------------------------------- 1691200000000 | SPLIT_SHARD | Split Shard 3 by User | IN_PROGRESS | 2023-08-05 01:46:40+00 | 1691300000000 | SPLIT_SHARD | Split Shard 4 by User | SUCCESS | 2023-08-06 05:33:20+00 | Scaling job succeeded. + | | | | | New shard instance with ID 7 was created. 1691400000000 | SPLIT_SHARD | Split Shard 5 by User | FAILED | 2023-08-07 09:20:00+00 | Error occurred for the add shard job 1691400000000. | | | | | Retry the command. If the issue persists, contact AWS Support. 1691500000000 | SPLIT_SHARD | Split Shard 5 by User | CANCELED | 2023-08-07 09:20:00+00 | Scaling job was cancelled. (4 rows)

任务状态可以是下列项之一:

  • IN_PROGRESS – 分片拆分任务已提交且正在进行中。同一时间只能有一个任务在进行中。

  • PENDING – 分片拆分任务正等待您结束。有关更多信息,请参阅 结束分片拆分

  • CANCELLATION_IN_PROGRESS – 用户正在取消分片拆分任务。

  • CANCELED – 用户或系统已成功取消分片拆分任务。

  • SUCCESS – 分片拆分任务已成功完成。该 message 字段包含新分片的实例 ID。

  • FAILED – 分片拆分任务失败。该 message 字段包含失败的详细信息以及可对失败任务采取的任何后续操作。

结束分片拆分

结束是分片拆分流程的最后一步。它会产生一些停机时间。如果启动分片拆分任务,则会在任务成功完成后立即结束。

有时,当您使用 rds_aurora.limitless_enable_auto_scale 参数启用系统发起的分片拆分时,系统会根据工作负载拆分分片。

在这种情况下,您可以选择是立即结束还是按您选择的时间结束。您可以使用 rds_aurora.limitless_finalize_split_shard_mode 数据库集群参数来选择何时结束:

  • 如果将该值设置为 immediate,则会立即结束。

  • 如果将该值设置为 user_initiated,则必须手动结束分片拆分任务。

    系统会向您发送一个 RDS 事件,并将分片拆分任务的状态设置为 PENDING

如果设置为 user_initiated,则使用 rds_aurora.limitless_finalize_split_shard 函数结束分片拆分任务:

SELECT * FROM rds_aurora.limitless_finalize_split_shard(job_id);
注意

此功能仅适用于由系统发起的分片拆分,不适用于用户发起的分片拆分。

取消分片拆分

您可以取消用户发起或系统发起的分片拆分,即 IN_PROGRESSPENDING。您需要任务 ID 才能将其取消。

SELECT * from rds_aurora.limitless_cancel_shard_scale_jobs(job_id);

除非出现错误,否则不会返回任何输出。您可以使用任务跟踪查询来跟踪取消情况。