2

Cassandraデータベースの場合、レコードを挿入時間の昇順で読み取ることができるように、FIFO方式でレコードをフェッチするメカニズムはありますか。基本的に、バッチで最も古いN行を読み取り、それらを処理し、処理されたらバッチを削除する必要があります。

私の理解では、列はタイプ(CompareWithで指定)でソートされ、行はパーティショナーでソートされます。

OrderPreservingPartitionerを使用して、挿入時間の昇順で行を並べ替えることはできますか?私は単一ノードでCassandraを実行しているので、キーの配布についてはあまり心配していません。OrderPreservingPartitionerを使用できる場合、レコードが挿入の昇順で維持されるように、キーの並べ替え基準を構成するにはどうすればよいですか?

あるいは、Hectorは、最も古い行が最初にフェッチされるように、常に行をフェッチするメカニズムを提供しますか?

編集 :

rs_atlの投稿を読んだ後、私はもう少し疑問があります:

  1. これを正しく理解していれば、TimeUUIDTypeをコンパレータとして使用して列ファミリを作成します。次に、列名にタイムスタンプを使用する必要があります。頭に浮かぶ当面の質問は、列名の並べ替え順序を昇順または降順としてどのように定義するかです。列ファミリーの作成時にこれを行うことはできますか、それともクライアントAPIを介して行う必要がありますか?

  2. シャード間隔として「時間」を使用することにした場合、つまり、キーに時間を追加した場合、最も古い時間の行を取得するにはどうすればよいですか?

4

1 に答える 1

2

Cassandra でこのようなソリューションを試みる場合、考慮すべき点がいくつかあります。

  1. そうしないとホットスポットが発生するため、常に RandomPartitioner を使用してください。
  2. キーは時間のバケット (数日または数時間など) である必要があるため、特定の期間について事前に知ることができます。
  3. 列名は、時間順 (辞書順または数値順) に並べ替えられるタイムスタンプにする必要があります。これにより、範囲のクエリが可能になります。
  4. 一貫性の問題が発生しないように、少なくとも QUORUM (または LOCAL_QUORUM) の読み取りと書き込みを使用してください。
  5. アプリで同じデータを複数回処理しないようにする方法を見つける必要があります。これは、処理のためにレコードを読み取ってから削除するまでの間に他の誰かがレコードを取得する可能性があるためです (つまり、キューのようなものではありません)。

Hector は順序をまったく決定しません。これは挿入時に発生し、選択したコンパレータに基づいています。特定の順序付けが必要な場合は、データをそのように記述する必要があります (上記のポイント 3 を参照)。

編集の追加情報について:

  1. TimeUUIDType をコンパレータとして使用するのではなく、Unix エポックまたは必要な精度レベルの YYYYMMDDxx 形式の時間の数値表現のいずれかである long 値のみを使用します。値を通常 (昇順) にするか逆 (降順) にするかは、照会時に決定できます。

  2. すべてのキーを要求して、最も小さいキーを選択するだけです。これは、キーの数と待機時間の要件に応じて、うまく機能するか、ひどいアイデアになる可能性があります。別の方法として (そして確かにより効率的です)、最も古いキーを実際にどこかに書き込むこともできます (ファイル、別の CF、メモリ内など、意味のあるものは何でも)。

于 2012-12-12T14:55:02.117 に答える