2017-08-28 83 views
0

我對Cassandra數據建模有疑問。對不起,很長的帖子。Cassandra數據模型指導

我在這裏採取假設的情況。假設我有一個主服務器,它從網絡上的機器(1個或多個)收集數據。其他機器的數據形式如機器細節,狀態,是否連接,是上或下,是臺式機還是筆記本電腦,就像這樣。我有這樣

  1. 由於主服務器ID獲取連接到它
  2. 鑑於機器ID的機器列表,獲取本機的詳細信息的查詢。
  3. 鑑於機器的狀態(沒有其他)獲取機器列表(一個或多個)
  4. 鑑於標誌is_connected獲取連接到主服務器的機器列表?
  5. 鑑於國旗is_up獲取機器列表?

因此,根據Cassandra,我們應該爲每個查詢(近似)創建一個列族。我擔心的是上面的查詢#3,#4,#5,這些查詢的where子句分別是status,is_connected和is_up,因此爲了滿足這些查詢,我必須創建包含這些標誌作爲分區鍵或集羣鍵的表。

CREATE TABLE server (
    server_id text, 
    server_name text, 
    status text, 
    . 
    . 
    . 
    . 
    . 
    other information, 
    PRIMARY KEY (server_id)) 

CREATE TABLE machine (
    machine_id text, 
    machine_name text, 
    status boolean, 
    is_connected boolean, 
    is_up boolean, 
    . 
    . 
    . 
    . 
    . 
    other information, 
    PRIMARY KEY (machine_id)) 

    CREATE TABLE machine_by_status (
     machine_id text, 
     machine_name text, 
     status boolean, 
     is_connected boolean, 
     is_up boolean, 
     . 
     . 
     . 
     . 
     . 
     other information, 
     PRIMARY KEY (status, machine_id)) 

    CREATE TABLE machine_by_connected (
     machine_id text, 
     machine_name text, 
     status boolean, 
     is_connected boolean, 
     is_up boolean, 
     . 
     . 
     . 
     . 
     . 
     other information, 
     PRIMARY KEY (is_connected, machine_id)) 

    CREATE TABLE machine_by_up_down (
     machine_id text, 
     machine_name text, 
     status boolean, 
     is_connected boolean, 
     is_up boolean, 
     . 
     . 
     . 
     . 
     . 
     other information, 
     PRIMARY KEY (is_up, machine_id)) 

但是這些標誌的值可能會在一段時間內發生變化。值可能是多個。如果這些是分區密鑰或集羣密鑰的一部分,那麼我無法更新或更改它。因此,一旦創建了我的專欄系列並添加了一些帶有標誌值的記錄,那麼對於新值,我該如何更新該記錄,或者如果我添加新記錄,那麼如何刪除舊記錄?我想避免在寫之前閱讀。

數據收集的頻率可能會有所不同,所以我不能使用TTL的固定值,以便Cassandra可以刪除舊值。我知道上述模式存在問題,例如它可能會產生熱點,或者可能會造成不平衡集羣,這就是我需要指導的原因。我該如何處理這種情況。我的客戶端應用程序只能在幾頁上基於這些標誌進行查詢。客戶端沒有其他數據要查詢。

那麼,如何創建列族來滿足查詢#3,#4,#5?在這種情況下,您的指導將幫助我提出良好的數據模型。

預先感謝您。

+0

可以插入多少臺機器? –

+0

@AshrafulIslam機器數量可能會高達200萬可能更多 – Shashi

+0

標誌狀態,is_connected,is_up所有這些都是低基數列,假設所有機器都已啓動,所以您的所有數據都將位於一個分區中(在同一個節點上),會產生熱點,不可擴展等。這是cassandra中非常糟糕的設計。 –

回答

1

國旗status,is_connected,is_up所有這些都是低基數分區。

比方說,所有的機器就到了,所以所有數據將在一個分區(在同一節點上),將創建熱點,會不會是可擴展等

因此,而不是使低基數列(status,is_connected,is_up)作爲分區密鑰。爲每個標誌值創建單獨的表格。

is_up

CREATE TABLE up_machines ( 
    machine_id text PRIMARY KEY, 
    machine_name text, 
); 

CREATE TABLE down_machines ( 
    machine_id text PRIMARY KEY, 
    machine_name text, 
); 

現在,如果你需要的上機列表,然後你可以從up_machines表中選擇所有。同樣爲其他標誌創建表。

另一件事情,而不是在那些選擇所有記錄,使用驅動程序分頁系統

https://docs.datastax.com/en/developer/java-driver/2.1/manual/paging/

注:如果一臺機器的狀態改變,你必須從一個表中刪除和插入到另一個。刪除記錄創建墓碑。如果這經常發生,可以生成巨大的墓碑。 About Deletes and Tombstones in Cassandra

+0

謝謝@ashrafulIslam – Shashi