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