Gossip 是一個(gè)對等網(wǎng)絡(luò)通信協(xié)議,節(jié)點(diǎn)間斷性的交換他們自身的狀態(tài)信息以及其他它們知道的節(jié)點(diǎn)信息库糠。gossip 每中和集群中最多三個(gè)節(jié)點(diǎn)交換信息司忱。不僅交換他們自身信息北秽,而且還交換通過之前的gossip了解的其他節(jié)點(diǎn)信息蜡峰,因此所有的節(jié)點(diǎn)能夠很快的了解集群中的其他節(jié)點(diǎn)狀況了袁。一條gossip 信息會有一個(gè)相關(guān)聯(lián)的版本號,因此當(dāng)進(jìn)行g(shù)ossip交換的時(shí)候事示,對于一個(gè)特定的節(jié)點(diǎn)早像,它的老信息就會被最新的狀態(tài)所覆蓋僻肖。
為了阻止gossip通信可能出現(xiàn)的問題肖爵,集群中所有的節(jié)點(diǎn)都有相同的seed nodes列表。這一點(diǎn)在一個(gè)節(jié)點(diǎn)第一次啟動的時(shí)候尤其重要臀脏。默認(rèn)情況下劝堪,一個(gè)節(jié)點(diǎn)在隨后的重啟過程中會記住已經(jīng)gossip的其他節(jié)點(diǎn)冀自。seed node就是為了新加入到集群中的節(jié)點(diǎn)bootstrapping the gossip process使用的。不是為了單點(diǎn)失敗秒啦,也沒有其他特別的目的熬粗。(我理解是說種子節(jié)點(diǎn)的作用是:每個(gè)node都是一樣的種子節(jié)點(diǎn),當(dāng)一個(gè)新的節(jié)點(diǎn)加入時(shí)余境,它是沒有任何其他節(jié)點(diǎn)的信息驻呐,因此它通過種子節(jié)點(diǎn)拿到其他節(jié)點(diǎn)的信息,之后 重啟之類的就不需要和種子節(jié)點(diǎn)通信了芳来,因?yàn)闀蛄谢约褐癵ossip到的信息含末,重啟時(shí)會replay,只有新加入的node即舌,啥也不知道因此需要通過種子節(jié)點(diǎn)知道佣盒,種子節(jié)點(diǎn)可以解決2個(gè)節(jié)點(diǎn)同時(shí)加入 可能出現(xiàn) A不知道B, B不知道A的情況)
注意:
在多數(shù)據(jù)中心的集群顽聂,確保每個(gè)數(shù)據(jù)中心至少有一個(gè)節(jié)點(diǎn)在seed list中肥惭。為了容錯建議每個(gè)數(shù)據(jù)中心指派多個(gè)seed node,否則當(dāng)一個(gè)節(jié)點(diǎn)bootstrap時(shí),需要同其他數(shù)據(jù)中心進(jìn)行g(shù)ossip紊搪。
不建議把每個(gè)節(jié)點(diǎn)都設(shè)置為seed node,因?yàn)闀黾泳S護(hù)的成本以及降低了gossip的性能蜜葱。gossip優(yōu)化并不是特別重要,但是建議使用一個(gè)小的seed 列表(每個(gè)數(shù)據(jù)中心3個(gè)節(jié)點(diǎn)最佳)
Failure detection and recovery
失敗檢測是從gossip的狀態(tài)和歷史獲取信息耀石,判斷系統(tǒng)中的一個(gè)節(jié)點(diǎn)是否down了或者已經(jīng)恢復(fù)了笼沥。Cassandra 利用這個(gè)信息避免將客戶端的請求路由到任何時(shí)候有可能不可到達(dá)的節(jié)點(diǎn)。同時(shí) Cassandra 通過Dynamic Snitch?避免將客戶端請求路由到那些存活的但是性能比較差的節(jié)點(diǎn)上娶牌。
gossip過程能夠跟蹤其他節(jié)點(diǎn)的狀態(tài)奔浅,通過直接(直接與某個(gè)節(jié)點(diǎn)gossip)或非直接(通過二手,三手等)方式诗良。相比于一個(gè)固定的閾值來標(biāo)記一個(gè)節(jié)點(diǎn)為fail汹桦,Cassandra 把網(wǎng)絡(luò)、負(fù)載鉴裹、歷史狀況等因素綜合考慮舞骆,用累加(accrual)檢測機(jī)制來計(jì)算每個(gè)節(jié)點(diǎn)的閾值。當(dāng)進(jìn)行g(shù)ossip交換時(shí)径荔,每個(gè)節(jié)點(diǎn)維護(hù)了其他節(jié)點(diǎn)gossip信息到達(dá)的滑動窗口時(shí)間督禽。可以通過配置phi_convict_threshold屬性來調(diào)節(jié)失敗檢測的敏感性总处。值越低狈惫,一個(gè)沒有應(yīng)答的節(jié)點(diǎn)更有可能被標(biāo)記為down。大部分情況下鹦马,默認(rèn)值就可以了胧谈。但是在Amazon EC2上需要增加到10或者12.(因?yàn)槌3龅骄W(wǎng)絡(luò)擁堵)忆肾,在不穩(wěn)定的網(wǎng)絡(luò)環(huán)境中(比如EC2),提高值到10或者12可以避免錯誤的失敗檢測菱肖。不建議使用高于12客冈,或者低于5的值。
節(jié)點(diǎn)失敗可能有各種各樣的原因造成的稳强,比如硬件失敗场仲,網(wǎng)絡(luò)故障。節(jié)點(diǎn)故障一般時(shí)間比較短退疫,但是也有可能持續(xù)很長時(shí)間的燎窘。因?yàn)橐粋€(gè)節(jié)點(diǎn)故障并不意味著永久地離開集群,不會自動從集群ring中移除蹄咖。其他的節(jié)點(diǎn)會周期性的嘗試和失敗的節(jié)點(diǎn)重新建立聯(lián)系褐健,看它們是否已經(jīng)回歸。想要永久的改變集群節(jié)點(diǎn)的membership澜汤,需要管理員通過nodetool utility工具明確的將節(jié)點(diǎn)添加進(jìn)來或者移除出集群蚜迅。
當(dāng)一個(gè)節(jié)點(diǎn)宕機(jī)后重新回歸,那么宕機(jī)這段時(shí)間俊抵,它上面的副本miss了需要寫入的數(shù)據(jù)谁不。一些repair機(jī)制可以恢復(fù)這些數(shù)據(jù),比如hinted handoffs以及通過nodetool repair手動repair徽诲。根據(jù)節(jié)點(diǎn)down掉的時(shí)間有多長來決定通過哪種repair機(jī)制來恢復(fù)數(shù)據(jù)刹帕,保持?jǐn)?shù)據(jù)的一致性。