

# DB シャードグループ内のシャードの分割
<a name="limitless-shard-split"></a>

DB シャードグループのシャードは、手動で 2 つの小さなシャードに分割できます。これは、*ユーザー開始*のシャード分割と呼ばれます。

Aurora PostgreSQL Limitless Database は、データ量が非常に多いか、使用量が非常に多い場合にシャードを分割することもできます。これは、*システム開始*のシャード分割と呼ばれます。

**Topics**
+ [前提条件](#limitless-shard-split.prereqs)
+ [シャードの分割](#limitless-shard-split.proc)
+ [シャード分割の追跡](#limitless-shard-split.track)
+ [シャード分割の確定](#limitless-shard-split.finalize)
+ [シャード分割のキャンセル](#limitless-shard-split.cancel)

## 前提条件
<a name="limitless-shard-split.prereqs"></a>

ユーザー開始のシャード分割には、次の前提条件があります。
+ DB シャードグループが必要です。
+ DB シャードグループは空にすることはできません。少なくとも 1 つのシャードテーブルが含まれている必要があります。
+ ユーザーには `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
  ```

システム開始のシャード分割を有効にするには、DB クラスターに関連付けられたカスタム DB クラスターパラメータグループに次の DB クラスターパラメータを設定します。


| パラメータ | 値 | 
| --- | --- | 
|  `rds_aurora.limitless_enable_auto_scale`  |  `on`  | 
|  `rds_aurora.limitless_auto_scale_options`  |  `split_shard` または `add_router,split_shard`  | 
|  `rds_aurora.limitless_finalize_split_shard_mode`  |  このパラメータは、*システム開始*のシャード分割を確定する方法を決定します。値は次のいずれかになります: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/limitless-shard-split.html) 詳細については、「[シャード分割の確定](#limitless-shard-split.finalize)」を参照してください。  このパラメータは、システム開始のシャード分割にのみ適用されます。   | 

詳細については、「[Amazon Aurora DB クラスターの DB クラスターパラメータグループ](USER_WorkingWithDBClusterParamGroups.md)」を参照してください。

## シャードの分割
<a name="limitless-shard-split.proc"></a>

DB シャードグループ内のシャードを分割するには、`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)
```

**注記**  
同時シャード分割オペレーションはサポートされていません。各オペレーションを順番に実行し、各オペレーションを完了してから別の追加オペレーションを開始します。

## シャード分割の追跡
<a name="limitless-shard-split.track"></a>

ジョブ 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` – シャード分割ジョブが送信され、進行中です。一度に進行中のジョブは 1 つだけです。
+ `PENDING` – シャード分割ジョブは確定を待っています。詳細については、「[シャード分割の確定](#limitless-shard-split.finalize)」を参照してください。
+ `CANCELLATION_IN_PROGRESS` – シャード分割ジョブはユーザーによってキャンセルされています。
+ `CANCELED` – シャード分割ジョブは、ユーザーまたはシステムによって正常にキャンセルされました。
+ `SUCCESS` – シャード分割ジョブが正常に完了しました。`message` フィールドには、新しいシャードのインスタンス ID が含まれます。
+ `FAILED` – シャード分割ジョブが失敗しました。`message` フィールドには、失敗の詳細と、失敗したジョブのフォローアップとして実行できるアクションが含まれます。

## シャード分割の確定
<a name="limitless-shard-split.finalize"></a>

確定はシャード分割プロセスの最後のステップです。これにより、ダウンタイムが発生します。シャード分割ジョブを開始すると、ジョブが正常に完了した直後に確定が行われます。

`rds_aurora.limitless_enable_auto_scale` パラメータを使用してシステム開始のシャード分割を有効にした場合、システムはワークロードに基づいてシャードを分割することがあります。

この場合、確定をすぐに行うか、選択した時間に行うかを選択できます。`rds_aurora.limitless_finalize_split_shard_mode` DB クラスターパラメータを使用して、タイミングを選択します。
+ 値を `immediate` に設定した場合、すぐに確定されます。
+ 値を `user_initiated` に設定した場合、シャード分割ジョブを手動で確定する必要があります。

  RDS イベントがユーザーに送信され、シャード分割ジョブのステータスが `PENDING` に設定されます。

`user_initiated` に設定した場合、`rds_aurora.limitless_finalize_split_shard` 関数を使用してシャード分割ジョブを確定します。

```
SELECT * FROM rds_aurora.limitless_finalize_split_shard(job_id);
```

**注記**  
この関数は、ユーザーではなく、システムによって開始されたシャード分割にのみ適用されます。

## シャード分割のキャンセル
<a name="limitless-shard-split.cancel"></a>

`IN_PROGRESS` または `PENDING` のユーザー開始またはシステム開始のシャード分割をキャンセルできます。キャンセルするにはジョブ ID が必要です。

```
SELECT * from rds_aurora.limitless_cancel_shard_scale_jobs(job_id);
```

エラーがない限り、出力は返されません。ジョブ追跡クエリを使用してキャンセルを追跡できます。