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

リレーノードを使用したMySQLGaleraクラスターによるダウンタイムゼロのネットワーク移行

    Galera Clusterの自動ノードプロビジョニングにより、データの一貫性が保証されたデータベースクラスターのスケールアウトの複雑さが簡素化されます。 SSTとISTは、データベースを手動でバックアップして新しいノードにコピーする必要なしに、初期データ同期の使いやすさを向上させます。これを、さまざまなネットワーク設定(WANレプリケーションなど)を許容するGaleraの機能と組み合わせると、サービスを中断することなく、さまざまな分離されたネットワーク間でデータベースを移行できるようになります。

    このブログ投稿では、ダウンタイムなしでMySQLGaleraClusterを移行する方法を検討します。リレーノードを使用して、データベースをアマゾンウェブサービス(AWS)EC2からGoogle Cloud Platform(GCP)コンピューティングエンジンに移動します。過去に同様のブログ投稿がありましたが、これは異なるアプローチを使用していることに注意してください。

    次の図は、移行計画を簡略化したものです。

    旧サイトの準備

    セキュリティグループまたはVPCの分離により、両方のサイトが相互に通信できないため、これら2つのサイトをブリッジするためのリレーノードが必要です。このノードはどちらのサイトにも配置できますが、ポート3306(MySQL)、4444(SST)、4567(gcomm)、および4568(IST)で反対側の1つ以上のノードに接続できる必要があります。これが私たちがすでに持っているものであり、古いサイトをどのようにスケーリングするかです:

    反対側に接続できる限り、既存のGaleraノード(3番目のノードなど)をリレーノードとして使用することもできます。欠点は、1つのノードがSSTに使用され、サイト間でGaleraレプリケーションストリームを中継するため、クラスター容量が2つに減少することです。データセットのサイズとサイト間の接続によっては、現在のクラスターでデータベースの信頼性の問題が発生する可能性があります。

    したがって、4番目のノードを使用して、反対側に同期するときの現在の本番クラスターのリスクを軽減します。まず、パブリックIPアドレスを使用してAWSダッシュボードに新しいインスタンスを作成し(外部と通信できるようにします)、必要なGalera通信ポート(TCP 3306、4444、4567-4568)を許可します。

    古いサイトに4番目のノード(リレーノード)を展開します。 ClusterControlを使用している場合は、「ノードの追加」機能を使用してクラスターをスケールアウトできます(ClusterControlノードからこの4番目のホストへのパスワードなしのSSHを事前に設定することを忘れないでください):

    リレーノードが現在のクラスターと同期していて、反対側と通信できることを確認してください。

    新しいサイトから、リレーノードに接続します。これは、外界に接続できる唯一のノードであるためです。

    新しいサイトの展開

    新しいサイトでは、1つのClusterControlノードと3つのノードのGaleraClusterを使用して同様のセットアップを展開します。両方のサイトで同じMySQLバージョンを使用する必要があります。新しいサイトのアーキテクチャは次のとおりです。

    ClusterControlを使用すると、新しいクラスターの展開は数回クリックするだけで、コミュニティエディションの無料機能になります。 ClusterControl-> Deploy Database Cluster-> MySQL Galeraに移動し、デプロイメントウィザードに従います:

    「デプロイ」をクリックして、「アクティビティー」->「ジョブ」->「クラスターの作成」で進行状況を監視します。完了すると、ダッシュボードに次のように表示されます。

    この時点で、2つの別々のGaleraクラスターがあります。古いサイトに4つのノードがあり、新しいサイトに3つのノードがあります。

    両方のサイトを接続する

    新しいサイト(GCP)で、古いサイトのリレーノードと通信するノードを1つ選択します。リレーノード(galera-aws4)へのコネクタとしてgalera-gcp1を選択します。次の図は、ブリッジングプランを示しています。

    構成する重要なものは、次のパラメーターです。

    • wsrep_sst_donor wsrep_node_name ドナーノードの。 galera-gcp1で、ドナーをgalera-aws4に設定します。
    • wsrep_sst_auth :username:password形式のSSTユーザークレデンシャルは、古いサイト(AWS)に従う必要があります。
    • wsrep_sst_receive_address :ジョイナノードでSSTを受信するIPアドレス。 galera-gcp1で、これをこのノードのパブリックIPアドレスに設定します。
    • wsrep_cluster_address :ガレラ接続文字列。 galera-gcp1で、galera-aws4のパブリックIPアドレスを追加します。
    • wsrep_provider_options
      • gmcast.segment:デフォルトは0です。GCPのすべてのノードに異なる整数を設定してください。
    1. リレーノード(galera-aws4)で、wsrep_node_nameを取得します:

      $ mysql -uroot -p -e 'SELECT @@wsrep_node_name'
      Enter password:
      +-------------------+
      | @@wsrep_node_name |
      +-------------------+
      | 10.0.0.13         |
      +-------------------+
    2. galera-gcp1のmy.cnfで、 wsrep_sst_donorを設定します リレーノードのwsrep_node_nameの値 およびwsrep_sst_receive_address galera-gcp1のパブリックIPアドレスへ:

      wsrep_sst_donor=10.0.0.13
      wsrep_sst_receive_address=35.197.136.232
    3. GCPのすべてのノードで、 wsrep_sst_authを確認します 古いサイト(AWS)の値は同じで、Galeraセグメントを1に変更します(Galeraは両方のサイトが異なるネットワークにあることを認識します):

      wsrep_sst_auth=backupuser:mysecretP4ssW0rd
      wsrep_provider_options="base_port=4567; gcache.size=512M; gmcast.segment=1"
    4. galera-gcp1で、 wsrep_cluster_addressを設定します リレーノードのパブリックIPアドレスを含めるには:

      wsrep_cluster_address=gcomm://10.148.0.2,10.148.0.3,10.148.0.4,13.229.247.149

      **変更するのはwsrep_cluster_addressのみです galera-gcp1で。 galera-gcp2およびgalera-gcp3でこのパラメーターを変更しないでください。

    5. GCP上のすべてのノードを停止します。 ClusterControlを使用している場合は、[クラスターアクション]ドロップダウン->[クラスターの停止]に移動します。また、クラスターレベルとノードレベルの両方で自動回復をオフにする必要があるため、ClusterControlは障害が発生したノードを回復しようとしません。

    6. 次に、同期部分です。 galera-gcp1を起動します。ドナーノードのMySQLエラーログから、galera-gcp1(35.197.136.232)のパブリックアドレスを使用してリレーノード(10.0.0.13)間でSSTが開始されていることがわかります。

      2017-12-19T13:58:04.765238Z 0 [Note] WSREP: Initiating SST/IST transfer on DONOR side (wsrep_sst_xtrabackup-v2 --role 'donor' --address '35.197.136.232:4444/xtrabackup_sst//1' --socket '/var/lib/mysql/m
      ysql.sock' --datadir '/var/lib/mysql/' --defaults-file '/etc/my.cnf' --defaults-group-suffix ''   '' --gtid 'df23adb8-b567-11e7-8c50-a386c8cc7711:151181')
      2017-12-19T13:58:04.765468Z 5 [Note] WSREP: DONOR thread signaled with 0
              2017-12-19T13:58:15.158757Z WSREP_SST: [INFO] Streaming the backup to joiner at 35.197.136.232 4444
      2017-12-19T13:58:52.512143Z 0 [Note] WSREP: 1.0 (10.0.0.13): State transfer to 0.0 (10.148.0.2) complete.

      この時点で、galera-gcp1には次の行が殺到することに注意してください。

      2017-12-19T13:32:47.111002Z 0 [Note] WSREP: (ed66842b, 'tcp://0.0.0.0:4567') connection to peer 00000000 with addr tcp://10.0.0.118:4567 timed out, no messages seen in PT3S
      2017-12-19T13:32:48.111123Z 0 [Note] WSREP: (ed66842b, 'tcp://0.0.0.0:4567') connection to peer 00000000 with addr tcp://10.0.0.90:4567 timed out, no messages seen in PT3S
      2017-12-19T13:32:50.611462Z 0 [Note] WSREP: (ed66842b, 'tcp://0.0.0.0:4567') connection to peer 00000000 with addr tcp://10.0.0.25:4567 timed out, no messages seen in PT3S

      galera-gcp1はAWSのリレーノードを超えて残りのノードを確認しようとし続けるため、この警告は無視してかまいません。

    7. galera-gcp1のSSTが完了すると、GRANTが欠落しているため(AWSからの同期後に既存のGRANTがオーバーライドされている)、GCEのClusterControlはデータベースノードに接続できなくなります。したがって、Galera-gcp1でSSTが完了した後に実行する必要があることは次のとおりです。

      mysql> GRANT ALL PRIVILEGES ON *.* TO [email protected]'10.148.0.5' IDENTIFIED BY 'cmon' WITH GRANT OPTION;

      これが行われると、ClusterControlは以下で強調表示されているようにgalera-gcp1の状態を正しく報告します。

    8. 最後の部分は、残りのgalera-gcp2とgalera-gcp3を一度に1つのノードで開始することです。 ClusterControl->ノード->ノードを選択->ノードの開始に移動します。すべてのノードが同期されると、クラスターサイズとして7を取得する必要があります。

    これで、クラスターは両方のサイトで動作し、スケールアウトが完了しました。

    廃止措置

    移行が完了し、すべてのノードが同期されたら、アプリケーションをGCPの新しいクラスターに切り替え始めることができます:

    この時点で、MySQLデータは廃止されるまですべてのノードに複製されます。レプリケーションのパフォーマンスは、クラスター内の最も遠いノードが許す限り良好になります。リレーノードは、ライトセットを反対側にブロードキャストするため、重要です。アプリケーションの観点からは、一度に1つのサイトにのみ書き込むことをお勧めします。つまり、AWSからの読み取り/書き込みのリダイレクトを開始し、代わりにGCPクラスターからそれらを提供する必要があります。

    古いデータベースノードを廃止してGCPのクラスターに移動するには、AWSでグレースフルシャットダウン(一度に1ノード)を実行する必要があります。 AWSサイトはこのクラスターのノードの大部分(4/7)を保持しているため、ノードを適切にシャットダウンすることが重要です。それらを一度にシャットダウンすると、GCP上のクラスターが非プライマリ状態になり、クラスターが操作を拒否するようになります。 AWS側でシャットダウンする最後のノードがリレーノードであることを確認してください。

    それに応じて、galera-gcp1の次のパラメータを更新することを忘れないでください。

    • wsrep_cluster_address -リレーノードのパブリックIPアドレスを削除します。
    • wsrep_sst_donor -この行にコメントします。ガレラにドナーを自動選択させます。
    • wsrep_sst_receive_address -この行にコメントします。 Galeraに受信インターフェースを自動選択させます。

    これで、Galera Clusterは完全に新しいプラットフォーム、ホスト、およびネットワークで実行され、移行中にデータベースサービスに1秒のダウンタイムが発生することはありません。なんてクールなの?


    1. SQL Server Windowsモードから混合モード(SQL Server 2008)に変更するにはどうすればよいですか?

    2. PDOを使用した接続タイムアウトの設定

    3. PostgreSQLでのデータウェアハウスの実行

    4. androidのSqliteからのListView