온프레미스 PostgreSQL 클러스터를 Google Cloud로 마이그레이션

이 문서에서는 온프레미스 PostgreSQL 클러스터를 Google Cloud를 마이그레이션하는 방법을 설명합니다. 이 방법에서는 PgBouncer를 연결 풀러로 사용하여 애플리케이션 다운타임을 최소화하고 결과 모니터링을 위한 도구 설정을 지원합니다. 이 문서는 Linux 환경에서 작업하는 PostgreSQL 관리자 및 시스템 관리자를 대상으로 합니다.

다음 다이어그램은 온프레미스 마스터 앞에 배치된 PgBouncer 인스턴스를 보여줍니다.

온프레미스 마스터 앞에 배치된 PgBouncer 인스턴스의 아키텍처

연결 풀링을 사용하면 Google Cloud에 장애 조치 발생 시 애플리케이션 구성을 다시 배포하거나 애플리케이션 수준을 변경하지 않고도 클라이언트가 대체 노드로 라우팅됩니다.

다음 다이어그램은 마이그레이션을 보여줍니다.

Google Cloud로 마이그레이션의 아키텍처

마이그레이션을 수행하려면 현재 마스터를 종료한 후 하위 Google Cloud 복제본을 마스터로 승격시킵니다. PgBouncer는 트래픽을 Google Cloud의 새로운 마스터 노드로 다시 라우팅합니다.

비용

이 가이드에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

가격 계산기를 사용하여 예상 사용량을 기준으로 예상 비용을 산출할 수 있습니다.

목표

  • Google Cloud에서 PostgreSQL 설정
  • Compute Engine에서 복제 설정
  • 새 인스턴스에 데이터 시드
  • Google Cloud에서 PostgreSQL 클러스터 설정
  • 새 서버로 전환
  • 모니터링 구현

시작하기 전에

이 가이드에서는 gcloud 명령어와 gsutil 명령어를 사용합니다. 이 명령어는 Cloud Console에서 시작된 Cloud Shell 인스턴스에서 실행될 수 있습니다. 로컬 워크스테이션에서 gcloudgsutil을 사용하려면 Cloud SDK를 설치합니다. 이 가이드에서는 Cloud Shell에서 명령어를 실행하는 방법을 보여줍니다. 워크스테이션에서 Cloud SDK를 사용하는 경우 상황에 맞게 안내를 적용합니다.

  1. Google 계정으로 로그인합니다.

    아직 계정이 없으면 새 계정을 등록하세요.

  2. Cloud Console의 프로젝트 선택기 페이지에서 Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기 페이지로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  4. Compute Engine API를 사용 설정합니다.

    API 사용 설정

환경 설정

시작하려면 다음 작업을 수행합니다.

  • Google Cloud에서 PostgreSQL 설정
  • Compute Engine에서 복제 설정

그런 다음 마스터 복제를 시작하기 전에 새 인스턴스에 데이터를 시드합니다.

Google Cloud에서 PostgreSQL 설정

Hot Standby를 이용한 고가용성 및 복제를 위해 PostgreSQL을 설정하는 방법의 단계를 따라 몇 분만에 Google Cloud에 PostgreSQL을 설정합니다. Compute Engine의 Ubuntu 가상 머신 인스턴스에 PostgreSQL을 구성합니다.

Compute Engine에서 복제 설정

Google Compute Engine에서 PostgreSQL을 설정하는 방법의 단계를 따라 Google Compute Engine에서 상시 대기 모드로 실행되도록 PostgreSQL을 구성합니다. 이때 Compute Engine 인스턴스는 두 개를 사용합니다. 한 인스턴스는 기본 PostgreSQL 서버를 실행하고, 다른 인스턴스는 대기 서버를 실행합니다.

PostgreSQL을 구성하는 속성이 마스터 인스턴스와 종속 인스턴스 간에 다르기는 하지만 원활한 장애 조치를 위해 속성 파일이 동일해야 합니다.

PostgreSQL 클러스터의 종속 인스턴스는 recovery.conf 파일의 존재로 표시됩니다.

대부분의 경우, 데이터베이스의 데이터 디렉터리를 부트 디스크에서 분리하는 것이 중요합니다. 다음 예시에서는 /database에 있는 마운트 아래에 데이터베이스 파일을 저장합니다.

복제를 설정하려면 다음 명령어를 사용하여 마스터 인스턴스에서 postgresql.conf 파일을 수정합니다.

wal_level = 'hot_standby'
archive_mode = on
archive_command = 'test ! -f /postgresql/archivedir/%f && cp %p /postgresql/archivedir/%f'
max_wal_senders = 3
listen_addresses = '*'
wal_keep_segments = 8

다음 명령어를 사용하여 복제본의 postgresql.conf 파일을 수정합니다.

hot_standby = on
standby_mode = on
primary_conninfo = 'host=${PRIMARY_IP} port=5432 user=repuser'

Read 요청을 복제본에 전송하는 경우 마스터에서 일부 부하를 상쇄할 수 있습니다.

데이터 시드

마스터 데이터베이스에는 제한된 트랜잭션 로그가 포함되어 있으므로, 대부분의 PostgreSQL 이전에서는 마스터 복제를 시작하기 전에 데이터를 새 인스턴스에 시드해야 합니다. 다음 중 한 가지 방법으로 데이터를 시드할 수 있습니다.

  • Pg_dump를 사용하여 단일 데이터베이스를 스크립트 또는 보관 파일에 덤프합니다.
  • Pg_basebackup을 사용하여 실행 중인 데이터베이스 클러스터의 바이너리 복사본을 만듭니다.
  • rsync를 사용하여 데이터 폴더를 복제본에 복사합니다.
  • 이전 백업을 복제본에 복원합니다.

위의 옵션 중에서 이전 백업을 복제본에 복원하는 것이 좋습니다. 많은 양의 데이터가 전송되어도 이 솔루션의 성능은 저하되지 않으며 현재 클러스터가 정상적으로 계속 작동할 수 있습니다.

데이터베이스를 처음으로 시드한 후 rsync 명령어를 사용하여 백업 이후 발생한 변경사항을 복제본에 피드할 수 있으며, 명령어가 두 인스턴스 간 데이터 디렉터리를 동기화합니다. 백업이 마스터보다 너무 뒤떨어져 정상 복제를 따라 잡을 수 없는 경우에 이 단계가 중요합니다.

Google Cloud에서 PostgreSQL 클러스터 설정

계단식 복제를 사용하여 PostgreSQL 클러스터를 만들 수 있습니다. 먼저 다음 다이어그램과 같이 데이터베이스를 마이그레이션합니다.

Google Cloud로 마이그레이션되는 현재 환경의 아키텍처

데이터베이스 마이그레이션

  1. 실행 중인 마스터 서버에서 전체 백업을 수행합니다(label은 임의의 라벨일 수 있음).

    echo "select pg_start_backup('label',true);" |sudo su - postgres -c psql
    sudo tar cvfz postgresql_AAAAMMDD.tar.gz $PGDATA
    

    $PGDATA는 PostgreSQL의 기본 데이터 디렉터리입니다.

  2. Google Cloud 프로젝트에 이름이 gs://pg-repo/인 버킷을 만듭니다.

  3. 방금 만든 버킷에 백업을 전송합니다.

    master$ gsutil cp postgresql_AAAAMMDD.tar.gz gs://pg-repo/
    
  4. 백업 파일을 Google Cloud 마스터에 전송합니다.

    new_master$ gsutil cp gs://pg-repo/postgresql_AAAAMMDD.tar.gz
    
  5. 백업 파일을 Google Cloud 마스터에 복원합니다.

    new_master$ (cd / ; tar xvf postgresql_AAAAMMDD.tar.gz)
    
  6. 다음을 포함하는 $PG_DATA 디렉터리에 recovery.conf 파일을 만듭니다.

    standby_mode     = 'on'
    primary_conninfo = 'port=5432 host=${running_master_ip} user=${replication_user} application_name=cloud_master'
    trigger_file     = '/tmp/failover.postgresql.5432'
    
  7. PostgreSQL 서비스를 시작합니다.

    sudo service postgresql start
    
  8. Google Cloud 마스터 서버가 실행 중인 마스터와 동기화될 때까지 기다립니다. 로그에 다음과 같은 내용이 표시됩니다.

    tail -f /var/log/postgresql/postgresql*log
    ...
    2018-09-22 17:59:54 UTC LOG:  consistent recovery state reached at 0/230000F0
    2018-09-22 17:59:54 UTC LOG:  database system is ready to accept read only connections
    ...
    

    또한 master pg_stat_replication에서 검색하여 새 종속 항목(cloud_master라 함)이 연결되어 있는지 확인할 수 있습니다.

    postgres=# \x
    Expanded display is on.
    postgres=# select * from pg_stat_replication where application_name='cloud_master';
    -[ RECORD 1 ]----+------------------------------
    pid              | 16940
    usesysid         | 16402
    usename          | repmgr
    application_name | cloud_master
    ...
    

종속 데이터베이스 만들기

  1. 데이터베이스와 서버를 종료합니다.

    sudo service postgresql stop
    sudo shutdown -h now
    
  2. 다음 명령어를 실행하여 서비스가 중지되었는지 확인합니다.

    gcloud compute instances describe master-instance-name | grep status
    

    출력에서 인스턴스 상태가 TERMINATED로 표시됩니다.

    status: TERMINATED
    

    그런 다음 새 종속 항목을 만드는 데 유용하도록 데이터 디스크의 스냅샷을 만듭니다.

  3. Cloud Console에서 스냅샷 페이지로 이동합니다.

    스냅샷 페이지로 이동

  4. PostgreSQL 디스크에서 새 스냅샷을 만듭니다.

  5. Google Cloud 마스터 서버를 시작합니다.

  6. VM 인스턴스 페이지로 이동하여 마스터 인스턴스 이름을 클릭한 다음 시작을 클릭합니다.

    PostgreSQL 서비스가 자동으로 시작됩니다.

  7. 다음 명령어를 실행하여 확인합니다.

    ps ax | grep postgres
    

    다음과 같은 결과가 표시됩니다.

     1398 ?     S   0:00 /usr/lib/postgresql/9.3/bin/postgres -D /var/lib/postgresql/9.3/main -c config_file=/etc/postgresql/9.3/main/postgresql.conf
     1454 ?     Ss  0:00 postgres: checkpointer process
     1455 ?     Ss  0:00 postgres: writer process
     1456 ?     Ss  0:00 postgres: wal writer process
     1457 ?     Ss  0:00 postgres: stats collector process
    
  8. Cloud Console에서 VM 인스턴스 페이지로 이동한 다음 인스턴스 만들기를 클릭합니다.

  9. 부팅 디스크의 경우, Ubuntu 14.04를 선택합니다.

  10. 관리, 디스크, 네트워킹, SSH 키를 클릭하고 앞에서 만든 스냅샷을 기반으로 새 디스크를 추가합니다.

  11. 새 서버를 시작하고 디스크를 마운트합니다.

    sudo mkdir /database && sudo mount /dev/sdb1 /database
    
  12. PostgreSQL을 설치합니다.

    sudo apt-get install postgresql && sudo service postgresql stop
    
  13. 데이터 디렉터리 및 복제 값을 구성합니다. Google Cloud 마스터에서 postgresql.conf 파일과 pg_hba.conf 파일을 복사하고 다음을 포함하도록 recovery.conf 파일을 수정합니다.

    standby_mode = 'on'
    primary_conninfo = 'port=5432 host=${cloud_master_ip} user=${replication_user} application_name=cloud_slave_${identifier}'
    recovery_target_timeline = 'latest'
    
  14. Google Cloud 마스터를 가리키는 새 구성 파일로 PostgreSQL 서비스를 시작합니다.

    sudo service postgresql restart
    
  15. 서비스가 실행 중인지 확인합니다.

    ps ax | grep postgres
    
  16. 다음 쿼리로 Google Cloud 마스터 서버를 확인합니다.

    postgres=# \x
    Expanded display is on.
    postgres=# select * from pg_stat_replication where application_name like 'cloud_slave%';
    -[ RECORD 1 ]----+-----------------------------
    pid              | 2466
    usesysid         | 16402
    usename          | repmgr
    application_name | cloud_slave_1
    ...
    
  17. 종속 항목을 더 만들려면 위 단계를 반복합니다.

새 서버로 전환

  1. 새로운 Google Cloud 마스터 서버를 가리키도록 PgBouncer의 구성 파일을 변경합니다.
  2. PgBouncer 인스턴스에서 PgBouncer를 종료하고 failover.postgresql.5432 트리거 파일을 사용하여 새로운 마스터를 승격시킨 후 PgBouncer를 다시 시작합니다.

    service pgbouncer stop ; ssh ${cloud_master_ip} 'touch /tmp/failover.postgresql.5432' ; service pgbouncer start
    

모니터링 설정

Google은 Blue Medora와 제휴하여 PostgreSQL 측정항목을 제공합니다. 기존 PostgreSQL 인스턴스와 새 Google Cloud 인스턴스에서 측정항목과 로그를 수집할 수 있습니다.

Blue Medora의 PostgreSQL 모니터링 지원에 대한 자세한 내용은 시작하기 페이지를 참조하세요.

샘플 쿼리

서버의 모든 동시 연결을 확인합니다.

 select * from pg_stat_activity;

(마스터) 복제 상태를 확인합니다.

select * from pg_stat_replication;

(마스터) 복제본에 데이터 적용 시 지연을 확인합니다.

select pg_xlog_location_diff(write_location, replay_location) from pg_stat_replication;

(마스터) 복제에서 바이트 지연을 확인합니다.

select client_hostname, client_addr, pg_xlog_location_diff(pg_stat_replication.sent_location,
  pg_stat_replication.replay_location)AS byte_lag from pg_stat_replication;

(종속 항목) 데이터베이스가 복제본인지 확인합니다.

select pg_is_in_recovery();

(종속 항목) 마스터에서 수신된 마지막 데이터를 확인합니다.

select pg_last_xlog_receive_location();

(종속 항목) 마스터에서 마지막으로 적용된 데이터를 확인합니다.

select pg_last_xlog_replay_location();

(종속 항목) 복제 지연(초)을 확인합니다.

select now() - pg_last_xact_replay_timestamp();

삭제

프로젝트 삭제

  1. Cloud Console에서 리소스 관리 페이지로 이동합니다.

    리소스 관리 페이지로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제 를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 다음 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계

  • 다른 Google Cloud 기능을 직접 사용해보세요. 가이드 참조
  • Google Cloud 제품을 사용하여 엔드 투 엔드 솔루션을 구축하는 방법을 알아보세요.