2013-04-18 11 views
20

私は分散データベースで作業しています。私は列ファミリの主キーの中で一意のIDを生成しようとしています。です。カッサンドラ:一意のIDを生成しますか?

UUIDを使用してJavaでこれを行うことに関するいくつかの記事を読んでいますが、衝突の可能性があるようです(非常に低くても)。

時刻に基づいてユニークなIDを生成する方法があるのだろうか?

答えて

23

​​タイプは、タイプ1 UUIDの後ろにあるカサンドラで使用できます。これは、現在の時刻と作成者のMACアドレスとシーケンス番号を使用します。 TimeUUID番号が正しく生成された場合、これはゼロ衝突で実行できます(CQL now()methodを使用するか、独自に挿入することができます。java SDKはスレッドセーフな実装を提供します)。 TimeUUIDsの主な利点は、IDを時間順に並べることができることです。詳細はhttp://wiki.apache.org/cassandra/TimeBaseUUIDNotesを参照してください。

しかし、可能であればclustering keyを使用しても、ハッシュパーティショナを使用する場合は順序が無用であるため、時間の順序は行の主キーには有効ではありません。また、独自のIDを生成する複雑さは、独自のIDを生成する場合、バグの原因となる可能性があります。カサンドラはUUIDタイプを使用してタイプ4UUIDもサポートしています。これらは単なるランダムビットです。衝突確率はありますが、衝突確率は(Javaで生成する場合の無相関の乱数源を仮定して)非常に低くなります.1秒間に10億回を100年間作成すると、1回の衝突確率は約50% 。 (詳細はhttp://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicatesを参照してください)

+0

ご返信ありがとうございます。タイプ1のUUIDを使用している場合: CREATE TABLEタイムライン(除外キー、プライマリキー(除外)) 除算をどのように生成してCFに挿入しますか? (私はCassandraのnow()というメソッドについて読んでいますが、使用方法はわかりません) – user2090879

+2

タイプ1のUUIDを使用している場合はtimeuuid型を使用してください。これはうまくいきます: CREATE TABLE timeline(rid timeuuid、PRIMARY KEY(rid)); タイムラインへの挿入(rid)の値(now()); – Richard

+0

私はこのエラーがあります: ')'にEOFがありません。それは今のメソッドを認識しないようなものです()。 ps:私はCassandra 1.2.0を使用しています。 – user2090879

2

Twitter Snowflakeを使用して調査する必要があります。プロジェクトのreadmeから:

As we at Twitter move away from Mysql towards Cassandra, we've needed a new way to generate id numbers. There is no sequential id generation facility in Cassandra, nor should there be.

スノーフレークは、時間順でユニークなlongを生成する直感的なアルゴリズムを使用します。あなたのデータベースが配布されているので、このサービスはあなたのニーズによく合うはずです。

+0

ありがとうございました! – user2090879

5

リチャード氏によると、TimeUUIDを使用することができ、TimeUUID値を生成することは大きな問題ではありません。単にcassandra FAQ timeuuidに従ってください。

+0

ありがとうございました。 – user2090879

2

timeuuidを生成するにはcassandra関数now()を使用し、uuid型文字列を生成するにはuuid()関数を使用する必要があります。

関連する問題