我对卡桑德拉有点新鲜。 我创建了一个如下表格 创建表事件(日文本,小时文本,sip文本,dip文本,计数,计数器, 主键((日,小时),sip,dip));
我们的用例是,应用程序每秒接收许多事件。我们希望每天每小时都有一个单独的分区,如果再次收到相同的事件,我们需要更新计数器。而且我们希望有dip和sip列组合的唯一条目,因此我将它们作为主键的一部分包含在内。
这里作为dip,sip列正在形成一个聚类键,在将记录插入表中时进行排序。在我们的例子中,这些列不需要排序,排序是一种开销,而我们在表中包含数百万行。如何避免这种排序开销,任何人都可以帮助我吗?
答案 0 :(得分:1)
Cassandra需要按聚类列进行排序才能正常运行。它需要以保持行键唯一的方式存储数据,并支持群集列上的范围查询等内容。正如Arun所说,这可以让您的后续更新快速运行。
您可以通过按排序顺序插入行来减少排序量,例如将第一个群集列设为时间戳。但是你失去了能够增加你的计数器的好处,因为你不知道早期事件的时间戳键。要获得最终计数,您需要在每小时后进行一次汇总操作以聚合匹配事件。
另一种方法是使sip和/或dip部分分区键。然后,每个事件将散列到不同的分区存储桶,并且不需要排序。但是你会把事件分组丢失到一小时的分区中。根据您的需要,这可能是好的也可能是坏的。如果您的事件发生率非常高,将它们全部分组到相同的一小时分区可能会产生热点,因为所有事件都会散列到同一节点,因此将事件分开分区会分散写入负载。如果稍后将事件作为一小时块读取对您来说更重要,那么将它们分组到一个分区将使得以更昂贵的写入为代价从而更有效地读取它们。
因此,一般情况下,如果将分区保持在合理的大小,则排序开销不应太大,因为它是在内存中完成的。如果您的分区太大而导致性能问题,请通过向分区键添加另一个字段来减小其大小,以将分区分成更小的块以在更多节点上分散负载。