2016-07-13 4 views
1

私の名前はDaniel、 です。私は新人ですが長時間のlurkerです。 私は次の "子供たちが眠っている間にいくつかのコードを書くことができます"というプロジェクトのためにApache Cassandraを学ぶことにしました。カサンドラDBをモデル化する方法、サーバメトリクス

私が書いているのは、キャサンドラのデータベースに対して読み書きをするきちんとした小さなAPIです。 は、私は、DBのレイアウトの多くは、MongoDBの中で考え出していたが、私にとって、それは上に移動し、エンジニアとして成長する時間です:)

ミッション: を私は、私のラック内のサーバーからエージェントをメトリックを収集するだろうメトリックのペイロードを毎分送信します。 私はapiの部分をかなり分かっており、ペイロードに署名するJWTトークンを使用します。 私が保管するデータのタイプは以下の通りです。 すなわち、cpuload、CPUUSAGE、MEMUSAGE、はdiskUsageなど

私は一種の私を読み込む作るために、ディスク上の時系列 としてそれをすべてを書き込み、私はstoragenginesを理解し、実際のモデルを作成する方法であるカサンドラと混乱していますパーツかなり素晴らしい。 しかし、私はこれらのことが適切に行われていることを理解しようとしています。サーバーの密度、データドッグなどの実際の生活のシナリオではどうすればよいのかを理解しようとしています。 "あなたの好みのサーバー監視サービスを挿入してください"。 :)

しかし、このようなスキーマを設計する経験豊富なエンジニアはどうですか?データベースの

使用シナリオ:

  • 書き込みペイロード分ごとにAPIを介して。 (ザッツ少なくとも100kのは、何か役に立つ を学習のために毎分書き込みを想像することができます)
  • (ものユーザーID

    • プル最新のデータ(3H)
    • プル最新のデータに関連付けられた資産を読みます
    • プル最新のデータ)毎日(毎週)
    • が最新のデータをプル(月額)
    • などなど
  • 稼働時間などを示す毎月のpdfレポートを生成します。

私は完全なペイロードを含む行を挿入するか、私には、サービスごとにそれらを挿入するより良い午前必要があります。timeuid |すべて1

でCPUUSAGE
サービス行ごと

CREATE TABLE metrics(
    id uuid PRIMARY KEY, 
    assetid int, 
    serviceType text, 
    metricValue int 
) 

CREATE TABLE metrics(
    id uuid PRIMARY KEY, 
    assetid int, 
    cpuload int, 
    cpuusage int, 
    memusage int, 
    diskusage int, 
) 

mongoでは、私はバケットをあらかじめ割り当てておき、 資料。 Webguiでは、あらかじめ定義された期間の平均統計情報を表示できます。

ダンベスの例が高く評価されています。 あなたは私のむしろ貧しい英語を解読できるといいですね。

このURLはSOの提案で見つかった: Cassandra data model for time series 私はそれも私に当てはまるものだと思います。

Sincerly ダニエル・オルソン

答えて

1

データモデルについては、私は、クラスタリング列として時間を追加することを示唆している:最初に、最新のメトリックを維持する降順

CREATE TABLE metrics(
id uuid, 
time timeuuid, 
assetid int, 
cpuload int, 
cpuusage int, 
memusage int, 
diskusage int, 
PRIMARY KEY (id, time) WITH CLUSTERING ORDER BY (time DESC)) 

使用。その後、クエリ最新の時間を取得するために、LIMIT句を使用することができます

SELECT * FROM metrics WHERE id = <UUID> LIMIT 60 

それとも日:

SELECT * FROM metrics WHERE id = <UUID> LIMIT 1440 

あなたはデータを保持する予定どのくらいに応じて、あなたが列を追加することもできます年、月、または日の間、パーティションサイズを制限するためにテーブルに追加します。あなたは、3ヶ月間のデータを保持したい場合たとえば、列は、IDと月であなたの鍵をパーティションに追加することができます:あなたは数年前から、使用の年+月またはのためのデータを保持する場合

CREATE TABLE metrics(
id uuid, 
time timeuuid, 
month text, 
assetid int, 
cpuload int, 
cpuusage int, 
memusage int, 
diskusage int, 
PRIMARY KEY ((id, month), time) WITH CLUSTERING ORDER BY (time DESC)) 

日付値。

最後の質問については、別々のテーブルまたは単一のテーブルについてです。 Cassandraはスパース列をサポートしているため、データを更新することなく、各メトリックの共通テーブルに複数の挿入を行うことができます。ただし、行ごとに1回だけ書くほうが速いです。

別のキーで異なるメトリックをクエリする必要がある場合は、別のテーブルが必要な場合があります。たとえば、ディスク使用量をIDとディスク名で問い合わせます。その問合せパターンをサポートするには、別の表またはマテリアライズド・ビューが必要です。

最後に、アセットIDが定義されていますが、これはプライマリキーで定義されていないため、現在のスキーマではアセットIDを使用してクエリできません。

関連する問題