Cassandra UUID 作为行键

3

为什么在Cassandra中,键通常定义为UUID?看起来键是在客户端生成的,那么为什么不只存储为字符串?特别将键存储为UUID有哪些好处呢?

3个回答

4
有关Cassandra的键,它可以是任何键,反正键最终会被转化为一个bytearray。如果客户端想要像“foobar”或任意长度的字符串作为键,这并没有问题。Cassandra客户端将其转换为字节数组后再传输到Cassandra服务器。在技术上,在服务器端它将被存储为“foobar”。
在决定键格式时,还有其他需要考虑的事情:
  • 密钥长度直接影响Cassandra的性能。尽可能使它们短,以便仍然可以用于所需的数据访问。对于数据访问无用的短键不比具有更好的获取/扫描属性的较长键更好。在设计密钥时需要权衡。如果您的密钥是长字符串,则将它们哈希成UUID可能是一个好主意。
  • 请注意,您可以将UUID存储为可读的人类字符串,其类似于UUID 'f5606950-98d1-11e3-a5e2-0800200c9a66',但更好的方法是使用内部数据类型仅使用16个字节来存储它。
  • 您需要事先决定是否使用OrderedPreservingPartitioner或RandomPartitioner,有许多权衡,但最重要的是它如何影响集群中的密钥分布。通常使用OrderedPreservingPartitioner,因为它允许进行有意义的扫描,根据密钥值,它通常会导致Cassandra节点的热/冷。为了帮助解决这个问题,可以再次使用原始密钥的哈希值-UUID或在真实密钥前加上一些UUID-。
  • 您计划如何访问您的密钥,从简单的getslice和过度忽视的delete,通常人们发现UUID是一个很好的折衷方案。
  • 您计划如何负载均衡数据

3
Cassandra键可以定义为任何类型(或其组合),因此您不受UUID的限制。
但是,为什么要使用UUID而不是字符串呢?
UUID为128位。字符串是可变长度的,UUID的字符串十六进制表示需要32个字符。如果您使用16位unicode字符,则每个键将需要512位,即需要4倍的空间。

1

在行数较多的情况下,这可以节省磁盘空间。

当有大量行时,通过减少从磁盘获取的数据量,来提高性能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接