ロードバランサーなしの負荷分散MySQLクラスター


10

私は、負荷分散されたMySQLクラスターを作成しようとしていますが、実際の負荷分散装置を使用せずに、障害や複雑さの別のポイントを追加しません。

私が考えていたのは、次のことです。

  1. MySQLのマスターマスターセットアップがある

  2. すべてのクライアントに、サーバー間で要求をローテーションする単純なラウンドロビンプロキシを配置します。

これは可能ですか?またはこれを達成するためのより良い方法はありますか?

mysql 

何に使うの?

ロードバランサーなどを使用せずに、ソリューションにHAを追加しようとしています。

回答:


3

MySQLプロキシを実際に使用する前に、この質問に対する他の回答を読んでください。CMSが書き込みを行う2つのマスターマスターサーバーがあり、CMSから読み取るだけの10のhttpdがある場合は問題ありませんが、(他の回答で指摘されているように)常にそうとは限りません。あなたは警告されました。

MySQL Proxyは、クライアントとMySQLサーバーの間にあり、それらの通信を監視、分析、または変換できる単純なプログラムです。その柔軟性により、無制限に使用できます。一般的なものには次のものがあります。フェイルオーバー。クエリ分析; クエリのフィルタリングと変更; などなど。

HAProxyは無料で、非常に高速で信頼性の高いソリューションであり、TCPおよびHTTPベースのアプリケーションに高可用性、負荷分散、プロキシを提供します

TCPモードで実行する場合は、Wackamoleよりも優れている可能性があります。どちらかを選択する必要がある場合は、HAProxyを使用します。また、HAProxyは多くのバックエンドを持つことができ、Waclamoleは2つしか持てません。HAProxyは「ダム」であることに注意してください。これは、ストリームの内部を見ることなくソケットを接続します。 。


確認するだけです:1)HAProxyには追加のマシンが必要です/ HA用に2つのマシン2)Wackamoleはセットアップごとに2つのサーバーしかサポートできませんか?よろしく。

Wackamoleの標準的な使用パターン(実際、私が知っている唯一のパターン)は、serverAとserverBがお互いを監視し、障害が発生した場合に他のIPを取得することです。WackamoleのWebサイトは、IPのプールを保護するために使用できると述べています...しかし、Wackamoleは意図したとおりの安定性を提供しないので、私はそれについてコメントしません。HAProxyについては、2つを冗長性のために2つの専用マシンに配置するか、質問で述べたように、各ノードに1つずつ配置することもできます。あなたのクエリがほとんど読んでいるなら、私はそれがかなりうまくいくと思います。

こんにちはリーフ。Wackamoleについての最後の少し-あなたの経験から、それは2台のマシンで十分に安定していないのですか

2台のマシンは互いにpingを実行しますが、そのうちの1台は負荷が200で、すべてのCPUが100%使用され、すべてのRAMが使用されています。MySQLがクラッシュしました。<-wackamoleはそこで機能しません。HAProxyは、リモートAPPLICATIONが起動しているかどうかを確認できます。Wackamoleは、サーバーが起動していて、application_uptime <server_uptimeの場合にのみ確認できます。私たちはワカモレに頼った多くのケースがあり、それは私たちを失望させました。

4

おそらく言及する価値があります。真のマルチマスターMySQLセットアップ用のGalera Replication for MySQLです。Galeraは同期レプリケーションプロトコルであるため、アプリケーションは任意のMySQLサーバーに対して読み取りおよび書き込みを行うことができます。ここに簡単なチュートリアルがあります:http : //www.severalnines.com/clustercontrol-mysql-galera-tutorial

MySQLサーバーの前にあるロードバランサーについては、この機能をサポートするMySQLコネクターを使用します(Javaの場合はConnector / J、phpの場合はMysqlnd)。

これを実行できるコネクタがない場合は、HAプロキシなどを使用します。このスクリプトは、HAプロキシを自動的にセットアップし、適切なMySQLサーバーのリストを維持します。https//github.com/severalnines/haproxy

宜しくお願いします、

ビナイ

www.severalnines.com


推奨する製品との関係を非常に明確に開示することが重要です。また、このサイトは自己宣伝用ではありません。あなたが投稿された問題を解決する製品を持っているなら、素晴らしい!すべての回答が製品に関係している場合は、回答を投稿するのではなく、広告スペースを取得することについて誰かと話したいと思うかもしれません。よくある質問をご覧ください。
JNK 2012年

3

マスターマスターレプリケーションは、思ったほど良くありません。ラウンドロビンプロキシや同様の「簡単な」ソリューションについても同様です。衝突するデータを別々のサーバーに十分な速度でコミットすると(サーバー間の遅延よりも速く、実動サーバーでは最大1秒になる可能性があります*)、両方がデータを受け入れます。オークションサーバーを所有している場合、同じ車を2回販売しただけです。誰が買ったの?どのDBを使用するかによって異なります。

アプリケーションは、実際には2つのデータベースがあり、両方のIPアドレスを知っている必要があることを認識する必要があります。「売りたい」なら、

DB_number = `auction_number` % `number_of_databases`

%modulo

...そして、それをDB_numberデータベースにコミットします。接続エラーが発生した場合は、おそらく他のエラーを使用してください(ただし、オークションサーバーの場合は、エラーを表示します)。

また、IPアドレスは両方のサーバー間でwackamole -dにする必要があります。1つのデータベースサーバーがピークの使用時間で数時間ダウンするという災害シナリオでは、アプリケーションが不在のサーバーに接続しようとし、タイムアウト(たとえば3秒)までハングすることがわかります。突然、クエリの半分が3秒長く実行されます(最終的にはすべて同じデータベースに移動するため、災害前よりも高速に実行されません)。おそらく同時リクエストハンドラスレッドの接続プールが限られているため、これはあなたのhttpdを幸せにしません...

* 本番サーバーでのレプリケーションの遅延は最大 1 秒になる可能性があります -私はこれをリモートコロケーションとデータセンターでテストしましたが、99%の時間はゼロですが、mysqlが1を示す場合があります。大規模なトラフィックでは、クライアントアプリケーションが2つのリクエストを作成し、結果として挿入と選択の2つのクエリが発生するため、多くの衝突が発生しました。一部のケースでは、行がまだ存在しなかったため、userIDのハッシュを使用して問題を修正しました

私の過ちから学んでほしいと思います;-)


こんにちは。共有いただきありがとうございます。私は実際にHAに良いワカモレについて考えました。私のアクティブ/アクティブを探している間、すべての負荷がマスターサーバーの1つにあり、2番目のサーバーがアイドル状態になると、基本的にアクティブ/パッシブが作成されるという問題があります。おそらく、サーバー間でリクエストを切り替えることができるように、各クライアントに軽量のLBソリューションを配置する方が良いでしょうか?そのようなツールが存在するかどうか何か考えはありますか?

冗長性が必要な場合は、「1つは動作し、1つはアイドル」が適切です。2つのサーバーの1つが停止したとしましょう(最初のサーバーが故障しても機能する可能性があるため、他のサーバーを購入したことを思い出します)。2番目のサーバーがすべてのトラフィックを処理できない場合、それはHA用ではなくスケール用です。また、Wackamoleのみに依存することは悪い解決策です(ping ok!= mysqld ok)。

3

負荷分散されたMySQL(またはその他の)データベースクラスターはかなり無駄です。複数のサーバーに書き込んでいる場合、問題が発生するか、同期レプリケーション(MySQLはいずれにしてもサポートしていません)を使用します。これにより、ロックを同期する必要があるため、パフォーマンスが著しく低下します。

読み取り/書き込みの負荷を分割し、mysqlスレーブ間で読み取りの負荷を分散し、書き込み用に単一のマスターを使用するか、マスターにアクティブ/パッシブフェイルオーバーペアを使用することをお勧めします。

基本的に、それぞれがアプリケーションの書き込み負荷全体を書き込む必要があるため、より多くのサーバーをスレーブとしてデータベースに配置して書き込みをスケーリングすることはできません。

書き込みをスケーリングするには、パーティション化または「シャーディング」などにより、データを複数のサーバーに論理的に分割する必要があります。これには通常、アプリケーションに重要な(テストするのは非常に難しいと思われる)変更が必要なので、本当にそうしない限り、これを実行したくないでしょう。それが必要。


もちろん、必要に応じてMySQLクラスタを使用することもできますが、それは独自の機能と欠点を備えた完全に異なるエンジンです-セットアップは少し複雑ですが、実際に市販のハードウェアでHA負荷分散データベースを提供します。同期レプリケーションを使用すると書き込みパフォーマンスのペナルティが発生しますが、サーバー間のパーティション分割が組み込まれているため、書き込みをスケーリングできます。


3

私が見つけたこの主題に関する別の素晴らしいガイド...

http://www.dancryer.com/2010/01/mysql-circular-replication

これは、3つの投稿シリーズのパート1です。

  • MySQL負荷分散クラスタガイド–パート1-サーバー自体のセットアップとMySQLレプリケーションの構成。

  • MySQL負荷分散クラスターガイド–パート2-次のガイドでプロキシを設定するために使用するMySQLクラスターノードのステータスを監視するスクリプトを設定します。

  • MySQL負荷分散クラスターガイド–パート3-監視スクリプトを使用して、HAProxyでロードバランサーを設定する


2

個人的には、ロードバランサーを使用する方が良いでしょう。

はい、それは別の障害点を追加しますが、配置したルーチン、またはすべてのクライアントにインストールしたルーチンは、標準のロードバランサーよりもはるかに複雑になります。


理にかなっていますが、問題は単一の障害ポイントです。2つのLBがある場合でも...クライアントの1つがダウンした場合、影響を受けるのは1つだけで、他には影響しません。

すべてのノードでLBを維持することは困難です。12台のサーバーにLBをインストールし、その後何かを変更したい場合(いずれかのDBのアドレス、またはDBか何かを追加)-問題に気づくでしょう。やった。

1

Connector / Jには、複数のサーバー間でクエリを負荷分散する機能があります。これは主に、すべてのSQLノードがデータの一貫したビューを持つMySQL NDBクラスターを対象としていますが、2つのマスターデータベースがこれらの2つのマスター間で合理的に一貫していることを確認できれば、アプリケーションにとって安全かもしれません。

接続文字列は次のようになります。

jdbc:mysql:loadbalance:// host-1、host-2、... host-n / dbname?loadBalanceStrategy = "random"&loadBalanceBlacklistTimeout = 5000


0

書き込みをレプリケートする必要があるため、書き込みを分割してもサーバーの負荷はかかりません。

2つのサーバーのみを使用している場合、drbdでハートビートを使用し、drbdにレプリケーションを処理させます。最初のサーバーに障害が発生すると、2番目のサーバーが引き継ぎます。2番目のサーバーを使用する場合は、gfsをdrbdで使用して、2番目のサーバーを読み取り専用として実行し、読み取りサーバーとして使用できます。フェイルオーバーが発生したら、サーバーを読み取り/書き込みに変更します。

re:wackamole-wackamoleは2台のサーバーに限定されない

これをカバーするチュートリアルシリーズを作成していますが、設定は非常に簡単です。


はい、理論的には、wackamoleは2台以上のサーバーをサポートできますが、運用環境でこれを試したことがありますか?しました。今、後悔しています。

これまでのところ、centos 5 64ビットでコンパイルできないという事実以外は問題はありませんでした

0

MySQLのバージョン5.6でこの質問に対するより最近の回答を提供するために、非同期レプリケーションをより堅牢にし、MySQLを再びHA(高可用性)の競争に参加させることを目的とするGTID(グローバルトランザクション識別子)を導入しました。

このセクションでは、グローバルトランザクション識別子(GTID)を使用したトランザクションベースのレプリケーションについて説明します。GTIDを使用する場合、元のサーバーでコミットされ、スレーブによって適用されるときに、各トランザクションを識別および追跡できます。つまり、GTIDを使用して、新しいスレーブを起動したり、新しいマスターにフェイルオーバーしたりするときに、ログファイルまたはそれらのファイル内の位置を参照する必要がないため、これらのタスクが大幅に簡略化されます。GTIDベースのレプリケーションは完全にトランザクションベースであるため、マスターとスレーブが一貫しているかどうかを判断するのは簡単です。マスターでコミットされたすべてのトランザクションがスレーブでもコミットされている限り、2つのトランザクション間の整合性が保証されます。GTIDではステートメントベースまたは行ベースのレプリケーションを使用できます(セクション16.2.1「レプリケーション形式」を参照)。ただし、最良の結果を得るには、

参照:16.1.3グローバルトランザクション識別子を使用したレプリケーション(MySQLドキュメント)

HAProxyを使用してクエリの負荷を分散するとSPOF(Single Point Of Failure)が発生し、ハートビートを追加するとこのソリューションが煩雑になると思いました。

より簡単な解決策は、すべてのMySQLノードでjdbc urlを介してクエリの負荷分散を目的とするJavaコネクタJConnectorを介して接続することです。マスター/スレーブまたはマスター/マスターのセットアップを処理できます。

これにより、MySQLでそのままHAクラスターソリューションをセットアップできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.