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

MySQLでソース-レプリカレプリケーションを構成する方法

    MySQL は、最も人気のあるオープンソースプロジェクトの1つであるリレーショナルデータベース管理システムです。安定性で知られていますが、ソースとレプリカのレプリケーションが構成されている場合、MySQLはさらに信頼性が高くなります。レプリケーションでは、通常、1台のMySQLサーバーがソースとして指定されます。 。ソースは、データベースの変更とデータの更新を1つ以上のレプリカに送信します。 データベースサーバー。 MySQLのデータ複製手順は柔軟であり、レプリカサーバーをソースに永続的に接続する必要はありません。このガイドでは、MySQLでソース-レプリカデータレプリケーションを構成する方法について説明します。

    MySQLデータレプリケーションのしくみ

    レプリケーションプロセスは、最初にソースデータベースにデータを保存してから、それを任意のレプリカにコピーします。命令を処理した後、ソースデータベースサーバーはバイナリログで変更を追跡します。ログは、データベースの構造と内容に対するすべての変更の順​​次レコードとして機能します。 SELECT ステートメントはデータベースの内容を変更しないため、記録されません。

    更新は非同期で行われるため、レプリカを継続的に接続する必要はありません。これは、信頼性の高いシステムの同期アーキテクチャとは対照的です。リアルタイム同期が必要な場合、MySQLはNDBクラスターを使用することをお勧めします 。

    各レプリカは、ソースのバイナリログの内容を要求することにより、ソースからデータをプルします。次に、レプリカはステートメントを順番に適用し、ソースで発生したイベントを効果的に再生します。各レプリカは独立しており、ソースバイナリログで現在の位置を追跡します。さらに、各レプリカは、独自のスケジュールに従ってソースと同期できます。データは、レプリカを含む任意のサーバーから読み取ることができます。

    MySQLでは、高度な粒度が可能です。特定のデータベースまたはデータベース内の特定のテーブルに複製することが可能です。デフォルトのレプリケーション形式はステートメントベースのレプリケーションです。 (SBR)、SQLステートメント全体が複製されます。ただし、行ベースのレプリケーション (RBR)もご利用いただけます。この形式は、変更された行を複製します。より複雑な多対多の構成を構成することも可能です。さまざまなレプリケーションオプションの詳細については、MySQLのドキュメントを参照してください。

    注 MySQLは、以前はソースレプリカレプリケーションを「マスタースレーブレプリケーション」と呼んでいました。 MySQL組織は最近用語を変更し、用語の更新でその理由を説明しました。以前の用語「マスター」は「ソース」に変更されましたが、「スレーブ」は現在「レプリカ」と呼ばれています。 MySQLがコードベースを更新している間、古い用語が特定のコマンドと出力表示に引き続き表示される場合があります。このガイドでは、手順全体でMySQLの推奨用語を使用しています。

    MySQLデータレプリケーションの利点

    ソースとレプリカのレプリケーションを有効にすると、非冗長システムに比べて多くの重要な利点があります。以下のリストは、いくつかの利点の概要を示しています。

    • ライブバックアップコピーはいつでも簡単に作成できます。レプリケーションプロセスは非同期であるため、レプリケーションは任意のスケジュールに従って実行できます。確実に機能するために、レプリカをソースと同期させる必要はありません。

    • レプリカを追加すると、システム全体の稼働時間と信頼性を向上させることができます。メンテナンスが必要な場合、またはソースデータベースが利用できない場合は、プライマリコントロールをレプリカに切り替えることができます。

    • 各レプリカは、データベースの別の読み取り可能なインスタンスを提供します。これにより、データマイニングまたは分析プログラムは、元のソースデータベースに追加の負荷をかけることなく、レプリカをクエリできます。

    • このアーキテクチャにより、スケーラビリティとパフォーマンスが向上します。データベースの読み取りとSELECT ステートメントはサーバー間でバランスを取ることができ、レイテンシーを削減します。

    • サードパーティは、レプリカを介してデータベースへの読み取り専用アクセスを取得でき、ソースへのアクセスを必要としなくなります。レプリカデータベースは、必要なときにオンデマンドで作成し、不要になったときに破棄することができます。この手法によりセキュリティが強化され、元のデータが改ざんされないようになります。

    始める前に

    1. まだ行っていない場合は、Linodeアカウントとコンピュートインスタンスを作成します。 Linode入門とコンピューティングインスタンスの作成ガイドをご覧ください。

    2. コンピューティングインスタンスのセットアップと保護ガイドに従って、システムを更新してください。また、タイムゾーンを設定し、ホスト名を構成し、制限付きユーザーアカウントを作成し、SSHアクセスを強化することもできます。

    3. MySQLソースレプリカレプリケーションを構成するには、少なくとも2つの個別のLinodeが必要です。 1つのLinodeがソースデータベースをホストし、別のノードがレプリカサーバーに必要です。

    注 このガイドの手順は、root以外のユーザーを対象としています。昇格された特権を必要とするコマンドには、接頭辞としてsudoが付けられます 。 sudoに慣れていない場合 コマンドについては、Linuxユーザーおよびグループガイドを参照してください。

    MySQLでソース-レプリカレプリケーションを構成する

    ソースとレプリカのレプリケーションを構成するには、MySQLを相互に通信できる2つの別々のサーバーにインストールする必要があります。これらの手順はUbuntuディストリビューションを対象としていますが、一般的にすべてのLinuxディストリビューションに適用できます。このプロセスは、次の手順で構成されています。

    1. MySQLをインストールします。
    2. MySQLソースデータベースを構成します。
    3. レプリカの新しいMySQLユーザーを構成します。
    4. MySQLデータをレプリケーション用に準備します。
    5. MySQLレプリカデータベースを構成します。
    6. 複製されたMySQLデータをインポートし、複製をアクティブ化します。

    MySQLのインストール

    MySQLが両方のLinodeでまだ利用できない場合は、次の手順を使用してインストールします。

    1. Linodeをアップグレードします。

       sudo apt-get update && sudo apt-get upgrade
      
    2. MySQLサーバーとクライアントアプリケーションをソースサーバーとレプリカサーバーの両方にインストールします。

       sudo apt-get install mysql-server mysql-client -y
      
    3. mysql_secure_installationを使用して、ルートパスワードを含むセキュリティオプションを構成します コマンド。

       sudo mysql_secure_installation
      
    4. ufwなどのファイアウォールを使用している場合 、MySQLトラフィックが通過できることを確認してください。次のルールを追加して、ポート3306を開きます ファイアウォール上。

       ufw allow mysql
      

    MySQLソースデータベースを構成する

    MySQLレプリケーションを有効にするには、メインのMySQL構成ファイルでいくつかの変数を編集します。ソースデータベースの構成に次の変更を加えます。

    1. ソースデータベースサーバーでメインのMySQL構成ファイルを見つけます。このファイルは通常、/etc/mysql/mysql.conf.d/mysqld.cnfにあります。 。ただし、以前のインストールでは、/etc/my.cnfにある可能性があります または/etc/mysql/my.cnfincludedirを介してファイルの1つから参照することもできます。 ディレクティブ。

    2. MySQL構成ファイルを開き、bind-addressを変更します ソースサーバーのIPアドレスに送信します。

      ファイル:/ etc / mysql / mysql.conf.d / mysqld.cnf
      1
      2
      
      bind-address  = <source_ip_address>
          
    3. server-idの行のコメントを外すか追加します およびlog-binserver-idを設定します 1へ 、およびlog-bin /var/log/mysql/mysql-bin.logへ 。

      skip_networkingを確認してください 変数はどこにも宣言されていません。このファイル内に表示されている場合はコメントアウトしてください。単一のデータベースを複製するには、binlog_do_db = <database_name>という行を追加します ファイルに。
      ファイル:/ etc / mysql / mysql.conf.d / mysqld.cnf
      1
      2
      3
      
      server-id  = 1
      log_bin  = /var/log/mysql/mysql-bin.log
          
    4. MySQLサービスを再起動します。

       sudo systemctl restart mysql
      
    5. MySQLのステータスを確認し、activeであることを確認します 。

       sudo systemctl status mysql
      
      mysql.service - MySQL Community Server
      Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
      Active: active (running) since Sun 2021-05-30 13:06:47 UTC; 1 day 1h ago

    レプリカの新しいMySQLユーザーを構成する

    レプリカを表すために、ソースサーバー上に新しいユーザーを作成する必要があります。新しいユーザーはMySQLシェル内に作成されます。

    1. MySQLシェルに入ります。

       sudo mysql -u root -p
      
    2. MySQL CREATE USERを使用してレプリカアカウントのユーザーを追加します 構文。ユーザー名は、レプリカアカウントの名前、@で構成されている必要があります シンボル、およびレプリカサーバーのIPアドレス。 REPLICA_PASSWORDの代わりに、アカウントのより安全なパスワードを選択してください 。

       CREATE USER 'replica_account_name'@'replica_ip_address‘ IDENTIFIED WITH sha256_password BY 'REPLICA_PASSWORD';
      
      注 レプリカが任意のアドレスから接続できるようにするには、ユーザーを'replica_account_name'@'%'として指定します。 。 % 記号は、任意のアドレスまたはドメインを表します。これにより、セキュリティがいくらか犠牲になり、柔軟性が向上します。
    3. リモートレプリカユーザーにレプリケーション権限を付与します。

       GRANT REPLICATION SLAVE ON *.* TO 'replica_account_name'@'replica_ip_address';
      

    レプリケーション用にMySQLデータを準備する

    この時点で、レプリケーション用のデータをステージングするために、ソースデータベースをフラッシュしてロックする必要があります。

    1. MySQLシェル内にとどまり、データベースを再起動せずに付与テーブルを再ロードするための特権をフラッシュします。

       FLUSH PRIVILEGES;
      
    2. データベースをロックして、データのエクスポート元となる安定したポイントでデータベースをフリーズします。データベースをエクスポートするまで、MySQLクライアントを実行し続けます。書き込みコマンドを入力するか、MySQLシェルを終了すると、ロックが解除されます。

       FLUSH TABLES WITH READ LOCK;
      
      注意 このコマンドは、ソースデータベースへのすべてのコミットをブロックします。ソースがそれ以上のコミットを処理できるようにする前に、データをエクスポートします。そうしないと、レプリカデータベースが破損したり、ソースデータベースとの整合性が失われたりする可能性があります。このセクションの残りの2つの手順をできるだけ早く完了してください。
    3. 次のコマンドを使用して、データベースのステータスを確認します。このコマンドは、現在のログファイルとこのファイルの最後のレコードの位置を表示します。後でレプリカでレプリケーションを開始する必要があるため、この情報を記録してください。

       SHOW MASTER STATUS;
      
      +------------------+----------+--------------+------------------+-------------------+
      | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
      +------------------+----------+--------------+------------------+-------------------+
      | mysql-bin.000002 |     1301 |              |                  |                   |
      +------------------+----------+--------------+------------------+-------------------+
      1 row in set (0.00 sec)
    4. 別のコンソールからLinuxシェルを使用し、mysqldumpを使用してデータベースをエクスポートします 道具。宛先ファイルの覚えやすい名前を選択します。 –master-dataを含めます ログファイルと現在のレコードの位置に関する情報をログに追加するオプション。

       sudo mysqldump -u root -p -–all-databases -–master-data > databasecopy.sql
      
      注 単一のデータベースをエクスポートするには、--opt <database_name>を含めます -–all-databasesではなくオプション 。
    5. 元のMySQLシェルに戻り、ソースデータベースのロックを解除します。

       UNLOCK TABLES;
      
    6. MySQLシェルを終了します。

       QUIT;
      
    7. ftpを使用して、エクスポートされたデータベースファイルをレプリカデータベースサーバーにコピーします 、scp 、またはファイルを転送する別の方法。

       scp databasecopy.sql [email protected]<replica_ip_address>
      

    MySQLレプリカデータベースを構成する

    レプリカデータベースの構成には、次の構成を適用する必要があります。 MySQLをレプリカサーバーにインストールするには、「MySQLのインストール」セクションを参照してください。

    1. 通常は/etc/mysql/mysql.conf.d/mysqld.cnfにあるメインのMySQLファイルを開きます。 、bind-addressを変更します レプリカサーバーのIPアドレスと一致させます。

      ファイル:/ etc / mysql / mysql.conf.d / mysqld.cnf
      1
      2
      
      bind-address  = xx.xx.xx.xx
          
    2. server-idの行のコメントを外すか追加します およびlog-binserver-id 2に設定する必要があります レプリカでは、log-bin 変数は/var/log/mysql/mysql-bin.logに設定する必要があります 。 relay-logの変数を追加します /var/log/mysql/mysql-relay-bin.logに設定します 。

      skip_networkingを確認してください 変数はこのファイル内のどこにも設定されていません。単一のデータベースを複製するには、次のディレクティブをファイルbinlog_do_db = database_nameに追加します。 。複数のレプリカを構成するには、server-idに番号を付けます 値は順番に増加します。たとえば、2番目のレプリカにはserver-idがあります 3の 。
      ファイル:/ etc / mysql / mysql.conf.d / mysqld.cnf
      1
      2
      3
      4
      
      server-id        = 2
      log_bin    = /var/log/mysql/mysql-bin.log
      relay-log        = /var/log/mysql/mysql-relay-bin.log
          
    3. MySQLサービスを再起動して、変更を組み込みます。

       sudo systemctl restart mysql
      
    4. MySQLのステータスを確認し、activeであることを確認します 。

       sudo systemctl status mysql
      
      mysql.service - MySQL Community Server
           Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:>
           Active: active (running) since Mon 2021-05-31 16:29:48 UTC; 6s ago
    5. オプション )MySQLは、セキュリティを強化するためにSSLを使用してソースに接続することをお勧めします。 SSLの構成の詳細については、MySQLSSLドキュメントを参照してください。 RSAセットアップツール このプロセスを促進するために使用できます。

    複製されたMySQLデータをインポートし、複製をアクティブ化する

    次のステップは、データベースデータのコピーをインポートし、レプリケーションソースを設定して、レプリカデータベースサーバーを再起動することです。これで、レプリカが同期され、使用できるようになります。

    1. Linuxシェルから次のコマンドを入力して、ソースデータベースをインポートします。以前にデータをエクスポートするために使用したデータベース名を指定します。

       sudo mysql -u root -p < databasecopy.sql
      
    2. MySQLシェルにログインします。

       sudo mysql -u root -p
      
    3. レプリカを停止します。

       STOP REPLICA;
      
    4. CHANGE REPLICATION SOURCEを入力します コマンド、および次の詳細。 source_ip_addressの代わりにソースデータベースサーバーのIPアドレスを使用してください 。 SOURCE_USERの場合 およびSOURCE_PASSWORD 、[レプリカの新しいMySQLユーザーの構成]セクションからレプリカのユーザー名とパスワードの詳細を入力します。 SOURCE_LOG_FILEの場合 およびSOURCE_LOG_POS 値には、SHOW MASTER STATUS;から記録した情報を入力します コマンド。

       CHANGE REPLICATION SOURCE TO SOURCE_HOST='source_ip_address',SOURCE_USER='replica_account_name', SOURCE_PASSWORD='REPLICA_PASSWORD', SOURCE_LOG_FILE='log_file_name', SOURCE_LOG_POS=log_position;
      
      注 MySQLが推奨する接続にSSLを使用するには、属性SOURCE_SSL=1を追加します。 コマンドに。ソースレプリカレプリケーションコンテキストでのSSLの使用の詳細については、MySQLのドキュメントを参照してください。
    5. レプリカを再起動します。

       START REPLICA;
      
    6. レプリカのステータスを確認します。レプリカはイベントを待機している必要があり、Last_IO_Errorがあってはなりません。 またはLast_Error イベント。 Slave_SQL_Running_State エントリには、レプリカがリレーログを読み取ったことが示されている必要があります。

       SHOW REPLICA STATUS\G
      
      Slave_IO_State: Waiting for master to send event
                        Master_Host: 178.79.153.39
                        Master_User: replica
                        Master_Port: 3306
                      Connect_Retry: 60
                    Master_Log_File: mysql-bin.000006
                Read_Master_Log_Pos: 156
                     Relay_Log_File: mysql-relay-bin.000006
                      Relay_Log_Pos: 371
              Relay_Master_Log_File: mysql-bin.000006
                   Slave_IO_Running: Yes
                  Slave_SQL_Running: Yes
      ..
                         Last_Errno: 0
                         Last_Error:
      ..
              Seconds_Behind_Master: 0
      Master_SSL_Verify_Server_Cert: No
                      Last_IO_Errno: 0
                      Last_IO_Error:
                     Last_SQL_Errno: 0
                     Last_SQL_Error:
        Replicate_Ignore_Server_Ids:
                   Master_Server_Id: 1
                        Master_UUID: 5bed9d10-c140-11eb-bc63-f23c92a2a6ac
                   Master_Info_File: mysql.slave_master_info
                          SQL_Delay: 0
                SQL_Remaining_Delay: NULL
            Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates

    MySQLSource-Replicaレプリケーションをテストする

    レプリカがインスタンス化される前にソースデータベースにすでにデータが入力されている場合は、追加のテストが必要です。この場合、データのインポート後に、ソースに存在するデータベースとテーブルがレプリカに存在することを確認してください。 SHOW REPLICA STATUSで 表示、Slave_SQL_Running_State エントリはSlave has read all relay logと読む必要があります 。

    レプリケーションが正しく行われていることを確認するには、ソースに新しいデータベースまたはテーブルを作成します。数秒後、新しいエントリがレプリカに表示されます。 SHOW DATABASES;を使用して、データベースの存在を検証します 指図。テーブルの存在を確認するには、USE databasename;を使用してデータベースに切り替えます。 、SHOW TABLES;と入力します 。 SHOW REPLICA STATUSを実行することもお勧めします コマンドを実行し、エラーがないか出力を精査します。 Last_Error およびLast_IO_Error フィールドは空で、レプリカは接続されたままである必要があります。

    MySQLソース-レプリカレプリケーションの詳細

    ソースとレプリカのレプリケーションに関する情報の最良のソースは、MySQLの公式ドキュメントです。レプリケーションに関するセクションには、アーキテクチャとインストールプロセスに関するより広範な情報が含まれています。 MySQLフォーラムも役立つかもしれません。

    詳細情報

    このトピックの詳細については、次のリソースを参照してください。これらは有用であることを期待して提供されていますが、外部でホストされている資料の正確性や適時性を保証することはできません。

    • MySQLドキュメント

    1. Oracleでキャッシュされたすべてのアイテムをクリアする方法

    2. データベースへのすべての接続を強制終了するスクリプト(RESTRICTED_USER ROLLBACK以上)

    3. MySQLで配列変数をシミュレートするにはどうすればよいですか?

    4. Sysbenchを使用してPostgreSQLのパフォーマンスをベンチマークする方法