Cassandra:基本概念
資料模型
Cassandra的資料模型與常見的關係型資料庫的資料模型有很大的不同
列(Column)
列是Cassandra的基本資料結構單元,具有三個值:名稱,值、時間戳
名稱 | 值 | 時間戳 |
---|---|---|
name:byte[] | value:byte[] | clock:byte[] |
在Cassandra中不需要預先定義列(Column),只需要在KeySpace裡定義列族,然後就可以開始寫資料了。
列族( Column Family)
列族相當於關係資料庫的表(Table),是包含了多行(Row)的容器。
ColumnFamily的結構舉例,如圖:
可以理解為Java結構 Map<String,Map<byte[],Column>>,如圖:
1)ColumnFamily 的2種類型
-
靜態column family(static column family)
靜態的column family,欄位名是固定的,比較適合對於這些column都有預定義的元資料
-
動態column family(dynamic column family)
動態的column family,欄位名是應用程式計算出來並且提供的,所以column family只能定義這些欄位的型別,無法不可以指定這些欄位的名字和值,這些名字和值是由應用程式插入某欄位才得出的。
2)Row key
ColumnFamily 中的每一行都用Row Key(行鍵)來標識,這個相當於關係資料庫表中的主鍵,並且總是被索引的。
3)主鍵
Cassandra可以使用PRIMARY KEY 關鍵字建立主鍵,主鍵分為2種
-
Single column Primary Key
如果 Primary Key 由一列組成,那麼稱為 Single column Primary Key
-
Composite Primary Key(複合主鍵)
如果 Primary Key 由多列組成,那麼這種情況稱為 Compound Primary Key 或 Composite Primary Key
列族具有以下屬性 -
- keys_cached - 它表示每個SSTable保持快取的位置數。
- rows_cached - 它表示其整個內容將在記憶體中快取的行數。
- preload_row_cache -它指定是否要預先填充行快取。
鍵空間 (KeySpace)
Cassandra的鍵空間(KeySpace)相當於資料庫,我們建立一個鍵空間就是建立了一個數據庫。
鍵空間包含一個或多個列族(Column Family)
注意:一般將有關聯的資料放到同一個 KeySpace 下面
鍵空間 (KeySpace) 建立的時候可以指定一些屬性:副本因子,副本策略,Durable_writes(是否啟用 CommitLog 機制)
副本因子(Replication Factor)
副本因子決定資料有幾份副本。例如:
副本因子為1表示每一行只有一個副,。副本因子為2表示每一行有兩個副本,每個副本位於不同的節點上。在實際應用中為了避免單點故障,會配置為3以上。
注意:所有的副本都同樣重要,沒有主從之分。可以為每個資料中心定義副本因子。副本策略設定應大於1,但是不能超過叢集中的節點數。
副本放置策略 (Replica placement strategy)
描述的是副本放在叢集中的策略
目前有2種策略,內容如下:
策略名 | 中文名 | 描述 |
---|---|---|
SimpleStrategy | 簡單策略 | 適用於只有一個數據中心。為叢集指定簡單的副本因子(有幾個副本) |
NetworkTopologyStrategy | 網路拓撲策略 | 推薦方式,因為可以擴充套件到多資料中心,可以單獨為每個資料中心設定複製因子 |
Durable_writes
否對當前KeySpace的更新使用commitlog,預設為true
副本 (Replication)
副本就是把資料儲存到多個節點,來提高容錯性
節點(Node)
儲存資料的機器
叢集(Cluster)
Cassandra資料庫是為跨越多條主機共同工作,對使用者呈現為一個整體的分散式系統設計的。Cassandra最外層容器被稱為群集。Cassandra將叢集中的節點組織成一個環(ring)(一致性hash處理),然後把資料分配到叢集中的節點(Node)上。
超級列
超級列是一個特殊列,因此,它也是一個鍵值對。但是超級列儲存了子列的地圖。
通常列族被儲存在磁碟上的單個檔案中。因此,為了優化效能,重要的是保持您可能在同一列族中一起查詢的列,並且超級列在此可以有所幫助。下面是超級列的結構。
資料型別
CQL提供了一組豐富的內建資料型別,使用者還可以建立自己的自定義資料型別。
CQL是Cassandra提供的一套查詢語言
數值型別
資料型別 | 含義 | 描述 |
---|---|---|
int | 32位有符號整型 | 和 Java 中的 int 類似 |
bigint | 64位長整型 | 和 Java 中的 long 類似 |
smallint | 16位有符號整型 | 和 Java 中的 short 類似 |
tinyint | 8位有符號整型 | 和 Java 中的 tinyint 類似 |
varint | 可變精度有符號整數 | 和 Java 中的 java.math.BigInteger 類似 |
float | 32位 IEEE-754 浮點型 | 和 Java 中的 float 類似 |
double | 64位 IEEE-754 浮點型 | 和 Java 中的 double 類似 |
decimal | 可變精度的 decimal | 和 Java 中的 java.math.BigDecimal 類似 |
文字型別
CQL提供2種類型存放文字型別,text和varchar基本一致
資料型別 | 含義 | 描述 |
---|---|---|
ascii | 文字 | 表示ASCII字串 |
text | 文字 | 表示UTF8編碼的字串 |
varchar | 文字 | 表示UTF8編碼的字串 |
時間型別
資料型別 | 含義 | 描述 |
---|---|---|
timestamp | 時間 | 包含了日期和時間,使用64位有符號的整數表示 |
date | 日期 | |
time | 時間 |
識別符號型別
型別 | 含義 | 描述 |
---|---|---|
uuid | 128位資料型別 | 通用唯一識別碼 CQL 中的 uuid 實現是 Type 4 UUID,其實現完全是基於隨機數的 |
timeuuid | Type 1 UUID |
集合型別
1)set
集合資料型別,set 裡面的元素儲存是無序的。
set 裡面可以儲存前面介紹的資料型別,也可以是使用者自定義資料型別,甚至是其他集合型別。
2)list
list 包含了有序的列表資料,預設情況下,資料是按照插入順序儲存的。
3)map
map 資料型別包含了 key/value 鍵值對。key 和 value 可以是任何型別,除了 counter 型別
使用集合型別要注意:
1、集合的每一項最大是64K。
2、保持集合內的資料不要太大,免得Cassandra 查詢延時過長,Cassandra 查詢時會讀出整個集合內的資料,集合在內部不會進行分頁,集合的目的是儲存小量資料。
3、不要向集合插入大於64K的資料,否則只有查詢到前64K資料,其它部分會丟失。
其他基本型別
型別 | 含義 | 描述 |
---|---|---|
boolean | 布林型別 | 值只能為 true/false |
blob | 二進位制大物件 | 儲存媒體或者其他二進位制資料型別時很有用 |
inet | IPv4 或 IPv6 網路地址 | cqlsh 接受用於定義 IPv4 地址的任何合法格式,包括包含十進位制,八進位制或十六進位制值的點或非點式表示 CQL 會輸出為 0.0.0.0 這種 地址形式。 |
counter | 計數器型別 | 值不能直接設定,而只能遞增或遞減 不能用作主鍵的一部分;如果使用計數器,則除primary key 列之外的所有列都必須是計數器 |
使用者自定義型別
如果內建的資料型別無法滿足需求,可以使用自定義資料型別。