【问题标题】:Cassandra: Generate a unique ID?Cassandra:生成一个唯一的 ID?
【发布时间】:2013-04-11 15:55:30
【问题描述】:

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

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

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

【问题讨论】:

    标签: cassandra cassandra uuid cql cql3


    【解决方案1】:

    您可以在 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 UUID: CREATE TABLE timeline (rid uuid, PRIMARY KEY(rid)) 我将如何生成 rid 并将其插入 CF ? (我在 Cassandra 中读到了一个名为 now() 的方法,但我不知道如何使用它)
    • 如果您使用类型 1 UUID,您应该使用类型 timeuuid。这应该有效: CREATE TABLE 时间线 (rid timeuuid, PRIMARY KEY(rid));插入时间线 (rid) 值 (now());
    • 我收到此错误:在')' 处缺少 EOF。就像它现在不识别该方法()。 ps:我用的是Cassandra 1.2.0
    • 它在 Cassandra 1.2.2 中对我有用。可能它已在某些常规 CQL3 修复中得到修复。您可能应该升级到 1.2.4(当前最新版本),有很多修复。
    • 非常感谢!我想是时候升级 Cassandra 了 :)
    【解决方案2】:

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

    随着 Twitter 从 Mysql 转向 Cassandra,我们需要一种新的方法来生成 ID 号。 Cassandra 中没有顺序 id 生成工具,也不应该有。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2012-02-22
          • 1970-01-01
          • 2015-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-04
          相关资源
          最近更新 更多