2016-05-24 79 views
2

我是卡桑德拉的新手,我一直在閱讀我所能做的和嘗試。卡桑德拉造型模式

我遇到過文檔說如果你願意,你可以爲每個查詢創建1個表。所以,如果我有一個「客戶」記錄,有4個不同的字段需要查詢,那麼我可以創建4個不同的表來執行此操作。

然後我遇到了一個叫做「Batch」的功能,好像說我可以使4個更新事務發生,如果我把它們放在一個批處理中。

但是我找不到任何明確的文檔將所有的部分拼湊在一起,並說「你應該爲每個查詢創建一個表,並且你應該使用一個批來保持所有這些查詢表同步。是最好的做法。「

這是最佳做法嗎?對於一個新手來說,我可以用少一點的「CAN」和多一點的「SHOULD」來做。:)

回答

4

你有沒有考慮過使用物化視圖?這是Cassandra 3.0中的一項新功能,可以很好地滿足您的用例,您可以擁有基表,然後爲每個查詢創建一個關閉該表的視圖。例如,使用this blog post爲例:

CREATE TABLE users (
    id uuid PRIMARY KEY, 
    username text, 
    email text, 
    age int 
); 

CREATE MATERIALIZED VIEW users_by_name AS 
    SELECT * FROM users 
    WHERE username IS NOT NULL 
    PRIMARY KEY (username, id); 

當您將數據插入到用戶數據也將傳播到的意見。然而,這不完全是事務性的(獲得寫入的成功響應並不意味着它已被傳播到視圖,但它們將最終),但它可以減少客戶端的負擔,並且應該關心任何關於表/視圖同步。

+1

哦哇!不,我沒有在教程中遇到實體化的觀點。那些看起來像一個很好的選擇!從您引用的博客文章(也感謝這一點)看來,每個物化視圖的性能損失大約爲10%。但使用BATCH似乎也有性能損失。 我知道這是關係型思維來期待數據的一致性,但在現實世界的情況下,缺乏一致性最終可能會如此昂貴,以至於值得受到MV或Batch的懲罰,但MV看起來好多了。 :) – Beaker

2

你不應該使用批處理。有兩大原因:

  • 這是慢
  • 它可能會失敗,如果發生這種情況:您的所有數據都將丟失。

更好:將所有內容分解爲不同的查詢。如果您需要在所有節點上成功執行查詢,請使用ALL或QUORUM的一致性級別。更多這裏:https://docs.datastax.com/en/cql/3.3/cql/cql_reference/consistency_r.html

您可以在這裏閱讀更多關於此功能。該批處理的工作方式如下:https://inoio.de/blog/2016/01/13/cassandra-to-batch-or-not-to-batch/

但有批處理的用例:如果您已經使用相同的分區鍵發送了一些插入查詢,並且這些查詢仍在進行中,請緩衝下一個查詢並將其作爲批處理執行您對以前的查詢得到了成功的響應。有了這個,你可以防止你的數據庫負載過高。

編輯: 我忘了一件事:你寫了關於創建語句。我認爲無論批次還是ALL/QOURUM對於創建語句都很重要。通常,您不會動態創建表並在同一時間向該表中插入新行。通常情況下:在開發環境中創建一個新表,更改應用程序,並在測試後在生產環境中創建一個新表。一段時間後,您正在部署新版本的應用程序。在這個時候,你可以確定新表格是在每個節點上創建的。有些框架提供了這種表格的動態創建,但我認爲最好是手動控制。用代碼來做這件事太危險了。也許有人拼錯桌子或類似的東西。

+0

感謝批量指針!他們沒有我期望的那麼好。 :)但我仍然喜歡原子性...因爲在一批中丟失所有數據會比丟失一些數據好得多。對於我所處理的大多數應用程序,數據丟失優於數據不一致。至少在數據丟失的情況下,您可以提出異常並在稍後嘗試整個過程。通過部分更新,根據我的經驗,您的數據會慢慢變成湯。但也許我工作在怪異的應用程序。 :) – Beaker