2

ログ収集には Cassandra を使用しています。1 時間あたり約 150,000 ~ 250,000 件の新しいレコード。列ファミリーには、「host」、「errorlevel」、「message」などのいくつかの列と、特別なインデックス付き列「indexTimestamp」があります。この列には、時間に丸められた時間が含まれます。

したがって、いくつかのレコードを取得したい場合は、最初に indexTimestamp による IndexExpression ( EQ operator を使用) で get_indexed_slices() を使用し、次にホスト、エラーレベルなどによるその他の IndexExpression を使用します。

indexTimestamp だけでレコードを取得すると、すべて正常に動作します。ただし、indexTimestamp でレコードを取得すると、たとえば、ホスト - cassandra は長時間 (15 ~ 20 秒以上) 動作し、タイムアウト例外がスローされます。

私が理解しているように、インデックス付きの列とインデックスなしの列でレコードを取得する場合、Cassandra はまずインデックス付きの列ですべてのレコードを取得し、次にインデックスのない列でそれらをフィルター処理します。

では、なぜ Cassandra はそれほど遅いのでしょうか? indexTimestamp によると、250,000 を超えるレコードはありません。それらを10秒でフィルタリングすることはできませんか?

私たちの Cassandra クラスターは、4 つの CPU と 4 GB のメモリを備えた 1 台のマシン (Windows 7) で実行されています。

4

1 に答える 1

1

Cassandra はこの種のクエリを非常に苦手としていることを覚えておく必要があります。インデックス付き列のクエリは、大きなテーブル向けではありません。このタイプのクエリでデータを検索する場合は、データ モデルを調整する必要があります。

実際、Cassandra はクエリできる DB ではありません。キーバリューストレージシステムです。それを理解するには、http: //howfuckedismydatabase.com/にアクセスして簡単に見てください。

役立つ最も基本的なパターンは、バケット行と範囲指定された範囲スライス クエリです。

あなたがオブジェクトを持っているとしましょう

user : {
  name : "XXXXX"
  country : "UK"
  city : "London"
  postal_code :"N1 2AC"
  age : "24"
}

by cityもちろん、 ORをクエリしたいby age( and&はまだor別のデータ モデルです)。

次に、名前が一意の id であると仮定して、次のようにデータを保存する必要があります。

write(row = "UK", column_name = "city_XXXX", value = {...})

write(row = "bucket_20_to_25", column_name = "24_XXXX", value = {...})

都市検索では国ごと、年齢検索では年齢層ご​​とにバケット化したことに注意してください。

age EQ 24 の範囲クエリは次のようになります。

get_range_slice(row= "bucket_20_to_25", from = "24-", to = "24=")

メモ"minus" == "under_score" - 1と として、 "equals" == "under_score" + 1「24_」で始まるすべての列を効果的に提供します

これにより、たとえば 21 ~ 24 歳の年齢を照会することもできます。

それが役に立ったことを願っています

于 2012-08-09T15:30:46.390 に答える