Cassandra:生成一个唯一的ID?

时间:2013-04-18 13:39:12

标签: cassandra uuid cql cql3

我正在开发分布式数据库。我正在尝试生成一个唯一ID,该ID将在中用作列系列主键

我阅读了一些关于使用UUID使用Java执行此操作的文章,但似乎存在碰撞的可能性(即使它非常低)。

我想知道是否有办法根据时间生成一个唯一的ID?

4 个答案:

答案 0 :(得分:28)

您可以在Cassandra中使用TimeUUID类型,后者支持 Type 1 UUID 。这使用当前时间和创建者的MAC地址和序列号。如果正确生成了TimeUUID号,则可以在零冲突的情况下完成(您可以使用CQL now() method或插入您自己的,java SDK提供一些线程安全的实现)。 TimeUUIDs的主要优点是ID可以按时间排序。有关详细信息,请参阅http://wiki.apache.org/cassandra/TimeBaseUUIDNotes

但是,时间排序对于行主键不太可能有用,因为使用散列分区器时排序是无用的,尽管可能使用clustering key。而且,如果您自己动手,生成唯一ID的复杂性可能会成为错误的根源。 Cassandra还使用UUID类型支持 Type 4 UUID 。这些只是随机位。存在碰撞概率,但碰撞概率(假设不相关的随机数源,如果您在Java中生成则会非常低) - 如果您在100年内创造10亿秒,则一次碰撞的概率约为50% 。 (有关详细信息,请参阅http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates。)

答案 1 :(得分:6)

您应该使用Twitter Snowflake进行调查。从项目自述文件:

  

当我们在Twitter上从Mysql转向Cassandra时,我们需要一种新的方法来生成id号。 Cassandra中没有顺序id生成工具,也不存在。

Snowflake使用直观的算法生成时间顺序和唯一的long。由于您的数据库是分布式的,因此该服务应该很好地满足您的需求。

答案 2 :(得分:6)

正如Richard所说,你可以使用TimeUUID,生成TimeUUID值并不是什么大问题。只需关注cassandra常见问题timeuuid

答案 3 :(得分:3)

您需要使用cassandra函数now()生成timeuuid并使用uuid()函数生成uuid类型字符串。