在Cassandra中存储二进制blob

时间:2014-12-16 22:23:57

标签: cassandra blobstore astyanax

我正在构建一个简单的HTTP服务,它存储任意二进制对象。该服务由Cassandra提供支持。它是亚马逊S3的简化版本。系统必须承受大量写入负载,并且应该在写入和读取路径上具有高可用性。

存储的数据有点不可变。它可以删除,但无法更新。因此,数据不一致不是问题。数据存储必须能够有效地使旧数据过期。

该服务使用Netflix的Astyanax库,该库提供recipe用于在Cassandra中存储(大)二进制对象。

我看到解决这个问题的两个解决方案,它们都有利有弊。对我来说很难估计,哪种方式更适合Cassandra。

带TTL的单表

Astyanax会自动将大型物品分成小块并将它们存储在一张桌子中。为每个blob分配一个TTL,使其在一段时间后过期。当TTL过期时,压缩运行会删除blob。

此解决方案有效且非常直接实施。我开始使用SizeTieredCompactionStrategy,但我认为,在处理TTL数据时,DateTieredCompactionStrategy可能是更好的选择。

我主要担心的是:卡桑德拉的压缩可以跟上吗?有没有人遇到类似的用例?

按时间分割数据

另一种方法是按时间对数据进行分片。我可以为每天创建一个表并将块存储在该表中。在这种情况下,我可以删除完整的表以删除过期的数据。

此解决方案需要在实现中花费更多精力,但可以简化并可能加快删除过期数据的速度。

Cassandra放桌子的表现如何?

1 个答案:

答案 0 :(得分:2)

您的方案的正确选项是DateTieredCompactionStrategy并为每个blob分配TTL。

参见: http://www.datastax.com/dev/blog/datetieredcompactionstrategy