Cassandra 簡介 -- data model

簡介:

隨著越來越多的資料插入和查詢資料庫中,我們可能面臨的情況是我們需要添加新的機器來處理的資料量。但在傳統的 MySQL,這添加一個新的機器需要更多的工作(如shading,我們自己切割資料到不同的機器)。不過有時候我們只需要鍵值查詢而非 JOIN 操作。 所以我們希望如果有一個資料庫,可以幫助我們解決這些問題。 我們需要一個更強大的資料庫幫助我們處理的可擴展性。因此有許多分佈式的鍵值資料庫開發這種情況。 Cassandra 是基於 Java 的分佈式鍵值資料庫。它不像MySQL 包含  JOIN 操作。它幫你處理分佈式資料。您可以考慮整個cluster 是一個很大的 hash table。所有的容錯和資料分割都是由 Cassandra 自己處理。它提供了“增量的可擴展性”(這意味著你可以增加新的機器來容納更多的處理)。Cassandra 還支持 “Column” 功能,使他比純粹鍵值的資料庫更方便的。

以下是區別:


基本的鍵值資料庫:

table['key1'] =value 1

Cassandra

有Column特點:


Table['Key1'] ['column_family'] ['column1'] = Vaule1

資料模型:

在 Cassandra,它可以被認為是一個四,五維 Hash Table。從上到下,層次結構是這樣的。



因此,該查詢將如下所示: 

get <ksp>.<cf>['<key>']['<col>']                             Get a column value.
get <ksp>.<cf>['<key>']['<super>']['<col>']              Get a sub column value.



Key Space:

Cassandra,你可以定義多個 key space。 它就像是 MySQL 裡面的table。 它是一個(Row,[ColumnFamily])的list。 通常每一個應用可以對應到一個 key space。


Row:

對於 row key,你對每個相對應的 column family 都可以儲存資料。 在每一個 column family 資料中是根據 row key 來做排序

Column Family:
在 column family,它包含一個 column list 或 super column list。 你在配置 Cassandra 之前必須定義它 每一個 column family 都儲在一個單獨的文件。 而每一個 column family 都可以存無限多個 column。

Column:
它是最小的元素資料,它僅包含一個 name,一個 value,和一個timestamp。 您可以在任何時候添加新的或刪除 column。

Super Column:
Super column 是一個包含著許多 column 的 list。

架構:

Cassandra 使用 consistent hash 來做 key partition。 每個節點在Cassandra cluster 中將在 ring 中選取一個 token(0 <token<2 ^ 32)。ring  的大小是2 ^ 32。 所以每個節點都會在 ringt 裡有一個相對應的位置, 當新的 key insert 時,它將使用 MD5 hash,找到在 ring 裡面的下一個節點。資料將被儲存在相對應的節點。

下面的例子一樣,key 將被插入到節點 2。


replicate method:
如果你想存儲兩個副本資料 Cassandra cluster 它將資料存儲在未來兩個節點。

adding a new node:
在consistent hash,添加一個新節點只會影響鄰居節點。在這種情況下,我們並不需要重新分配所有資料。以下圖為例,一些資料存儲在節點 1 現在將存儲在新的節點 4。新的節點將隨機選擇一個 token,並根據 MD5 找到相應的位置。

參考: