1. 程式人生 > >Cassandra 學習三 數據模型

Cassandra 學習三 數據模型

ase 設計時 order simple asto space tag coff imp

Cassandra如何存儲數據的概述。

  集群(Cluster)

  ·Cassandra數據庫分布在幾個一起操作的機器上。最外層容器被稱為集群。對於故障處理,每個節點包含一個副本,如果發生故障,副本將負責。Cassandra按照環形格式將節點排列在集群中,並為它們分配數據。

鍵空間 (Keyspace)(相當於關系型數據庫的DataBase)

  鍵空間是Cassandra中數據的最外層容器。Cassandra中的一個鍵空間的基本屬性是 -

  • 復制因子 - 它是集群中將接收相同數據副本的計算機數。

  • 副本放置策略 - 它只是把副本放置策略。我們有簡單策略(機架感知策略),舊網絡拓撲策略(機架感知策略)和網絡拓撲策略(數據中心共享策略)等策略。

  • 列族(類似於關系型數據庫中的表(Table) - 鍵空間是一個或多個列族的列表的容器。列族又是一個行集合的容器。每行包含有序列。列族表示數據的結構。每個鍵空間至少有一個,通常是許多列族。

創建鍵空間的語法如下 -

CREATE KEYSPACE Keyspace name
WITH replication = {‘class‘: ‘SimpleStrategy‘, ‘replication_factor‘ : 3};


Cassandra列族示意如下:整個是一個列族,包含了兩行,兩行的列可以不一樣。(類比關系型數據庫,相當於整個表有兩條記錄Row key1和Row key2)

技術分享圖片

下面的示例可以讓我們更好地理解Cassandra的數據存儲:

Musician:                           ColumnFamily 1 (列族)
    bootsy:                         RowKey 
        email: [email protected],    ColumnName:Value 
        instrument: bass            ColumnName:Value 
    george:                         RowKey 
        email: [email protected]     ColumnName:Value
Band:                               ColumnFamily 2 
    george:                         RowKey 
        pfunk: 1968-2010            ColumnName:Value

另外,Cassandra還有一種可在列之間建立關聯的超級列(Super Column),你可以往超級列中添加子列。

技術分享圖片

如果用JSON表示,一組存放在列族中的數據看起來是這樣的:

Hotel {
    key: AZC_043 { name: Cambria Suites Hayden, phone: 480-444-4444,address: 400 N. Hayden Rd., city: Scottsdale, state: AZ, zip: 85255} 
    key: AZS_011 { name: Clarion Scottsdale Peak, phone: 480-333-3333,address: 3000 N. Scottsdale Rd, city: Scottsdale, state: AZ, zip: 85255} 
    key: CAS_021 { name: W Hotel, phone: 415-222-2222,address: 181 3rd Street, city: San Francisco, state: CA, zip: 94103} 
    key: NYN_042 { name: Waldorf Hotel, phone: 212-555-5555,address: 301 Park Ave, city: New York, state: NY, zip: 10019} }

使用Cassandra創建鍵空間Hotelier,列族為Hotel,並查詢行鍵(Row Key)為“NYN_042”的結果,

cassandra> get Hotelier.Hotel[‘NYN_042‘] 
=> (column=zip, value=10019, timestamp=3894166157031651)
=> (column=state, value=NY, timestamp=3894166157031651)
=> (column=phone, value=212-555-5555, timestamp=3894166157031651)
=> (column=name, value=The Waldorf=Astoria, timestamp=3894166157031651)
=> (column=city, value=New York, timestamp=3894166157031651)

列(Column)
Cassandra的列是一組鍵值對(和關系型數據庫中的列不一樣)

使用JSON描述的列結構:

{
    "name": "email",
    "value: "[email protected]", 
    "timestamp": 1274654183103300
}

超級列(Super Column)的結構:(鍵值對的嵌套)

技術分享圖片


最後讓我們來鞏固一下Cassandra和關系型數據庫的區別吧:


  • 沒有查詢語言:No SQL (Structured Query Language);

  • 沒有外鍵約束:關系型數據庫的最重要特征;

  • 雙重簇索引:在關系型數據庫中,每個表只能指定一個簇索引,其它的索引查詢都會導致全表掃描,但在Cassandra中,我們可以有第二級的簇索引;

  • 排序是在設計時決策:Cassandra不支持Order By,排序是需要設計時考慮,而不是像在關系型數據庫查詢時刻使用Order By;

  • 無數據結構約定:這是Cassandra最大的優勢,在關系型數據庫中,我們設計數據庫結構時總是慎之又慎,但在Cassandra中不需要預先約定數據結構。

 

Cassandra 學習三 數據模型