1. 程式人生 > 其它 >Cassandra:基本概念

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 列之外的所有列都必須是計數器

使用者自定義型別

如果內建的資料型別無法滿足需求,可以使用自定義資料型別。