1

独自のインデックス リストを作成せずに、行キーを整理して範囲スキャンを実行する良い方法を見つけようとしています。

私は現在、約 15.000 のデータベースを持つ MySQL データベースを持っています。各 ~50 テーブル = 75.000 テーブルです。データの 99% は常に一意の識別子で読み取られるため、そのデータは Cassandra クラスターに移動する予定です。

一部のメンテナンス (完全なテーブルの内容の一覧表示、完全なテーブルの削除、またはデータベースの削除) では、完全なテーブルまたはデータベースの内容を取得する必要があります。Range-Scans は、これに最適なようです。

現在、古い構造の各部分の UUID を生成し、|(DB + テーブル + Id = UUID1|UUID2|UUID2) で区切ってまとめることを計画しています。

例:

07424eaa-4761-11e1-ac67-12313c033ac4|0619a6ec-4525-11e1-906e-12313c033ac4|0619a6ec-4795-12e9-906e-78313c033ac4

データを含む CF は でソートする必要がありますorg.apache.cassandra.db.marshal.AsciiType

クライアントとしてphpcassaを使用しています。

UUID|範囲スキャンの場合、範囲の開始キーと終了キーとして同じキーを使用したいのですが、それに追加するchr(255)z追加します。両方の文字の ascii-value は、そのキーに続く他の UUID 文字よりも大きくなります。

これは、説明されている範囲スキャンの目標を達成できる確実なアプローチですか?

4

1 に答える 1

5

Cassandra のベスト プラクティスは、RandomPartitioner を使用することです。これにより、トークンが均等に分散されている限り、「無料」の負荷分散が可能になります。残念なことに、ランダム パーティショナーでは、行範囲クエリ (つまり get_range_slices) はランダムな順序でキーを返します。

これは、列ファミリー全体をページングするのに適しています (それが必要な場合は、アプローチが機能します)。ただし、行キーの連続した小さな範囲をページングしたいだけの場合は、うまくいきません。

これを解決する 1 つのオプションは、幅の広い行と複合列を使用することです。たとえば、次のような列ファミリーです。

{ 
  row1 -> {column1: value1, column2: value2},
  row2 -> {column3: value3, column4: value4},
  ... 
}

次のように転置されます。

{
  row1-10 -> {
              [row1, column1]: value1, [row1, column2]: value2,
              [row2, column3]: value3, [row2, column4]: value4,
              ...
             }
  ...
}

また、右側の列の間の右側の行で列スライス (get_slice) を実行することにより、範囲クエリを実行できます。すなわち

get_range_slice(start=row1, end=row2)

になります:

get_slice(row=row1-10, start=[row1, null], end=[row2, null])

列キーの null の 2 番目のディメンションに注意してください。

秘訣は、列が大きくなりすぎないように行 (「バケット」) キーを選択することです (通常の Cassandra ではパフォーマンスが低下します)。これは、クエリの平均サイズと uuid の分布によって異なりますが、行キーとして UUID1 を使用し、列キーの最初の次元として [UUID2, UUID3] を使用することをお勧めします。

于 2012-01-31T20:49:39.947 に答える