AWS EC2 MySQL レプリケーション: マスターからスレーブにクエリを実行するための設定

AWS EC2 MySQL レプリケーション: マスターからスレーブにクエリを実行するための設定

別々の AWS EC2 インスタンスで MySQL マスター/スレーブ環境を正常にセットアップしました。スレーブは実行されており、マスターを正常に複製しています。

ここまでは順調ですね。

今、スレーブにクエリを実行できるようにしたいのですが (分析などのために)、マスターからスレーブにクエリを送信できるようにするための適切な構成が見つかりません。

表示されるエラーは(AWS セキュリティプロファイルの設定によって異なりますが)「接続拒否」または「接続タイムアウト」のいずれかです。

スレーブでは、ポート 3306 への接続に使用するマスター IP ブロックの EC2 セキュリティ グループ許可があり、マスターの接続構成でスレーブの IP アドレスを使用しました。

その結果、マスターからスレーブにクエリを実行しようとしたときに、「接続拒否」エラーが発生しました。

マスターで「show full processlist」を実行し、スレーブ ホストが IP ではなく AWS EC2 ホスト名であり、ポート 44508 が末尾に追加されていることがわかったので、マスターの接続情報を IP アドレスではなくスレーブ ホスト名を使用するように変更し、スレーブのセキュリティ グループ設定を変更して、マスターからのトラフィックをポート 3306 ではなくポート 44508 で許可するようにしました。

その結果、「接続がタイムアウトしました」というエラーが発生しました。

スレーブのセキュリティ グループで IP/ホスト名/ポートの組み合わせを試しましたが、どの組み合わせでも 2 つのエラーのいずれかが発生します。

マスター マシンからスレーブに対して (読み取り専用) クエリを実行し、その結果をマスターに返すことができるように設定するためのヒントを誰か提供できますか? TIA。

両方のシステムは同じように設定されていますが、マスターでは Codeigniter4 も実行されており、ここで接続構成を設定しています。

Ubuntu 20.04.3 LTS と MySQL 8.0.26-0

答え1

このような設定では、クライアント (アプリ、ソフトウェア) はスレーブに接続し、SELECT クエリのみを実行する必要があります (書き込みクエリを実行する必要がある場合は、マスターでのみ実行する必要があります)。

確認すべき点:

  1. MySQL サーバーがスレーブ サーバーでネットワークをリッスンする場合。
  2. セキュリティ グループがアプリによるスレーブ サーバーへの接続を許可している場合。
  3. 問題を防ぐために、スレーブは読み取り専用として構成する必要があります。

答え2

解決済み: スレーブの /etc/mysql/mysql.conf.d/mysqld.cnf で、「bind-address」行と「my​​sqlx-bind-address」行をコメント アウトし、スレーブを停止し、mysqld を再起動してスレーブを起動する必要がありました。

「bind-address = 127.0.0.1」とすると、他の場所からの接続が阻止されます。これをコメントアウトすると、localhost だけでなくすべてのソースからのアクセスが許可されます。EC2 セキュリティ グループは、ポート 3306 へのアクセスをマスター サーバーのみに制限します。

今のところ、全体的に順調に動作しています。改めて、ご清聴ありがとうございました。

関連情報