현재 Aurora PostgreSQL 버전 11.6을 사용중인데, 최근 아마존으로부터 Aurora 버전 업그레이드 요청이 왔다.
아마존에 따르면, 더이상 버전 11.6을 지원하지 않을 것이라고 한다. 3월 중에 강제로 버전을 올릴 예정이라고 하는데 그러면 서비스 운영 중에 문제가 생길 수 있으니 그 전에 알아서 서비스에 지장을 주지 않는 시기와 방법을 통해 업그레이드를 진행해야 한다는 과제가 생겼다.
업그레이드를 하기에 앞서, 몇 가지 확인해야 하는 사항들이 있었다.
major.minor
형식을 갖는다.메이저 버전 업그레이드
에 해당한다. aws rds describe-db-engine-versions \
--engine aurora-postgresql \
--engine-version {현재 버전} \
--query 'DBEngineVersions[].ValidUpgradeTarget[?IsMajorVersionUpgrade == `true`].{EngineVersion:EngineVersion}' \
--output text
→ 확인 결과, 아래의 네 가지 버전으로 업그레이드가 가능하다. (이는 aws console의 각 데이터베이스에서 수정
클릭을 통해서도 확인이 가능하다.)```
11.7
11.8
11.9
11.11
11.12
11.13
```
가장 최신 버전으로 업그레이드 하는 것도 좋지만 현재 본인이 사용하고 있는 기능에 지장이 없을 지 꼼꼼하게 확인해 보아야 한다.
가장 좋은 방법은 aws 공식 문서에서도 권고 하듯이 테스트 DB를 만들어 확인 해 보는 것이다.
그럼 이제 위의 사항들을 인지한 상태에서 업그레이드를 진행해 본다.
아래 2, 3, 5,번은 확장을 사용하지 않는 경우 해당 사항이 없다. 바로 모의 테스트로 넘어가면 된다.
사용자 지정 DB 인스턴스 또는 DB 클러스터 파라미터 그룹을 사용하는 경우 아래의 두 가지 옵션을 따른다.
이 경우는 aws console을 이용해 업데이트를 시도 하지 않고 aws-cli를 이용해 업데이트를 시도할 때에만 해당한다. 왜냐하면, 메이저 버전 업데이트를 시도할 경우 새 버전에 맞추어 파라미터 그룹을 지정해야 하는데 console에서는 default를 제공해 주지만 aws-cli의 경우 그렇지 않기 때문이다.
SELECT count(*) FROM pg_catalog.pg_prepared_xacts;
SELECT count(*) FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n, pg_catalog.pg_attribute a
WHERE c.oid = a.attrelid
AND NOT a.attisdropped
AND a.atttypid IN ('pg_catalog.regproc'::pg_catalog.regtype,
'pg_catalog.regprocedure'::pg_catalog.regtype,
'pg_catalog.regoper'::pg_catalog.regtype,
'pg_catalog.regoperator'::pg_catalog.regtype,
'pg_catalog.regconfig'::pg_catalog.regtype,
'pg_catalog.regdictionary'::pg_catalog.regtype)
AND c.relnamespace = n.oid
AND n.nspname NOT IN ('pg_catalog', 'information_schema');
DB 클러스터 스냅샷
이 생성되지만, 혹시 모르니 업그레이드 전에 수동 백업을 진행할 수도 있다. pgRouting
postgis_raster
postgis_tiger_geocoder
postgis_topology
address_standardizer
address_standardizer_data_us
ALTER EXTENSION <PostgreSQL-extension> UPDATE TO 'new-version'
unknown
데이터 형식 삭제하기(선택) 버전 10부터는 unknown
데이터 형식에 대한 지원이 중지 되었다. 따라서 unknown
데이터 형식을 찾아 삭제해야 한다. 찾는 방법은 다음과 같다.
SELECT DISTINCT data_type FROM information_schema.columns WHERE data_type ILIKE 'unknown';
테스트 DB를 생성하기 위한 방법으로는 크게 2가지가 있는데 최근 스냅샷에서 데이터베이스 복원 또는 복제
를 하거나 S3에서 가져오기
를 사용하는 방법이다.
1) S3에서 가져오기
만약 S3에 스냅샷을 저장하고 있다면 DB 생성시 S3에서 가져오기
버튼을 클릭해서 모든 데이터를 가져올 수 있다.
버킷의 하위 폴더에 들어 있는 스냅샷 데이터를 가져오려면 아래와 같은 방법으로 해야 한다.
예를 들어 이름이 backups인 하위 폴더의 S3에 백업 파일을 저장했고 여러 세트의 백업 파일이 각각 자체 디렉터리(gzip_backup1, gzip_backup2 등)에 들어 있다고 가정해봅시다. 이 경우 gzip_backup1 폴더의 파일에서 복원하려면 backups/gzip_backup1의 접두사를 지정합니다.
방법은 여기를 참고하면 된다.
→ 그러나 이 방법으로는 Mysql 하위 호환 버전만 생성된다. 따라서, 기존에 사용하던 PostgreSQL 호환 버전을 생성하고 싶다면 스냅샷 생성해 놓은 것이 있을 경우 스냅샷으로부터 데이터베이스를 생성하는 것이 좋다.
2) 스냅샷 통해 복원하기
메뉴에서 스냅샷에 들어가 최근 스냅샷을 찾고, 복원하고자 하는 스냅샷 체크 박스를 클릭한 후 우측 상단의 작업
> 스냅샷 복원
을 선택하면 된다.
→ 이 방법을 통해 PostgreSQL 호환 버전을 생성할 수 있다.
→ 기존의 DB와 똑같은 버전을 선택해서 생성하면 된다(다른 메이저 버전으로 복원은 불가능하다).
콘솔에서 수동으로 업그레이드 하거나 AWS CLI 또는 RDS API를 사용하는 방법이 있는데 그건 이 페이지를 참고하면 될 것 같다. 아래에 더 자세하게 설명해 놓았다.
업그레이드 중에 진행 사항을 보고 싶다면?
진행 중인 업그레이드에 대한 자세한 내용은 Amazon RDS를 사용하여 pg_upgrade 유틸리티가 생성하는 두 개의 로그를 볼 수 있다. 이러한 로그는 pg_upgrade_internal.log
및 pg_upgrade_server.log
이다.
→ 요기를 참고하면 사용법을 자세히 볼 수 있다.
→ 그러나 이 방법 역시 해당 확장을 사용해야 확인이 가능하다.
위에서 설명한 진행 방법을 토대로 실제 테스트를 진행해 보았다.
aws cli로 버전 업그레이드 진행시 수동으로 값을 생성해 주어야 하지만, aws console에서 버전 업그레이드 진행시 default 값이 주어짐
→ 새로운 버전에 맞는 파라미터를 클러스터
와 인스턴스
용으로 두 가지 만들어 놓는다.
→ aws-cli를 이용할 경우 메이저 업그레이드
진행시 아래와 같이 파라미터 그룹을 명시해야 한다.(클러스터 --db-cluster-parameter-group-name {클러스터 파라미터 그룹}
& 인스턴스 --db-instance-parameter-group-name {인스턴스 파라미터 그룹}
) 아래의 예시는 버전 12로 메이저 업그레이드 할 때의 설정이다.
aws rds modify-db-cluster \
--db-cluster-identifier {클러스터명} \
--engine-version {타겟 버전} \
--db-cluster-parameter-group-name postgresql12-cluster-paramter-group \
--db-instance-parameter-group-name postgresql12-paramter-group \
--allow-major-version-upgrade \
--apply-immediately
만약 본인이 개발한 서비스가 다운타임 없이 업그레이드를 해야 하는 비트코인 거래소 같은 것이었다면 위의 방법으로 업그레이드를 진행하면 안된다. 무중단 업그레이드가 까다롭긴 해도 방법이 있긴 하다.
DMS를 이용한 db 이중화
CDC란?
CDC는 AWS DMS 원본 데이터 스토어에서 진행중인 변경 사항을 캡처하는 작업을 말한다. 데이터를 마이그레이션하는 동안에도 이 변경 사항을 캡처할 수 있다.
작업을 생성해 지원된 대상 데이터 스토어로 초기(전체 로드) 마이그레이션을 완료한 후 지속적 변경 사항을 캡처할 수도 있다.
- 이 프로세스는 진행 중인 복제 또는 변경 데이터 캡처(CDC)라고 한다.
참고
1) 블로그
2) 공식 문서