1台のマシン(ポート)から2台の異なるマシン(ポート)にトラフィックを送信(複製)する必要があります。 TCPセッションも処理する必要があります。
最初は em-proxy を使用しましたが、オーバーヘッドが非常に大きいようです(CPUの50%を超えています)。次に、 haproxy をインストールし、トラフィックをリダイレクトすることができました(重複しないように)。オーバーヘッドは妥当です(5%未満)。
問題は、haproxy設定ファイルで次のように言うことができなかったことです。
-特定のアドレス:ポートと、2つの異なるマシン:ポートで送信されたものをリッスンし、そのうちの1つからの回答を破棄します。
このためのEmプロキシコードは非常に単純ですが、EventMachineは多くのオーバーヘッドを生成するように思われます。
Haproxyコードを掘り下げて変更(トラフィックの重複)を試みる前に、似たようなものはありますか?
ありがとう。
この目的のためだけにプロキシを作成しました。
https://github.com/chrislusf/teeproxy
使用法
./teeProxy -l :8888 -a localhost:9000 -b localhost:9001
tee-proxyはリバースプロキシです。着信リクエストごとに、リクエストを2つに複製してから、2つのサーバーに転送します。サーバーa
からの結果は通常どおり返されますが、サーバーb
からの結果は無視されます。
tee-proxyは、GET
、POST
、およびその他のHTTPメソッドの両方を処理します。
Iptablesの実験はどうですかROUTE target
?トラフィックをミラーリングするための「ティー」オプションがあります。
http://www.netfilter.org/projects/patch-o-matic/pom-external.html#pom-external-ROUTE
これにより、次のようなものでトラフィックをミラーリングできます。
iptables -A PREROUTING -t mangle -p tcp --dport 80 -j ROUTE --gw 1.2.3.4 --tee iptables -A POSTROUTING -t mangle -p tcp --sport 80 -j ROUTE- gw 1.2.3.4 --tee
2番目のマシンは同じサブネット上にある必要があり、ターゲットIPアドレスでリッスンする(arpsに応答しない)か、無差別にリッスンする必要があります。
https://github.com/agnoster/duplicator を試してください。
teeproxy を試しましたが、GET以外のリクエストで奇妙な結果が得られました。
Node.jsを使用して、同様の目的でリバースプロキシ/ロードバランサーも作成しました(これは単なる楽しみであり、現時点では本番環境に対応していません)。
https://github.com/losnir/ampel
それは非常に意見があり、現在サポートしています:
GET
ラウンドロビン選択の使用(1:1)POST
リクエスト分割を使用します。 「マスター」と「シャドウ」の概念はありません。最初に応答するバックエンドはクライアント要求を処理するバックエンドであり、その後、他のすべての応答は破棄されます。誰かがそれが役に立つと思うなら、私はそれをより柔軟になるように改善することができます。
TCPトラフィックもティーすることができるものが必要でしたが、邪魔にならないため、たとえばリバースプロキシとして間に何かを置くことができませんでした。
私がやったことは基本的に、tcpdump/Wiresharkロジック(パケットスニッフィング)を使用して、いくつかのことを実行するように構成できるGoプロセスでラップすることです。
コードが役立つ場合があります: https://github.com/RobinUS2/teecp