Cassandra內部機制的相關技巧
閑話協(xié)議(Gossip)
Cassandra是一個有單個節(jié)點組成的集群 – 其中沒有“主”節(jié)點或單點故障-因此,每個節(jié)點都必須積極地確認集群中其他節(jié)點的狀態(tài)。它們使用一個稱為閑話(Gossip)的機制來做此事.每個節(jié)點每秒中都會將集群中每個節(jié)點的狀態(tài)“以閑話的方式傳播”到1-3個其他節(jié)點.系統(tǒng)為閑話數(shù)據(jù)添加了版本,因此一個節(jié)點的任何變更都會快速地傳播遍整個集群.通過這種方式,每個節(jié)點都能知道任一其他節(jié)點的當前狀態(tài):是在正在自舉呢, 還是正常運行呢,等等.
提示移交(Hinted Handoff)
在關于寫操作的文章中,我提到Cassandra會存儲數(shù)據(jù)的拷貝到N個節(jié)點.客戶端可以根據(jù)數(shù)據(jù)的重要性選擇一個一致性級別(Consistency level),例如, ConsistencyLevel.QUORUM表示,只有這N個節(jié)點中的多數(shù)返回成功才表示這個寫操作成功.
如果這些節(jié)點中的一個宕機了,會發(fā)生什么呢?寫操作稍后將如何傳遞到此節(jié)點呢?Cassandra使用了一種稱為提示移交(Hinted Handoff)的技術來解決此問題,其中數(shù)據(jù)會被寫入并保存到另一個隨機節(jié)點X,并提示這些數(shù)據(jù)需要被保存到節(jié)點Y,并在節(jié)點重新在線時進行重放(記住,當節(jié)點Y變成在線時,閑話機制會快速通知X節(jié)點).提示移交可以確保節(jié)點Y可以快速的匹配上集群中的其他節(jié)點.注意,如果提示移交由于某種原因沒有起作用,讀修復最終仍然會“修復”這些過期數(shù)據(jù),不過只有當客戶端訪問這些數(shù)據(jù)時才會進行讀修復.
提示的寫是不可讀的(因為節(jié)點X并不是這N份拷貝的其中一個正式節(jié)點),因此,它們并不會記入寫一致性.如果Cassandra的配置了3份拷貝,而其中的兩個節(jié)點不可用,就不可能實現(xiàn)一個ConsistencyLevel.QUORUM的寫操作.
逆熵(Anti-Entropy)
Cassandra的***一個眾所周知的秘密武器是逆熵(Anti-entropy).逆熵明確保證集群中的節(jié)點一致認可當前數(shù)據(jù).如果由于默認情況,讀修復(read repair)與提示移交(hinted handoff)都沒有生效,逆熵會確保節(jié)點達到最終一致性.逆熵服務是在“主壓縮”(等價與關系數(shù)據(jù)庫中的重建表)時運行的,因此,它是一個相對重量級但運行不頻繁的進程.逆熵使用Merkle樹(也稱為散列樹)來確定節(jié)點在列族(column family)數(shù)據(jù)樹內的什么位置不能一致認可,接著修復該位置的每一個分支.
原文鏈接:http://www.dbthink.com/?p=430