私は分散データベースに取り組んでいます。 cassandra のcolumn family primary keyとして機能する一意のIDを生成しようとしています。
Javaを使用してUUID
を使用してこれを行う方法についての記事をいくつか読んでいますが、非常に低い場合でも衝突の可能性があるようです。
多分時間に基づいて一意のIDを生成する方法があるのだろうか?
CassandraでTimeUUID
タイプを使用できます。これは、Type 1 UUIDをサポートします。これは、現在の時刻と作成者のMACアドレスとシーケンス番号を使用します。 TimeUUID番号が正しく生成される場合、これはゼロ衝突で実行できます(CQL now()
method を使用するか、独自のJava = SDKはスレッドセーフな実装を提供します。TimeUUIDs
の主な利点は、IDを時間順に並べることができることです。 http://wiki.Apache.org/cassandra/TimeBaseUUIDNotes を参照してください。詳細については。
ただし、時間の順序付けは、ハッシュパーティショナーを使用するときには無意味であるため、行の主キーには有用ではありませんが、可能であれば clustering key を使用します。また、独自のIDを生成する複雑さは、独自のIDをロールする場合のバグの原因になる可能性があります。 Cassandraは、Type 4 UUIDもサポートします。UUID
タイプを使用します。これらは単なるランダムビットです。衝突の可能性はありますが、衝突の可能性は(Javaで生成した場合の相関関係のない乱数ソースと仮定して)非常に低いです-100年間で1秒間に10億を作成した場合、1つの衝突の可能性は約50%です(詳細については http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates を参照してください。)
Twitter Snowflake を使用して調査する必要があります。プロジェクトのreadmeから:
TwitterでMysqlからCassandraに移行するにつれて、ID番号を生成する新しい方法が必要になりました。 Cassandraには、順次ID生成機能はありませんし、あるべきではありません。
Snowflakeは直観的なアルゴリズムを使用して、時間順で一意のlongを生成します。データベースは分散されているため、このサービスはニーズに適しているはずです。
リチャードが言ったように、TimeUUIDを使用でき、TimeUUID値を生成することは大したことではありません。 cassandra= FAQ timeuuid 。
Timeuuidを生成するにはcassandra function now()
_を使用し、uuidタイプ文字列を生成するにはuuid()
functionを使用する必要があります。