cassandra - 基于节点的用例的 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 个,但多个读取器可能会登陆同一个节点。
我们如何设计我们的分区键,以便在不编写自定义分区程序的情况下均匀分布数据?
解决方案
没有必要通过分片使数据分布更加复杂。
当您接近数十万个分区时,默认设置Murmur3Partitioner
会将您的数据均匀分布在节点之间。
如果您的用例真的要在“数据 1”上成为热点,那么这更多是您的用例/访问模式的固有问题,但在实践中很少见,除非您在社交图使用中遇到超级节点问题(例如)泰勒斯威夫特或巴拉克奥巴马的追随者比其他人多数百万的情况。干杯!
推荐阅读
- ios - 在iOS中选择时忽略可访问性标签?
- node.js - 将循环结构转换为 JSON 错误,同时在节点 js bot 的 cosmos DB 中保存对话状态
- sql - 通过检查参数组合来更新字段
- swift - 为什么我的完成处理程序没有返回所需的值?
- c# - IAsyncEnumerable 的传递?
- bash - Cat * 和类似名称文件的顺序
- bash - 如何将循环内的故障精确定位到字符串内的特定值
- informix - informix dbimport 抛出 23103 - 代码集转换函数因非法序列或无效值而失败
- filter - 从下面 Ansible 输出的 stdout_lines 中过滤一个值
- javascript - AJAX 表单只允许提交一次?