2016-05-29 48 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。您創建一個快速流處理應用程序。第二個應用程序在您的批處理流中只做一件事:修復損壞的表。第二種解決方案非常快速,適用於實時分析,但第一種解決方案更安全。我認爲,就你而言,第一個是更好的選擇。 –