摘要
本篇文章主要是介紹cassandra與其他NoSQL的區(qū)別以及其身的特點(diǎn)與應(yīng)用場(chǎng)景。在關(guān)系數(shù)據(jù)庫我們沒必要選擇數(shù)據(jù)庫,通常需要適配oracle/mysql/sql server/db2 等多種數(shù)據(jù)庫。但是今天的NoSQL 還不夠成熟,以及每一款的NoSQL 數(shù)據(jù)庫應(yīng)用領(lǐng)域不是很寬泛,設(shè)計(jì)理念也有很大差異,所以通常我們需要為我們的應(yīng)用評(píng)估究竟哪款NoSQL數(shù)據(jù)庫比較合適。個(gè)人認(rèn)為各個(gè)NoSQL數(shù)據(jù)庫并沒有誰好誰差,需要從自己的應(yīng)用本身出發(fā)來考量。
NoSQL比較——華山論劍,誰與爭(zhēng)鋒
排名
從DB Engines提供的數(shù)據(jù)可以看出,cassandra目前在NoSQL數(shù)據(jù)庫排名第二,僅次于與MongoDB。所有數(shù)據(jù)庫中排名第七。而且從趨勢(shì)圖中可以看出,cassandra目前處于快速上升階段.
性能比較
有很多大公司或者學(xué)校的科研機(jī)構(gòu)對(duì)目前比較流行的NoSQL 做過詳細(xì)的benchmark.綜合來看,cassandra的 insert throughput 有優(yōu)勢(shì),線性擴(kuò)展很好(貌似最流行的mongoDB在這一方面表現(xiàn)的不是很好),寫操作要優(yōu)于讀操作。但是write,read latency還是比較大,不如其他的NoSQL.具體的讀者可以參考下下面的兩個(gè)鏈接信息.
http://www.planetcassandra.org/nosql-performance-benchmarks/
http://www.csdn.net/article/2013-04-15/2814886-nosql-benchmark
cassandra案例
cassandra 試用的場(chǎng)景主要有5個(gè)方面
1.物聯(lián)網(wǎng)
物聯(lián)網(wǎng)應(yīng)用中有大量的傳感器和設(shè)備,需要采集環(huán)境信息,然后發(fā)送給上位機(jī)。這些信息都是時(shí)間順序排列的,cassandra非常適合用來存儲(chǔ)這些信息。
2.個(gè)性化
使用cassandra接收,分析??梢蕴峁┛焖伲统杀?,可擴(kuò)展的用戶體驗(yàn)
3.message
最早facebook就是使用cassandra來存儲(chǔ)message(不過后期好像替換掉了)
4.欺騙檢測(cè)
cassandra可以是欺騙分析模式變得更快速,精確,高效
5.列表
產(chǎn)品目錄,電源評(píng)分,cassandra可以將用戶選中的諸多項(xiàng)目作為一個(gè)集合存儲(chǔ)起來
目前apple擁有最大的cassandra cluster.超過75,000nodes,存儲(chǔ)數(shù)據(jù)達(dá)到10PB.不過apple沒有關(guān)于他們使用cassandra的用途的相關(guān)報(bào)告。此外netflix 也有2500 nodes的cassandra cluster,netflix 是一家流媒體公司,使用cassandra來儲(chǔ)存用戶的訪問痕跡,以及l(fā)og數(shù)據(jù),能夠處理10M transactions/s的并發(fā)量。netflix在cassandra的實(shí)踐過程中,遇到過很多的坑,也誕生了很多優(yōu)秀的解決方案,他們都通過blog,code等方式開源了一部分出來。,是后續(xù)cassandra學(xué)習(xí)者不可多得的參考資料。
國內(nèi)cassandra最早的實(shí)踐者應(yīng)該是360,用在搜索業(yè)務(wù)上,超過了1000Nodes.然后還有宜搜一家創(chuàng)業(yè)公司,做手機(jī)端的搜索,規(guī)模也有250Nodes.
總體架構(gòu)——會(huì)當(dāng)凌絕頂,一覽眾山小###
CAP
在NoSQL領(lǐng)域,CAP理論不可不提的。
C:Consistency 一致性,數(shù)據(jù)信息保持一致
A:Available 可用性
P:Partition tolerance 集群能夠容納一部分節(jié)點(diǎn)/數(shù)據(jù)分區(qū) down掉的情況發(fā)生
CAP 理論指出你不可能想獲得一個(gè)操作低延遲,同時(shí)使CAP 都滿足。cassandra 是犧牲了一部分的C,保證
AP.從而降低延遲。當(dāng)然如果你不在乎延遲,那么在cassandra中你也是可以調(diào)整的,使C也得到保證。
Constistency Level
cassandra創(chuàng)建keyspace的時(shí)候可以指定數(shù)據(jù)在cluster中存儲(chǔ)幾份
create keyspace test with replication={'class':'NetworkTopologyStrategy','replication_factor':3}
RF=3
在cassandra client 端,對(duì)于每次的write/read操作都可以分別指定consistency level.
如
consistency level=ONE 表示只要有一份數(shù)據(jù)返回,就認(rèn)為操作成功了。
consistency level=quorum,表示只要有(n+1)/2 【向上取整】份數(shù)據(jù)返回,就認(rèn)為操作成功了。n
就是上面創(chuàng)建Keyspace 時(shí)指定的RF
一般來說,只要保證W+R>N就可以實(shí)現(xiàn)一致性。W等于write寫操作指定的consistency level.R等于讀指定的consistency level.N等于replication_factor
值
上面我們說過,如果你不在乎延遲,那么可以調(diào)節(jié)。使consistency得到保證。在這里,你可以指定Consistency Level=ALL。
這樣就是強(qiáng)一致性。
通過我們的寫操作Consistency Level 設(shè)置為QUORUM,即超過一半的replication寫人成功就認(rèn)為這次寫操作成功。剩下的replication我們不能
保證一定能寫入成功。cassandra有其他的機(jī)制保證一條記錄最終能夠一致,及達(dá)到RF設(shè)置的要求。所以cassandra的一致性又稱之為最終一致性。
最終一致性
1.read repair
cassandra去讀數(shù)據(jù)的時(shí)候,當(dāng)有read consistency level 份數(shù)據(jù)成功返回的時(shí)候就認(rèn)為成功了。但是會(huì)有異步操作去檢測(cè)這條record是不是都存在,如果有個(gè)Node上面丟失了這個(gè)record,就會(huì)去修復(fù)。
2.hintedhandoff repair
當(dāng)某個(gè)節(jié)點(diǎn)down后,coordinator會(huì)將應(yīng)當(dāng)寫入到這個(gè)down node的信息寫入到自己本地hinted 文件。當(dāng)檢測(cè)到這個(gè)節(jié)點(diǎn)
恢復(fù)了,coordinator會(huì)使用hint將這些數(shù)據(jù)再寫入到down node.當(dāng)然,超過設(shè)定的max_hint_window_in_ms時(shí)間后,hint
文件就會(huì)被刪除。down node節(jié)點(diǎn)的數(shù)據(jù)就不會(huì)通過這種方式來恢復(fù)了。
3.anti-entropy repair
這種方式需要手動(dòng)執(zhí)行。nodetool repair.
cassandra 有一個(gè)叫Merkle trees 的結(jié)構(gòu)來存儲(chǔ)每份復(fù)制數(shù)據(jù)應(yīng)該保存在哪個(gè)節(jié)點(diǎn)。
nodetool repair 就是比較發(fā)現(xiàn)目前cluster與Merkle trees的差別,然后修復(fù)復(fù)制數(shù)據(jù)。
分片
數(shù)據(jù)分片的技術(shù)在關(guān)系型數(shù)據(jù)中就有,就是將相似的數(shù)據(jù)放在一起,這樣查詢相似的數(shù)據(jù),就可以查詢更少的物理節(jié)點(diǎn)/分區(qū)了,
大大減少了延遲。
cassandra 提供了靈活的分片規(guī)則,你可以指定不同的partition key來對(duì)數(shù)據(jù)分片。
默認(rèn)使用org.apache.cassandra.dht.Murmur3Partitioner來實(shí)現(xiàn)。
create table test (
name text,
age int,
address text,
PRIMARY KEY(name,address,age)
);
test 這種表的partition key 就是name 字段,根據(jù)name的hash value值在token ring 中的范圍,來存儲(chǔ)一條記錄。
這樣一樣name的數(shù)據(jù)會(huì)有一樣的hash value.就會(huì)存儲(chǔ)在一個(gè)partition中。
參考
http://db-engines.com/en/ranking
http://db-engines.com/en/ranking_trend
http://stackoverflow.com/questions/2892729/mongodb-vs-cassandra