

# 논리적 복제를 사용하여 Aurora PostgreSQL에 대한 메이저 버전 업그레이드 수행
<a name="AuroraPostgreSQL.MajorVersionUpgrade"></a>

논리적 복제와 Aurora 고속 복제를 사용하면 변경되는 데이터를 새로운 메이저 버전 데이터베이스로 점진적으로 마이그레이션하면서도 현재 Aurora PostgreSQL 데이터베이스 버전을 사용하는 메이저 버전 업그레이드를 수행할 수 있습니다. 가동 중지 시간이 짧은 이 업그레이드 프로세스를 블루/그린 업그레이드라고 합니다. 데이터베이스의 현재 버전을 “블루” 환경이라고 하고 새 데이터베이스 버전을 “그린” 환경이라고 합니다.

Aurora 고속 클로닝은 소스 데이터베이스의 스냅샷을 생성하여 기존 데이터를 완전히 로드합니다. 고속 클로닝은 Aurora 스토리지 계층에 구축되는 기록 중 복사(copy-on-write) 프로토콜을 사용하므로, 짧은 시간 안에 데이터베이스 클론을 생성할 수 있습니다. 이 방법은 대규모 데이터베이스로 업그레이드할 때 매우 효과적입니다.

PostgreSQL에서의 논리적 복제는 사용자가 PostgreSQL 신규 버전으로 전환할 때까지 초기 인스턴스의 데이터 변경 사항을 추적하고 병렬로 실행되는 새 인스턴스로 전송합니다. 논리적 복제에서는 게시 및 구독 모델을 사용합니다. Aurora PostgreSQL 논리적 복제에 대한 자세한 내용은 [Amazon Aurora PostgreSQL를 사용한 복제](AuroraPostgreSQL.Replication.md) 섹션을 참조하세요.

**작은 정보**  
관리형 Amazon RDS 블루/그린 배포 기능을 사용하여 메이저 버전 업그레이드에 필요한 가동 중지를 최소화할 수 있습니다. 자세한 내용은 [데이터베이스 업데이트에 Amazon Aurora 블루/그린 배포 사용](blue-green-deployments.md) 섹션을 참조하세요.

**Topics**
+ [요구 사항](#AuroraPostgreSQL.MajorVersionUpgrade.Requirements)
+ [제한 사항](#AuroraPostgreSQL.MajorVersionUpgrade.Limitations)
+ [파라미터 값 설정 및 확인](#AuroraPostgreSQL.MajorVersionUpgrade.Parameters)
+ [Aurora PostgreSQL를 새로운 메이저 버전으로 업그레이드](#AuroraPostgreSQL.MajorVersionUpgrade.StartLogicalReplication)
+ [업그레이드 후 작업 수행](#AuroraPostgreSQL.MajorVersionUpgrade.PostUpgrade)

## 요구 사항
<a name="AuroraPostgreSQL.MajorVersionUpgrade.Requirements"></a>

가동 중지 시간이 짧은 이 업그레이드 프로세스를 수행하려면 다음 요구 사항을 충족해야 합니다.
+ rds\$1superuser 권한이 있어야 합니다.
+ 업그레이드하려는 Aurora PostgreSQL DB 클러스터가 논리적 복제를 사용하여 메이저 버전 업그레이드를 수행할 수 있는 지원 버전을 실행해야 합니다. DB 클러스터에 마이너 버전 업데이트 및 패치가 있다면 적용해야 합니다. 이 기법에 사용되는 `aurora_volume_logical_start_lsn` 함수는 다음 버전의 Aurora PostgreSQL에서 지원됩니다.
  + 15.2 이상의 15 버전
  + 14.3 이상의 14 버전
  + 13.6 이상의 13 버전
  + 12.10 이상의 12 버전
  + 11.15 이상의 11 버전
  + 10.20 이상의 10 버전

  `aurora_volume_logical_start_lsn` 함수에 대한 자세한 내용은 [aurora\$1volume\$1logical\$1start\$1lsn](aurora_volume_logical_start_lsn.md) 섹션을 참조하세요.
+ 모든 테이블에는 프라이머리 키가 있거나 [PostgreSQL ID 열](https://www.postgresql.org/docs/current/sql-createtable.html)이 포함되어야 합니다.
+ 두 (이전 및 신규 클러스터를 포함한) Aurora PostgreSQL DB 클러스터 간의 인바운드 및 아웃바운드 액세스를 허용하도록 VPC의 보안 그룹을 구성합니다. 특정 Classless Inter-Domain Routing(CIDR) 범위 또는 VPC나 피어 VPC의 다른 보안 그룹에 대한 액세스 권한을 부여할 수 있습니다. (피어 VPC에는 VPC 피어링 연결이 필요합니다.)

**참고**  
실행 중인 논리적 복제 시나리오를 구성하고 관리하는 데 필요한 권한에 대한 자세한 내용은 [PostgreSQL 핵심 설명서](https://www.postgresql.org/docs/13/logical-replication-security.html)를 참조하십시오.

## 제한 사항
<a name="AuroraPostgreSQL.MajorVersionUpgrade.Limitations"></a>

 Aurora PostgreSQL DB 클러스터를 새 메이저 버전으로 업그레이드하기 위해 가동 중지 시간이 짧은 업그레이드를 수행할 때는 기본 PostgreSQL 논리적 복제 기능을 사용하게 됩니다. PostgreSQL 논리적 복제와 동일한 기능과 제한 사항이 있습니다. 자세한 내용은 [PostgreSQL 논리적 복제](https://www.postgresql.org/docs/13/logical-replication.html)를 참조하세요.
+ 데이터 정의 언어(DDL) 명령은 복제되지 않습니다.
+ 복제는 라이브 데이터베이스에서의 스키마 변경을 지원하지 않습니다. 스키마는 클로닝 프로세스 중에 원래 형태로 재생성됩니다. 클로닝 후 업그레이드가 완료되기 전에 스키마를 변경하면 변경 사항이 업그레이드된 인스턴스에 반영되지 않습니다.
+ 대형 객체는 복제되지 않지만 일반 테이블에 데이터를 저장할 수 있습니다.
+ 복제는 파티션을 나눈 테이블을 포함한 테이블에서만 지원됩니다. 뷰, 구체화된 뷰 또는 외부 테이블 같은 다른 유형의 관계로의 복제는 지원되지 않습니다.
+ 시퀀스 데이터는 복제되지 않으며 장애 조치 후 수동 업데이트가 필요합니다.

**참고**  
이 업그레이드는 자동 스크립팅을 지원하지 않습니다. 모든 단계를 직접 수행해야 합니다.

## 파라미터 값 설정 및 확인
<a name="AuroraPostgreSQL.MajorVersionUpgrade.Parameters"></a>

 업그레이드하기 전에 Aurora PostgreSQL DB 클러스터의 라이터 인스턴스를 게시 서버로 작동하도록 구성합니다. 인스턴스는 다음 설정이 적용된 사용자 지정 DB 클러스터 파라미터 그룹을 사용해야 합니다.
+ `rds.logical_replication` – 이 파라미터를 1로 설정합니다. `rds.logical_replication` 파라미터는 미리 쓰기 로그 파일 관리를 제어하는 독립 실행형 PostgreSQL 서버의 `wal_level` 파라미터 및 기타 파라미터와 동일한 용도로 사용됩니다.
+ `max_replication_slots` – 이 파라미터를 생성할 총 구독 수로 설정합니다. AWS DMS를 사용 중인 경우 이 파라미터를 이 DB 클러스터에서 변경된 데이터를 캡처하는 데 사용할 AWS DMS 태스크의 숫자로 설정합니다.
+ `max_wal_senders` - 관리 태스크와 새 세션에 사용할 수 있도록 동시 연결 수에 약간의 여분을 더한 수로 설정합니다. AWS DMS를 사용하는 경우 max\$1wal\$1senders 수는 총 동시 세션 수에 특정 시간에 작동하는 AWS DMS 태스크 수를 더한 값과 같아야 합니다.
+ `max_logical_replication_workers` - 예상하는 논리적 복제 작업자 및 테이블 동기화 작업자 수로 설정합니다. 일반적으로는 복제 작업자 수를 max\$1wal\$1senders에 사용한 것과 동일한 값으로 설정하는 것이 안전합니다. 작업자는 서버에 할당된 백그라운드 프로세스 풀(max\$1worker\$1processes)에서 가져옵니다.
+  `max_worker_processes` - 서버의 백그라운드 프로세스 수로 설정합니다. 이 수는 복제, 자동 진공 처리 프로세스 및 동시에 수행될 수 있는 기타 유지 관리 프로세스에 작업자를 할당할 수 있을만큼 커야 합니다.

신규 버전의 Aurora PostgreSQL로 업그레이드하는 경우 이전 버전 파라미터 그룹에서 수정한 모든 파라미터를 복제해야 합니다. 이러한 파라미터는 업그레이드된 버전에 적용됩니다. `pg_settings` 테이블을 쿼리하여 파라미터 설정 목록을 얻어 새 Aurora PostgreSQL DB 클러스터에서 파라미터 설정을 다시 생성할 수 있습니다.

예를 들어 복제 파라미터의 설정을 얻으려면 다음 쿼리를 실행합니다.

```
SELECT name, setting FROM pg_settings WHERE name in 
('rds.logical_replication', 'max_replication_slots', 
'max_wal_senders', 'max_logical_replication_workers', 
'max_worker_processes');
```

## Aurora PostgreSQL를 새로운 메이저 버전으로 업그레이드
<a name="AuroraPostgreSQL.MajorVersionUpgrade.StartLogicalReplication"></a>

**게시자(블루) 준비 방법**

1. 다음 예제에서 소스 라이터 인스턴스(블루)는 PostgreSQL 버전 11.15를 실행하는 Aurora PostgreSQL DB 클러스터입니다. 이 복제 시나리오에서는 게시 노드입니다. 이 데모에서 소스 라이터 인스턴스는 일련의 값을 포함하는 샘플 테이블을 호스팅합니다.

   ```
   CREATE TABLE my_table (a int PRIMARY KEY);
   INSERT INTO my_table VALUES (generate_series(1,100));
   ```

1. 원본 인스턴스에서 게시자를 만들려면 psql(CLI for PostgreSQL) 또는 원하는 클라이언트를 사용하여 인스턴스의 라이터 노드에 연결해야 합니다. 각 데이터베이스에 다음 명령을 입력합니다.

   ```
   CREATE PUBLICATION publication_name FOR ALL TABLES;
   ```

   publication\$1name은 게시의 이름을 지정합니다.

1. 인스턴스에서 복제 슬롯을 생성해야 합니다. 다음 명령은 복제 슬롯을 생성하고 `pgoutput` [논리적 디코딩 플러그인](https://www.postgresql.org/docs/current/logicaldecoding-explanation.html)을 로드합니다. 이 플러그인은 미리 쓰기 로그(WAL)에서 읽은 콘텐츠를 논리적 복제 프로토콜로 변경하고, 게시 사양에 따라 데이터를 필터링합니다.

   ```
   SELECT pg_create_logical_replication_slot('replication_slot_name', 'pgoutput');
   ```

**게시자를 복제하는 방법**

1. Amazon RDS 콘솔을 사용하여 원본 인스턴스의 클론을 만듭니다. Amazon RDS 콘솔에서 인스턴스 이름을 강조 표시한 다음 **Actions**(작업) 메뉴에서 **Create clone**(복제본 생성)을 선택합니다.  
![\[Aurora MySQL DB 클러스터 버전 2에서 버전 3으로의 현재 위치 업그레이드\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/AuroraUserGuide/images/apg-logicalreplication-mvu-create-clone.png)

1. 인스턴스의 고유 이름을 입력합니다. 대부분의 설정은 소스 인스턴스의 기본값입니다. 새 인스턴스에 필요한 변경 사항을 적용했다면 **Create clone**(복제본 생성)을 선택합니다.  
![\[Aurora MySQL DB 클러스터 버전 2에서 버전 3으로의 현재 위치 업그레이드\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/AuroraUserGuide/images/apg-logicalreplication-mvu-create-clone-note.png)

1. 대상 인스턴스가 시작되는 동안 라이터 노드의 **Status**(상태) 열에는 **Status**(상태) 열에 생성 중(Creating)이 표시됩니다. 인스턴스가 준비되면 인스턴스의 상태가 사용 가능(Aavailable)으로 변경됩니다.

**업그레이드를 위해 클론 준비**

1. 클론은 배포 모델의 '그린' 인스턴스입니다. 이것은 복제 구독 노드의 호스트입니다. 노드를 사용할 수 있게 되면 psql에 연결하고 새 라이터 노드에 아래의 쿼리를 수행해 LSN(로그 시퀀스 번호)을 얻습니다. LSN은 WAL 스트림에서 레코드가 시작되는 부분을 나타냅니다.

   ```
   SELECT aurora_volume_logical_start_lsn();
   ```

1. 쿼리의 응답에서 LSN 번호를 찾을 수 있습니다. 프로세스 후반부에 필요하니 이 번호를 메모해 두십시오.

   ```
   postgres=> SELECT aurora_volume_logical_start_lsn();
   aurora_volume_logical_start_lsn 
   ---------------
   0/402E2F0
   (1 row)
   ```

1. 클론을 업그레이드하기 전에 클론의 복제 슬롯을 삭제하세요.

   ```
   SELECT pg_drop_replication_slot('replication_slot_name');
   ```

**클러스터를 새 메이저 버전으로 업그레이드**
+ 공급자 노드를 복제한 후 Amazon RDS 콘솔을 사용하여 구독 노드에서 메이저 버전 업그레이드를 시작합니다. RDS 콘솔에서 인스턴스 이름을 강조 표시하고 **Modify**(수정) 버튼을 선택합니다. 업데이트된 버전과 업데이트된 파라미터 그룹을 선택하고, 설정을 즉시 적용하여 대상 인스턴스를 업그레이드합니다.  
![\[Aurora MySQL DB 클러스터 버전 2에서 버전 3으로의 현재 위치 업그레이드\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/AuroraUserGuide/images/apg-logicalreplication-mvu-modify-DB-cluster.png)
+ CLI를 사용하여 업그레이드를 수행할 수도 있습니다.

  ```
  aws rds modify-db-cluster —db-cluster-identifier $TARGET_Aurora_ID —engine-version 13.6 —allow-major-version-upgrade —apply-immediately
  ```

**가입자(그린)를 준비하는 방법**

1. 업그레이드 후에 클론이 사용 가능해지면 psql에 연결하고 구독을 정의합니다. 이렇게 하려면 `CREATE SUBSCRIPTION` 명령에서 다음 옵션을 지정해야 합니다.
   + `subscription_name` – 구독의 이름입니다.
   + `admin_user_name` - rds\$1superuser 권한이 있는 관리자 사용자의 이름입니다.
   + `admin_user_password` - 관리자 사용자와 연결된 암호입니다.
   + `source_instance_URL` - 게시 서버 인스턴스의 URL입니다.
   + `database` - 구독 서버가 연결할 데이터베이스입니다.
   + `publication_name` - 게시 서버의 이름입니다.
   + `replication_slot_name` - 복제 슬롯의 이름입니다.

   ```
   CREATE SUBSCRIPTION subscription_name 
   CONNECTION 'postgres://admin_user_name:admin_user_password@source_instance_URL/database' PUBLICATION publication_name 
   WITH (copy_data = false, create_slot = false, enabled = false, connect = true, slot_name = 'replication_slot_name');
   ```

1.  구독을 생성한 후 [pg\$1replication\$1origin](https://www.postgresql.org/docs/14/catalog-pg-replication-origin.html) 뷰를 쿼리하여 복제 원본의 식별자인 roname 값을 검색합니다. 각 인스턴스에는 `roname`이 하나씩 있습니다.

   ```
   SELECT * FROM pg_replication_origin;
   ```

   예제:

   ```
   postgres=> 
   SELECT * FROM pg_replication_origin;
    
   roident | roname 
   ---------+----------
   1 | pg_24586
   ```

1. 게시 노드의 이전 쿼리에서 저장한 LSN과 명령의 [INSTANCE] 구독 노드에서 반환된 `roname`을 입력합니다. 이 명령은 `[pg\$1replication\$1origin\$1advance](https://www.postgresql.org/docs/14/functions-admin.html)` 함수를 사용하여 복제를 위한 로그 시퀀스의 시작점을 지정합니다.

   ```
   SELECT pg_replication_origin_advance('roname', 'log_sequence_number');
   ```

   `roname`은 pg\$1replication\$1origin 뷰에서 반환된 식별자입니다.

   `log_sequence_number`는 `aurora_volume_logical_start_lsn` 함수의 이전 쿼리에서 반환된 값입니다.

1. 그런 다음 `ALTER SUBSCRIPTION... ENABLE` 절을 사용하여 논리적 복제를 켭니다.

   ```
   ALTER SUBSCRIPTION subscription_name ENABLE;
   ```

1. 이 시점에서 복제가 제대로 작동하는지 확인할 수 있습니다. 게시 인스턴스에 값을 추가한 다음 값이 구독 노드에 복제되었는지 확인합니다.

   그런 다음 아래 명령을 사용하여 게시 노드의 복제 지연을 모니터링합니다.

   ```
   SELECT now() AS CURRENT_TIME, slot_name, active, active_pid, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),
   confirmed_flush_lsn)) AS diff_size, pg_wal_lsn_diff(pg_current_wal_lsn(),
   confirmed_flush_lsn) AS diff_bytes FROM pg_replication_slots WHERE slot_type = 'logical';
   ```

   예제:

   ```
   postgres=> SELECT now() AS CURRENT_TIME, slot_name, active, active_pid, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), 
   confirmed_flush_lsn)) AS diff_size, pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn) AS diff_bytes FROM pg_replication_slots WHERE slot_type = 'logical';
    
   current_time                   | slot_name             | active | active_pid | diff_size | diff_bytes 
   -------------------------------+-----------------------+--------+------------+-----------+------------
   2022-04-13 15:11:00.243401+00  | replication_slot_name | t      | 21854      | 136 bytes | 136
   (1 row)
   ```

   `diff_size` 및 `diff_bytes` 값을 사용하여 복제 지연을 모니터링할 수 있습니다. 이러한 값이 0에 도달하면 복제본이 원본 DB 인스턴스를 따라잡은 것입니다.

## 업그레이드 후 작업 수행
<a name="AuroraPostgreSQL.MajorVersionUpgrade.PostUpgrade"></a>

업그레이드가 완료되면 콘솔 대시보드 **Status(상태)** 열에 인스턴스 상태가 **Available**(사용 가능)로 표시됩니다. 새 인스턴스에서는 다음을 수행하는 것이 좋습니다.
+ 라이터 노드를 가리키도록 애플리케이션을 리디렉션합니다.
+ 케이스로드를 관리하고 라이터 노드에 문제가 발생할 경우 고가용성을 제공할 수 있도록 리더 노드를 추가합니다.
+ Aurora PostgreSQL DB 클러스터는 때때로 운영 체제 업데이트가 필요합니다. 이러한 업데이트에는 glibc 라이브러리의 최신 버전도 포함될 수 있습니다. 이러한 업데이트를 진행하는 중에는 [Aurora PostgreSQL 에서 지원되는 데이터 정렬입니다.](PostgreSQL-Collations.md)에 설명된 지침을 따르는 것이 좋습니다.
+ 액세스를 보장하기 위해 새 인스턴스의 사용자 권한을 업데이트합니다.

새 인스턴스에서 애플리케이션과 데이터를 테스트한 후에는 초기 인스턴스를 제거하기 전에 최종 백업을 만드는 것이 좋습니다. Aurora 호스트에서 논리적 복제를 사용하는 자세한 방법은 [Aurora PostgreSQL DB 클러스터의 논리적 복제 설정](AuroraPostgreSQL.Replication.Logical.Configure.md) 단원을 참조하십시오.