猴子都聽不懂的
Cassandra

By Seta

本次分享參考

O’Reilly Cassandra: The Definitive Guide Second Edition

Agenda

  • Gossip機制與錯誤偵測
     
  • Cassandra的OO
     
  • 複本策略與機制
     
  • 如何協調一致性
     
  • 你看不到的讀寫機制

先認識Gossip

Gossip協議起源於1987年由Allen Demers提出,他主要是研究如何在一個不穩定的網路中傳輸資訊的一個協議。

也就是透過像人與人之間愛聊八卦,一傳十、十傳百的概念來達到對彼此資訊認知目的

Gossip的概念

  • Cassandra 透過Gossiper(大嘴巴)來觀查一個節點名單(閨密)的狀況
  • 每一秒大嘴巴都會隨機關心一個閨密跟他聊天
  • 大嘴巴:你最近好嗎?(GossipDigestSynMessage.)
    A將資料(Key,Version)給B
  • 閨密:我很好啊~只是.....(GossipDigestAckMessage.)
    B將比A新的資料(Key,Value,Version)給A更新
  • 大嘴巴:原來如此我懂了,你放心我絕不會跟其他人說
    (GossipDigestAck2Message)
    A再將比B新的資料給B更新

Gossip錯誤處理機制

  • 當Gossip要找人八卦的時後發覺有人不理他了
    他很小心眼就會把他列入懷中的黑名單記起來
     
  • 然後用The Phi Accrual Failure Detector演算法來進行
    故障探測(failure detection)概念:
    1. 不信任,很難區分是Crash or Slow (你是真的在忙沒看到還是裝死)
    2. 透過奪命連環Call(HeartBeats)來決定你是在忙還是沒看到

Snitches

  • 用來設定cassandra ring裡的node怎麼分群
     
  • 決定Cassandra node與node之間的route

Snitches的種類

Cassandra的OO

Cassandra的OO的缺點 

  • 造成資料傾斜
     
  • 成本過高

    Ring環的tokens數量=
    集群的機器數量

     

Cassandra的OO的改善

  • Virtual Nodes的出現
     
  • 一個node最多會有256個Virtual nodes
     
  • 可以透過設定num_tokens來控制
     
  • 更平均的將資料分佈在nodes
     
  • 更方便維護新增、減少、修護nodes
     

SimpleStrategy

key經過hash會定位到hash環上的一個位置, 找到下一個vnode為數據的第一份存儲節點. 接下來的兩個vnode為另外兩個副本.

NetworkTopologyStrategy

指定複本資料到特定的資料中心或是單一資料中心中的不同叢集

CREATEKEYSPACE ExcelsiorWITHREPLICATION= {'class':'SimpleStrategy''replication_factor':3};
// 建立KeySpace時複本策略使用SimpleStrategy複本數為3

CREATEKEYSPACE ExcaliburWITHREPLICATION= {'class':'NetworkTopologyStrategy''dc1':3'dc2':2};
// 建立KeySpace時使用NetworkTopologyStrategy 並在dc1有3個複本 dc2有2個複本

Consistency Levels

Cassandra 因為在寫入或是讀取時每個Node上的資料不一定一致,所以用Consistency Levels來確認最新版的資料回傳給使用者

Consistency Levels 2

Consistency Level設定說明:
ONE 1
TWO 2
THREE 3
QUORUM(replication factor / 2 +1 )
ANY

Cassadnra的讀寫機制

Cassandra的寫入路徑:
Commit Logs > Memtables > SSTables

 

 

Commit Log

Commit Log是一個失敗回溯機制來確保當你的資料庫無預期的關機或崩潰時,Commit Log會確保你的資料不會不見,當你下次開機或重新啟動時Commit log會重新運作,將你未寫入的資料進行寫入的動作。

Memtable

Memtable是常駐在記憶體的資料結構,每個membtable都包含特定資料表的資料,當Memtable的資料數量達到一定的門檻時,Memtable將會把資料轉移至SSTables

SSTables

SSTables(Sorted String Table)的概念源自於Google的Bigtable,一但memtable將資料轉移到SSTable時舊的SSTables將會和新的資料進從合併產生一個新的檔案並且壓縮後移除舊的SSTable資料。

Caching

Key Cache:Key Cache是指對照SSTable的partition keys的索引來加速取得存在SSTable的資料(default enabled)
Row Cache:顧名思意是列的快取他可以大大提升我們在讀取資料的速度但也會消耗更多的記憶體這個快取與Memtable不同儲存在off-heap memory(default disable)
Counter Cache:用來加速計數的效能用來調整經常會被使用到的計數類型資料時所造成資源競爭(default enabled)

Hinted Handoff

Hinted機制就像一個便利貼備忘錄,當一個寫入的請求傳到NodeA當NodeA要將資料背景同步到NodeB時,NodeB因為各種因素例如網路問題,機器問題...等無法將資料寫到NodeB時,這時NodeA就會memo這一件事來提醒自已當NodeB可以使用時,會把這一件還沒完成的寫入繼續完成

 Tombstones 

當Cassandra要刪除資料時,他會更新你所要刪除的資料並加上一個Tombstones的標記,他並不會直接把資料刪除,直到SSTables進行合併時產生新的SSTable他才會刪除

Bloom Filters

Bloom 是一種演算法,加速Cassandra在讀取資料時的效率,用來確認一個元素是不是在一個集合中,當我們對Cassandra進行一個查詢時Cassandra 會先使用Bloom Filters(記憶體中)來確認資料在不在才會對儲存裝置進行動作讀取,透過這個方式來加速取得資料的速度(因為記憶體速度>硬碟速度)

Q&A

Gossip如何運作

  • Cassandra 透過Gossiper(大嘴巴)來觀查一個節點名單(閨密)的狀況
  • 每一秒大嘴巴都會隨機關心一個閨密跟他聊天
  • 大嘴巴:你最近好嗎?(GossipDigestSynMessage.)
  • 閨密:我很好啊~只是.....(GossipDigestAckMessage.)
  • 大嘴巴:原來如此我懂了,你放心我絕不會跟其他人說
    (GossipDigestAck2Message)
Made with Slides.com