cassandra框架模型之一——Colum排序,分区策略 Token,Partitioner bloom-filter,HASH
轉自:http://asyty.iteye.com/blog/1202072
一、Cassandra框架
二、Cassandra數據模型
Colum / Colum Family, SuperColum / SuperColum Family
Colum排序
三、分區策略
Token,Partitioner
bloom-filter,HASH
四、副本存儲
五、網絡嗅探
六、一致性
Quorum NRW
維護最終一致性
七、存儲機制
CommitLog
MenTable
SSTable
附
一、Cassandra框架
圖1Cassandra
Cassandra是社交網絡理想的數據庫,適合于實時事務處理和提供交互型數據。以Amazon的完全分布式的Dynamo為基礎,結合了Google BigTable基于列族(Column Family)的數據模型,P2P去中心化的存儲,目前twitter和digg中都有使用。
在CAP特性上,HBase選擇了CP,Cassandra更傾向于AP,而在一致性上有所減弱。
Cassandra的類Dynamo特性有以下幾點:
l對稱的,P2P架構
n無特殊節點,無單點故障
l基于Gossip的分布式管理
l通過分布式hash表放置數據
n可插拔的分區
n可插拔的拓撲發現
n可配置的放置策略
l可配置的,最終一致性
類BigTable特性:
l列族數據模型
n可配置,2級maps,Super Colum Family
lSSTable磁盤存儲
nAppend-only commit log
nMentable (buffer and sort)
n不可修改的SSTable文件
l集成Hadoop
二、Cassandra數據模型
Colum / Colum Family, SuperColum / SuperColum Family
Column是數據增量最底層(也就是最小)的部分。它是一個包含名稱(name)、值(value)和時間戳(timestamp)的三重元組。
下面是一個用JSON格式表示的column:
{//這是一個Column
name:"emailAddress",
value:"arin@example.com",
timestamp:123456789
}
需要注意的是,name和value都是二進制的(技術上指byte[]),并且可以是任意長度。
與HBase相比,除了Colum/Colum Family外,Cassandra還支持SuperColum/SuperColum Family。
SuperColum與Colum的區別就是,標準Column的value是一個“字符串”,而SuperColumn的value是一個包含多個Column的map,另一個細微的差別是:SuperColumn沒有時間戳。
{//這是一個SuperColumn
name:"homeAddress",
//無限數量的Column
value:{
street:{name:"street",value:"1234xstreet",timestamp:123456789},
city:{name:"city",value:"sanfrancisco",timestamp:123456789},
zip:{name:"zip",value:"94107",timestamp:123456789},
}
}
Column Family(CF)是某個特定Key的Colum集合,是一個行結構類型,每個CF物理上被存放在單獨的文件中。從概念上看,CF像數據庫中的Table。
SuperColum Family概念上和Column Family(CF)相似,只不過它是Super Colum的集合。
Colum排序
不同于數據庫可以通過Order by定義排序規則,Cassandra取出的數據順序是總是一定的,數據保存時已經按照定義的規則存放,所以取出來的順序已經確定了。另外,Cassandra按照column name而不是column value來進行排序。
Cassandra可以通過Colum Family的CompareWith屬性配置Colume值的排序,在SuperColum中,則是通過SuperColum Family的CompareSubcolumnsWith屬性配置Colum的排序。
Cassandra提供了以下一些選:BytesType,UTF8Type,LexicalUUIDType,TimeUUIDType,AsciiType,Column name識別成為不同的類型,以此來達到靈活排序的目的。
三、分區策略
Token,Partitioner
Cassandra中,Token是用來分區數據的關鍵。每個節點都有一個第一無二的Token,表明該節點分配的數據范圍。節點的Token形成一個Token環。例如使用一致性HASH進行分區時,鍵值對將根據一致性Hash值來判斷數據應當屬于哪個Token。
圖3 Token Ring
分區策略的不同,Token的類型和設置原則也有所不同。Cassandra (0.6版本)本身支持三種分區策略:
RandomPartitioner:隨機分區是一種hash分區策略,使用的Token是大整數型(BigInteger),范圍為0~2^127,Cassandra采用了MD5作為hash函數,其結果是128位的整數值(其中一位是符號位,Token取絕對值為結果)。因此極端情況下,一個采用隨機分區策略的Cassandra集群的節點可以達到2^127+1個節點。采用隨機分區策略的集群無法支持針對Key的范圍查詢。
OrderPreservingPartitioner:如果要支持針對Key的范圍查詢,那么可以選擇這種有序分區策略。該策略采用的是字符串類型的Token。每個節點的具體選擇需要根據Key的情況來確定。如果沒有指定InitialToken,則系統會使用一個長度為16的隨機字符串作為Token,字符串包含大小寫字符和數字。
CollatingOrderPreservingPartitioner:和OrderPreservingPartitioner一樣是有序分區策略。只是排序的方式不一樣,采用的是字節型Token,支持設置不同語言環境的排序方式,代碼中默認是en_US。
分區策略和每個節點的Token(Initial Token)都可以在storage-conf.xml配置文件中設置。
bloom-filter, HASH
Bloom Filter是一種空間效率很高的隨機數據結構,本質上就是利用一個位數組來表示一個集合,并能判斷一個元素是否屬于這個集合。Bloom Filter的這種高效是有誤差的:在判斷一個元素是否屬于某個集合時,有可能會把不屬于這個集合的元素誤認為屬于這個集合(false positive)。因此,Bloom Filter不適合那些“零錯誤”的應用場合,而在能容忍低錯誤率的場合下,Bloom Filter通過極少的錯誤換取了存儲空間的極大節省。
原理:位數組+ K個獨立hash(y)函數。將位數組中hash函數對應的值的位置設為1,查找時如果發現所有hash函數對應位都是1說明存在,很明顯這個過程并不保證查找的結果是完全正確的。
在Cassandra中,每個鍵值對使用1Byte的位數組來實現bloom-filter。
圖4 Bloom Filter
總結
以上是生活随笔為你收集整理的cassandra框架模型之一——Colum排序,分区策略 Token,Partitioner bloom-filter,HASH的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 没有路由器wifi密码怎么设置没路由器如
- 下一篇: 软件质量管理的八个法则