

# DB 샤드 그룹에서 샤드 분할
<a name="limitless-shard-split"></a>

DB 샤드 그룹의 샤드를 두 개의 더 작은 샤드로 수동으로 분할할 수 있습니다. 이를 *사용자 시작* 샤드 분할이라고 합니다.

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 샤드 그룹은 비워둘 수 없습니다. 샤딩된 테이블을 하나 이상 포함해야 합니다.
+ 사용자에게 `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/ko_kr/AmazonRDS/latest/AuroraUserGuide/limitless-shard-split.html)<br />자세한 내용은 [샤드 분할 마무리](#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` - 샤드 분할 작업이 제출되어 진행 중입니다. 한 번에 하나의 작업만 진행할 수 있습니다.
+ `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}});
```

오류가 없으면 출력이 반환되지 않습니다. 작업 추적 쿼리를 사용하여 취소를 추적할 수 있습니다.