我正在编写一个需要跟踪"对象"的应用程序。具体来说,当一个"对象" (1k blob)到达应用程序级别,它将保留在C *中以备将来使用。谈到数字,我希望得到10-50亿个不同的对象,因此预期的数据大小介于10-50TB之间。
应用程序可以在可变时间窗口(例如,一天或一个月)内多次查看完全相同的对象。应用程序"消费"这些对象在某些条件适用时(它们不会立即消耗),因此应用程序级别的计数器与每个对象相关联。我不能容忍低于/超过计数,所以C *计数器是一个很大的不,我依靠正确的"锁定"在应用程序级别。我基本上确保每个对象都被正确计算,然后点击"右边"数量"全局锁定"和罚款,但我很好。当应用程序完成处理一个对象时,关联的计数器达到零并且我确定该对象将永远不再被使用,因此可以安全地删除它(从应用程序的角度来看)。
然而,问题在于我绝对不能保证:
如果对象X在一个月内被看到5次,则所有这5个对象将被连续处理。
如果在一个月内看到对象X 5次,则该对象将连续处理5次。
实际上,两个语句都是一回事:我无法将处理减少到队列,一个经典的Cassandra反模式,因为计数器赢得了#t立即归零。
实际上,这5个对象将(更现实地)一次处理一次,其间有一些未确定的延迟。因此,如果对象X具有5"计数",当一个对象X被处理时,我必须更新计数器并将其设置为4,并且"等待"直到所有剩余的4个对象X被处理,一次处理。这是最糟糕的"混合"到目前为止,我看到的模型是两个世界中最糟糕的:经常更新的列模型和队列反模式模型。
我想删除所有这些对象以回收存储空间,并且我试图找到一个不会遭受过多写入模式的模型申请。
从我到目前为止看到的情况来看,如果我能找到一种方法来收集最终可以删除的表中的对象,我只会执行频繁的更新,因为drop会完全删除表并避免所有删除和墓碑都混乱(假设在删除表时没有拍摄快照)。然后我会创建一个新表来处理下一组数据(类似于常量表名,后跟增加的单调数,以避免重复使用相同的表名,例如TBLNAME0
,TBLNAME1
,等。)。
这显然会给应用程序带来一些好处,但它会在架构中引入一些潜在的不一致性。考虑一个分布式的东西,如果一个或多个节点出现故障,我会得到很多混乱的数据,显然这是我想要避免的。
另一方面,如果我不放弃整个桌子而且我坚持删除,那么墓碑会给应用程序带来巨大的读取惩罚。
谈到删除/删除频率,我预计平均每天或每两天丢一次表,而且我预计每天会有超过1000万次删除。
Q1:放弃还是不放弃?(我投票支持放弃)。
Q2:Cassandra真的很适合这个吗?关于还有什么用的建议?
答案 0 :(得分:1)
...我希望获得100到50亿个不同的对象,因此预期的数据大小 是10-50TB ......
有了这个大数据集,你怎么能在任何体面的时间框架内将数据重组到新表?
我建议您删除对象。如果这些墓碑不在一排,那么读取惩罚以获得活细胞就不会那么多。因此,创建具有合理分区键的表肯定会是加分。
根据我的经验,对于频繁更新列,增加commitlog_total_space_in_mb和memtable_total_space_in_mb有助于避免频繁记忆到sstable刷新。这减少了压实和gc压力。
如果您提供了有关您希望执行的最常见CQL语句的建议架构和示例的更多详细信息,那么人们可能会更好地了解您打算做什么。