首页 文章

Cassandra:分区键的数据类型 - 十进制或UUID

提问于
浏览
2

我想先描述一下我正在处理的问题:
目前,我试图找到一种策略,允许我将数据从现有的PostgreSQL数据库迁移到Cassandra集群 . PostgreSQL中的主键是一个25位的十进制值 . 当我迁移数据时,如果我能够以某种方式保留当前主键的值并使用它来唯一地标识Cassandra中的数据,那将是很好的 . 此密钥应该用作Cassandra中的分区键(我正在讨论的表中没有涉及其他列) . 经过一些研究,我发现一个好的做法是在Cassandra中使用UUID . 所以现在我有两种可能的解决方案来解决我的问题:

  • 我可以创建一个转换规则,将我当前的十进制主键从PostgrSQL数据库转移到Cassandra的UUID中 . 每当有人请求访问某些旧数据时,我都必须将转换规则重新应用到密钥并使用UUID在Cassandra中搜索数据 . 转换将在应用程序服务器中进行,该服务器管理与Cassandra的所有通信(因此没有客户端将直接与Cassandra交谈)添加到Cassandra的新数据当然将与UUID一起存储 .

  • 另一个我目前已在Java中实现的解决方案是使用十进制值作为Cassandra中的分区键 . 由于有可能,多个应用程序服务器将同时与Cassandra通信,我当前的方法是在我的应用程序中生成UUID并将其转换为十进制值 . 使用这种方法,我可以简单地重用PostgreSQL中的所有现有主键 .

我不能简单地为现有数据创建新密钥,因为其他应用程序已经存储了对旧主键值的引用,因此会尝试使用这些密钥请求数据 .

现在我的问题是:这两种方法似乎都有效,最终会有唯一的密钥来识别我的数据 . 跨所有节点的数据分配也应该没问题 . 但我想知道,如果使用UUID超过十进制值作为分区键或反之亦然有任何好处 . 我不确切知道Cassandra确定分区键的哈希值,因此无法确定是否需要任何数据类型 . 如果相关,我正在使用Murmur3Partitioner for Cassandra .

有没有人有这个问题的经验?

提前感谢您的回答 .

1 回答

  • 3

    我知道UUID有两个好处 .

    首先,它们可以独立生成,几乎没有碰撞的可能性 . 这在分布式系统中非常有用,因为您经常有多个客户端想要使用唯一键插入数据 . 在RDBMS中,我们有很多自动递增字段来提供唯一性,因为它可以很容易地以原子方式完成,但在分布式数据库中,我们没有高效的全局原子锁来做到这一点 .

    第二个优点是UUID在存储方面相当高效,只需要8个字节 .

    只要旧的十进制值是唯一的,您就应该可以将它们用作分区键 .

相关问题