在資料庫碎片群組中分割碎片 - Amazon Aurora

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在資料庫碎片群組中分割碎片

您可以手動將資料庫碎片群組中的碎片分割成兩個較小的碎片。這稱為使用者起始的碎片分割。

Aurora PostgreSQL 無限資料庫也可以在碎片具有非常大量的資料或非常高的用量時分割碎片。這稱為系統啟動的碎片分割。

先決條件

使用者啟動的碎片分割具有下列先決條件:

  • 您必須擁有資料庫碎片群組。

  • 資料庫碎片群組不能為空:它必須至少包含一個碎片資料表。

  • 使用者必須具有 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

若要啟用系統啟動的碎片分割,請在與資料庫叢集相關聯的自訂資料庫叢集參數群組中設定下列資料庫叢集參數:

參數 Value

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);

除非發生錯誤,否則不會傳回任何輸出。您可以使用任務追蹤查詢來追蹤取消。