외부 복제본 구성

이 페이지에서는 Cloud SQL 외부에 있는 복제본 한 개 이상으로 복제되는 Cloud SQL 인스턴스를 구성하는 방법과 외부 복제본 구성에서 기본 인스턴스를 강등시켜 구성을 되돌리는 방법을 설명합니다.

외부 복제본 구성에 대한 자세한 내용은 외부 복제 정보를 참조하세요.

외부 복제본 구성 설정

시작하기 전에

이 태스크를 시작하기 전에 Cloud SQL 인스턴스와 외부 복제본 요구사항을 충족하는 외부 MySQL 인스턴스가 있어야 합니다.

기본 인스턴스 구성

  1. Google Cloud 콘솔의 Cloud SQL 인스턴스 페이지로 이동합니다.
  2. 기본 인스턴스에서 외부 복제본의 IP 주소에 대한 액세스를 사용 설정합니다.

    IP 액세스를 사용 설정하는 방법은 IP 연결을 위한 액세스 구성을 참조하세요.

  3. 나중에 사용할 수 있도록 기본 인스턴스의 공개 IP 주소와 공개 발신 IP 주소를 기록합니다. 인스턴스의 개요 페이지에서 이러한 값을 확인할 수 있습니다.
  4. 오른쪽 상단에 있는 Cloud Shell 아이콘()을 클릭합니다.
  5. Cloud Shell 프롬프트에서 기본 제공 MySQL 클라이언트를 사용하여 기본 인스턴스에 연결합니다.
    
    gcloud sql connect PRIMARY_INSTANCE_NAME \
    --user=root
    
       
  6. 루트 비밀번호를 입력합니다. 그러면 mysql 프롬프트가 표시됩니다.
  7. 복제를 위한 특별 사용자를 만들고 복제 권한을 부여합니다.
    CREATE USER 'REPLICATION_USER'@'%' IDENTIFIED BY 'REPLICATION_USER_PASSWORD';
    GRANT REPLICATION SLAVE ON *.* TO 'REPLICATION_USER'@'%';
       
  8. 새 데이터베이스로 시작하는 경우 기본 인스턴스와 복제본 인스턴스 모두에 동일한 데이터베이스와 테이블을 만듭니다. 예를 들면 다음과 같습니다.
    CREATE DATABASE test;
    
    USE test;
    
    CREATE TABLE replica_test (id SERIAL PRIMARY KEY, data text);
    INSERT INTO replica_test (data) VALUES ('apple'), ('banana'), ('cherry');
    
    
  9. 기본 인스턴스에 이미 데이터베이스가 있는 경우 복제본에 동일한 데이터베이스를 만들어야 합니다. 이렇게 하려면 데이터베이스를 기본 인스턴스에서 Cloud Storage 버킷으로 내보내고 복제본으로 가져옵니다. Cloud SQL에서 Cloud Storage의 SQL 덤프 파일로 데이터 내보내기 자세히 알아보기

외부 복제본 구성

경고: 이 절차를 수행하면 기본 인스턴스의 설정과 데이터가 복제본에서 MySQL 데이터베이스에 호스팅된 모든 데이터(사용자와 비밀번호 포함)를 덮어씁니다.
  1. 복제본을 호스팅하는 머신에서 기본 인스턴스에서 만든 내보내기 파일을 사용하여 새 외부 MySQL 인스턴스를 시드합니다.

    예를 들어 다음 명령어는 mydump.sql이라는 내보낸 파일을 로드합니다.

    mysql --user=root --password < mydump.sql
    
  2. 이 복제본-기본 쌍의 서버 ID를 결정합니다.

    이 서버 ID는 외부 복제본 구성 전체에서 고유한 숫자 값(예: '3')이어야 합니다(모든 복제본에는 고유한 서버 ID가 있어야 함).

  3. 복제본의 my.cnf 옵션 파일에 다음 옵션을 추가합니다.
    [mysqld]
    server-id=[SERVER_ID]
    gtid_mode=ON
    enforce_gtid_consistency=ON
    log_slave_updates=ON
    replicate-ignore-db=mysql
    binlog-format=ROW
    log_bin=mysql-bin
    expire_logs_days=1
    read_only=ON
    

    MySQL 복제 옵션에 대한 자세한 내용은 복제 및 바이너리 로깅 옵션을 참조하세요.

  4. 구성 파일이 읽히도록 mysqld 프로세스를 다시 시작합니다.
  5. 복제본의 mysql 클라이언트에서 다음 명령어를 입력합니다.
    CHANGE MASTER TO MASTER_HOST='MASTER_IP_ADDRESS', MASTER_USER='REPLICATION_USER',
    MASTER_PASSWORD='REPLICATION_PASSWORD', MASTER_AUTO_POSITION=1;
    
  6. 복제본에 복제를 시작합니다.
    START SLAVE;
    
  7. 복제 상태를 확인합니다.

    SHOW SLAVE STATUS\G;
    

    'Waiting for master to send event'가 표시되면 복제가 진행되고 있는 것입니다.

외부 복제본 기본 인스턴스 강등

Cloud SQL 인스턴스에 외부 복제본이 있는 경우 구성을 되돌릴 수 있으며 그에 따른 변경사항은 다음과 같습니다.

  • 외부 복제본이 새 기본 인스턴스가 됩니다.
  • Cloud SQL 인스턴스는 이전에 외부 복제본(지금은 소스 데이터베이스 서버로 지칭)이었던 서버에서 복제되는 읽기 복제본이 됩니다.

외부 복제본 구성을 되돌리는 방법은 다음과 같습니다.

  1. 소스 표현 인스턴스를 만듭니다.

    이 인스턴스는 강등 작업이 완료된 후 Cloud SQL 복제본에 대한 소스 데이터베이스 서버를 표현합니다.

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data '{
             "name": "SOURCE_REPRESENTATION_NAME",
             "region": "REGION",
             "databaseVersion": "EXTERNAL_SERVER_DATABASE_VERSION",
             "onPremisesConfiguration": {
                 "hostPort": "EXTERNAL_SERVER_IP:EXTERNAL_SERVER_PORT"
             }
         }' \
         -X POST \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT-ID/instances
    

    Cloud SQL 복제본을 상주시킬 지역을 사용합니다.

  2. 강등 절차를 시작합니다.

    이 API 호출을 사용할 때는 민감한 정보를 입력해야 하므로 명령줄에 데이터를 제공하지 말고 JSON 파일을 사용하여 데이터를 cURL에 제공해야 합니다.

    데이터 파일을 만듭니다.

    {
        "demoteMasterContext": {
            "replicaConfiguration": {
                "mysqlReplicaConfiguration": {
                    "username": "REPLICATION_USERNAME",
                    "password": "PASSWORD",
                    "caCertificate": "EXTERNAL_SERVER_CA",
                    "clientCertificate": "CLIENT_CERT",
                    "clientKey": "PRIVATE_KEY"
                }
            },
            "masterInstanceName": "SOURCE_REPRESENTATION_NAME",
        },
    }
    

    그런 다음 API를 호출합니다.

    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data @PATH_TO_DATA_FILE \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT-ID/instances/INSTANCE_NAME/demoteMaster
    

    SSL/TLS 옵션에 대한 자세한 내용은 SSL/TLS 옵션을 참조하세요. replicaConfiguration 객체에서 사용하는 속성에 대한 자세한 내용은 외부 서버에서 복제를 참조하세요.

  3. 외부 복제본이 기본 인스턴스에서 대기 중인 모든 트랜잭션을 완료할 때까지 기다립니다.

    복제본이 포착되면 SHOW SLAVE STATUS 명령어에서 Seconds Behind Master가 0으로 표시되고 외부 복제본과 Cloud SQL 기본 인스턴스의 Executed_Gtid_Set 값이 동일해집니다.

  4. mysql 클라이언트를 사용하여 외부 복제본의 복제를 중지합니다.

    STOP SLAVE
    RESET SLAVE ALL
    
  5. Cloud SQL 인스턴스가 소스 데이터베이스 서버에 해당하는 외부 서버에서 복제를 시작할 때까지 기다립니다.

    Cloud SQL 인스턴스에서 SHOW SLAVE STATUS 명령어를 실행하면 복제 상태를 확인할 수 있습니다.

  6. Cloud SQL 인스턴스가 소스 데이터베이스 서버에서 복제를 성공적으로 마치면 소스 데이터베이스 서버의 read_only 플래그를 off로 설정하고 소스 데이터베이스 서버를 가리키도록 애플리케이션을 업데이트합니다.

문제해결

문제 문제 해결
오류 메시지: The slave is connecting ... master has purged binary logs containing GTIDs that the slave requires. 기본 Cloud SQL 인스턴스에는 자동 백업 및 바이너리 로그와 point-in-time recovery가 사용 설정되어 있으므로 복제본이 따라잡을 수 있을 만큼 충분한 로그가 있어야 합니다. 그러나 이 경우에는 바이너리 로그가 존재하더라도 복제본은 어떤 행부터 읽을지 알 수 없습니다.

올바른 플래그 설정을 사용하여 새 덤프 파일을 만들고 이 파일을 사용하여 외부 복제본을 구성합니다.

  1. Compute Engine 인스턴스를 통해 mysql 클라이언트에 연결합니다.
  2. mysqldump를 실행하고 --master-data=1--flush-privileges 플래그를 사용합니다.

    중요: --set-gtid-purged=OFF 플래그를 포함하지 마세요.

    자세히 알아보기

  3. 방금 만든 덤프 파일에 SET @@GLOBAL.GTID_PURGED='...' 줄이 포함되어 있는지 확인합니다.
  4. 덤프 파일을 Cloud Storage 버킷에 업로드하고 덤프 파일을 사용하여 복제본을 구성합니다.

다음 단계