【问题标题】:How does Cassandra handle the case of hash collision of the token functionCassandra如何处理token函数哈希冲突的情况
【发布时间】:2021-08-10 07:20:55
【问题描述】:

考虑三行,(a, b), (a, f) 和 (c, e)。

遗憾的是,在某些薄片分区算法下,分区键值 ac 哈希为相同的值。

在这种情况下,Cassandra 如何在内部对行进行排序?

会在:

(a,b)
(a,f)
(c,e)

或在

(a, b)
(c, e)
(a, f)

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    首先,如果分区键不同,就不可能有相同的令牌(哈希值)。 Murmur3Partitioner 将处理令牌(哈希)的唯一性。

    row 1 (a,b) - a is partition key in this case. Hash will be calculated using a
    row 2 (a,f) - a is partition key in this case. Hash will be calculated using a
    row 3 (c,e) - c is partition key in this case. Hash will be calculated using c 
    

    第 1 行和第 2 行具有相同的行 kay(分区键),现在这是冲突。但是 cassandra 具有与每个单元格相关联的时间戳(一个单元格是 cassandra 中的最小存储单元)。每个单元格都有三个属性名称、值和时间戳。 Cassandra 使用时间戳将这些两行合并为一行。最新的值将被保留。从上面的示例中,对于第 kay a 行,值 f 将保持不变。 Cassandra 压缩过程将负责合并行。

    【讨论】:

    • 哈希值的可能范围是从-2^63到+2^63-1,因为它是一个有限的空间,这意味着碰撞确实有机会发生,尽管可能永远不会发生。
    • 如果发生冲突,将使用时间戳来解决冲突。具有最新时间戳的数据将保留。
    • 是的。这就是我感兴趣的。所以如果a,和c发生了hash冲突,那么最后,我们将从问题中的原始三行中存储一行。
    • @Hacky - 假设主键中除了分区键本身之外没有其他字段。
    猜你喜欢
    • 2013-09-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 2013-07-05
    • 2011-06-24
    • 2015-10-03
    • 1970-01-01
    相关资源
    最近更新 更多