頻繁に使用されるAPIのサーバー設定


9

間もなく起動するアプリケーション用に多数のサーバーを購入しますが、セットアップに不安があります。いただいたフィードバックはすべて感謝しています。

私が書いたAPIを利用するアプリケーションがあります。他のユーザー/開発者もこのAPIを使用します。APIサーバーはリクエストを受信して​​ワーカーサーバーに中継します。APIは、ロギング、認証、およびレート制限のために、mysql dbのリクエストのみを保持します。

各ワーカーサーバーは異なるジョブを実行し、将来的にはスケーリングして、ジョブを実行できるようにワーカーサーバーをさらに追加します。API構成ファイルは、新しいワーカーサーバーを記録するために編集されます。ワーカーサーバーはいくつかの処理を行い、一部はアプリケーションへの表示のためにAPIによって後で取得される画像へのパスをローカルデータベースに保存し、一部はプロセスの結果の文字列を返し、それをローカルデータベースに保存します。

このセットアップは効率的に見えますか?これを再構成するより良い方法はありますか?考慮すべき問題は何ですか?下の画像をご覧ください。理解に役立つと思います。ここに画像の説明を入力してください

回答:


17

高可用性

Chrisが言うように、APIサーバーはレイアウトの単一障害点です。セットアップしているのは、メッセージキューイングインフラストラクチャです。これは、多くの人が以前に実装したものです。

同じ道を進む

APIサーバーでリクエストを受信し、各サーバーで実行されているMySQL DBにジョブを挿入するとします。このパスを続行する場合は、APIサーバーレイヤーを削除して、APIユーザーから直接コマンドを受け入れるようにワーカーを設計することをお勧めします。ラウンドロビンDNSのような単純なものを使用して、各APIユーザー接続を使用可能なワーカーノードの1つに直接配布できます(接続が成功しない場合は再試行します)。

メッセージキューサーバーを使用する

より堅牢なメッセージキューイングインフラストラクチャでは、ActiveMQのような、この目的のために設計されたソフトウェアを使用します。ActiveMQのRESTful APIを使用してAPIユーザーからのPOSTリクエストを受け入れることができ、アイドル状態のワーカーはキューの次のメッセージを取得できます。ただし、これはおそらくあなたのニーズにとってはやり過ぎです。1秒あたりの遅延、速度、数百万のメッセージを考慮して設計されています。

Zookeeperを使用する

中立的な立場として、具体的にはメッセージキューサーバーではありませんが、Zookeeperを確認することをお勧めします。この正確な目的のために$ workで使用します。Zookeeperサーバーソフトウェアを実行する3つのサーバー(APIサーバーに類似)のセットがあり、ユーザーとアプリケーションからのリクエストを処理するためのWebフロントエンドがあります。WebフロントエンドとワーカーへのZookeeperバックエンド接続には、サーバーがメンテナンスのためにダウンしている場合でも、キューの処理を続行できるようにするロードバランサーがあります。作業が完了すると、ワーカーはZookeeperクラスターにジョブが完了したことを通知します。労働者が死亡すると、そのジョブは別の作業に送られ、完了します。

その他の懸念

  • ワーカーが応答しない場合にジョブが完了するようにします
  • APIはジョブが完了したことをどのように認識し、ワーカーのデータベースからそれを取得しますか?
  • 複雑さを減らすようにしてください。各ワーカーノードに独立したMySQLサーバーが必要ですか、それともAPIサーバー上のMySQLサーバー(または複製されたMySQL Cluster)と通信できますか?
  • セキュリティ。誰でもジョブを送信できますか?認証はありますか?
  • 次の仕事を得るのはどの労働者ですか?タスクに10ミリ秒かかるのか1時間かかるのかは明記しません。高速な場合は、レイテンシを抑えるためにレイヤーを削除する必要があります。それらが遅い場合は、短いリクエストがいくつかの長時間実行されているものの後ろに行き詰まらないように注意する必要があります。

すばらしい返事をありがとうございました。APIレイヤーがボトルネックであることはわかっていましたが、アプリケーションユーザーに手動で通知することなくワーカーサーバーを追加する唯一の方法であるように思われました。あなたの答えを完全に読んだ後、そうだと気づきました。そうです、各ワーカーが独自のAPIを持っている方が良いでしょう。ワーカーを追加するとコードが複製されますが、このシナリオではパフォーマンスが向上します。
Abs

@Abs-最初の賛成票をありがとう!APIレイヤーを削除する場合は、この記事で説明されているように、ラウンドロビンDNSを実行してHAProxy(できればペア)をセットアップしないことをお勧めします。そうすれば、タイムアウトを処理する必要がなくなります。
ファナティック

@abs APIレイヤーを削除する必要はありませんが、冗長性(CARPフェイルオーバーなど)を追加することが、単一障害点を排除するための重要な考慮事項になります...
voretaq7

メッセージングに関しては、決定する前にRabbitMQをよく確認することをお勧めします。rabbitmq.com
Antonius Bloch

2

私が目にする最大の問題は、フェイルオーバー計画の欠如です。

APIサーバーが大きな単一障害点です。ダウンした場合、ワーカーサーバーが機能していても機能しません。さらに、ワーカーサーバーがダウンすると、サーバーが提供するサービスは利用できなくなります。

Linux Virtual Serverプロジェクト(http://www.linuxvirtualserver.org/)を参照して、負荷分散とフェイルオーバーがどのように機能するかを理解し、これらが設計にどのように役立つかを理解することをお勧めします。

システムを構成する方法はたくさんあります。どちらが良いかは、あなたが最もよく答える主観的な電話です。いくつかの調査を行うことをお勧めします。さまざまな方法のトレードオフを比較検討します。着床方法に関する情報が必要な場合は、新しい質問を送信してください。


このシナリオでフェイルオーバーメカニズムをどのように実装しますか?一般的な概要は素晴らしいでしょう。
Abs

ダイアグラムから、Linux Virtual Server(LVS)を調査する必要があります。移動しlinuxvirtualserver.orgとすることができますすべてを学び始めます。
Chris Ting、

興味深いことに、私はそれとフェイルオーバー全般を調べます。私のセットアップに関する他のコメントはありますか?私が直面する可能性のある他の危険はありますか?
Abs

@Abs:直面する可能性のある多くの問題があります。あなたの質問には多くの主観的な部分があり、私が個人的にやろうとしていることにあなたを囲みたくありません。私はあなたのセットアップをサポートする必要はありません。あなたがやる。私の本当の答えは、フェイルオーバーと高可用性について学ぶことです。
Chris Ting、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.