web-dev-qa-db-ja.com

TCPトラフィックをどのように負荷分散しますか?

TCPトラフィックの負荷分散方法を決定しようとしています。HTTP負荷分散は単純なリクエスト/レスポンスアーキテクチャであるため、どのように機能するか理解しています。しかし、負荷分散の方法がわかりませんTCPサーバーが他のクライアントにデータを書き込もうとしているときのトラフィック。単純なTCPチャットサーバーのワークフローの画像を添付しましたN個のアプリケーションサーバー間でトラフィックのバランスをとりたいと思っています。自分がやろうとしていることを実行できるロードバランサーはありますか、または別のトピックを調査する必要がありますか?ありがとう。

enter image description here

20
Brian DiCasa

まず、図では、ロードバランサーが(TCP)proxyとして機能していると想定していますが、常にそうであるとは限りません。多くの場合、直接ルーティング(または直接サーバーリターン)が使用されるか、宛先NATが実行されます。どちらの場合も、バックエンドサーバーとクライアント間の接続は直接です。したがって、この場合、本質的に= TCPバックエンドサーバー間で分散されるハンドシェイク。詳細については、以下を参照してください。

明らかにTCPプロキシは存在します(HAProxyは1つです)。その場合、プロキシは接続の両側を管理するため、アプリは着信IP /ポートによってクライアントを識別できる必要があります(これはたまたまクライアントではなくプロキシからのものです。)プロキシはメッセージをクライアントに戻す処理を行います。

どちらの方法でも、共通のセッションストア(ある種のデータベース、またはRedisなどのkey => valueストア)を用意するのが難しいのではないかと思いますが、これはアプリケーションの設計に起因します。 Frankにメッセージを送信する」と、Frankが(DBから)接続しているバックエンドサーバーを特定し、そのサーバーにメッセージを送信するように通知することができます。永続的な接続(すべてのロードバランサーがこれを実行できます)を使用するか、またはWebSocketのような本質的に永続的なものを使用することにより、(同じクライアントからの)接続が異なるバックエンドサーバーを移動する問題を軽減します。

私はチャットソフトウェアの経験がないので、これはおそらく非常に単純化しすぎです。明らかに、フォールトトレランスと負荷分散のために、DBサーバー自体を複数のマシンに分散させることができます。

15
James Little