web-dev-qa-db-ja.com

MySQL ClusterでのAWSネットワークロードバランサーの使用

私は stackoverflow についてこの質問をしましたが、このコミュニティにはもっと適しているかもしれませんが。

MySQLクラスター(Galeraクラスター)に接続するWebサーバーがあります...クラスターは正常に動作します(MySQLの最初のインスタンスでレコードを更新すると、2番目のインスタンスで自動的に更新されます)。問題は、WebサーバーとMySQLインスタンスの間にロードバランサーが必要なことです...

だから私はAWSネットワークロードバランサーをセットアップすることです(私の場合、NLBはネットワークレイヤー、TCPで動作します)... MySQLの2つのインスタンスをNLBのターゲットグループ(プライベートIP)に追加しました。

enter image description here

次に、NLBに接続するためにWebサーバーの接続文字列を更新します。

<add name="MyDB" connectionString="Server=my-nlb-ap-southeast-2.amazonaws.com; Port=3306; Database=mydb; Uid=user1; Pwd=mypassword; Protocol=TCP" providerName="MySql.Data.MySqlClient"/>

しかし、私は次のエラーを受け取ります:

[MySqlException(0x80004005):指定されたMySQLホストのいずれにも接続できません。] MySql.Data.MySqlClient.NativeDriver.Open()+1734 MySql.Data.MySqlClient.Driver.Open()+60 MySql.Data.MySqlClient。 Driver.Create(MySqlConnectionStringBuilder設定)+309 MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()+18 MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()+290 MySql.Data.MySqlClient.MySqlPl.l.qlPr.l.r.qlPr.llr Data.MySqlClient.MySqlPool.GetConnection()+60 MySql.Data.MySqlClient.MySqlConnection.Open()+1588 MySql.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken(DbConnection connection)+182 System.Data.EmonsityProvider.Core .GetProviderManifestToken(DbConnection接続)

WebサーバーからMySQLに接続しようとすると、次のようになります。

enter image description here

enter image description here

これは、WebサーバーがNLBを介してMySQLインスタンスに到達できることを意味すると思いますが、接続文字列が機能していない理由がわかりません。

すべてのIPに対してポート3306を開いたので、VPCにないローカルコンピューターからNLBに接続できます。

enter image description here

しかし、ウェブサーバーはまだ同じエラーを受けています...


HAProxyの代わりにAWS NLBを使用することを決めた理由は、NLBの可用性が高いためです... HAProxyを使用する場合、HAProxyとしてVPCに2台のサーバーを追加する必要があります(高可用性のため) ... NLBの場合、1つの高可用性ロードバランサーだけを使用できますが、この目的でAWS NLBを使用できるかどうかはわかりません。

1
Hooman Bahreini

接続文字列が機能しないのは興味深いことです。 mysqlクライアントをウェブサーバーから実行して、接続して認証できることを確認できますか?

C:\> mysql -hmy-nlb-ap-southeast-2.amazonaws.com -uuser1 -pmypassword

また、NLBが本当に必要ですか?負荷分散にDNSを使用するのはどうですか? mydb.example.comのようなレコードを作成し、dbクラスターノードごとに1つずつ、2つのアドレスを指定します。

mydb.example.com. IN A 10.20.30.40  ; db node 1
                  IN A 10.20.40.50    ; db node 2

複数の値を持つDNSレコードはround-robinの順序で返されます。つまり、一部のクライアントはnode 1 IPを最初に取得し、他のクライアントはnode 2を取得します=最初。また、プライマリノードに障害が発生した場合でも、フェイルオーバー先のIPが残っています。

NLBに時間と費用をかける前に、まずこのDNSアプローチを試してみます。

それが役に立てば幸い:)

1
MLu