HAProxy를 사용하여 MySQL 클러스터를 Compute Engine으로 마이그레이션

이 가이드에서는 기본 MySQL 복제, HAProxy 인스턴스, Compute Engine을 사용하여 MySQL 데이터베이스를 Google Cloud로 마이그레이션하는 과정을 안내합니다. MySQL은 널리 사용되고 있는 다목적 관계형 데이터베이스 관리 시스템(RDBMS)입니다.

기존 MySQL 클러스터의 데이터를 Compute Engine의 MySQL로 이전하고자 하는 시스템 관리자, 개발자, 엔지니어, 데이터베이스 관리자, DevOps 엔지니어라면 본 가이드를 참조하는 것이 좋습니다. 리전 간 인스턴스, 매개변수의 효율적인 사용, 특정 성능 요건 때문에 관리형 서비스를 사용하지 않고 직접 MySQL 인스턴스를 관리하는 것이 좋을 것입니다. 이 솔루션은 MySQL에서 Cloud SQL로의 마이그레이션을 다루지 않습니다.

본 가이드에서는 독자가 다음에 익숙하다고 가정합니다.

  • Linux
  • Ubuntu-서버 16.04
  • MySQL 5.7
  • HAProxy
  • Compute Engine

아키텍처

본 가이드의 GitHub 저장소에 있는 Cloud Deployment Manager 템플릿을 사용하여 MySQL 클러스터가 us-east1 리전에 있고 기본(master), 복제본(slave), 그리고 MySQL 클라이언트로 구성되어 있는 환경을 만듭니다. 이 문서에서 설명하는 스크립트는 데이터베이스를 source_db 스키마와 5,000개 행의 샘플 데이터로 이루어진 source_table 테이블로 채웁니다.

아래의 아키텍처 다이어그램은 시작할 때의 환경을 보여줍니다. 이 환경은 MySQL 클러스터와 클라이언트 인스턴스로 구성되어 있습니다.

MySQL 클러스터와 클라이언트 인스턴스로 구성되는 시작 환경의 아키텍처

먼저, 소스 복제본 인스턴스를 Compute Engine에서 실행되는 대상 기본 인스턴스로 복제하고 트래픽을 전달할 HAProxy 인스턴스를 만듭니다. 아래의 다이어그램을 보면, HAProxy 부하 분산기가 소스 기본을 가리키고 복제가 소스 복제본과 대상 기본 인스턴스 사이에 구성되어 있습니다.

부하 분산기가 온프레미스 기본을 가리키게 하기

복제가 구성되고 배포가 동기화되고 나면 아래의 다이어그램과 같이 HAProxy 부하 분산기를 대상 기본 Compute Engine 인스턴스로 가리키세요.

부하 분산기가 Compute Engine 인스턴스를 가리키게 하기

목표

  • Deployment Manager를 사용하여 Compute Engine에 소스 MySQL 클러스터와 MySQL 클라이언트 인스턴스를 생성합니다.
  • Compute Engine에서 1노드 대상 MySQL 배포를 설정합니다.
  • 소스 MySQL 클러스터에서 대상 MySQL 인스턴스로 데이터를 복제합니다.
  • HAProxy 인스턴스를 만들어서 소스 MySQL 클러스터를 가리키도록 구성합니다.
  • MySQL 클라이언트가 HAProxy 인스턴스를 가리키게 합니다.
  • HAProxy 인스턴스가 대상 MySQL 노드를 가리키게 합니다.
  • 소스 배포에서 대상 배포로의 데이터 복제를 중지합니다.

비용

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

  • Compute Engine
  • Cloud Storage

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

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

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

    프로젝트 선택기로 이동

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

  6. Compute Engine and Cloud Deployment Manager API를 사용 설정합니다.

    API 사용 설정

이 가이드를 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않도록 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

환경 설정하기

이 가이드에서는 Cloud Shell을 사용하여 명령어를 입력합니다. Cloud Shell은 Google Cloud Console의 명령줄에 대한 액세스 권한을 제공하고 Cloud SDK 및 Google Cloud 개발에 필요한 기타 도구를 포함합니다. Cloud Shell은 Cloud Console 하단에 창으로 표시됩니다. 초기화되는 데 몇 분 정도 걸릴 수 있지만 창은 즉시 표시됩니다.

첫 번째 단계로, Cloud Shell을 사용하여 Cloud Storage 버킷을 만듭니다.

  1. Cloud Shell을 엽니다.

    Cloud Shell 열기

  2. Cloud Storage 버킷 이름의 환경 변수를 설정합니다.

    GCS_BUCKET_NAME=${USER}-mysql-$(date +%s)
    echo $GCS_BUCKET_NAME
    
  3. Cloud Storage 버킷을 만듭니다.

    gsutil mb gs://${GCS_BUCKET_NAME}/
    
  4. GitHub 저장소에서 환경을 설정할 스크립트를 검색합니다.

    git clone https://github.com/GoogleCloudPlatform/solutions-compute-mysql-migration-haproxy.git mysql-migration
    
  5. 초기화 스크립트를 실행하여 기본 및 복제본 인스턴스의 MySQL 클러스터를 만듭니다. 이 스크립트는 MySQL 클라이언트 인스턴스도 생성합니다.

    cd mysql-migration
    ./run.sh ${DEVSHELL_PROJECT_ID} ${GCS_BUCKET_NAME}
    

복제할 소스 MySQL 준비

데이터를 다른 MySQL 인스턴스로 마이그레이션하려면 source-mysql-replica 인스턴스를 설정하여 데이터를 다른 인스턴스에 복제합니다.

  1. Cloud Console에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지

  2. source-mysql-replica 인스턴스 행에서 ssh를 클릭합니다.

  3. 복제를 위해 사용자를 한 명 지정합니다. 본 가이드에서 이 사용자의 비밀번호는 solution-admin입니다.

    mysql -u root -psolution-admin -e "GRANT REPLICATION SLAVE ON *.* TO
    'sourcereplicator'@'%' IDENTIFIED BY 'solution-admin';"
    
  4. 복제본 로깅을 사용 설정합니다.

    sudo bash -c 'echo log_slave_updates = 1 >>/etc/mysql/mysql.conf.d/mysqld.cnf'
    
  5. MySQL을 다시 시작합니다.

    sudo service mysql restart
    

    MySQL을 다시 시작하면, 복제본 인스턴스에 연결된 모든 클라이언트의 연결이 끊어집니다. 복제본이 기본과 동기화되려면 복제본이 다시 시작할 때 기본에 쓰는 볼륨에 따라 시간이 걸릴 수 있습니다.

대상 MySQL 인스턴스용 서비스 계정 설정

서비스 계정은 역할 및 권한 집합과 연결됩니다. 본 가이드에서 요구하는 최소의 권한을 보유한 MySQL 인스턴스용 서비스 계정을 만드세요.

  1. Cloud Shell을 엽니다.

    Cloud Shell 열기

  2. 서비스 계정을 만듭니다.

    gcloud iam service-accounts create mysql-instance \
        --display-name "mysql-instance"
    
  3. storage.objectAdmin 역할을 mysql-instance 서비스 계정에 추가합니다. 이 역할은 Cloud Storage 버킷에 있는 파일을 보고 다운로드하기 위해 필요합니다.

    gcloud projects add-iam-policy-binding ${DEVSHELL_PROJECT_ID} \
        --member=serviceAccount:mysql-instance@${DEVSHELL_PROJECT_ID}.iam.gserviceaccount.com \
        --role=roles/storage.objectAdmin
    

Compute Engine에 대상 MySQL 인스턴스 설정

이 섹션에서는 Compute Engine 인스턴스를 만들어서 여기에 MySQL을 설치합니다.

  1. Cloud Shell에서 대상 MySQL 인스턴스를 만듭니다.

    gcloud compute instances create target-mysql-primary \
            --image-family=ubuntu-1604-lts  --image-project=ubuntu-os-cloud \
            --tags=mysql57 --zone=us-central1-c \
        --service-account=mysql-instance@${DEVSHELL_PROJECT_ID}.iam.gserviceaccount.com \
        --scopes=https://www.googleapis.com/auth/devstorage.read_write
    
  2. Cloud Console에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지

  3. 새로고침을 클릭합니다.

  4. Cloud Console에서 ssh를 사용하여 target-mysql-primary 인스턴스에 연결합니다.

  5. 인스턴스의 터미널 창에서 MySQL을 설치합니다.

    sudo apt-get update
    sudo apt-get -y install mysql-server-5.7
    
  6. 메시지가 표시되면 루트 사용자 비밀번호로 solution-admin을 입력합니다.

  7. Cloud Shell에서, 소스 MySQL 인스턴스와 대상 인스턴스 간의 통신을 허용하는 방화벽 규칙을 만듭니다.

    gcloud compute firewall-rules create mysql  --allow=tcp:3306 \
        --source-tags source-mysql --target-tags target-mysql
    

소스 복제본과 대상 기본 인스턴스 사이에 보안 루트 액세스 설정

target-mysql-primary 인스턴스에 비공개 키와 공개 키를 만들고 공개 키를 source-mysql-replica 인스턴스에 복사하여 인증을 설정합니다. 인증을 이렇게 설정하면 나중에 rsync 명령어를 사용하여 파일을 source-mysql-replica 인스턴스에서 target-mysql-primary 인스턴스로 빠르게 복사할 수 있습니다.

  1. Cloud Console에서 ssh를 사용하여 target-mysql-primary 인스턴스에 연결합니다.

  2. 비공개 키를 만듭니다.

    sudo ssh-keygen
    
  3. 메시지가 표시되면 Enter를 눌러서 기본 설정을 모두 승인합니다.

  4. 공개 키를 Cloud Storage 버킷에 복사합니다.

    sudo bash -c "gsutil cp /root/.ssh/id_rsa.pub gs://[GCS_BUCKET_NAME]/"
    

    각 항목의 의미는 다음과 같습니다.

    • [GCS_BUCKET_NAME]은 본 가이드의 초반부에서 만든 버킷을 의미합니다.
  5. Cloud Console에서 ssh를 사용하여 source-mysql-replica 인스턴스에 연결합니다.

  6. 인스턴스의 터미널 창에서, Cloud Storage 버킷의 공개 키를 복사합니다.

    sudo bash -c "gsutil cp \
        gs://[GCS_BUCKET_NAME]/id_rsa.pub /root/.ssh/target-mysql-primary.pub"
    

    각 항목의 의미는 다음과 같습니다.

    • [GCS_BUCKET_NAME]은 본 가이드의 초반부에서 만든 버킷을 의미합니다.
  7. 공개 키를 authorized_keys 파일에 추가합니다.

    sudo bash -c "cat /root/.ssh/target-mysql-primary.pub >>  \
        /root/.ssh/authorized_keys"
    
  8. Cloud Console에서 ssh를 사용하여 target-mysql-primary 인스턴스에 연결합니다.

  9. target-mysql-primary 인스턴스에서 연결을 테스트합니다.

    sudo ssh source-mysql-replica
    
  10. 메시지가 표시되면 yes을 입력하여 원격 서버의 공개 키를 승인합니다.

MySQL 배포 동기화

rsync 명령어를 사용하여 source-mysql-replica 인스턴스의 MySQL 데이터 파일을 target-mysql-primary 인스턴스에 복사합니다. 다운타임을 최소화하기 위해 이 명령어를 두 번 실행하세요. 소스 복제본이 온라인 상태일 때 데이터의 대다수를 복사하기 위해 한 번 실행하고 소스 복제본이 오프라인 상태일 때 다시 실행합니다. 소스 복제본이 오프라인 상태일 때 파일을 복사하면 열린 파일에 있는 모든 데이터가 올바로 복사됩니다.

MySQL 데이터 파일 복사

이 섹션에서는 source-mysql-replica 인스턴스의 MySQL 데이터 파일을 target-mysql-primary 인스턴스로 복사합니다.

  1. Cloud Console에서 ssh를 사용하여 target-mysql-primary 인스턴스에 연결합니다.

  2. 인스턴스의 터미널 창에서 MySQL을 중지합니다.

    sudo service mysql stop
    
  3. /var/lib/mysql의 콘텐츠를 삭제합니다.

    sudo bash -c "rm -rf /var/lib/mysql/*"
    
  4. 소스의 데이터베이스 파일을 복사합니다.

    sudo bash -c "rsync -av source-mysql-replica:/var/lib/mysql/ /var/lib/mysql"
    

    본 가이드에서는 이 과정에 5~10초가 소요됩니다. 그러나 실제 워크로드에서 이 과정을 완료하는 데 드는 시간은 마이그레이션하려는 데이터베이스의 크기와 네트워크의 성능에 따라 결정됩니다.

  5. Cloud Console에서 ssh를 사용하여 source-mysql-replica 인스턴스에 연결합니다.

  6. source-mysql-primary 인스턴스로부터의 복제를 일시 중지합니다.

    mysql -uroot -psolution-admin -e 'show master status; stop slave;'
    

    이에 따른 출력은 다음 형식으로 표시됩니다.

    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000002 |      154 | source_db    |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    

    log_bin 파일과 위치를 기록해둡니다. 사용자의 값이 다를 수 있으므로 본 가이드의 후반부에서는 mysql-bin.000002 파일 이름이 PRIMARY_LOG_FILE로 표시되고 154 파일 위치가 PRIMARY_LOG_POS로 표시됩니다.

  7. 처음 복사 작업을 수행할 때 쓰기를 중지하지 않았으므로 target-mysql-primary 인스턴스에서 다음 명령어를 실행하여 target-mysql-primary 인스턴스가 source-mysql-replica 인스턴스와 일관되도록 합니다.

    sudo bash -c "rsync -av source-mysql-replica:/var/lib/mysql/ /var/lib/mysql"
    
  8. source-mysql-replica 인스턴스에서 복제를 다시 시작합니다.

    sudo mysql -uroot -psolution-admin -e 'start slave;'
    

target-mysql-primary 인스턴스를 복제에 맞도록 구성

  1. Cloud Console에서 ssh를 사용하여 target-mysql-primary 인스턴스에 연결합니다.

  2. 기본 MySQL 인스턴스 ID가 포함된 파일을 삭제합니다.

    sudo rm /var/lib/mysql/auto.cnf
    
  3. MySQL 구성을 업데이트하여 source-mysql-replica 인스턴스에서 source_db 데이터베이스를 복제합니다.

    sudo sed -i "s|#server-id.*|server-id = 4|" \
        /etc/mysql/mysql.conf.d/mysqld.cnf
    sudo sed -i "s|#log_bin|log_bin|" /etc/mysql/mysql.conf.d/mysqld.cnf
    sudo sed -i "s|#binlog_do_db.*|binlog_do_db = source_db|" \
        /etc/mysql/mysql.conf.d/mysqld.cnf
    
  4. 네트워크상에 있는 다른 호스트의 연결을 승인하도록 MySQL을 사용 설정합니다.

    LOCAL_IP=$(curl  http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip \
        -H "Metadata-Flavor: Google")
    sudo sed -i "s|bind-address.*|bind-address = $LOCAL_IP|" \
        /etc/mysql/mysql.conf.d/mysqld.cnf
    
  5. MySQL을 시작합니다.

    sudo service mysql start
    
  6. MySQL 콘솔에 로그인합니다.

    mysql -u root -psolution-admin
    
  7. 기본 인스턴스를 재설정합니다.

    reset slave;
    
  8. 복제 프로세스를 구성합니다.

    CHANGE MASTER TO MASTER_HOST='source-mysql-replica', \
        MASTER_USER='sourcereplicator', MASTER_PASSWORD='solution-admin', \
        MASTER_LOG_FILE='[[PRIMARY_LOG_FILE]]', MASTER_LOG_POS=[[PRIMARY_LOG_POS]];
    

    각 항목의 의미는 다음과 같습니다.

    • [PRIMARY_LOG_FILE]은 앞 단계의 mysql-bin.000002를 나타냅니다.
    • [PRIMARY_LOG_FILE]은 앞 단계의 154를 나타냅니다.
  9. 복제를 시작합니다.

    start slave;
    
  10. source_db 테이블이 서버에 존재하고 여기에 소스 배포의 데이터가 포함되어 있는지 확인합니다.

    SELECT * FROM source_db.source_table;
    

    이 테이블은 다음과 같은 형식으로 표시됩니다.

    +----+---------------------+------------+
    | id | timestamp           | event_data |
    +----+---------------------+------------+
    |  1 | 2018-09-06 13:57:17 |    8511.85 |
    |  2 | 2018-09-06 13:57:17 |    2658.33 |
    |  3 | 2018-09-06 13:57:17 |    2756.08 |
    |  4 | 2018-09-06 13:57:17 |    5805.42 |
    |  5 | 2018-09-06 13:57:17 |    5758.86 |
    
  11. 복제본 인스턴스의 상태를 확인합니다.

    show slave status \G
    

    출력값은 다음과 비슷합니다.

    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: source-mysql-replica
    ...
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    ...
    1 row in set (0.00 sec)
    

HAProxy 인스턴스 만들기

HAProxy 인스턴스를 사용하여 소스 배포를 가리킬 수 있는 하나의 액세스 포인트를 만듭니다. 나중에 마이그레이션을 할 때 클라이언트를 재구성하지 않고 이 액세스 포인트가 대상 배포를 가리키게 할 수 있습니다.

  1. Cloud Shell에서 HAProxy 인스턴스를 만들고 여기에 고정 IP 주소를 할당합니다.

    gcloud compute instances create haproxy --image-family=ubuntu-1604-lts  \
        --image-project=ubuntu-os-cloud --tags=haproxy,http-server \
        --zone=us-central1-c --private-network-ip=10.128.0.100
    
  2. Cloud Console에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지

  3. 새로고침을 클릭합니다.

  4. HAProxy 인스턴스의 행에서 ssh를 클릭하여 인스턴스에 연결합니다.

  5. HAProxy 인스턴스에서 HAProxy 1.6.3을 설치합니다.

    sudo apt-get update
    sudo apt-get install -y haproxy=1.6.3-1
    
  6. 나중에 MySQL 인스턴스와의 연결을 테스트할 수 있도록 MySQL 클라이언트를 설치합니다.

    sudo apt-get install -y mysql-client
    

양 MySQL 배포의 기본 노드와 통신하도록 HAProxy 인스턴스 사용 설정

MySQL 복제의 설정을 완료하였으면 마이그레이션을 시작할 준비가 된 것입니다.

방화벽 규칙 사용 설정

  1. Cloud Shell에서 HAProxy 인스턴스와 양 MySQL 배포 간의 통신을 활성화하는 방화벽 규칙을 만듭니다.

    gcloud compute firewall-rules create haproxy-mysql --allow=tcp:3306 \
        --source-tags haproxy --target-tags target-mysql,source-mysql
    
  2. HAProxy 인스턴스 관리자 액세스를 허용하는 방화벽 규칙을 만듭니다.

    gcloud compute firewall-rules create haproxy-admin --allow=tcp:80 \
        --source-ranges=0.0.0.0/0 --target-tags haproxy
    

대상 인스턴스를 위한 HAProxy 인증 설정

이 섹션에서는 target-mysql-primary 인스턴스의 HAProxy 인증을 설정합니다.

  1. Cloud Console에서 ssh를 사용하여 target-mysql-primary 인스턴스에 연결합니다.

  2. haproxy_check라는 사용자를 만듭니다. 이 사용자가 HAProxy 인스턴스에서 로그인하도록 승인합니다. HAProxy 인스턴스는 이 사용자를 이용하여 서버의 상태를 확인합니다.

    mysql -uroot -psolution-admin -e "INSERT INTO mysql.user \
        (Host,User,ssl_cipher,x509_issuer,x509_subject) values \
        ('10.128.0.100','haproxy_check','','',''); FLUSH PRIVILEGES";
    
  3. haproxy_root라는 사용자를 만듭니다. 이 사용자가 HAProxy 인스턴스에서 로그인하도록 승인합니다.

    PROJECT_ID=`curl  \
        http://metadata.google.internal/computeMetadata/v1/project/project-id -H "Metadata-Flavor: Google"`
    HA_PROXY_FQDN=haproxy.c.$PROJECT_ID.internal
    mysql -uroot -psolution-admin -e "GRANT ALL PRIVILEGES ON *.* TO \
        'haproxy_root'@'"$HA_PROXY_FQDN"' IDENTIFIED BY 'solution-admin' WITH \
        GRANT OPTION; FLUSH PRIVILEGES;"
    

소스 기본 인스턴스를 위한 HAProxy 인증 설정

이 섹션에서는 source-mysql-primary 인스턴스의 HAProxy 인증을 설정합니다.

  1. Cloud Console에서 ssh를 사용하여 source-mysql-primary 인스턴스에 연결합니다.

  2. haproxy_check라는 사용자를 만들어서 HAProxy 인스턴스에서 로그인할 권한을 부여합니다.

    mysql -uroot -psolution-admin -e "INSERT INTO mysql.user \
        (Host,User,ssl_cipher,x509_issuer,x509_subject) values \
        ('10.128.0.100','haproxy_check','','',''); FLUSH PRIVILEGES;"
    
  3. HAProxy_root라는 사용자를 만들어서 HAProxy 인스턴스에서 로그인할 권한을 부여합니다.

    PROJECT_ID=`curl  \
        http://metadata.google.internal/computeMetadata/v1/project/project-id -H \
        "Metadata-Flavor: Google"`
    HA_PROXY_FQDN=haproxy.c.$PROJECT_ID.internal
    mysql -uroot -psolution-admin -e "GRANT ALL PRIVILEGES ON *.* TO \
        'haproxy_root'@'"$HA_PROXY_FQDN"' IDENTIFIED BY 'solution-admin' WITH GRANT OPTION; FLUSH PRIVILEGES;"
    

    haproxy_root 사용자는 HAProxy 인스턴스에서 MySQL에 액세스하기 위해 필요합니다.

HAProxy와 MySQL 기본 인스턴스 간 연결성 테스트

  1. Cloud Console에서 ssh를 사용하여 HAProxy 머신에 로그인합니다.

  2. source-mysql-primary 인스턴스와의 연결을 테스트합니다.

    mysql -h source-mysql-primary -u haproxy_root -psolution-admin -e \
        "SHOW DATABASES"
    
  3. target-mysql-primary 인스턴스와의 연결을 테스트합니다.

    mysql -h target-mysql-primary -u haproxy_root -psolution-admin -e \
        "SHOW DATABASES"
    

HAProxy 구성

이제 HAProxy 구성 파일을 만들어 source-mysql-primary 인스턴스를 가리킵니다.

  1. Cloud Console에서 ssh를 사용하여 HAProxy 인스턴스에 로그인합니다.

  2. HAProxy 인스턴스에 있는 기존의 HAProxy 구성 파일을 백업합니다.

    sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bkp
    
  3. HAProxy 인스턴스를 구성하고 본 가이드의 후반부에서 사용할 비밀번호를 만듭니다.

    sudo bash -c "cat <<EOF >  /etc/haproxy/haproxy.cfg
    ######### HAProxy Config file #########
    
    global
           log /dev/log    local0
           log /dev/log    local1 notice
           chroot /var/lib/haproxy
           stats socket /run/haproxy/admin.sock mode 660 level admin
           stats timeout 30s
           user haproxy
           group haproxy
           daemon
    
    defaults
           log     global
           timeout connect 3000
           timeout client  5000
           timeout server  5000
    
    listen mysql-cluster
    bind 127.0.0.1:3306,$(curl  \
        http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip \
        -H 'Metadata-Flavor: Google'):3306
           mode tcp
           option mysql-check user haproxy_check
           balance roundrobin
    
           # Server number 1
           server source-primary source-mysql-primary:3306 check
    
           # Server number 2
           # server target-primary target-mysql-primary:3306 check
    
    listen stats
           bind 0.0.0.0:80
           mode http
           stats enable
           stats uri /haproxy
           stats realm Strictly\ Private
           stats auth mysqlproxy:MySQLProxy12!
    EOF"
    
  4. HAProxy 서비스를 새로고침합니다.

    sudo service haproxy reload
    

배포 테스트

  1. HAProxy 인스턴스에서 로컬호스트 주소를 호스트로 사용하여 source-mysql-primary 인스턴스에 연결합니다.

    mysql -h 127.0.0.1 -u haproxy_root -psolution-admin -e "SHOW DATABASES"
    

    출력값에 데이터베이스의 이름이 포함되어 있습니다.

    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | source_db          |
    | sys                |
    +--------------------+
    
  2. Cloud Console에서 ssh를 사용하여 mysql-client 인스턴스에 연결합니다.

  3. HAProxy 인스턴스를 사용하여 source-mysql-primary 인스턴스와의 연결을 테스트합니다.

    mysql -h haproxy  -u haproxy_root -psolution-admin -e "SHOW DATABASES"
    
  4. Cloud Shell에서 HAProxy 인스턴스의 공개 IP 주소를 찾습니다.

    gcloud compute instances describe haproxy \
        --format='value(networkInterfaces[0].accessConfigs[0].natIP)' \
        --zone=us-central1-c
    
  5. HAProxy 인스턴스의 외부 IP 주소를 복사합니다.

  6. HAProxy 인스턴스와 source-mysql-master 인스턴스 사이의 연결 상태를 점검하려면 다음 URL로 이동하여 소스-기본 행이 녹색인지 확인합니다.

    http://[PUBLIC_IP_OF_HAPROXY]/haproxy
    

    각 항목의 의미는 다음과 같습니다.

    • [PUBLIC_IP_OF_HAPROXY]HAProxy 인스턴스의 공개 IP 주소를 나타냅니다.
  7. 사용자 이름 필드에 mysqlproxy를 입력합니다.

  8. 비밀번호 입력란에 MySQLProxy12!를 입력합니다.

MySQL 서버 전환

이 단계에서는 실제 마이그레이션을 수행합니다. 모든 인스턴스가 동기화된 상태에서 HAProxy 서비스가 대상 배포를 가리키도록 하고 환경을 테스트합니다.

HAProxy 서비스 중지

  1. HAProxy 인스턴스에 연결합니다.

  2. 대상이 소스와 일치하도록 하기 위해 source-mysql-primary 인스턴스와의 모든 연결을 중지합니다.

    sudo service haproxy stop
    

기본 인스턴스의 테이블 잠그기

  1. source-mysql-primary 인스턴스에 연결합니다.

  2. 쓰기 테이블을 잠급니다.

    mysql -uroot -psolution-admin -e "FLUSH TABLES WITH READ LOCK"
    

소스 인스턴스가 동기화 상태인지 확인

이 섹션에서는 source-mysql-primary 인스턴스와 source-mysql-replica 인스턴스가 동기화 상태인지 확인합니다.

  1. Cloud Console에서 ssh를 사용하여 source-mysql-replica 인스턴스에 로그인합니다.

  2. 복제본의 상태를 점검합니다.

    mysql -u root -psolution-admin -e "show slave status \G" | grep \
        Seconds_Behind_Master
    

    Seconds_Behing_Master의 값이 0이면 인스턴스가 동기화 상태인 것입니다.

소스 인스턴스와 대상 인스턴스가 동기화 상태인지 확인

이 섹션에서는 source-mysql-replica 인스턴스와 target-mysql-primary 인스턴스가 동기화 상태인지 확인합니다.

  1. Cloud Console에서 ssh를 사용하여 target-mysql-primary 인스턴스에 로그인합니다.

  2. 복제본의 상태를 점검합니다.

    mysql -u root -psolution-admin -e "show slave status \G" | grep Seconds_Behind_Master
    

    Seconds_Behind_Master의 값이 0이면 인스턴스가 동기화 상태인 것입니다.

  3. source-mysql-replica 인스턴스로부터의 복제를 일시 중지합니다.

    mysql -u root -psolution-admin -e "stop slave;reset master;"
    

HAProxy 구성이 target-mysql-primary 인스턴스를 가리키게 하기

  1. Cloud Console에서 ssh를 사용하여 HAProxy 인스턴스에 로그인합니다.

  2. HAProxy 구성을 변경하여 target-mysql-primary 인스턴스를 가리키게 합니다.

    sudo sed -i 's|server source-primary|# server source-primary|g' \
        /etc/haproxy/haproxy.cfg
    sudo sed -i 's|# server target-primary|server target-primary|g' \
        /etc/haproxy/haproxy.cfg
    
  3. 서비스를 새로고침합니다.

    sudo service haproxy restart
    
  4. HAProxy 인스턴스와 target-mysql-primary 인스턴스 사이의 연결 상태를 점검하기 위해 다음 URL로 이동하여 대상-기본 행이 녹색인지 확인합니다.

    http://[PUBLIC_IP_OF_HAPROXY]/haproxy
    

    각 항목의 의미는 다음과 같습니다.

    • [PUBLIC_IP_OF_HAPROXY]HAProxy 인스턴스의 공개 IP 주소를 나타냅니다.
  5. 사용자 이름 필드에 mysqlproxy를 입력합니다.

  6. 비밀번호 입력란에 MySQLProxy12!를 입력합니다.

  7. Cloud Console에서 ssh를 사용하여 mysql-client 인스턴스에 로그인합니다.

  8. 새 구성을 테스트합니다.

    mysql -h haproxy  -u haproxy_root -psolution-admin -e "SHOW DATABASES"
    

    출력값에 데이터베이스의 이름이 포함되어 있습니다.

    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | source_db          |
    | sys                |
    +--------------------+
    

프로덕션 클러스터 마이그레이션 시 고려 사항

본 가이드에서 사용자는 MySQL 클러스터를 다른 MySQL 인스턴스로 마이그레이션하였습니다. 소스 클러스터는 Google Cloud에 배포되더라도 온프레미스 클러스터나 다른 클라우드 플랫폼에 있는 클러스터를 시뮬레이션하도록 되어 있습니다. 프로덕션 워크로드를 이전할 때 고려해야 할 점은 다음과 같습니다.

  • 연결 설정: 온프레미스 배포에서 마이그레이션하든 다른 퍼블릭 클라우드에서 마이그레이션하든 환경과 Google Cloud 사이에 연결 채널을 설정해야 합니다. VPN 또는 Cloud Interconnect를 사용하는 것을 고려하세요.
  • 네트워크 성능: 소스 환경과 대상 환경 간의 지연 시간은 얼마인가요? 사용 가능한 대역폭은 어떤가요? 이 같은 요소가 동기화 속도에 커다란 영향을 미칠 수 있고 클라이언트와 HAProxy 클러스터 간의 연결에 영향을 줄 수 있습니다.
  • 데이터베이스 매개변수 미세 조정: 본 가이드에서는 몇 가지 복제 매개변수에 대해서만 다룹니다. 데이터베이스 관리자가 환경과 앱의 요구에 따라 그 성능과 구성을 수정하기 위해 여러 가지 커스텀 매개변수로 소스 MySQL 클러스터를 구성하였을지도 모릅니다. 예를 들어 대상 클러스터 구성을 조정해야 할 수도 있습니다.
  • MySQL 클러스터에 실행 중인 쿼리의 유형: 긴 쿼리를 실행하고 있나요? 초당 쿼리 수가 많은가요, 적은가요? 이에 관한 대답이 HAProxy 인스턴스의 구성 방식에 영향을 미칠 것입니다. 예를 들어 시간 제한을 조정해야 할 수도 있습니다.
  • 대상 배포: 본 가이드에서는 대상 배포를 위한 복제본 인스턴스를 설정하지 않았습니다. 프로덕션 환경의 경우 대상 배포를 위한 클러스터를 설정하세요.
  • Haproxy 인스턴스 및 배포: 본 가이드에서는 하나의 HAProxy 인스턴스를 사용했습니다. 프로덕션 워크로드 마이그레이션의 경우에는 중복 HAProxy 배포를 사용해도 됩니다.
  • 영역 선택: 본 가이드에서는 us-central1-c 영역을 사용하지만 프로덕션 워크로드의 경우에는 어떤 영역을 사용해도 됩니다. 리전을 선택하는 방법에 대한 자세한 내용은 Compute Engine 리전 선택 권장사항을 참조하세요.
  • 디스크 크기: 디스크의 크기가 소스 MySQL 인스턴스의 디스크 크기와 일치하는지 확인하세요.
  • 권한 및 액세스: 본 가이드에서는 루트 사용자를 사용했습니다. 프로덕션 마이그레이션 시에는 sudo 또는 root 명령어를 실행할 수 없다면 다른 사용자를 사용해야 할 것입니다.

정리

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

프로젝트 삭제

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

    리소스 관리로 이동

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

다음 단계