用于基于节点的用例的cassandra数据建模



我有一个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个,但可能有多个读者登录到同一节点。

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

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

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

如果您的用例真的要成为";数据1";,那么这更多的是你的用例/访问模式的固有问题,但在实践中这是罕见的,除非你在社交图用例中遇到超级节点问题(例如(,泰勒·斯威夫特或巴拉克·奥巴马的粉丝比其他人多数百万。干杯

最新更新