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