【问题标题】:data modeling of cassandra for node based use cases基于节点的用例的 cassandra 数据建模
【发布时间】:2021-01-11 00:46:32
【问题描述】:

我有一个包含 2 列的 cql 表

{

long minuteTimeStamp -> 只有纪元时间的分钟部分。秒被忽略。

字符串数据 -> 一些数据

}

我有一个 5 节点的 cassandra 集群,我想在所有 5 个节点上均匀分布每分钟的数据。所以如果每分钟的数据是~10k条记录,那么每个节点应该消耗~2k数据。

我也想并行消费每分钟数据,意味着5个不同的阅读器在每个节点上读取数据1。

我找到了一种解决方案,就像我还在表格中多保留一列一样

{

长分钟时间戳

int shardIdx

字符串数据

分区键:(minuteTimeStamp,shardIdx)

}

通过在写入数据时执行此操作,我将对 shardIdx 进行循环循环。由于 cassandra 使用 vnodes,因此 (min0,0) 可能会转到 node0,而 (min0,1) 也可能会转到 node0,因为该令牌也可能属于 node0。这样我可以创建一些热点,它也会妨碍读取,因为 5 个并行读取器想要在每个节点上读取 1 个,但多个读取器可能会到达同一个节点。

我们如何设计我们的 partition-key,以便在不编写自定义分区程序的情况下均匀分布数据?

【问题讨论】:

    标签: cassandra cql


    【解决方案1】:

    没有必要通过分片使数据分布更加复杂。

    当您接近数十万个分区时,默认的Murmur3Partitioner 会将您的数据均匀分布在节点之间。

    如果您的用例真的要在“数据 1”上成为热点,那么这更多是您的用例/访问模式的固有问题,但在实践中这种情况很少见,除非您有超级节点问题(例如)社交图谱用例,泰勒斯威夫特或巴拉克奥巴马的追随者比其他人多几百万。干杯!

    【讨论】:

    • Erick Ramirez,你的意思是 cassandra 不会将 vnode 随机放置在环上,而是使用issues.apache.org/jira/browse/CASSANDRA-7032 中提到的算法。如果是这种情况,是的,这将是均匀分布。
    • 不,不是虚拟节点的代币分配。它是使用 Murmur3 散列算法的分区的随机分布。干杯!
    猜你喜欢
    • 2015-09-13
    • 2018-03-08
    • 1970-01-01
    • 2016-10-04
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2019-09-03
    相关资源
    最近更新 更多