首页 > 解决方案 > 基于节点的用例的 cassandra 数据建模

问题描述

我有一个有 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 个,但多个读取器可能会登陆同一个节点。

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

标签: cassandracql

解决方案


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

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

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


推荐阅读