我想首先描述我正在处理的问题:
目前,我试图找到一种策略,允许我将数据从现有的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。
有没有人有过这个问题的经验?
提前感谢您的回答。
答案 0 :(得分:3)
我知道UUID有两个好处。
首先,它们可以独立生成,几乎没有碰撞的可能性。这在分布式系统中非常有用,因为您经常有多个客户端想要使用唯一键插入数据。在RDBMS中,我们有很多自动递增字段来提供唯一性,因为它可以很容易地以原子方式完成,但在分布式数据库中,我们没有高效的全局原子锁来做到这一点。
第二个优点是UUID在存储方面相当高效,只需要8个字节。
只要您的旧十进制值是唯一的,您就应该可以将它们用作分区键。