Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra:分区键的数据类型-十进制或UUID_Cassandra - Fatal编程技术网

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

Cassandra:分区键的数据类型-十进制或UUID,cassandra,Cassandra,我想先描述一下我正在处理的问题: 目前,我试图找到一种策略,允许我将现有PostgreSQL数据库中的数据迁移到Cassandra集群中。PostgreSQL中的主键是一个25位的十进制值。当我迁移数据时,如果我能以这样或那样的方式保留当前主键的值,并使用它在Cassandra中唯一地标识数据,那就太好了。这个键应该用作Cassandra中的分区键(我所说的表中不涉及其他列)。在做了一些研究之后,我发现一个很好的实践是在Cassandra中使用UUID。因此,现在我有两种可能的解决方案来解决我的

我想先描述一下我正在处理的问题:
目前,我试图找到一种策略,允许我将现有PostgreSQL数据库中的数据迁移到Cassandra集群中。PostgreSQL中的主键是一个25位的十进制值。当我迁移数据时,如果我能以这样或那样的方式保留当前主键的值,并使用它在Cassandra中唯一地标识数据,那就太好了。这个键应该用作Cassandra中的分区键(我所说的表中不涉及其他列)。在做了一些研究之后,我发现一个很好的实践是在Cassandra中使用UUID。因此,现在我有两种可能的解决方案来解决我的问题:

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

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

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

    现在我的问题是:这两种方法似乎都有效,并且最终都有唯一的键来识别我的数据。数据在所有节点上的分布也应该很好。但我想知道,使用UUID而不是十进制值作为分区键是否有好处,反之亦然。我不知道Cassandra到底做了什么来确定分区键的散列值,因此无法确定是否有任何数据类型是首选的。如果相关的话,我正在使用Cassandra的Murrit3Partitioner

    有没有人有过这方面的经验


    提前感谢您的回答。

    我知道UUID有两个好处

    首先,它们可以独立生成,几乎不会发生碰撞。这在分布式系统中非常有用,因为您经常有多个客户端希望插入具有唯一密钥的数据。在RDBMS中,我们拥有自动递增字段以提供唯一性的特权,因为这可以很容易地以原子方式完成,但在分布式数据库中,我们没有高效的全局原子锁来完成这一点

    第二个优点是UUID的存储效率相当高,只需要8个字节


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

    我知道这样做的好处是,它们可以在几乎没有冲突的情况下生成(至少在几百年内)。但因为我有一个转换规则,可以将UUID转换为25位十进制值,所以我不应该失去这个好处。转换将考虑UUID的每个字节,因此不会丢失任何信息,并且仍然保存唯一性。您确定UUID只需要8个字节来存储它们吗?据我所知,UUID是128位(16字节)的值。因此我不明白为什么它们需要更少的字节来存储它们。我认为你是对的。UUID看起来使用了16个字节。我可能一直在想时间戳,它是8个字节。