cassandra 概述

摘要

本篇文章主要是介紹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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容