sql >> データベース >  >> RDS >> Mysql

MySQLデータベースをAmazonRDSからDigitalOceanに移行する

    以前のブログ(パート1とパート2)では、RDSデータをEC2インスタンスに移行する方法について説明しました。その過程で、データをRDSから移動することができましたが、引き続きAWSで実行しています。データをアマゾンウェブサービスから完全に移動したい場合は、もう少し作業が必要です。今日のブログ投稿では、その方法を紹介します。

    環境の紹介

    作業する環境は、シリーズの最後の投稿で最終的に得たものと非常によく似ています。唯一の違いは、AWSからの移行プロセスの中間ステップとしてEC2インスタンスを使用するため、カットオーバーが発生しなかったことです。

    初期インフラストラクチャのセットアップ

    アクションプラン

    関連リソースクラウド内のMySQL-AmazonRDSからEC2インスタンスへのオンライン移行(パート1)クラウド内のMySQL-Amazon RDSから独自のサーバーへのオンライン移行(パート2)クラウド内のMySQL-AmazonRDSの長所と短所

    以前のブログでは、最初にデータをRDSからフルアクセス可能なEC2インスタンスに移行しました。すでにEC2インスタンスでMySQLを実行しているため、データを別のクラウドにコピーする方法に関して、より多くのオプションを選択できます。 DigitalOceanは、ここではデモ目的でのみ使用されます。以下で説明するプロセスは、他のホスティングプロバイダーまたはクラウドプロバイダーへの移行に使用できます。 VPSインスタンスに直接アクセスする必要があります。このプロセスでは、xtrabackupを使用してデータをコピーします(ただし、他のバイナリ転送方法を使用することはまったく問題ありません)。 AWSとDigitalOceanの間の安全な接続を準備する必要があります。これを行ったら、EC2インスタンスからDigitalOceanドロップレットへのレプリケーションをセットアップします。次のステップは、カットオーバーと移動アプリケーションを実行することですが、ここでは取り上げません。

    接続方法の決定

    アマゾンウェブサービスでは、さまざまな方法から選択して、外部ネットワークへの接続を作成できます。 VPN接続をサポートするハードウェアアプライアンスがある場合は、それを使用して、AWSのVPCとローカルインフラストラクチャの間にVPN接続を形成できます。ネットワークプロバイダーがAWSネットワークとのピアリング接続を提供し、BGPルーターを使用している場合は、AWSDirectConnectを介してネットワークとAWS間の直接VLAN接続を取得できます。複数の分離されたネットワークがある場合は、AWSVPNCloudHubを使用してそれらをAmazonとリンクできます。最後に、EC2インスタンスを管理するので、OpenVPNなどのソフトウェアソリューションを使用して、そのEC2インスタンスとローカルネットワークの間にVPNを設定することもできます。

    データベースについて話しているので、EC2上のMySQL(マスター)とDigitalOceanで実行されているスレーブの間でSSLレプリケーションをセットアップすることもできます。 -スレーブへの初期データ転送の方法を理解する必要があります-1つの解決策は、xtrabackupの出力をtarし、そのファイルを暗号化して、WAN(rsync)経由で送信するか、S3バケットにアップロードしてからダウンロードすることです。そこから。 SSH暗号化に依存して、データを新しい場所にscp(またはSSHを使用してrsync)することもできます。

    選択できるオプションはたくさんあります。ただし、別のソリューションを使用します。EC2インスタンスとDigitalOceanドロップレットの間にSSHトンネルを確立して、データの複製に使用する安全なチャネルを形成します。最初の転送は、SSH接続を介してrsyncを使用して行われます。

    データベース管理に関するSevereninesDevOpsガイドオープンソースデータベースを自動化および管理するために知っておくべきことを学ぶ無料でダウンロード

    DigitalOceanへのデータのコピー

    MySQL 5.7をDigitalOceanインスタンスで稼働させたら、EC2インスタンスのバックアップを実行してからDOに転送する必要があります。技術的には、ノード間でエクストラバックアップデータの直接ストリーミングを実行できるはずですが、実際にはお勧めできません。 WANリンクは信頼できない可能性があるため、ローカルでバックアップを取り、rsyncを使用して、問題が発生したときに転送を再試行することをお勧めします。

    まず、EC2インスタンスのバックアップを取りましょう:

    [email protected]:~# innobackupex --user=tpcc --password=tpccpass /tmp/backup

    準備ができたら、DigitalOceanネットワークに転送する必要があります。安全な方法でそれを行うために、DOドロップレット上に新しいユーザーを作成し、SSHキーを生成し、このユーザーを使用してデータをコピーします。もちろん、既存のユーザーを使用することもできます。新しいユーザーを作成する必要はありません。それでは、新しいユーザーを追加しましょう。これを行うには多くの方法があります。「adduser」コマンドを使用します。

    [email protected]:~# adduser rdscopy
    Adding user `rdscopy' ...
    Adding new group `rdscopy' (1001) ...
    Adding new user `rdscopy' (1001) with group `rdscopy' ...
    Creating home directory `/home/rdscopy' ...
    Copying files from `/etc/skel' ...
    Enter new UNIX password:
    Retype new UNIX password:
    passwd: password updated successfully
    Changing the user information for rdscopy
    Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
    Is the information correct? [Y/n] y

    次に、接続に使用するsshキーのペアを生成します。

    [email protected]:~# ssh-keygen -C 'rdscopy' -f id_rsa_rdscopy -t rsa -b 4096
    Generating public/private rsa key pair.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in id_rsa_rdscopy.
    Your public key has been saved in id_rsa_rdscopy.pub.
    The key fingerprint is:
    3a:b0:d2:80:5b:b8:60:1b:17:58:bd:8e:74:c9:56:b3 rdscopy
    The key's randomart image is:
    +--[ RSA 4096]----+
    |   ..            |
    |  o  . o         |
    | . .. + o        |
    | o ..* E         |
    |+o+.*   S        |
    |o+++ + .         |
    |o.. o o          |
    |   .   .         |
    |                 |
    +-----------------+

    SSHキーを持っているので、DigitalOceanドロップレットに設定する必要があります。 .sshディレクトリを作成し、適切なアクセス許可を持つauthorized_keysファイルを作成する必要があります。

    [email protected]:~# mkdir /home/rdscopy/.ssh
    [email protected]:~# cat id_rsa_rdscopy.pub > /home/rdscopy/.ssh/authorized_keys
    [email protected]:~# chown rdscopy.rdscopy /home/rdscopy/.ssh/authorized_keys
    [email protected]:~# chmod 600 /home/rdscopy/.ssh/authorized_keys

    次に、秘密鍵をEC2インスタンスにコピーする必要があります。準備ができたら、データをコピーできます。前に述べたように、そのためにrsyncを使用します-何らかの理由でプロセスが中断された場合に転送を再開できるようにします。 SSHと組み合わせて、WAN経由でデータをコピーする安全で堅牢な方法を作成しました。 EC2ホストでrsyncを開始しましょう:

    [email protected]:~# rsync -avz -e "ssh -i id_rsa_rdscopy -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress /tmp/backup/2017-02-20_16-34-18/ [email protected]:/home/rdscopy

    しばらくすると、データの量と転送速度によって異なりますが、バックアップデータがDigitalOceanドロップレットで利用できるようになります。これは、InnoDB REDOログを適用し、それをMySQLデータディレクトリにコピーして準備するときが来たことを意味します。そのためには、MySQLを停止し、現在のデータディレクトリを削除し、innobackupexまたは手動でファイルをコピーして戻し、最後に、新しいファイルの所有者とグループがmysqlに設定されていることを確認する必要があります。

    [email protected]:~# innobackupex --apply-log /home/rdscopy/
    [email protected]:~# service mysql stop
    [email protected]:~# rm -rf /var/lib/mysql/*
    [email protected]:~# innobackupex --copy-back /home/rdscopy/
    [email protected]:~# chown -R mysql.mysql /var/lib/mysql

    MySQLを起動する前に、server_idとUUIDの両方が異なることも確認する必要があります。前者はmy.cnfで編集でき、後者は次の方法で保証できます:

    [email protected]:~# rm /var/lib/mysql/auto.cnf

    これで、MySQLを起動できます:

    [email protected]:~# service mysql start

    レプリケーションの設定

    EC2とDOの間でレプリケーションを設定する準備ができましたが、最初にsshトンネルを設定する必要があります。EC2インスタンスでubuntuユーザー用の追加のsshキーを作成し、それをDOインスタンスにコピーします。次に、ubuntuユーザーを使用して、レプリケーションに使用するトンネルを作成します。

    新しいsshキーを作成することから始めましょう:

    [email protected]:~# ssh-keygen -C 'tunnel' -f id_rsa_tunnel -t rsa -b 4096
    Generating public/private rsa key pair.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in id_rsa_tunnel.
    Your public key has been saved in id_rsa_tunnel.pub.
    The key fingerprint is:
    c4:44:79:39:9c:c6:ce:45:bb:13:e5:6f:c5:d9:8c:14 tunnel
    The key's randomart image is:
    +--[ RSA 4096]----+
    |       .o+ +. E. |
    |       o. O .= +o|
    |        o= oo o.=|
    |       .  o  o ..|
    |        S   o   o|
    |             . . |
    |                 |
    |                 |
    |                 |
    +-----------------+

    次のステップ-公開鍵をEC2インスタンスのauthorized_keysファイルに追加する必要があります。このファイルに、DigitalOceanから接続してトンネルを作成します。

    [email protected]:~# cat id_rsa_tunnel.pub >> /home/ubuntu/.ssh/authorized_keys

    また、DOドロップレットに転送する秘密鍵も必要です。これはさまざまな方法で実行できますが、以前に作成したrdscopyユーザーとキーを使用してセキュアscpを使用します:

    [email protected]:~# scp -i id_rsa_rdscopy id_rsa_tunnel [email protected]:/home/rdscopy
    id_rsa_tunnel                                                                                                                                                                    100% 3247     3.2KB/s   00:00

    必要なのはこれだけです。これで、SSHトンネルを作成できます。いつでも利用できるようにしたいので、スクリーンセッションを使用します。

    [email protected]:~# screen -S tunnel
    [email protected]:~# ssh -L 3307:localhost:3306 [email protected] -i /home/rdscopy/id_rsa_tunnel

    ここで行ったことは、「ubuntu」ユーザーと/ home / rdscopy / id_rsa_tunnelにあるキーを使用して、ローカルホストのポート3307とリモートホストの54.224.107.6、ポート3306の間にSSHトンネルを開くことでした。画面セッションを切り離すと、リモートホストが127.0.0.1:3307経由で利用可能になります。

    レプリケーションを設定するには、EC2でMySQLに接続するために使用するnユーザーを追加する必要があります。 EC2ホストで作成し、ホストとして「127.0.0.1」を使用します。SSHトンネルを介した接続は、ローカルホストからの接続のようになります。

    mysql> CREATE USER [email protected] IDENTIFIED BY 'rds_rpl_pass';
    Query OK, 0 rows affected (0.00 sec)
    mysql> GRANT REPLICATION SLAVE ON *.* TO [email protected];
    Query OK, 0 rows affected (0.00 sec)

    これでレプリケーションをセットアップする準備が整いました。今度は、エクストラバックアップデータに基づいてスレーブを作成する従来のプロセスに従います。 xtrabackup_binlog_infoのデータを使用して、バックアップ時のマスター位置を特定する必要があります。この位置は、CHANGEMASTERTO…コ​​マンドで使用したい位置です。 xtrabackup_binlog_infoファイルの内容を見てみましょう:

    [email protected]:~# cat /home/rdscopy/xtrabackup_binlog_info
    binlog.000052    896957365

    これは、CHANGE MASTER TOで使用するバイナリログファイルと位置です:

    [email protected]:~# mysql -u root -ppass
    mysql> CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=3307, MASTER_USER='rds_rpl', MASTER_PASSWORD='rds_rpl_pass', MASTER_LOG_FILE='binlog.000052', MASTER_LOG_POS=896957365; START SLAVE;

    これで完了です。レプリケーションが稼働し、DigitalOceanスレーブがレプリケーションに追いついているはずです。追いつくと、データベース層は切り替えの準備が整います。もちろん、通常は単一のノードではありません。インフラストラクチャが本番トラフィックを処理する準備が整う前に、DOで複数のスレーブをセットアップする必要があります。

    スイッチオーバー自体は別のトピックです。ダウンタイムを最小限に抑えるための計画を立てる必要があります。一般に、トラフィックは古い場所から新しい場所に移動する必要がありますが、その方法は主に環境によって異なります。 DNSエントリの単純な変更から、トラフィックをリダイレクトするためにすべてのトリガーを正しい順序でプルする複雑なスクリプトまで、何でもかまいません。いずれにせよ、データベースはすでに新しい場所にあり、リクエストを処理する準備ができています。


    1. MariaDBで日付に年を追加する6つの方法

    2. MySQLでGroupBy句を使用して行をグループ化する

    3. MySQLでどのように機能しないか

    4. Oracleトリガー内で新しい行をXMLに変換します