Amazon RDS for PostgreSQL로 PostgreSQL 확장 사용 - Amazon Relational Database Service

Amazon RDS for PostgreSQL로 PostgreSQL 확장 사용

다양한 확장 프로그램 및 모듈을 설치하여 PostgreSQL의 기능을 확장할 수 있습니다. 예를 들어 공간 데이터로 작업하려면 PostGIS 확장을 설치하고 사용할 수 있습니다. 자세한 내용은 PostGIS 확장을 사용하여 공간 데이터 관리 단원을 참조하십시오. 또 다른 예로, 매우 큰 테이블의 데이터 입력을 개선하려는 경우 pg_partman 확장을 사용하여 데이터 분할을 고려할 수 있습니다. 자세한 내용은 pg_partman 확장자를 사용하여 PostgreSQL 파티션 관리하기을 참조하십시오.

참고

RDS for PostgreSQL 14.5부터, RDS for PostgreSQL은 PostgreSQL용 신뢰할 수 있는 언어 확장을 지원합니다. 이 기능은 RDS for PostgreSQL DB 인스턴스에 추가할 수 있는 pg_tle 확장으로 구현됩니다. 이 확장을 사용하면 개발자는 설정 및 구성 요구 사항을 간소화하는 안전한 환경에서 자체 PostgreSQL 확장을 만들 수 있습니다. 자세한 내용은 PostgreSQL용 신뢰할 수 있는 언어 확장 작업 단원을 참조하십시오.

경우에 따라 확장을 설치하는 대신 RDS for PostgreSQL DB 인스턴스의 사용자 지정 DB 파라미터 그룹의 shared_preload_libraries 목록에 특정 모듈을 추가할 수 있습니다. 일반적으로 기본 DB 클러스터 파라미터 그룹은 pg_stat_statements만 로드하지만 목록에 추가할 수 있는 다른 모듈도 몇 개 있습니다. 예를 들어, PostgreSQL pg_cron 확장을 사용하여 유지 관리 예약에 자세히 설명된 대로 pg_cron 모듈을 추가하여 스케줄링 기능을 추가할 수 있습니다. 또 다른 예로, auto_explain 모듈을 로드하여 쿼리 실행 계획을 로깅할 수 있습니다. 자세히 알아보려면 AWS 지식 센터에서 쿼리 실행 계획 로깅에 관한 문서를 참조하세요.

RDS for PostgreSQL 버전에 따라 확장 프로그램을 설치하려면 다음과 같이 rds_superuser 권한이 필요합니다.

  • RDS for PostgreSQL 버전 12 및 이전 버전의 경우 확장 프로그램을 설치하려면 rds_superuser 권한이 필요합니다.

  • RDS for PostgreSQL 버전 13 및 이상 버전의 경우 지정된 데이터베이스 인스턴스에 대한 생성 권한이 있는 사용자(역할)는 신뢰할 수 있는 확장 프로그램을 설치하고 사용할 수 있습니다. 신뢰할 수 있는 확장 프로그램 목록은 PostgreSQL 신뢰할 수 있는 확장 섹션을 참조하세요.

RDS for PostgreSQL DB 인스턴스에 설치할 수 있는 확장 프로그램을 rds.allowed_extensions 파라미터에 나열하여 정확하게 지정할 수도 있습니다. 자세한 내용은 PostgreSQL 확장의 설치 제한 단원을 참조하십시오.

rds_superuser 역할에 대한 자세한 내용은 PostgreSQL 역할 및 권한 이해 섹션을 참조하세요.

orafce 확장에서 함수 사용

orafce 확장은 Oracle 데이터베이스에서 함수와 패키지의 하위 집합을 에뮬레이션하는 함수 및 연산자를 제공합니다. orafce 확장을 사용하면 Oracle 애플리케이션을 PostgreSQL로 쉽게 포팅할 수 있습니다. 이 확장은 RDS for PostgreSQL 버전 9.6.6 이상에서 지원됩니다. orafce에 대한 자세한 내용은 GitHub에서 orafce를 참조하세요.

참고

RDS for PostgreSQL은 orafce 확장의 일부분인 utl_file 패키지를 지원하지 않습니다. 이는 utl_file 스키마 함수가 기본 호스트에 대한 수퍼유저 권한을 필요로 하는 운영 체제 텍스트 파일의 읽기 및 쓰기 작업을 제공하기 때문입니다. 관리형 서비스에서 RDS for PostgreSQL은 호스트 액세스를 제공하지 않습니다.

orafce 확장을 사용하려면
  1. DB 인스턴스를 생성할 때 사용한 기본 사용자 이름으로 DB 인스턴스에 연결합니다.

    동일한 DB 인스턴스의 다른 데이터베이스에 대해 orafce를 활성화하려면 /c dbname psql 명령을 사용합니다. 이 명령을 사용하면 연결을 시작한 후 기본 데이터베이스에서 변경합니다.

  2. CREATE EXTENSION 문을 사용하여 orafce 확장을 활성화합니다.

    CREATE EXTENSION orafce;
  3. ALTER SCHEMA 문을 사용하여 oracle 스키마 소유권을 rds_superuser 역할로 이전합니다.

    ALTER SCHEMA oracle OWNER TO rds_superuser;

    oracle 스키마의 소유자 목록을 보려면 \dn psql 명령을 사용합니다.

pgactive를 사용하여 액티브-액티브 복제 지원

pgactive 확장은 액티브-액티브 복제를 사용하여 여러 RDS for PostgreSQL 데이터베이스에서 쓰기 작업을 지원하고 조정합니다. Amazon RDS for PostgreSQL은 다음 버전에서 pgactive 확장을 지원합니다.

  • RDS for PostgreSQL 16.1 이상의 16 버전

  • RDS for PostgreSQL 15.4-R2 이상의 15 버전

  • RDS for PostgreSQL 14.10 이상의 14 버전

  • RDS for PostgreSQL 13.13 이상의 13 버전

  • RDS for PostgreSQL 12.17 이상의 12 버전

  • RDS for PostgreSQL 11.22

참고

복제 구성에서 둘 이상의 데이터베이스에 쓰기 작업이 있는 경우 충돌이 발생할 수 있습니다. 자세한 내용은 액티브-액티브 복제의 충돌 처리 단원을 참조하세요.

pgactive 확장 기능 초기화

RDS for PostgreSQL DB 인스턴스에서 pgactive 확장 기능을 초기화하려면 rds.enable_pgactive 파라미터 값을 1로 설정한 다음 데이터베이스에 확장을 생성합니다. 이렇게 하면 파라미터 rds.logical_replicationtrack_commit_timestamp가 자동으로 활성화되고 wal_level 값이 logical로 설정됩니다.

이러한 작업을 수행하려면 rds_superuser 역할의 권한이 있어야 합니다.

AWS Management Console 또는 AWS CLI를 사용하여 PostgreSQL DB 인스턴스에 필요한 RDS를 생성할 수 있습니다. 다음 단계에서는 RDS for PostgreSQL DB 인스턴스가 사용자 지정 DB 파라미터 그룹에 연결되어 있다고 가정합니다. 사용자 지정 DB 파라미터 그룹 생성에 대한 자세한 내용은 파라미터 그룹 작업 단원을 참조하세요.

pgactive 확장 기능을 초기화하려면
  1. https://console.aws.amazon.com/rds/에서 AWS Management Console에 로그인한 후 Amazon RDS 콘솔을 엽니다.

  2. 탐색 창에서 RDS for PostgreSQL DB 인스턴스를 선택합니다.

  3. RDS for PostgreSQL DB 인스턴스의 구성 탭을 엽니다. 인스턴스 세부 정보에서 DB 인스턴스 파라미터 그룹 링크를 찾습니다.

  4. 링크를 선택하여 RDS for PostgreSQL DB 인스턴스와 연결된 사용자 지정 파라미터를 엽니다.

  5. rds.enable_pgactive 파라미터를 찾아 1로 설정하여 pgactive 기능을 초기화합니다.

  6. Save changes(변경 사항 저장)를 선택합니다.

  7. Amazon RDS 콘솔의 탐색 창에서 데이터베이스를 선택합니다.

  8. RDS for PostgreSQL DB 인스턴스를 선택한 다음 작업 메뉴에서 재부팅을 선택합니다.

  9. DB 인스턴스 재부팅을 확인하여 변경 사항을 적용합니다.

  10. DB 인스턴스를 사용할 수 있게 되면 psql 또는 다른 PostgreSQL 클라이언트를 사용하여 RDS for PostgreSQL DB 인스턴스에 연결합니다.

    다음 예시에서는 RDS for PostgreSQL DB 인스턴스에 postgres라는 기본 데이터베이스가 있다고 가정합니다.

    psql --host=mydb.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=master username --password --dbname=postgres
  11. pgactive가 초기화되었는지 확인하려면 다음 명령을 실행합니다.

    postgres=>SELECT setting ~ 'pgactive' FROM pg_catalog.pg_settings WHERE name = 'shared_preload_libraries';

    pgactiveshared_preload_libraries에 들어 있는 경우 앞의 명령은 다음을 반환합니다.

    ?column? ---------- t
  12. 다음과 같이 확장을 생성합니다.

    postgres=> CREATE EXTENSION pgactive;
pgactive 확장 기능을 초기화하려면

AWS CLI를 사용하여 pgactive를 초기화하려면 다음 절차와 같이 modify-db-parameter-group 작업을 호출하여 사용자 지정 파라미터 그룹의 특정 파라미터를 수정합니다.

  1. 다음 AWS CLI 명령으로 rds.enable_pgactive1로 설정하여 RDS for PostgreSQL DB 인스턴스의 pgactive 기능을 초기화합니다.

    postgres=>aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=rds.enable_pgactive,ParameterValue=1,ApplyMethod=pending-reboot" \ --region aws-region
  2. 다음 AWS CLI 명령으로 RDS for PostgreSQL DB 인스턴스를 재부팅하여 pgactive 라이브러리가 초기화되도록 합니다.

    aws rds reboot-db-instance \ --db-instance-identifier your-instance \ --region aws-region
  3. 인스턴스를 사용할 수 있다면 psql을 사용하여 RDS for PostgreSQL DB 인스턴스에 연결합니다.

    psql --host=mydb.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=master user --password --dbname=postgres
  4. 다음과 같이 확장을 생성합니다.

    postgres=> CREATE EXTENSION pgactive;

RDS for PostgreSQL DB 인스턴스용 액티브-액티브 복제 설정

다음 절차는 동일한 리전에서 PostgreSQL 15.4 이상을 실행하는 RDS for PostgreSQL DB 인스턴스 간에 액티브-액티브 복제를 시작하는 방법을 보여줍니다. 다중 리전 고가용성 예제를 실행하려면 Amazon RDS for PostgreSQL 인스턴스를 서로 다른 두 리전에 배포하고 VPC 피어링을 설정해야 합니다. 자세한 내용은 VPC 피어링을 참조하세요.

참고

여러 리전 간에 트래픽을 전송하면 추가 비용이 발생할 수 있습니다.

이 단계에서는 RDS for PostgreSQL DB 인스턴스가 pgactive 확장을 이용해 설정되었다고 가정합니다. 자세한 내용은 pgactive 확장 기능 초기화 단원을 참조하십시오.

pgactive 확장을 사용하여 첫 번째 RDS for PostgreSQL DB 인스턴스를 구성하려면

다음 예제는 pgactive 그룹을 생성하는 방법과 RDS for PostgreSQL에서 pgactive 확장을 생성하는 데 필요한 기타 단계를 보여줍니다.

  1. psql 또는 다른 클라이언트 도구를 사용하여 첫 번째 RDS for PostgreSQL DB 인스턴스에 연결할 수 있습니다.

    psql --host=firstinstance.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=master username --password --dbname=postgres
  2. 다음 명령을 사용하여 RDS for PostgreSQL 인스턴스에 데이터베이스를 생성합니다.

    postgres=> CREATE DATABASE app;
  3. 다음 명령을 사용하여 새 데이터베이스로 연결을 전환합니다.

    \c app
  4. shared_preload_libraries 파라미터에 pgactive가 포함되어 있는지 확인하려면 다음 명령을 실행합니다.

    app=>SELECT setting ~ 'pgactive' FROM pg_catalog.pg_settings WHERE name = 'shared_preload_libraries';
    ?column? ---------- t
  5. 다음 SQL 문을 사용하여 샘플 테이블을 생성하고 채웁니다.

    1. 다음 SQL 문을 사용하여 예제 테이블을 생성합니다.

      app=> CREATE SCHEMA inventory; CREATE TABLE inventory.products ( id int PRIMARY KEY, product_name text NOT NULL, created_at timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP);
    2. 다음 SQL 문을 사용하여 테이블에 일부 샘플 데이터를 입력합니다.

      app=> INSERT INTO inventory.products (id, product_name) VALUES (1, 'soap'), (2, 'shampoo'), (3, 'conditioner');
    3. 다음 SQL 문을 사용하여 테이블에 데이터가 있는지 확인합니다.

      app=>SELECT count(*) FROM inventory.products; count ------- 3
  6. 기존 데이터베이스에 pgactive 확장을 생성합니다.

    app=> CREATE EXTENSION pgactive;
  7. 다음 명령을 사용하여 pgactive 그룹을 생성하고 초기화합니다.

    app=> SELECT pgactive.pgactive_create_group( node_name := 'node1-app', node_dsn := 'dbname=app host=firstinstance.111122223333.aws-region.rds.amazonaws.com user=master username password=PASSWORD');

    node1-app은 pgactive 그룹 내 노드를 고유하게 식별하기 위해 할당하는 이름입니다.

    참고

    공개적으로 액세스할 수 있는 DB 인스턴스에서 이 단계를 성공적으로 수행하려면 rds.custom_dns_resolution 파라미터를 1로 설정하여 활성화해야 합니다.

  8. DB 인스턴스가 준비되었는지 확인하려면 다음 명령을 사용합니다.

    app=> SELECT pgactive.pgactive_wait_for_node_ready();

    이 명령이 제대로 실행되면 다음과 같은 출력이 표시됩니다.

    pgactive_wait_for_node_ready ------------------------------ (1 row)
두 번째 RDS for PostgreSQL 인스턴스를 구성하고 pgactive 그룹에 연결하려면

다음 예제는 RDS for PostgreSQL DB 인스턴스를 pgactive 그룹에 조인하는 방법과 DB 인스턴스에서 pgactive 확장을 생성하는 데 필요한 기타 단계를 보여줍니다.

이 단계에서는 다른 RDS for PostgreSQL DB 인스턴스pgactive 확장을 이용해 설정되었다고 가정합니다. 자세한 내용은 pgactive 확장 기능 초기화 단원을 참조하십시오.

  1. psql을 사용하여 게시자로부터 업데이트를 수신할 인스턴스에 연결합니다.

    psql --host=secondinstance.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=master username --password --dbname=postgres
  2. 다음 명령을 사용하여 두 번째 RDS for PostgreSQL DB 인스턴스에 데이터베이스를 생성합니다.

    postgres=> CREATE DATABASE app;
  3. 다음 명령을 사용하여 새 데이터베이스로 연결을 전환합니다.

    \c app
  4. 기존 데이터베이스에 pgactive 확장을 생성합니다.

    app=> CREATE EXTENSION pgactive;
  5. 다음과 같이 RDS for PostgreSQL 두 번째 DB 인스턴스pgactive 그룹에 조인합니다.

    app=> SELECT pgactive.pgactive_join_group( node_name := 'node2-app', node_dsn := 'dbname=app host=secondinstance.111122223333.aws-region.rds.amazonaws.com user=master username password=PASSWORD', join_using_dsn := 'dbname=app host=firstinstance.111122223333.aws-region.rds.amazonaws.com user=postgres password=PASSWORD');

    node2-app은 pgactive 그룹 내 노드를 고유하게 식별하기 위해 할당하는 이름입니다.

  6. DB 인스턴스가 준비되었는지 확인하려면 다음 명령을 사용합니다.

    app=> SELECT pgactive.pgactive_wait_for_node_ready();

    이 명령이 제대로 실행되면 다음과 같은 출력이 표시됩니다.

    pgactive_wait_for_node_ready ------------------------------ (1 row)

    첫 번째 RDS for PostgreSQL 데이터베이스가 비교적 큰 경우 pgactive.pgactive_wait_for_node_ready()에서 복원 작업의 진행 보고서가 출력되는 것을 볼 수 있습니다. 출력 결과는 다음과 비슷합니다:

    NOTICE: restoring database 'app', 6% of 7483 MB complete NOTICE: restoring database 'app', 42% of 7483 MB complete NOTICE: restoring database 'app', 77% of 7483 MB complete NOTICE: restoring database 'app', 98% of 7483 MB complete NOTICE: successfully restored database 'app' from node node1-app in 00:04:12.274956 pgactive_wait_for_node_ready ------------------------------ (1 row)

    이 시점부터 pgactive는 두 DB 인스턴스 간에 데이터를 동기화합니다.

  7. 다음 명령을 사용하여 두 번째 DB 인스턴스의 데이터베이스에 데이터가 있는지 확인할 수 있습니다.

    app=> SELECT count(*) FROM inventory.products;

    데이터가 성공적으로 동기화되면 다음과 같은 출력이 표시됩니다.

    count ------- 3
  8. 다음 명령을 실행하여 새 값을 삽입합니다.

    app=> INSERT INTO inventory.products (id, product_name) VALUES ('lotion');
  9. 첫 번째 DB 인스턴스의 데이터베이스에 연결하고 다음 쿼리를 실행합니다.

    app=> SELECT count(*) FROM inventory.products;

    액티브-액티브 복제가 초기화된 경우 출력은 다음과 비슷합니다.

    count ------- 4
pgactive 그룹에서 DB 인스턴스를 분리하고 제거하려면

다음 단계를 사용하여 pgactive 그룹에서 DB 인스턴스를 분리하고 제거할 수 있습니다.

  1. 다음 명령을 사용하여 첫 번째 DB 인스턴스에서 두 번째 DB 인스턴스를 분리할 수 있습니다.

    app=> SELECT * FROM pgactive.pgactive_detach_nodes(ARRAY[‘node2-app']);
  2. 다음 명령을 사용하여 두 번째 DB 인스턴스에서 pgactive 확장을 제거합니다.

    app=> SELECT * FROM pgactive.pgactive_remove();

    확장을 강제로 제거하려면:

    app=> SELECT * FROM pgactive.pgactive_remove(true);
  3. 다음 명령을 사용하여 확장을 제거합니다.

    app=> DROP EXTENSION pgactive;

액티브-액티브 복제의 충돌 처리

pgactive 확장은 클러스터별이 아니라 데이터베이스별로 작동합니다. pgactive를 사용하는 각 DB 인스턴스는 독립 인스턴스이며 모든 소스의 데이터 변경을 수락할 수 있습니다. 변경 사항이 DB 인스턴스로 전송되면 PostgreSQL은 변경 사항을 로컬에서 커밋한 다음 pgactive를 사용하여 변경 사항을 다른 DB 인스턴스에 비동기적으로 복제합니다. 두 PostgreSQL DB 인스턴스가 거의 동시에 같은 레코드를 업데이트하는 경우 충돌이 발생할 수 있습니다.

pgactive 확장은 충돌 감지 및 자동 해결을 위한 메커니즘을 제공합니다. 두 DB 인스턴스 모두에서 트랜잭션이 커밋된 시점의 타임스탬프를 추적하고 최신 타임스탬프와 함께 변경 사항을 자동으로 적용합니다. 또한 pgactive 확장은 pgactive.pgactive_conflict_history 테이블에서 충돌이 발생하는 경우에 이를 로깅합니다.

pgactive.pgactive_conflict_history는 계속 규모가 늘어납니다. 제거 정책을 정의할 수 있습니다. 정기적으로 일부 레코드를 삭제하거나 이 관계에 대한 파티션 스키마를 정의하여 수행할 수 있으며, 나중에 원하는 파티션을 분리, 삭제, 잘라낼 수 있습니다. 정기적으로 제거 정책을 구현하기 위한 한 가지 옵션은 pg_cron 확장을 사용하는 것입니다. PostgreSQL pg_cron 확장을 사용하여 유지 관리 일정 예약 pg_cron 기록 테이블에 대한 다음 예제 정보를 참조하세요.

액티브-액티브 복제의 시퀀스 처리

pgactive 확장이 포함된 RDS for PostgreSQL DB 인스턴스는 서로 다른 두 개의 시퀀스 메커니즘을 사용하여 고유한 값을 생성합니다.

글로벌 시퀀스

글로벌 시퀀스를 사용하려면 CREATE SEQUENCE 명령문을 사용하여 로컬 시퀀스를 생성합니다. 시퀀스의 다음 고유 값을 가져오려면 usingnextval(seqname) 대신 pgactive.pgactive_snowflake_id_nextval(seqname)을 사용합니다.

다음 예제에서는 글로벌 시퀀스를 생성합니다.

postgres=> CREATE TABLE gstest ( id bigint primary key, parrot text );
postgres=>CREATE SEQUENCE gstest_id_seq OWNED BY gstest.id;
postgres=> ALTER TABLE gstest \ ALTER COLUMN id SET DEFAULT \ pgactive.pgactive_snowflake_id_nextval('gstest_id_seq');
분할된 시퀀스

분할 단계 또는 분할된 시퀀스에서는 각 노드에 일반 PostgreSQL 시퀀스가 사용됩니다. 각 시퀀스는 같은 양만큼 증가하고 다른 오프셋에서 시작합니다. 예를 들어, 100단계에서 노드 1은 101, 201, 301 등의 시퀀스를 생성하고 노드 2는 102, 202, 302 등의 시퀀스를 생성합니다. 이 스키마는 노드가 장기간 통신할 수 없는 경우에도 잘 작동하지만 설계자가 스키마를 설정할 때 최대 노드 수를 지정해야 하며 노드별 구성이 필요합니다. 실수로 인해 시퀀스가 겹치기 쉽습니다.

다음과 같이 노드에 원하는 시퀀스를 생성하여 pgactive를 사용해 이 접근 방식을 비교적 간단히 구성할 수 있습니다.

CREATE TABLE some_table (generated_value bigint primary key);
postgres=> CREATE SEQUENCE some_seq INCREMENT 100 OWNED BY some_table.generated_value;
postgres=> ALTER TABLE some_table ALTER COLUMN generated_value SET DEFAULT nextval('some_seq');

그런 다음 각 노드에서 setval을 호출하여 다음과 같이 다른 오프셋 시작 값을 지정합니다.

postgres=> -- On node 1 SELECT setval('some_seq', 1); -- On node 2 SELECT setval('some_seq', 2);

pgactive 확장용 파라미터 참조

다음 쿼리를 사용하여 pgactive 확장과 관련된 모든 파라미터를 볼 수 있습니다.

postgres=> SELECT * FROM pg_settings WHERE name LIKE 'pgactive.%';

pgactive 멤버 간의 복제 지연 측정

다음 쿼리를 사용하여 pgactive 멤버 간의 복제 지연을 볼 수 있습니다. 모든 pgactive 노드에서 이 쿼리를 실행하면 전체 상황을 파악할 수 있습니다.

postgres=# SELECT *, (last_applied_xact_at - last_applied_xact_committs) AS lag FROM pgactive.pgactive_node_slots; -{ RECORD 1 ]----------------+----------------------------------------------------------------- node_name | node2-app slot_name | pgactive_5_7332551165694385385_0_5__ slot_restart_lsn | 0/1A898A8 slot_confirmed_lsn | 0/1A898E0 walsender_active | t walsender_pid | 69022 sent_lsn | 0/1A898E0 write_lsn | 0/1A898E0 flush_lsn | 0/1A898E0 replay_lsn | 0/1A898E0 last_sent_xact_id | 746 last_sent_xact_committs | 2024-02-06 18:04:22.430376+00 last_sent_xact_at | 2024-02-06 18:04:22.431359+00 last_applied_xact_id | 746 last_applied_xact_committs | 2024-02-06 18:04:22.430376+00 last_applied_xact_at | 2024-02-06 18:04:52.452465+00 lag | 00:00:30.022089

pgactive 확장에 대한 제한 사항

  • 모든 테이블에는 프라이머리 키가 필요합니다. 없는 경우 업데이트 및 삭제가 허용되지 않습니다. 프라이머리 키 열의 값은 업데이트해서는 안 됩니다.

  • 시퀀스는 간격이 있을 수 있으며 경우에 따라 순서를 따르지 않을 수도 있습니다. 시퀀스는 복제되지 않습니다. 자세한 내용은 액티브-액티브 복제의 시퀀스 처리 단원을 참조하십시오.

  • DDL 및 대형 객체는 복제되지 않습니다.

  • 보조 고유 인덱스로 인해 데이터 차이가 발생할 수 있습니다.

  • 그룹 내 모든 노드에서 데이터 정렬이 동일해야 합니다.

  • 노드 간 로드 밸런싱은 안티 패턴입니다.

  • 대규모 트랜잭션으로 인해 복제 지연이 발생할 수 있습니다.

pg_repack 확장을 사용하여 테이블 및 인덱스에서 부풀림을 줄입니다.

pg_repack 확장을 사용하여 VACUUM FULL의 대안으로 표와 인덱스에서 팽창을 제거할 수 있습니다. 이 확장은 RDS for PostgreSQL 버전 9.6.3 이상에서 지원됩니다. pg_repack 확장 및 전체 표 재압축에 대한 자세한 내용은 GitHub 프로젝트 설명서를 참조하세요.

VACUUM FULL과 달리 pg_repack 확장에는 다음과 같은 경우 표 재구축 작업 중 짧은 기간 동안만 배타적 잠금(AccessExclusiveLock)이 필요합니다.

  • 로그 표 초기 생성 - 다음 예와 같이 데이터의 초기 복사 중에 발생하는 변경 사항을 기록하기 위해 로그 표가 생성됩니다.

    postgres=>\dt+ repack.log_* List of relations -[ RECORD 1 ]-+---------- Schema | repack Name | log_16490 Type | table Owner | postgres Persistence | permanent Access method | heap Size | 65 MB Description |
  • 최종 교체 및 삭제 단계.

나머지 재구축 작업의 경우 원래 표 행을 새 표로 복사하려면 원래 표에 ACCESS SHARE 잠금만 있으면 됩니다. 이렇게 하면 INSERT, UPDATE, DELETE 작업을 평소처럼 진행할 수 있습니다.

추천

pg_repack 확장을 사용하여 표와 색인에서 팽창을 제거할 때는 다음 권장 사항이 적용됩니다.

  • 업무 외 시간이나 유지 관리 기간 중에 재압축을 수행하여 다른 데이터베이스 활동의 성능에 미치는 영향을 최소화합니다.

  • 재구축 작업 중 차단 세션을 면밀히 모니터링하고 원래 표에 특히 배타적 잠금이 필요한 최종 교체 및 삭제 단계 중 pg_repack을 차단할 수 있는 작업이 없는지 확인합니다. 자세한 내용은 쿼리를 차단하는 요소 식별을 참조하세요.

    차단 세션이 표시되면 신중하게 고려한 후 다음 명령을 사용하여 세션을 종료할 수 있습니다. 이를 통해 pg_repack을 계속하여 재구축을 완료하는 데 도움이 됩니다.

    SELECT pg_terminate_backend(pid);
  • 트랜잭션 비율이 매우 높은 시스템에서 pg_repack's 로그 표의 누적된 변경 사항을 적용하는 동안 적용 프로세스가 변경 속도를 따라가지 못할 수 있습니다. 이 경우 pg_repack에서 적용 프로세스를 완료할 수 없습니다. 자세한 내용은 재압축 중 새 표 모니터링 단원을 참조하십시오. 인덱스가 심하게 팽창된 경우 다른 해결 방법은 인덱스 전용 재압축을 수행하는 것입니다. 이는 또한 VACUUM의 인덱스 정리 주기를 더 빠르게 완료하는 데도 도움이 됩니다.

    PostgreSQL 버전 12의 수동 VACUUM을 사용하면 인덱스 정리 단계를 건너뛸 수 있으며, PostgreSQL 버전 14의 긴급 autovacuum 중에는 인덱스 정리 단계를 자동으로 건너뛸 수 있습니다. 이렇게 하면 인덱스 팽창을 제거하지 않고도 VACUUM을 더 빠르게 완료할 수 있습니다. 이는 랩어라운드 VACUUM 방지와 같은 긴급 상황에만 사용 가능합니다. 자세한 내용은 Amazon Aurora 사용 설명서의 인덱스 팽창 방지를 참조하세요.

필수 조건

  • 표에는 PRIMARY KEY 또는 null이 아닌 UNIQUE 제약 조건이 있어야 합니다.

  • 확장 버전은 클라이언트와 서버 모두 동일해야 합니다.

  • RDS 인스턴스에 팽창이 없는 표의 전체 크기보다 더 많은 FreeStorageSpace가 있는지 확인합니다. 예를 들어, TOAST와 인덱스를 포함한 표의 총 크기를 2TB로, 표의 총 팽창을 1TB로 가정해 보겠습니다. 필요한 FreeStorageSpace는 다음 계산에서 반환된 값보다 커야 합니다.

    2TB (Table size) - 1TB (Table bloat) = 1TB

    다음 쿼리를 사용하여 표의 전체 크기를 확인하고 pgstattuple을 사용하여 팽창을 도출할 수 있습니다. 자세한 내용은 Amazon Aurora 사용 설명서의 표 및 인덱스 팽창 진단을 참조하세요.

    SELECT pg_size_pretty(pg_total_relation_size('table_name')) AS total_table_size;

    이 스페이스는 활동 완료 후 회수됩니다.

  • RDS 인스턴스에 재압축 작업을 처리할 수 있는 충분한 컴퓨팅 및 IO 용량이 있는지 확인합니다. 최적의 성능 균형을 보장하려면 인스턴스 클래스를 확장하는 방안을 고려할 수 있습니다.

pg_repack 확장을 사용하려면
  1. 다음 명령을 실행하여 RDS for PostgreSQL 인스턴스에 pg_repack 확장을 설치합니다.

    CREATE EXTENSION pg_repack;
  2. 다음 명령을 실행하여 pg_repack에서 생성한 임시 로그 표에 대한 쓰기 액세스 권한을 부여합니다.

    ALTER DEFAULT PRIVILEGES IN SCHEMA repack GRANT INSERT ON TABLES TO PUBLIC; ALTER DEFAULT PRIVILEGES IN SCHEMA repack GRANT USAGE, SELECT ON SEQUENCES TO PUBLIC;
  3. pg_repack 클라이언트 유틸리티를 사용하여 데이터베이스에 연결합니다. rds_superuser 권한이 있는 계정을 사용합니다. 예를 들어 rds_test 역할이 rds_superuser 권한을 가지고 있다고 가정하겠습니다. 다음 구문은 postgres 데이터베이스의 모든 표 인덱스를 포함하는 전체 표에 대해 pg_repack을 수행합니다.

    pg_repack -h db-instance-name.111122223333.aws-region.rds.amazonaws.com -U rds_test -k postgres
    참고

    -k 옵션을 사용하여 연결해야 합니다. -a 옵션은 지원되지 않습니다.

    pg_repack 클라이언트의 응답은 재압축된 DB 인스턴스상의 표에 대한 정보를 제공합니다.

    INFO: repacking table "pgbench_tellers" INFO: repacking table "pgbench_accounts" INFO: repacking table "pgbench_branches"
  4. 다음 구문은 postgres 데이터베이스의 인덱스를 포함한 단일 표 orders를 재압축합니다.

    pg_repack -h db-instance-name.111122223333.aws-region.rds.amazonaws.com -U rds_test --table orders -k postgres

    다음 구문은 postgres 데이터베이스의 orders 표에 대한 인덱스만 재압축합니다.

    pg_repack -h db-instance-name.111122223333.aws-region.rds.amazonaws.com -U rds_test --table orders --only-indexes -k postgres

재압축 중 새 표 모니터링

  • 데이터베이스 크기는 교체 및 삭제 재압축 단계까지 표의 전체 크기에서 팽창을 뺀 값만큼 증가합니다. 데이터베이스 크기의 증가율을 모니터링하고, 재압축 속도를 계산하고, 초기 데이터 전송을 완료하는 데 걸리는 시간을 대략적으로 예측할 수 있습니다.

    예를 들어, 표의 총 크기를 2TB로, 데이터베이스의 크기를 4TB로, 표의 총 팽창을 1TB로 가정해 보겠습니다. 재압축 작업 종료 시 계산의 결과로 반환되는 데이터베이스 총 크기 값은 다음과 같습니다.

    2TB (Table size) + 4 TB (Database size) - 1TB (Table bloat) = 5TB

    두 시점 사이의 증가율(바이트)을 샘플링하여 재압축 작업의 속도를 대략적으로 추정할 수 있습니다. 증가율이 분당 1GB인 경우 초기 표 구축 작업을 완료하는 데 약 1,000분 또는 약 16.6시간이 걸릴 수 있습니다. 초기 표 구축 외에도 pg_repack에서는 누적된 변경 사항을 적용해야 합니다. 소요 시간은 진행 중인 변경 사항과 누적 변경 사항을 적용하는 속도에 따라 달라집니다.

    참고

    pgstattuple 확장을 사용하여 표의 팽창을 계산할 수 있습니다. 자세한 내용은 pgstattuple을 참조하세요.

  • 재압축 스키마 아래에 있는 pg_repack's 로그 표의 행 수는 초기 로드 후 새 표에 적용하기 위해 보류 중인 변경 사항의 양을 나타냅니다.

    pg_stat_all_tables에서 pg_repack's 로그 표를 확인하여 새 표에 적용된 변경 사항을 모니터링할 수 있습니다. pg_stat_all_tables.n_live_tup은 새 표에 적용할 보류 중인 레코드 수를 나타냅니다. 자세한 내용은 pg_stat_all_tables를 참조하세요.

    postgres=>SELECT relname,n_live_tup FROM pg_stat_all_tables WHERE schemaname = 'repack' AND relname ILIKE '%log%'; -[ RECORD 1 ]--------- relname | log_16490 n_live_tup | 2000000
  • pg_stat_statements 확장을 사용하여 재압축 작업의 각 단계에 소요된 시간을 확인할 수 있습니다. 이는 프로덕션 환경에서 동일한 재압축 작업을 적용할 준비를 하는 데 유용합니다. LIMIT 절을 조정하여 출력을 더 확장할 수 있습니다.

    postgres=>SELECT SUBSTR(query, 1, 100) query, round((round(total_exec_time::numeric, 6) / 1000 / 60),4) total_exec_time_in_minutes FROM pg_stat_statements WHERE query ILIKE '%repack%' ORDER BY total_exec_time DESC LIMIT 5; query | total_exec_time_in_minutes -----------------------------------------------------------------------+---------------------------- CREATE UNIQUE INDEX index_16493 ON repack.table_16490 USING btree (a) | 6.8627 INSERT INTO repack.table_16490 SELECT a FROM ONLY public.t1 | 6.4150 SELECT repack.repack_apply($1, $2, $3, $4, $5, $6) | 0.5395 SELECT repack.repack_drop($1, $2) | 0.0004 SELECT repack.repack_swap($1) | 0.0004 (5 rows)

재압축은 부적절한 작업이므로, 원본 표는 영향을 받지 않으며 원본 표를 복구해야 하는 예상치 못한 문제가 발생하지 않습니다. 재압축이 예기치 않게 실패할 경우 오류의 원인을 검사하여 해결해야 합니다.

문제가 해결되면 표가 있는 데이터베이스에서 pg_repack 확장을 삭제하고 다시 만든 다음 pg_repack 단계를 다시 시도하세요. 또한 컴퓨팅 리소스의 가용성과 표의 동시 접근성은 재압축 작업을 적시에 완료하는 데 중요한 역할을 합니다.

PLV8 확장 업그레이드 및 사용

PLV8은 PostgreSQL을 위한 신뢰할 수 있는 Javascript 언어 확장입니다. 저장 프로시저, 트리거 및 SQL에서 호출할 수 있는 기타 절차 코드에 사용할 수 있습니다. 이 언어 확장은 모든 최신 PostgreSQL 릴리스에서 지원됩니다.

PLV8을 사용하고 PostgreSQL을 새 PLV8 버전으로 업그레이드하는 경우 즉시 새로운 확장을 사용하세요. 다음 단계를 수행하여 카탈로그 메타데이터를 새 PLV8 버전과 동기화합니다. 이 단계는 선택 사항이지만 메타데이터 불일치 경고를 방지하려면 완료하는 것이 좋습니다.

업그레이드 프로세스는 기존 PLV8 기능을 모두 삭제합니다. 따라서 업그레이드하기 전에 RDS for PostgreSQL DB 인스턴스의 스냅샷을 생성하는 것이 좋습니다. 자세한 내용은 단일 AZ DB 인스턴스용 DB 스냅샷 생성 단원을 참조하십시오.

새 PLV8 버전과 카탈로그 메타데이터 동기화
  1. 업데이트해야 하는 것을 확인합니다. 이렇게 하려면 인스턴스에 연결된 동안 다음 명령을 실행합니다.

    SELECT * FROM pg_available_extensions WHERE name IN ('plv8','plls','plcoffee');

    결과에 기본 버전보다 낮은 설치 버전에 대한 값이 포함된 경우 이 절차를 계속 진행하여 확장을 업데이트합니다. 예를 들어, 다음 결과 집합은 업데이트해야 함을 나타냅니다.

    name | default_version | installed_version | comment --------+-----------------+-------------------+-------------------------------------------------- plls | 2.1.0 | 1.5.3 | PL/LiveScript (v8) trusted procedural language plcoffee| 2.1.0 | 1.5.3 | PL/CoffeeScript (v8) trusted procedural language plv8 | 2.1.0 | 1.5.3 | PL/JavaScript (v8) trusted procedural language (3 rows)
  2. RDS for PostgreSQL DB 인스턴스의 스냅샷을 생성합니다. 이미 해당 스냅샷을 생성한 경우 이 단계를 건너뜁니다. 스냅샷이 생성되는 동안 다음 단계를 따라 계속 진행할 수 있습니다.

  3. DB 인스턴스에 있는 PLV8 함수의 개수를 파악해야 업그레이드 이후 모두 존재하는지 확인할 수 있습니다. 예를 들어 다음 SQL 쿼리는 plv8, plcoffee 및 plls로 작성된 함수의 수를 반환합니다.

    SELECT proname, nspname, lanname FROM pg_proc p, pg_language l, pg_namespace n WHERE p.prolang = l.oid AND n.oid = p.pronamespace AND lanname IN ('plv8','plcoffee','plls');
  4. pg_dump를 사용하여 스키마 전용 덤프 파일을 생성합니다. 예를 들어, 클라이언트 시스템의 /tmp 디렉터리에 파일을 생성합니다.

    ./pg_dump -Fc --schema-only -U master postgres >/tmp/test.dmp

    이 예에서는 다음 옵션을 사용합니다.

    • -Fc - 사용자 지정 형식

    • --schema-only - 스키마(이 경우에서는 함수)를 생성하는 데 필요한 명령만 덤프

    • -U – RDS 기본 사용자 이름

    • database – DB 인스턴스의 데이터베이스 이름

    pg_dump에 대한 자세한 내용은 PostgreSQL 설명서의 pg_dump를 참조하세요.

  5. 덤프 파일에 있는 'CREATE FUNCTION' DDL 문을 추출하십시오. 다음 예에서는 grep 명령을 사용하여 함수를 생성하는 DDL 문을 추출하여 파일에 저장합니다. 후속 단계에서 이를 사용하여 함수를 다시 생성합니다.

    ./pg_restore -l /tmp/test.dmp | grep FUNCTION > /tmp/function_list/

    pg_restore에 대한 자세한 내용은 PostgreSQL 설명서의 pg_restore를 참조하세요.

  6. 함수 및 확장 기능을 중단합니다. 다음 예는 모든 PLV8 기반 객체를 중단합니다. 캐스케이드 옵션은 모든 종속이 중단되도록 합니다.

    DROP EXTENSION plv8 CASCADE;

    PostgreSQL 인스턴스에 plcoffee 또는 plls 기반 객체가 포함된 경우 이러한 확장 기능에 대해 이 단계를 반복합니다.

  7. 확장 기능을 생성합니다. 다음 예에서는 plv8, plcoffee 및 plls 확장을 생성합니다.

    CREATE EXTENSION plv8; CREATE EXTENSION plcoffee; CREATE EXTENSION plls;
  8. 덤프 파일과 "드라이버" 파일을 사용하여 함수를 생성합니다.

    다음 예에서는 이전에 추출한 함수를 다시 생성합니다.

    ./pg_restore -U master -d postgres -Fc -L /tmp/function_list /tmp/test.dmp
  9. 다음 쿼리를 사용하여 모든 함수가 다시 생성되었는지 확인합니다.

    SELECT * FROM pg_available_extensions WHERE name IN ('plv8','plls','plcoffee');

    PLV8 버전 2는 결과 세트에 다음 추가 행을 추가합니다.

    proname | nspname | lanname ---------------+------------+---------- plv8_version | pg_catalog | plv8

PL/Rust를 사용하여 Rust 언어로 PostgreSQL 함수 작성

PL/Rust는 PostgreSQL에 대한 신뢰할 수 있는 Rust 언어 확장입니다. 저장 프로시저, 함수 및 SQL에서 호출할 수 있는 기타 절차 코드에 사용할 수 있습니다. PL/Rust 언어 확장은 다음 버전에서 사용할 수 있습니다.

  • RDS for PostgreSQL 16.1 이상의 16 버전

  • RDS for PostgreSQL 15.2-R2 이상의 15 버전

  • RDS for PostgreSQL 14.9 이상의 14 버전

  • RDS for PostgreSQL 13.12 이상의 13 버전

자세한 내용은 GitHub의 PL/Rust를 참조하세요.

PL/Rust 설정

DB 인스턴스에 plrust 확장을 설치하려면 DB 인스턴스와 연결된 DB 파라미터 그룹의 shared_preload_libraries 파라미터에 plrust를 추가합니다. plrust 확장이 설치되어 있으면 함수를 만들 수 있습니다.

shared_preload_libraries 파라미터를 수정하려면 DB 인스턴스가 사용자 지정 파라미터 그룹과 연결되어 있어야 합니다. 사용자 지정 DB 파라미터 그룹 생성에 대한 자세한 내용은 파라미터 그룹 작업 단원을 참조하세요.

AWS Management Console 또는 AWS CLI를 사용하여 plrust 확장을 설치할 수 있습니다.

다음 단계에서는 DB 인스턴스가 사용자 지정 DB 파라미터 그룹에 연결되어 있다고 가정합니다.

shared_preload_libraries 파라미터에 plrust 확장 설치

rds_superuser 그룹(역할)의 멤버인 계정을 사용하여 다음 단계를 완료합니다.

  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/rds/에서 Amazon RDS 콘솔을 엽니다.

  2. 탐색 창에서 Databases(데이터베이스)를 선택합니다.

  3. DB 인스턴스의 이름을 선택하여 세부 정보를 표시합니다.

  4. DB 인스턴스의 구성 탭을 열고 DB 인스턴스 파라미터 그룹 링크를 찾습니다.

  5. 링크를 선택하여 DB 인스턴스와 연결된 사용자 지정 파라미터를 엽니다.

  6. 파라미터 검색 필드에 shared_pre를 입력하여 shared_preload_libraries 파라미터를 찾습니다.

  7. 파라미터 편집을 선택하여 속성 값에 액세스합니다.

  8.  필드의 목록에 plrust를 추가합니다. 쉼표를 사용하여 값 목록에서 항목을 구분합니다.

  9. shared_preload_libraries 파라미터 변경 사항을 적용하려면 DB 인스턴스를 재부팅합니다. 초기 재부팅을 완료하려면 추가 시간이 필요할 수 있습니다.

  10. 인스턴스를 사용할 수 있게 되면 plrust가 초기화되었는지 확인합니다. psql을 사용하여 DB 인스턴스에 연결하고 다음 명령을 실행합니다.

    SHOW shared_preload_libraries;

    출력은 다음과 비슷한 형태가 됩니다.

    shared_preload_libraries -------------------------- rdsutils,plrust (1 row)
shared_preload_libraries 파라미터에 plrust 확장 설치

rds_superuser 그룹(역할)의 멤버인 계정을 사용하여 다음 단계를 완료합니다.

  1. modify-db-parameter-group AWS CLI 명령을 사용하여 plrust를 shared_preload_libraries 파라미터에 추가합니다.

    aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=shared_preload_libraries,ParameterValue=plrust,ApplyMethod=pending-reboot" \ --region aws-region
  2. reboot-db-instance AWS CLI 명령을 사용하여 DB 인스턴스를 재부팅하고 plrust 라이브러리를 초기화합니다. 초기 재부팅을 완료하려면 추가 시간이 필요할 수 있습니다.

    aws rds reboot-db-instance \ --db-instance-identifier your-instance \ --region aws-region
  3. 인스턴스를 사용할 수 있게 되면 plrust가 초기화되었는지 확인합니다. psql을 사용하여 DB 인스턴스에 연결하고 다음 명령을 실행합니다.

    SHOW shared_preload_libraries;

    출력은 다음과 비슷한 형태가 됩니다.

    shared_preload_libraries -------------------------- rdsutils,plrust (1 row)

PL/Rust를 사용하여 함수 생성

PL/Rust는 함수를 동적 라이브러리로 컴파일하고 로드한 다음 실행합니다.

다음 Rust 함수는 배열에서 배수를 필터링합니다.

postgres=> CREATE LANGUAGE plrust; CREATE EXTENSION
CREATE OR REPLACE FUNCTION filter_multiples(a BIGINT[], multiple BIGINT) RETURNS BIGINT[] IMMUTABLE STRICT LANGUAGE PLRUST AS $$ Ok(Some(a.into_iter().filter(|x| x.unwrap() % multiple != 0).collect())) $$; WITH gen_values AS ( SELECT ARRAY(SELECT * FROM generate_series(1,100)) as arr) SELECT filter_multiples(arr, 3) from gen_values;

PL/Rust가 있는 상자 사용

Amazon RDS for PostgreSQL 버전 15.4, 14.9, 13.12부터 PL/Rust는 다음 상자를 지원합니다.

  • aes

  • ctr

  • rand

RDS for PostgreSQL 버전 15.5-R2, 14.10-R2, 13.13-R2부터 PL/Rust는 2개의 추가 상자를 지원합니다.

  • croaring-rs

  • num-bigint

이 상자에서는 기본 기능만 지원됩니다. 새 RDS for PostgreSQL 버전에는 업데이트된 버전의 상자가 포함될 수 있으며 기존 버전의 상자는 더 이상 지원되지 않을 수 있습니다.

PL/Rust 함수가 새 메이저 버전과 호환되는지 테스트하려면 메이저 버전 업그레이드 수행에 대한 모범 사례를 따르세요. 자세한 내용은 블로그 Amazon RDS를 PostgreSQL의 메이저 및 마이너 버전으로 업그레이드하기 위한 모범 사례 및 Amazon RDS 사용 설명서에 나온 Amazon RDS용 PostgreSQL DB 엔진 업그레이드를 참조하세요.

PL/Rust 함수를 생성할 때 종속성을 사용하는 예제는 종속성 사용에서 확인하세요.

PL/Rust 제한 사항

기본적으로 데이터베이스 사용자는 PL/Rust를 사용할 수 없습니다. PL/Rust에 대한 액세스를 제공하려면 rds_superuser 권한이 있는 사용자로 연결하고 다음 명령을 실행합니다.

postgres=> GRANT USAGE ON LANGUAGE PLRUST TO user;