web-dev-qa-db-ja.com

不完全なデータを返すグラファイト/カーボンクラスター

グラファイト/カーボンクラスターをセットアップしようとしています。クラスタ内の2つのノード間でトラフィックを転送するエラスティックロードバランサーがあり、それぞれに1つのWebアプリ、リレー、キャッシュがあります。

この例では、Metric1の1000カウントをクラスターに送信しました。

これが図です:

Diagram of Graphite cluster

問題

上の図に示されているように、各サーバーは実際のメトリック数の約半分を保持しています。 Webアプリを介して照会すると、実際の数の半分しか返されません。 この素晴らしい投稿 によると、Webアプリは最初に表示される結果を返すため、これは予想される動作です。これは、完全なカウントのみをノードに保存する必要があることを意味します(そして文書化されています)(私の例では、ノードの一方または両方に1000が必要です)。

したがって、私の問題は、カウントの不適切なシャーディングと複製であるように見えます。上記の私の例では、新しいカウントがWebから着信すると、NodeAまたはNodeBのいずれかにリダイレクトできます。カウントは任意のリレーを介してクラスターに入ることができると想定していました。この仮定をテストするために、クラスターからロードバランサーを削除し、すべての着信カウントをNodeAのリレーに送信しました。これは機能しました。フルカウントが1つのノードに表示され、次に2番目のノードに複製され、フルカウントがWebアプリから正しく返されました。

私の質問

carbon-relayは、アプリケーションレベルのロードバランサーとして機能しているように見えます。これは問題ありませんが、インバウンドトラフィックが大きくなりすぎると、単一のcarbon-relayをロードバランサーとして使用することがボトルネックになり、単一障害点になるのではないかと心配しています。実際のロードバランサーを使用して、着信トラフィックをクラスターのリレー全体に均等に分散することをお勧めします。ただし、carbon-relayはNiceを再生していないようであるため、上記の問題が発生します。

  • 上記のシナリオで、リレークラスターがMetric1を2つのキャッシュ間で分割したのはなぜですか? (ロードバランサーが入力を異なるリレーに分散したとき?)
  • グラファイト/カーボンクラスターの前で弾性ロードバランサーを使用できますか?この目的のためにクラスターを誤って構成しましたか?
  • できない場合は、プライマリcarbon-relayを専用のボックスに配置して、ロードバランサーとして機能させる必要がありますか?
3
David Elner

ポート#のタイプミスを介して、私の設定のDESTINATIONSが実際には他のcarbon-cacheではなくcarbon-relaysを指していることがわかりました。質問に示されている図を実際に表すように構成を修正すると、問題が修正されたようです。データが各ノードに完全な形式で表示されるようになりました(レプリケーション後)。

ただし、補足として、 この質問 で詳しく説明されているように、WebアプリのレンダリングAPIからの結果に一貫性がないという問題が発生しています。上記の構成に関連する場合と関連しない場合があります。

3
David Elner

あなたが持っているのは権威の問題です。 Whisperを使用すると、各時系列データベースを唯一のカーボンキャッシュデーモンが所有する必要があります。そうしないと、発生している整合性の問題が発生します。カーボンリレーは、同じ時系列を同じエンドポイントに一貫して送信することにより、この問題に対処しようとします。これは、正規表現ベースのルールエンジンを使用するか、コンシステントハッシュを使用して行うことができます。

私の推奨は、問題を過度に設計せず、それ以上できなくなるまでスケールアップしてから、スケールアウトすることです。 5年前のWestmereEPコア1つで問題なく、60秒ごとに350,000メトリックを処理する単一のカーボンリレーがあります。コンシステントハッシュを使用している場合、メトリックをダウンストリームにルーティングする場所を特定するのは非常に低コストの操作です。大量の正規表現ルールを使用している場合、それは多くの文字列照合であり、パフォーマンスの壁にはるかに速く到達する可能性があります。

Whisperデータベースは特にパフォーマンスが高くありません。おそらく、リレーが問題を引き起こし始めるずっと前に、I/Oパフォーマンスのボトルネックにぶつかるでしょう。 あなたはあなたのアーキテクチャを完全に考えすぎています。

単一のノードが提供できる範囲を超えて本当にスケールアウトする必要がある場合は、クライアント構成管理ロジックに基づいて特定のリレーにルーティングするか、それぞれが実行する複数のリレーにルーティングするELBを設定できます。同じルールセットで、メトリックを同じエンドポイントにルーティングします。これには正規表現ベースのマッチングを使用する必要があると思いますが、リレーが同じバージョンの場合はコンシステントハッシュも機能する可能性があります。私はこのアプローチをテストしたことがありません。

0
jgoldschrafe