Cassandra概況
Cassandra是一套開源分布式NoSQL數(shù)據(jù)庫系統(tǒng)。它最初由Facebook開發(fā),用于儲存收件箱等簡單格式數(shù)據(jù),集GoogleBigTable的數(shù)據(jù)模型與AmazonDynamo的完全分布式的架構(gòu)于一身。Cassandra的名稱來源于希臘神話,是特洛伊的一位悲劇性的女先知的名字,因此項目的Logo是一只放光的眼睛。Facebook于2008將Cassandra開源,此后,由于Cassandra良好的可擴(kuò)放性,被Digg、Twitter等知名Web2.0網(wǎng)站所采納,成為了一種流行的分布式結(jié)構(gòu)化數(shù)據(jù)存儲方案。Cassandra在2009年成為了Apache軟件基金會的Incubator項目,并在2010年2月走出孵化器,成為正式的基金會項目。
Cassandra功能介紹
Cassandra的主要特點(diǎn)就是它不是一個數(shù)據(jù)庫,而是由一堆數(shù)據(jù)庫節(jié)點(diǎn)共同構(gòu)成的一個分布式網(wǎng)絡(luò)服務(wù),對Cassandra的一個寫操作,會被復(fù)制到其他節(jié)點(diǎn)上去,對Cassandra的讀操作,也會被路由到某個節(jié)點(diǎn)上面去讀取。對于一個Cassandra群集來說,擴(kuò)展性能是比較簡單的事情,只管在群集里面添加節(jié)點(diǎn)就可以了。
這里有很多理由來選擇Cassandra用于您的網(wǎng)站。和其他數(shù)據(jù)庫比較,有三個突出特點(diǎn):
模式靈活
使用Cassandra,像文檔存儲,你不必提前解決記錄中的字段。你可以在系統(tǒng)運(yùn)行時隨意的添加或移除字段。這是一個驚人的效率提升,特別是在大型部署上。
真正的(高)可擴(kuò)展性
Cassandra是純粹意義上的水平擴(kuò)展。為給集群添加更多容量,可以指向另一臺電腦。你不必重啟任何進(jìn)程,改變應(yīng)用查詢,或手動遷移任何數(shù)據(jù)。()可以幫助您可隨時添加更多硬件,以便根據(jù)需求附加更多客戶和更多數(shù)據(jù)。
多數(shù)據(jù)中心識別
你可以調(diào)整你的節(jié)點(diǎn)布局來避免某一個數(shù)據(jù)中心起火,一個備用的數(shù)據(jù)中心將至少有每條記錄的完全復(fù)制。
剛性結(jié)構(gòu)
Cassandra沒有一個單一的故障點(diǎn),它可用于無法承受故障的關(guān)鍵業(yè)務(wù)應(yīng)用程序。
快速線性規(guī)模的性能
Cassandra線性可擴(kuò)展。它可以提高吞吐量,因為它可以幫助您增加群集中的節(jié)點(diǎn)數(shù)量。 因此,它保持快速的響應(yīng)時間。
容錯
Cassandra是容錯的。 假設(shè)集群中有4個節(jié)點(diǎn),這里每個節(jié)點(diǎn)都有相同數(shù)據(jù)的副本。 如果一個節(jié)點(diǎn)不再服務(wù),則其他三個節(jié)點(diǎn)可以按照請求進(jìn)行服務(wù)。
靈活的數(shù)據(jù)存儲
Cassandra支持所有可能的數(shù)據(jù)格式,如結(jié)構(gòu)化,半結(jié)構(gòu)化和非結(jié)構(gòu)化。 它可以幫助您根據(jù)需要更改數(shù)據(jù)結(jié)構(gòu)。
簡單的數(shù)據(jù)分發(fā)
Cassandra中的數(shù)據(jù)分發(fā)非常簡單,因為它可以靈活地通過在多個數(shù)據(jù)中心復(fù)制數(shù)據(jù)來分發(fā)所需的數(shù)據(jù)。
事務(wù)支持
Cassandra支持事務(wù),諸如原子性,一致性,隔離和持久性(ACID)等屬性。
快速寫入
Cassandra的設(shè)計是在便宜的商品硬件上運(yùn)行。 它執(zhí)行快速寫入,可以存儲數(shù)百TB的數(shù)據(jù),而不會犧牲讀取效率。
一些使Cassandra提高競爭力的其他功能:
范圍查詢
如果你不喜歡全部的鍵值查詢,則可以設(shè)置鍵的范圍來查詢。
列表數(shù)據(jù)結(jié)構(gòu)
在混合模式可以將超級列添加到5維。對于每個用戶的索引,這是非常方便的。
分布式寫操作
有可以在任何地方任何時間集中讀或?qū)懭魏螖?shù)據(jù)。并且不會有任何單點(diǎn)失敗。
應(yīng)用客戶facebook
主要特性
●分布式
●基于column的結(jié)構(gòu)化
●高伸展性
基本架構(gòu)
Cassandra沒有像BigTable或Hbase那樣選擇中心控制節(jié)點(diǎn),而選擇了無中心的P2P架構(gòu),網(wǎng)絡(luò)中的所有節(jié)點(diǎn)都是對等的,它們構(gòu)成了一個環(huán),節(jié)點(diǎn)之間通過P2P協(xié)議每秒鐘交換一次數(shù)據(jù),這樣每個節(jié)點(diǎn)都擁有其它所有節(jié)點(diǎn)的信息,包括位置、狀態(tài)等。
Cassandra的核心組件包括:
Gossip:點(diǎn)對點(diǎn)的通訊協(xié)議,用來相互交換節(jié)點(diǎn)的位置和狀態(tài)信息。當(dāng)一個節(jié)點(diǎn)啟動時就立即本地存儲Gossip信息,但當(dāng)節(jié)點(diǎn)信息發(fā)生變化時需要清洗歷史信息,比如IP改變了。通過Gossip協(xié)議,每個節(jié)點(diǎn)定期每秒交換它自己和它已經(jīng)交換過信息的節(jié)點(diǎn)的數(shù)據(jù),每個被交換的信息都有一個版本號,這樣當(dāng)有新數(shù)據(jù)時可以覆蓋老數(shù)據(jù),為了保證數(shù)據(jù)交換的準(zhǔn)確性,所有的節(jié)點(diǎn)必須使用同一份集群列表,這樣的節(jié)點(diǎn)又被稱作seed。
Partitioner:負(fù)責(zé)在集群中分配數(shù)據(jù),由它來決定由哪些節(jié)點(diǎn)放置第一份的copy,一般情況會使用Hash來做主鍵,將每行數(shù)據(jù)分布到不同的節(jié)點(diǎn)上,以確保集群的可擴(kuò)展性。
Replica placement strategy:復(fù)制策略,確定哪個節(jié)點(diǎn)放置復(fù)制數(shù)據(jù),以及復(fù)制的份數(shù)。
Snitch:定義一個網(wǎng)絡(luò)拓?fù)鋱D,用來確定如何放置復(fù)制數(shù)據(jù),高效地路由請求。
cassandra.yaml:主配置文件,設(shè)置集群的初始化配置、表的緩存參數(shù)、調(diào)優(yōu)參數(shù)和資源使用、超時設(shè)定、客戶端連接、備份和安全。
?
Cassandra數(shù)據(jù)庫設(shè)計與維護(hù)總結(jié)
1.分區(qū)字段設(shè)計時選用timeuuid/timestamp(比如每日或者每小時0點(diǎn)時間戳)+任意bucket字段(類型等固定的字段)
2.cluster字段可以根據(jù)需求設(shè)計
3.使用索引時的查詢條件中務(wù)必帶上分區(qū)字段的查詢條件,否則cassandra會去所有分區(qū)字段的索引中查詢,效率低下而且一旦查詢結(jié)果中超過10萬個墓碑,就會拋出異常
4.高基數(shù)字段比如true/false這類的一般不要上索引,否則會極大的降低查詢效率
5.由于cassandra的read repair機(jī)制,執(zhí)行大量刪除操作之后如果出現(xiàn)了大量read timeout需要在每臺cassandra的bin目錄下執(zhí)行
./nodetool flush
./nodetool $ keyspace $table
強(qiáng)制合并sstable
6.如果cassandra出現(xiàn)不同節(jié)點(diǎn)間的數(shù)據(jù)一致性錯誤,需要執(zhí)行。/nodetool repair $keyspace $table
7.如果repair還是不能解決問題,需要執(zhí)行 。/sstablescrub $keyspace $table清洗掉損壞的數(shù)據(jù),注意此操作如果中斷容易造成數(shù)據(jù)損壞,最好執(zhí)行前先做快照
8.cassandra默認(rèn)開啟了安全模式,執(zhí)行drop、truncate等敏感字段時會對數(shù)據(jù)做一次快照,過多快照會導(dǎo)致cassandra在啟動時遍歷目錄環(huán)節(jié)花費(fèi)過長時間,最終可能需要幾個小時才能啟動,
這個時候需要執(zhí)行。/nodetool clearsnapshot $keyspace
評論