【发布时间】: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,以便在不编写自定义分区程序的情况下均匀分布数据?
【问题讨论】: