2017-10-17 163 views
4

我現在有一個持續的事件驅動的實時流數據的列家族建模爲這樣的應用:實時數據Cassandra的數據建模

CREATE TABLE current_data (
    account_id text, 
    value text, 
    PRIMARY KEY (account_id) 
) 

數據正在每隔X秒發送每個帳戶ID,所以我們每次收到事件時都會覆蓋現有的行。這些數據包含當前的實時信息,我們只關心最近的事件(對於較舊的數據不適用,這就是我們插入已有密鑰的原因)。 從應用程序用戶端 - 我們通過account_id語句查詢select。

我想知道是否有更好的方法來模擬這種行爲,並看着卡桑德拉的最佳實踐和類似的問題(How to model Cassandra DB for Time Series, server metrics)。

思考這樣的事情:

CREATE TABLE current_data_2 (
     account_id text, 
     time timeuuid,  
     value text, 
     PRIMARY KEY (account_id, time) WITH CLUSTERING ORDER BY (time DESC) 
) 

沒有覆寫會發生,並且每個插入也將有TTL完成(可以是幾分鐘TTL)。

現在的問題是如何在之上更好地成爲第一個數據模型。據我瞭解,主要的優勢將在READS - 因爲數據是按時間所有我需要做的開的是一個簡單的

SELECT * FROM metrics WHERE account_id = <id> LIMIT 1 

而在第一個數據模型Cassandra的實際讀取所有行時,其中覆蓋相同的鍵,然後通過其寫入時間戳選擇最後一個(請糾正我,如果我錯了)。

謝謝。

+0

如果您只需要最近的活動,那麼第一個是最好的 –

+0

請問您可以更具體嗎?是不是第二個更好的讀取? – fncontroloptioncommand

回答

1

首先,我建議你檢查的官方文檔大約read path.

數據按時間排序

這僅僅是你的第二個情況便是如此,當卡桑德拉讀取單個的SSTableMemTable(檢查流程圖)。

卡桑德拉實際讀取那裏覆蓋相同的密鑰 所有行,然後通過它的寫時間戳

這發生在合併單元格通過時間戳一步的文檔中選擇最後一個(再次檢查流程圖)。請注意,在每個SSTable中,在第一種情況下行數將爲1。

在這兩種情況下,主要的驅動因素是在閱讀過程中必須檢查多少個SSTables。它與每個SSTable包含的記錄數有些獨立。

但在第二種情況下,你有更大的SSTabes,導致更長的SSTable壓實。 TTL到期還執行額外的寫入。所以第一種情況有些可取。