Cassandra 設計用來處理多節點大型數據工作負載,系統中沒有單點,Cassandra 採用peer-to-peer架構,數據在所有節點之間分發。
- cluster中所有node具有相同的角色。每個node互相獨立,同時在內部又互相溝通。
- cluster中所有node都可以處理讀寫請求,而不用管數據具體在哪兒。
- 如果一個node掛了,其它node可以處理讀寫請求。
1. node之間的溝通
Cassandra 各node之間採用 gossip 協議進行溝通,gossip 進程每秒與集羣中最多三個node交換信息,信息包括node自身的信息以及與該node交換過信息的node的信息,這樣,所有node都可以很快獲取集羣中所有的node信息。
2. Data distribution and replication
Cassandra是一個分區的按行存儲的數據庫(partitioned row store database)。在Cassandra中,數據以table的形式組織起來,primary key唯一標記一行,同時,primary key也決定了數據行存儲的node,replication是數據行的備份,Cassandra將數據複製到多個node上,從而實現高可用和容錯。
下面分data distribution 和 replication兩個方面進行闡述,其中distribution說明將數據分發到哪個node,replication說明如何備份。
2.1 Data distribution
partitioner 決定了數據是怎樣在集羣中分佈的。簡單的講,partitioner是一個函數,根據partition key產生一個唯一標記一行的token,然後,這行數據根據token分發到集羣中的節點,通常,partitioner是Hash函數。Cassandra提供了三種partitioner,包括Murmur3Partitioner(default)、RandomPartitioner、ByteOrderedPartitioner。(爲更好理解這部分,可以參考一致性哈希)。
2.2 Data replication
Cassandra將數據存儲到多個node以實現高可用和容錯,replication策略決定了將數據備份到哪些節點。
replication factor 指數據在整個cluster中的份數,如果replication factor等於1,則數據在整個集羣中僅存在一份,此時,如果存儲數據的node出現故障,那麼數據就丟失了。在實踐中,replication factor 應該不超過cluster中node的數量。
Cassandra提供了兩種replication 策略:
- SimpleStrategy: 僅適用於單datacenter 單 rack。根據partitioner存儲第一份replica,然後在順時針方向的下一個node上存放下一份replica(不考慮網絡拓撲信息)。
- NetworkTopologyStrategy: 可以方便的擴展到多datacenter,推薦使用,同時,NetworkTopologyStrategy儘量避免將數據存儲到相同的rack上。
3. Snitches
snitch 決定了node屬於哪個datacenter的哪個rack。可以用於告知Cassandra集羣網絡拓撲信息,以實現高效的請求路由與分發、備份數據。
主要的snitch包括:
- dynamic snitching
- SimpleSnitch
- RackInferringSnitch
- PropertyFileSnitch
- GossipingPropertyFileSnitch
- ...
4. 總結
本文主要介紹Cassandra的架構、數據distribution 與 replication,下一章介紹Cassandra的內部信息,包括存儲引擎、Cassandra讀寫、數據一致性等。