【问题标题】:When to use Materialized Views?何时使用物化视图?
【发布时间】:2017-04-19 17:35:58
【问题描述】:

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

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 个都失败)。

所以,既然保持一致性是有意义的,那么在我看来,我总是想使用物化视图,并且不得不接受read before write 的惩罚。

我想我的另一个问题是什么时候数据可以不一致?

因此,希望有人可以为我提供更清晰的说明,了解如何在 cassandra 中处理用户或帖子等“理论模型”上的多个查询。我应该使用物化视图吗?如果我为每个模型使用 3 个不同的表,我如何保持它们的一致性?只是希望所有 3 次插入都不会失败?好像不太对。

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    阅读我的深入研究博文,了解使用物化视图时的所有权衡。了解权衡后,请明智地选择:http://www.doanduyhai.com/blog/?p=1930

    【讨论】:

      【解决方案2】:

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

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

      一般来说,记住一件重要的事情:Cassandra 有一个最终一致性模型。这意味着:如果您使用 quorum,您将保持一致性,但并非每次都如此。如果您的应用程序需要完全的一致性,不要只最终使用另一种解决方案。例如。带分片的 SQL。 Cassandra 针对写入进行了优化,只有在使用 cassandra 功能时才会感到高兴。

      一些性能提示: 如果您需要更好的一致性:使用 QUORUM,永远不要使用 ALL。而且,通常,您可以独立编写查询。有时批处理很有用。不要使用 ALLOW FILTERING 执行查询。不要在分区键上使用令牌范围或 IN 运算符:)

      【讨论】:

      • 在您提到的第一段中,您提到权衡是时间与性能。我有时间,所以我喜欢制作这 3 个不同的表格而不是物化视图。然而,我仍然困惑什么是保持 3 Posts 表中的数据一致的正确方法。 (顺便说一句,当我说一致性时,我不是指副本之间的一致性,而是 3 个 Posts 表的数据一致性)。我担心我的服务器会插入 3 次以创建帖子,但有一次我的服务器出现故障。现在我有 'posts_by_id' 但没有 'posts_By_category' 表。那么我将如何处理 3 个表的数据一致性呢?
      • 您可以做两件事:使用 QUOURUM 或创建批量修复过程。第一个很容易实现:docs.datastax.com/en/cassandra/2.0/cassandra/dml/… 第二个,你需要一个像kafka这样的消息队列系统。您创建了一个快速流处理应用程序。第二个应用程序,在您的批处理流中,只做一件事:修复损坏的表。第二个解决方案非常快,非常适合实时分析,但第一个更安全。我认为,就您而言,第一个是更好的选择。
      猜你喜欢
      • 2020-11-14
      • 1970-01-01
      • 2014-12-26
      • 2021-05-24
      • 2019-10-07
      • 2014-06-07
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多