如何解决基于节点的用例的cassandra数据建模
我有一个包含2列的cql表
{
long minutesTimeStamp->纪元时间的仅分钟部分。秒将被忽略。
字符串数据->一些数据
}
我有一个5节点的cassandra集群,我想每分钟在所有5个节点上均匀地分配数据。因此,如果每分钟的数据量约为1万条记录,那么每个节点应消耗的数据量约为2k。
我还想并行使用每一分钟的数据,这意味着5个不同的读取器在每个节点上读取1个数据。
我来到了一种解决方案,就像我在表中又保留了一列一样
{
long minutesTimeStamp
int shardIdx
字符串数据
分区键:(minuteTimeStamp,shardIdx)
}
通过在写入数据时执行此操作,我将对shardIdx进行循环轮询。由于cassandra使用 vnodes ,因此(min0,0)可能会进入node0,而(min0,1)也可能会进入node0,因为此令牌也可能属于node0。这样,我可以创建一些热点,而且还会妨碍读取,因为5个并行读取器想要在每个节点上读取1个,但是可能有多个读取器到达同一节点。
我们如何设计分区键,以便在不编写自定义分区程序的情况下均匀地分布数据?
解决方法
无需通过分片使数据分发更加复杂。
当您接近成千上万个分区时,默认的Murmur3Partitioner
将在节点之间平均分配数据。
如果您的用例确实要成为“数据1”上的热点,那么用例/访问模式将是一个固有的问题,但是在实践中很少会出现,除非您在其中遇到了超节点问题(例如)社交图用例,其中泰勒·斯威夫特(Taylor Swift)或巴拉克·奥巴马(Barack Obama)的追随者比其他所有人都要多。干杯!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。