作者:玄陵
一、Cassandra簡單介紹
Cassandra的曆史
Cassandra = Dynamo(distributed architecture ) + Bigtable(data format)。Cassandra最開始是Apache的頂級開源項目,他開源的資料庫曆史是來自于2篇論文:Dynamo(distributed architecture ),07年Amazon(亞馬遜)發表,Cassandra吸取了Dynamo的分布式架構;Bigtable(data format),由Google(谷歌)發表,Cassandra吸取了Bigtable的部分資料組織格式,及表的多種組織格式。由這2篇論文衍生出開源Cassandra。
Cassandra的總體架構
分布式層面

Apache Cassandra的特性:
線性擴充:它有去中心化的架構;
高可用:它有多副本,副本讀寫政策能夠保證可用性較高;
高性能:主要取決于它底層的LSM Tree Storage;
靈活應用:通過CQL語言去通路Cassandra,是wide column的寬表模型。
DHT環(圖左):
在環上有5個節點,每個節點把環進行劃分,在Cassandra設計裡,每一個節點對應負責一部分的資料範圍,它能保證所有資料映射到環上最小到最大的範圍,每個節點将DHT環的範圍進行均衡切分,切分後能保證每個節點負責範圍相對均勻,任何一條資料來到這條環上,都可以做到相對均勻的選擇它對應的節點。
單個節點是由LSM Tree的引擎構成,他有自己的Memtable,有自己的 WAL Commit Log有自己的一個SStable,可以保證它的寫、讀的性能比較好。
環外的Clients,輸入一條SQL,選擇任意一個Cassandra服務端的節點去進行連接配接,然後在對應的節點上可以基于你的CQL編譯出來一個結果, 選擇你的資料需要落在的副本節點上,是它一次在分布式層面的架構寫入的流程。
Cassandra的初步認識
單節點層面
Cassandra在單個節點實際組成的子產品,在圖的左邊有ABCDE5個節點,然後去分解B節點對應的組成子產品,最上層是由網絡層組成的,網絡層主要的是實作了使用者請求過來的CQL語句,以及對 CQL的Binary協定請求的實作。
當CQL請求過來經過我們的網絡層,網絡層的Server把這個對應的請求轉發到下面會有一個CQL的Parser(Cassandra内部的對SQL語言進行解析的子產品,這個子產品是把對應的SQL類string語言轉換成對應的statement,轉換成在Cassandra内部可進行請求編譯的結果)。
還有meta的管理的子產品,Cassandra所有的錄入表資訊以及我們的 scheme資訊等管理的子產品,底層 Commitlog/sstable/index等管理的子產品,最下層是我們的一個檔案系統。
Cassandra的架構,它底層是直接跟Linux、或者windows平台對應的底層的local file system進行互動的,在看網絡層下面的Gossip,是讓叢集中的ABCDE這5個節點互相的感覺到彼此,路由資訊都是由Gossip感覺維護的,也能夠各個節點的探活狀态。再下層就是DHT環,在後面個replication的management,是對副本的管理的政策。通過這兩幅圖,我們可以看到Cassandra在整體的分布式層面,以及在單節點層面,它請求的或者說組織的一個子產品情況。
通過這兩幅圖,我們可以大概Cassandra架構有一定了解,它是分布式的資料庫、區中心化的資料庫,單節點是由lsm區域進行構成的引擎,每個節點它最上層是有一個網絡層,然後下面會直接把所有的輸入CQL進行編譯成結果。
二、Cassandra CQL介紹
第二部分詳細介紹CQL對應一些文法,通過了解到對應的文法之後,我們可以如何去使用Cassandra,進行簡單的讀和寫、建表等基本操作有一個初步的認識。
Cassandra為了友善使用者去操作或請求它自己所實作的類似于Query Language,自定義的一個輕的 native的 SQL的語言。
可以通過社群datastax或Netflix再或任何其他的以及開源的一個driver去通路我們的Cassandra,通過我們的CQL語言去通路Cassandra,原生支援:java/c++/python/nodejs/php/c#/go/ruby等多語言去通路Cassandra,同時也支援spark 通路。
通過HBase KV api VS CQL 寫一條資料對比可以看的,縮短了代碼行數,直接使用 SQL語言進行一個操作,比較友善。
CQL總體介紹
把這個分三塊Data type、DDL/DML/ACL、INDEX/MV/UDF/IDA:
Data type包含:基礎資料類型、集合資料類型、UDT(User-defined-Type)。
DDL/DML/ACL包含:DDL: CREATE/DROP、DML:SELECT/UPDATE/DELET/INSERT、ACL:ROLE/USER/PASSWORD/…。
INDEX/MV/UDF/IDA包含:Secondary index/SaSI Index、Materialized View、UDF/UDA。
CQL幾個概念
在介紹CQL語言之前,要先去了解幾個比較基本的概念,Cassandra自己定義的意義和備注。
Partition key是Cassandra特有的,表示分區鍵,可以确定資料存放的節點。落在哪個節點上面去,資料它屬于哪個節點或者哪幾個副本都是它決定。
cql_type 是由 native_type | collections | udt | tuple |custom_type 類型組成的。資料結構豐富,便于業務直接使用,無需封裝,eg:inet,使用者使用ip直接使用無需轉換。要強調的是Cassandra的Type還定義在别的資料庫不常見的一些類型,比方說:Inet就是定義的 IP的資料類型,如果使用者要存儲某個IP類型,那麼它就直接可以用Inet這個類型去存儲。
是以我們的所有的類型是在建表的時候,通過定義某一個列的名字後,會根據跟上列的對應的類型。
Collecion Type是一個集合資料類型,其中map, set,list,是别的資料庫裡面不常見的,但是是日常用的比較多的類型,Collecion Type可以基于自己的業務場景去操作的。
UDT:User Defined Type就是組合了多種類型成包括成一種新的類型,并支援:CREATE /ALTER /DROP文法。
CQL DDL
DDL的一些使用的方式CREATE KEYSPACE、USE KEYSPACE 、ALTER KEYSPACE、DROP KEYSPACE、 DESCRIBE KEYSPACE;CREATE TABLE 、ALTER TABLE、 DROP TABLE、 DESCRIBE TABLE、 TRUNCATE ,建表,鍵值空間、修改表、修改鍵值空間、删除表、删除鍵值空間、還有清空表。
定義KEYSPACE實際上會定義兩個東西,第一個Replication,下面會有兩個子項目,一個是class,class也分兩種,一種是Simple strategy和NetworkTopologyStrategy ,主要定義了的副本的擺放政策,就是在Cassandra執行裡面,一行資料會放在多個副本上面,多個副本的擺放政策這裡定義它是順序的還是逆序的,還是說以某種方式擺放的;副本數Replication factor,會定義一行資料寫進來,在分布式的節點上面有幾個節點會放,副本因子是多少,
舉例:
CREATE KEYSPACE KS1 WITH replicate application,它的class simple strategy它的擺放政策是1;
CREATE KEYSPACE KS2, class擺放政策是networkToplogyStrategy,因為使用的NetworkToplogy,這裡需要定義一個對應的跟NetworkToplogy相關的叫DC的概念,如圖可見定義的 dc1的副本數是1,如果使用者有多DC概念,後面可以跟上DC2、DC3、DC4以及在各個DC下面的一個擺放的副本因子。
CQL的DDL對Table,在建立一個table的時候,必須要有一些對應的資訊:
- Primary key : 必須定義,由partition key 和 cluster key組成
- Partition key :必須定義,确定資料的擺放實體位置
- Cluster key:可以不定義,确定資料在partition 下的擺放情況
- default_time_to_live: 表級别ttl;如果一個資料希望在所有表下面的資料都有TTL的話 ,就用此定義,機關是秒。
- Compaction政策:STCS/LCS/TWCS;
- Compression壓縮政策:SNAPPY/LZ4;
CREATE對應TABLE,定義了一個 PK的類型是text,CK類型是text,regularcn類型也是text;
定義的主鍵是由PK和CK組成的,這裡PK就是partition key,然後CK是 cluster key;
對應的參數,如default_time_to_live是 100秒;
Compaction政策是 SizeTieredCompactionStrategy,還有一些門檻值;
Compression用定義的是lz4,如上圖下面 tb是沒有參數的,如果沒有參數它會定義預設的設定一些參數。
CQL DML
DML : SELECT / INSERT / UPDATE/ DELETE /BATCH
1、SELECT
• 支援擷取指定列以及通配符操作;
• 支援LIMIT/PARTITION LIMIT/ ORDE BY /GOUP BY ;
• 支援native function 處理操作: count、max、min、sum、avg等
• 支援JSON;
• 其他多數豐富操作;
舉例
如圖所示SELECT*from這個表,包括count、limit、 some select等資料,大概是一些對應的操作以及select執行 select資料,以Jason的方式輸出,這裡都有對應的一些例子可以做參考。
2、INSERT
• 支援正常寫資料,primary key 必須指定資料
• 支援寫入JSON資料;
• 支援cell 以及row TTL;
• 保證線性一緻性:IF NOT EXIST
3、UPDATE
• 需要指定primary key,主鍵列必須要指定
• 如果資料存在就更新,不存在則寫入
4、DELETE
• 支援行、列級别删除
如圖所示 UPDATE對應的資料列或者行資料,使用了一個TTL,UPDATE ks. Tb USING TTL SET age= 20 WHERE name,這個nameprimary key;
對應的delete這一行資料,把WHERE name = xl行資料全删掉。
5、BATCH
• 文法:BEIGIN BATCH開始,以 APPLY BATCH 結束,中間可包含多條INSERT/UPDATE/DELETE;
• 支援LOGGED/UNLOGGED BATCH 2種模式。LOGGED BATCH 保證batch資料最終全被寫入
• 提高寫入吞吐;
如圖所示分了兩條INSERT一條update以及一條delete,最後以看到select資料是符合需求的。
CQL ACL
• Role級别操作,支援賬戶密碼,role資源操作;
• 各種資源級别的鑒權;
• 常見grant 以及revoke操作(role資源和permissions);
如圖所示,首先是以Cassandra使用者user去登入,登入時建立了一個ROLE,CREATE ROLE JACK可以 log in,然後password是super user,這是CREATE ROLE的文法裡面需要定義的一些操作,第二次以jack使用者去 log in的時候,執行了LISE ROLES ,可以看到Cassandra和Jack兩個使用者對應的permission,執行了一些grant和revoke操作,通可以通過grant、revoke去操作,讓 Jack對某個KEYSPACE或select的操作,對 Jack可以決定是否有效。
CQL INDEX
INDEX : Secondary Index/ SASI / Materialized View
1、Secondary Index
• Local Index,索引表資料和資料表資料共存;适用于基數适中的資料表列;
• 可以指定索引名,若不指定則自動生成;
• Counter列不支援二級索引;
• 頻繁删除以及update的列不推薦使用;
• 支援多重索引查詢,支援集合資料類型上建構索引;
如圖所示可以看到例子裡面建了對這個表上面兩個列對應的進行了建構索引,查詢的時候也基于對應的列去查詢,以空間換時間的一個方式。
2、SASI : Sstable Attached Secondary Index
• Local Index的一種,支援較多索引模式:prefix,contains,sparse,支援輕搜尋功能;
• 對字元串支援的prefix 和 contains功能支援,輕模糊比對,like ’%key‘, like ‘%key%’
• 使用analyzer可以對某個列的文本資料做詞幹分析;
• 豐富的索引建構選項:大小寫敏感,索引模式,是否使用anlyzer;
• 不支援collection類型;
• 實驗功能,不推薦生産使用;
例一
如圖所示,這個例子也對應地建構了一個對應的索引,使用了一個SASI的索引,支援一些對應的操作,可以看到是用like一個模糊比對比對出對應的一些資料。
例二
如圖所示,在建構索引的時候指定對應的anlyzer,可以通過anlyzer去做一些資料的分詞,但允許的資料量不是特别大,如果真正需要單個類的資料量比較大的情況,還是建議用一些搜尋引擎。
3、Materialized View
• 全局索引表,資料基于資料表建構;
• 适用于資料表基數較高的資料列;
• 需要指定新的primary key;
如圖所示CREATE Materialized View ,新Materialized View是select所有的資料,把所有的資料都當放到Materialized View裡面,類似于全一種新的一個表。