我有一张非常庞大的Cassandra表,大约有1300万个条目。该表用作一种查找表。这意味着没有写入但只有读取。我使用Datastax Enterprise 4.8
(包括Cassandra 2.1
)。
因此,内容非常静态,但有时(每隔几个月)内容会有更新。问题是,旧数据可能会过时并出现新数据。但旧的数据不会被覆盖(它留在表中)。有必要删除旧数据以获得干净的数据库。
我有一个要求......数据库必须在更新期间可用。可以在短时间内(几分钟)并排存在新旧数据。
我已经考虑过以下解决方案:
哪种解决方案最好?或者甚至更好,是否有解决方案可以更加优雅地解决我的问题?
答案 0 :(得分:1)
好的,经过大量的测试,这是我的发现。所有提到的测量都基于1300万个数据集。
我编写了一个创建SSTables的小型Java工具。 Here您可以找到一个很好的示例,了解如何使用CQLSSTableWriter执行此操作。在创建SSTable之后,我使用sstableloader命令行工具(Cassandra附带)将其导入Cassandra。
<强>结论强>
我编写了一个小型Java工具,它执行CQL命令将数据集插入到Cassandra中。另外,我添加了一个版本列,因此在导入后,我可以删除旧数据。缺点是,我唯一的分区键是版本本身,所以我可以轻松删除旧数据集。为解决此问题,我使用Solr and use Solr queries对表进行索引以在该表中进行搜索。事实上,数据不是在单个节点之间分配对我们来说是好的,搜索仍然像一个魅力。至少在几个节点之间复制数据。
<强>结论强>
我将使用第二种解决方案,因为它更快,您不必处理正确的库版本。在我的所有工具中,我都使用线程,所以在这里我还有一个很大的调整螺丝来找到并发和线程开销之间的最佳平衡。最后,我在我的工具(~8)中使用了少量线程,但使用了Datastax Java驱动程序的executeAsync方法。