HAProxy を使用して MySQL クラスタを Compute Engine に移行する

このチュートリアルでは、ネイティブの MySQL レプリケーション、HAProxy インスタンス、Compute Engine を使用して、MySQL データベースを Google Cloud に移行する作業の手順を説明します。MySQL は、よく利用されている多目的リレーショナル データベース管理システム(RDBMS)の 1 つです。

このチュートリアルは、システム管理者、デベロッパー、エンジニア、データベース管理者、devops エンジニアの方が、既存の MySQL クラスタにあるデータを Compute Engine 上の MySQL に移行しようとしている場合に役立ちます。マネージド サービスを使用する代わりに自分で MySQL インスタンスを管理することが必要になる場合もあります。たとえば、クロス リージョン インスタンス、高度なパラメータの使い方、またはパフォーマンスに関する特定のニーズがある場合です。このソリューションは、MySQL から Cloud SQL への移行には対応していません。

このチュートリアルは、読者が次の技術を理解していることを前提としています。

  • Linux
  • Ubuntu-server 16.04
  • MySQL 5.7
  • HAProxy
  • Compute Engine

アーキテクチャ

このチュートリアルの GitHub リポジトリにある Cloud Deployment Manager テンプレートを使用して環境を作成します。この環境では、MySQL クラスタが us-east1 リージョンにあり、プライマリ(master)とレプリカ(slave)で構成され、これに加えて MySQL クライアントがあります。このドキュメントで説明しているスクリプトを実行すると、データベース内に source_db スキーマと source_table テーブルが作成され、サンプルデータ 5,000 行が入力されます。

次のアーキテクチャ図は、チュートリアル開始時の環境を示しています。これは、MySQL クラスタ 1 つとクライアント インスタンス 1 つで構成されています。

MySQL クラスタとクライアント インスタンスがある、最初の環境のアーキテクチャ

まず、ソースレプリカ インスタンスを、Compute Engine 上で稼働するターゲット プライマリ インスタンスに複製します。また、トラフィックを転送するための HAProxy インスタンスを作成します。次の図では、HAProxy ロードバランサがソース プライマリを指しており、レプリケーションがソースレプリカとターゲット プライマリ インスタンスの間で構成されています。

ロードバランサがオンプレミスのプライマリを指すように設定する

レプリケーションが構成されて、両方のデプロイメントが同期する状態になったら、次の図に示すように、HAProxy ロードバランサがターゲットのプライマリ Compute Engine インスタンスを指すように設定します。

ロードバランサが Compute Engine のインスタンスを指すように設定する

目標

  • Deployment Manager を使用して、ソース MySQL クラスタと MySQL クライアント インスタンスを Compute Engine 上に作成します。
  • 1 ノードのターゲット MySQL デプロイメントを Compute Engine 上に設定します。
  • ソース MySQL クラスタのデータをターゲット MySQL インスタンスにレプリケートします。
  • HAProxy インスタンスを作成し、ソース MySQL クラスタを指すように構成します。
  • MySQL クライアントが HAProxy インスタンスを指すように指定します。
  • HAProxy インスタンスがターゲット MySQL ノードを指すように設定します。
  • ソース デプロイメントからターゲット デプロイメントへのデータ レプリケーションを停止します。

料金

このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。

  • Compute Engine
  • Cloud Storage

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。新しい Google Cloud ユーザーは無料トライアルをご利用いただけます。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    [プロジェクトの選択] ページに移動

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Compute Engine and Cloud Deployment Manager API を有効にします。

    API を有効にする

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

環境設定

このチュートリアルでは、Cloud Shell を使用してコマンドを入力します。Cloud Shell では Google Cloud Console のコマンドラインにアクセスできます。また、Google Cloud で開発を行うために必要な Cloud SDK やその他のツールも含まれています。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
    

ターゲット MySQL インスタンスを Compute Engine 上にセットアップする

このセクションでは、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. root ユーザーのパスワードを要求されたら、「solution-admin」と入力します。

  7. Cloud Shell で、ソース MySQL インスタンスとターゲット インスタンスとの通信を許可するファイアウォール ルールを作成します。

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

ソースレプリカ インスタンスとターゲット プライマリ インスタンスの間の安全な root アクセスをセットアップする

認証を設定するために、秘密鍵と公開鍵を target-mysql-primary インスタンス上で作成し、公開鍵を source-mysql-replica インスタンスにコピーします。このように認証を設定すると、後でファイルを source-mysql-replica インスタンスから target-mysql-primary インスタンスに rsync コマンドを使用して簡単にコピーできるようになります。

  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 インスタンスから target-mysql-primary インスタンスに MySQL データファイルをコピーします。ダウンタイムを最小限に抑えるために、このコマンドを 2 回実行します。1 回目はソースレプリカがオンラインのときに実行してデータの大半をコピーし、2 回目はソースレプリカがオフラインのときに実行します。ソースレプリカがオフラインのときにファイルをコピーするのは、開いているファイルのデータをすべて確実に正しくコピーするためです。

MySQL のデータファイルをコピーする

このセクションでは、MySQL のデータファイルを source-mysql-replica インスタンスから 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.000002PRIMARY_LOG_FILE と表し、ファイル位置 154PRIMARY_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. source_db データベースを source-mysql-replica インスタンスからレプリケートするように MySQL の構成を更新します。

    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 つ作成し、これがソース デプロイメントを指すように設定します。後で、このアクセス ポイントがターゲット デプロイメントを指すように設定すれば、移行中にクライアントの再構成を行う必要はありません。

  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
    

HAProxy インスタンスが両方の MySQL デプロイメントのプライマリ ノードと通信できるように設定する

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 認証をセットアップする

このセクションでは、HAProxy 認証を target-mysql-primary インスタンスに対してセットアップします。

  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 認証をセットアップする

このセクションでは、HAProxy 認証を source-mysql-primary インスタンスに対してセットアップします。

  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 インスタンスから、localhost アドレスをホストとして使用して 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 に移動して、source-primary の行が緑色であることを確認します。

    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 に移動して target-primary の行が緑色であることを確認します。

    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 クラスタに対して実行されるクエリのタイプ: 実行するのは長いクエリか。1 秒あたりのクエリの数は多いか、それとも少ないか。これらに対する答えは、HAProxy インスタンスの構成方法に影響する可能性があります。たとえば、タイムアウトの調整が必要になることがあります。
  • ターゲット デプロイメント: このチュートリアルでは、ターゲット デプロイメント用のレプリカ インスタンスをセットアップしませんでした。本番環境では、ターゲット デプロイメント用のクラスタをセットアップします。
  • Haproxy インスタンスとデプロイメント: このチュートリアルでは、HAProxy インスタンスを 1 つだけ使用しました。本番環境のワークロード移行の場合は、冗長 HAProxy デプロイメントを使用できます。
  • ゾーンの選択: このチュートリアルでは us-central1-c ゾーンを使用していますが、本番環境のワークロードにはどのゾーンでも使用できます。リージョンを選択する方法の詳細については、Compute Engine のリージョン選択に関するベスト プラクティスをご覧ください。
  • ディスクサイズ: ディスクのサイズがソース MySQL インスタンスのディスクサイズと一致することを確認します。
  • 権限とアクセス: このチュートリアルでは root ユーザーを使用しました。本番環境の移行では、sudo または root コマンドを実行できない場合に別のユーザーを使用する必要があります。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ