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