Cassandra:生成唯一ID?

34

我正在研究分布式数据库。 我试图生成一个唯一的ID,作为中的“列族主键”。

我阅读了一些使用Java和UUID来完成此操作的文章,但似乎存在碰撞的概率(即使很低)。

我想知道是否有一种基于时间生成唯一ID的方法?

4个回答

35
你可以在Cassandra中使用TimeUUID类型,它支持类型1 UUID。它使用当前时间和创建者的MAC地址以及序列号生成。如果正确生成TimeUUID号码,则可以零冲突地完成此操作(您可以使用CQL now()method或插入自己的代码,Java SDK提供了一些线程安全的实现)。TimeUUIDs的主要优点是ID可以按时间排序。有关更多信息,请参见http://wiki.apache.org/cassandra/TimeBaseUUIDNotes
然而,对于行主键来说,时间排序可能并不有用,因为在使用哈希分区器时,排序是无用的,尽管可以使用聚簇键。如果自己编写生成唯一ID的复杂度很高,可能会导致错误。Cassandra还通过使用UUID类型支持类型4 UUID。这些只是随机位。存在碰撞概率,但碰撞概率(假设未关联的随机数源,如果在Java中生成)非常低-如果每秒创建10亿个,并持续100年,则发生碰撞的概率约为50%。(有关更多详细信息,请参见http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates。)

感谢您的回复。如果我使用类型1 UUID,例如:CREATE TABLE timeline (rid uuid, PRIMARY KEY(rid)),我该如何生成rid并将其插入CF中?(我在Cassandra中读了一种叫做now()的方法,但是我不知道如何使用它) - user2090879
2
如果你在使用类型1 UUID,那么应该使用timeuuid类型。下面是正确的写法: CREATE TABLE timeline (rid timeuuid, PRIMARY KEY(rid)); insert into timeline (rid) values (now()); - Richard
非常感谢!我觉得是时候升级Cassandra了 :) - user2090879
@user2090879 也许您没有输入所有列的值。这也是您可能遇到错误的原因之一。 - Parveen Verma
1
那么,在我的情况下,我可以使用TimeUUID来生成每秒超过400,000个唯一ID以将新行持久化到Cassandra数据库中吗?我必须确保所有我的ID都是唯一的...否则,我将不得不以某种方式检查存储在我的Cassandra中的ID的唯一性。 - Matley
显示剩余2条评论

11
你应该考虑使用Twitter Snowflake。从项目自述文件中可以看到:
随着 Twitter 从 Mysql 转向 Cassandra,我们需要一种新的生成 ID 号码的方式。Cassandra 中没有顺序 ID 生成设施,也不应该有。Snowflake 使用直观的算法生成既按时间排序又唯一的 longs。由于你的数据库是分布式的,所以这个服务应该能满足你的需求。

7

正如Richard所说,您可以使用TimeUUID,并且生成TimeUUID值并不是一件困难的事情。只需按照Cassandra FAQ timeuuid 的指示操作即可。


3
你需要使用Cassandra函数now()生成timeuuid,并使用uuid()函数生成uuid类型的字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接