2016-05-29 94 views
0

我正在学习卡桑德拉,我知道我应该为每个查询制作一张表格。我不确定何时应该制作单独的表格或物化视图。例如,我有用户和帖子以下查询:何时使用物化视图?

users_by_id users_by_email users_by_session_key

posts_by_id posts_by_category posts_by_user

我就应该总是用物化视图?

在我看来,如果你想保持邮件或用户在查询中保持一致,那么我必须使用物化视图。但是我读到的物化视图有一个read before write延迟。另一方面,如果我使用不同的表格,每次创建新帖子时我应该制作3个插入点吗?我注意到我得到了错误batch with conditions cannot span multiple tables,这意味着我必须一次将它插入到每个单独的表中,如果其中一个查询失败,会导致一致性问题。 (批处理语句,如果其中一个失败,将全部失败3)。

因此,由于它具有一致性是有意义的,那么在我看来,我总是希望使用物化视图,并且必须采取惩罚措施。

我想我的另一个问题是数据何时会不一致?

所以希望有人能够为我提供更多的清晰度,以便如何在用户或帖子这样的'理论模型'上的cassandra中处理多个查询。我应该使用物化视图吗?如果我为每个模型使用3个不同的表格,我如何保持它们一致?只希望所有3插入不失败?看起来不正确。

回答

0

不,你不应该总是使用物化视图。完美的解决方案是您数据库的接口。在这个应用程序中,你处理所有不同的表格。但是物化视图也有一些用例:如果您没有时间用于此应用程序,但您需要此功能,请使用物化视图。你有一个性能折衷,但在这种情况下,时间更重要。如果你还需要真正的更新而不是所有表上的upserts:使用物化视图。

批处理对于缓冲或将具有相同分区键的数据集放在一起很有用。例如:您有一个高数据吞吐量应用程序。在你的心跳之间或执行另一个QUORUM查询之间,你有10个具有相同分区键的其他事件。但你不会执行它们,因为你在等待成功的回应。如果成功回来,您可以执行批量查询。但请记住:对于相同的分区键只使用一个批处理。

一般来说,记住一件重要的事情:卡桑德拉有一个最终的一致性模型。这意味着:如果你使用qourum,你会有一致性,但不是每次。如果您的应用程序需要完全一致性,那么不仅会最终使用其他解决方案例如。 SQL与分片。 Cassandra针对写入进行了优化,只有在使用cassandra功能时才会感到满意。

一些性能提示: 如果您需要更好的一致性:使用QUORUM,请勿使用ALL。而且,一般情况下,单独编写查询。有时批处理是有用的。不要使用ALLOW FILTERING执行查询。请勿在分区键上使用令牌范围或IN运算符:)

+0

在你的第一段中,你提到你提到的权衡是时间vs性能。我有时间让id喜欢使这3个不同的表而不是物化视图。然而,我仍然困惑什么是保持3 Posts表中的数据一致的正确方法。 (顺便说一下,当我说一致性时,我不是指复制品间的一致性,而是3 posts表中数据的一致性)。我的担心是,我的服务器使3插入创建一个帖子,但在一次我的服务器失败。现在我有'posts_by_id'但没有'posts_By_category'表。那么我将如何处理3个表格的数据一致性呢? –

+0

您可以做两件事:使用QUOURUM或创建批量修复过程。第一个很容易实现:https://docs.datastax.com/en/cassandra/2.0/cassandra/dml/dml_config_consistency_c.html 对于第二个,您需要像kafka一样的Message Queue System。您创建一个快速流处理应用程序。第二个应用程序在您的批处理流中只做一件事:修复损坏的表。第二种解决方案非常快速,适用于实时分析,但第一种解决方案更安全。我认为,就你而言,第一个是更好的选择。 –