Apache Cassandra 是一種分布式非關(guān)系型數(shù)據(jù)庫,具有高性能、可擴展、無中心化等特征。
一種column-based數(shù)據(jù)庫。
Cassandra所支持的基本數(shù)據(jù)模型。這些基本數(shù)據(jù)模型有:Column,Super Column,Column Family以及Keyspace。


(官方文檔對使用這個持謹慎意見)


在抽象設(shè)計模型時,我們常常需要面對另外一個問題,那就是如何指定各Column Family所使用的各種鍵。在Cassandra相關(guān)的各類文檔中,我們常常會遇到以下一系列關(guān)鍵的名詞:Partition Key,Clustering Key,Primary Key以及Composite Key。那么它們指的都是什么呢?



而在一個CQL語句中,WHERE等子句所標(biāo)示的條件只能使用在Primary Key中所使用的列。您需要根據(jù)您的數(shù)據(jù)分布決定到底哪些應(yīng)該是Partition Key,哪些應(yīng)該作為Clustering Key,以對其中的數(shù)據(jù)進行排序。
一個好的Partition Key設(shè)計常常會大幅提高程序的運行性能。首先,由于Partition Key用來控制哪個結(jié)點記錄數(shù)據(jù),因此Partition Key可以決定是否數(shù)據(jù)能夠較為均勻地分布在Cassandra的各個結(jié)點上,以充分利用這些結(jié)點。同時在Partition Key的幫助下,您的讀請求應(yīng)盡量使用較少數(shù)量的結(jié)點。這是因為在執(zhí)行讀請求時,Cassandra需要協(xié)調(diào)處理從各個結(jié)點中所得到的數(shù)據(jù)集。因此在響應(yīng)一個讀操作時,較少的結(jié)點能夠提供較高的性能。因此在模型設(shè)計中,如何根據(jù)所需要運行的各個請求指定模型的Partition Key是整個設(shè)計過程中的一個關(guān)鍵。一個取值均勻分布的,卻常常在請求中作為輸入條件的域,常常是一個可以考慮的Partition Key。
除此之外,我們也應(yīng)該好好地考慮如何設(shè)置模型的Clustering Key。由于Clustering Key可以用來在Partition內(nèi)部排序,因此其對于包含范圍篩選的各種請求的支持較好。
- 去中心, 各個節(jié)點地位等同,通過多個副本機制避免單點故障。
- 組成部分:節(jié)點、數(shù)據(jù)中心(相關(guān)節(jié)點集合?同一類數(shù)據(jù)嗎?)、集群(所有節(jié)點或者是所有數(shù)據(jù)中心)、提交日志(崩潰恢復(fù)機制,每個寫入操作都將寫入提交日志)、存儲表(提交日志后,數(shù)據(jù)將被寫入存儲表。有時,對于單列系列,將有多個內(nèi)容表。)SSTable(內(nèi)容達到閾值后,存儲到的數(shù)據(jù)磁盤文件)、Bloom filter(?特殊的緩存,每次查詢都會訪問,用途:用于測試元素是否是集合成員,通過這個找到SStable?)
-
寫操作: 寫操作
數(shù)據(jù)首先被寫入節(jié)點的提交日志捕獲,然后存儲在內(nèi)存表中,當(dāng)內(nèi)存表滿時,數(shù)據(jù)將被寫入SStable。
-
讀操作: 讀操作
- nosql偏好數(shù)據(jù)冗余,因為nosql一般無法做表關(guān)聯(lián)查詢
- Keyspace相當(dāng)于一個數(shù)據(jù)庫, durable_writes表示是否在寫入數(shù)據(jù)前是否要進行 commit log,默認為true,如果為false則有可能丟失數(shù)據(jù)。還包括replication factory:復(fù)制因子(多少副本),Replica placement strategy : 復(fù)制策略(網(wǎng)絡(luò)結(jié)構(gòu))
-
Column Family:列家族, 可以認為是mysql中的表,是記錄的集合。column family示意圖
-
Column: Column Family由若干的記錄【像是一個大map】(key, column)組成,其中的key是一個主鍵,而column是這個鍵對應(yīng)的value。 而這個column呢, 實際還是一個map, 對應(yīng)著(column_name, column_value,timestamp[用于感知哪個是最新記錄])。(cassandra以列為中心,按列進行存儲,這應(yīng)該就是為什么叫做column-based的原因吧)column-based
- cassandra的key:primary key(partition key+ clustering key),partition key:用于路由 記錄 至某個節(jié)點,clustering key:記錄按這個排序。
- 整個數(shù)據(jù)結(jié)構(gòu)類似 map<partitionkey, sortedmap<clusterkey+column,value>> 所以查詢的時候只能由外層往內(nèi)層查詢。primarykey必須用=,因為指定分區(qū), clusterkey必須遵循最左匹配有點類似索引.
- http://www.itdecent.cn/p/e678d6f812c3
-
查詢
整個primary key組成主鍵(不可重復(fù)),并且只能查主鍵。
- 總結(jié)一下, 其實就是一個寫入快, 數(shù)據(jù)量大的一種查詢限定的數(shù)據(jù)庫。
- 使用參見API。
- cql很像sql, insert可以插入主鍵相同的數(shù)據(jù), 然后會覆蓋前一條, 在mysql is impossible!
- 存儲是一列一列的, 整體是大的key-value對, 逐列向內(nèi)剝開。




