轉(zhuǎn)眼間再過一個月就到2022年了,臨近年底有不少小伙伴問沐子冕杠,自己想要換工作微姊,但是不知道是年前換好,還是年后換比較好呢分预?沐子一直的觀點都是兢交,換工作的時候只要你想清楚了,在現(xiàn)在的公司已經(jīng)無法成長或者看不到希望時笼痹,到了非換不可的地步配喳,那么只要有合適的下家的前提下,隨時都可以換凳干。從沐子多年的工作經(jīng)驗界逛,以及跟身邊一些資深HR溝通后,總結(jié)出來一些經(jīng)驗纺座,那就是年前和年后都各有一個找工作的好時機(jī)息拜,主要看求職者自身為換工作準(zhǔn)備得是否充分。
我們在工作中可能很少碰到腦裂的問題净响,但是面試官想要了解面試者的經(jīng)歷和解決復(fù)雜問題的能力少欺,常常也會涉及到此類問題。小編主要以Redis馋贤、Zookeeper為例重點講解腦裂問題和合適的解決方案赞别,為粉絲們在面試中增加亮點。
一配乓、 Redis集群腦裂
什么是redis的集群腦裂仿滔?
在哨兵架構(gòu)中,redis的集群腦裂是某個master所在機(jī)器突然脫離了正常的網(wǎng)絡(luò)犹芹,導(dǎo)致redis master節(jié)點跟redis slave節(jié)點和sentinel集群處于不同的網(wǎng)絡(luò)分區(qū)崎页,此時因為sentinel集群無法感知到master的存在,哨兵可能就會認(rèn)為master宕機(jī)了腰埂,然后開啟選舉飒焦,將其他slave切換成了master,這個時候集群里就會有兩個master屿笼,也就是所謂的腦裂牺荠。
出現(xiàn)集群腦裂后翁巍,如果客戶端還在基于原來的master節(jié)點繼續(xù)寫入數(shù)據(jù),那么新的master節(jié)點將無法同步這些數(shù)據(jù)休雌,當(dāng)網(wǎng)絡(luò)問題解決之后灶壶,sentinel集群將原先的master節(jié)點降為slave節(jié)點,此時再從新的master中同步數(shù)據(jù)杈曲,將會造成大量的數(shù)據(jù)丟失例朱。
解決方案
由于腦裂是由網(wǎng)絡(luò)等原因造成的,除了提高網(wǎng)絡(luò)鱼蝉、硬件等方法外养涮,主要通過增加以下配置凳鬓,改善出現(xiàn)腦裂而引發(fā)的數(shù)據(jù)丟失問題锥忿。
min-slaves-to-write 1 // 要求至少有1個slave
min-slaves-max-lag 10 //數(shù)據(jù)復(fù)制和同步的延遲不能超過10秒
如果一個master出現(xiàn)了腦裂邀摆,跟其他slave丟了連接,那么上面兩個配置可以確保說洁奈,如果不能繼續(xù)給指定數(shù)量的slave發(fā)送數(shù)據(jù)间唉,而且slave超過10秒沒有給自己ack消息,那么就直接拒絕客戶端的寫請求利术。這樣腦裂后的舊master就不會接受client的新數(shù)據(jù)呈野,最多就丟失10秒的數(shù)據(jù),也就避免了大量長時間的數(shù)據(jù)丟失印叁。
二被冒、 Zookeeper集群腦裂
什么是Zookeeper的集群腦裂?
ZooKeeper是用來協(xié)調(diào)(同步)分布式進(jìn)程的服務(wù)轮蜕,提供了一個簡單高性能的協(xié)調(diào)內(nèi)核昨悼,用戶可以在此之上構(gòu)建更多復(fù)雜的分布式協(xié)調(diào)功能。下面以Zookeeper集群為例跃洛,講解出現(xiàn)腦裂的情況率触。
從下圖中可以看到,正常狀態(tài)的時候汇竭,節(jié)點
5 作為主節(jié)點葱蝗,其他節(jié)點作為備節(jié)點;當(dāng)連接發(fā)生故障時细燎,節(jié)點 1两曼、節(jié)點 2、節(jié)點 3 形成了一個子集群找颓,節(jié)點 4合愈、節(jié)點 5
形成了另外一個子集群叮贩,這兩個子集群的連接已經(jīng)中斷击狮,無法進(jìn)行信息交換佛析。按照規(guī)則和算法,兩個子集群分別選出了節(jié)點 2 和節(jié)點 5
作為主節(jié)點彪蓬,此時整個系統(tǒng)就出現(xiàn)了兩個主節(jié)點寸莫。這個狀態(tài)違背了系統(tǒng)設(shè)計的初衷,兩個主節(jié)點會各自做出自己的決策档冬,整個系統(tǒng)的狀態(tài)就混亂了膘茎。這時候整個系統(tǒng)就很混亂可能有一部分client已經(jīng)通知到了連接到新的leader上去了,有的client仍然連接在老的leader上酷誓,如果同時有兩個client需要對leader的同一個數(shù)據(jù)更新披坏,并且剛好這兩個client此刻分別連接在新老的leader上,就會出現(xiàn)很嚴(yán)重問題盐数。
解決方案
要解決腦裂的問題棒拂,一般有下面幾種方法:
1、zooKeeper默認(rèn)采用了Quorums這種方式來防止"腦裂"現(xiàn)象玫氢。即只有集群中超過半數(shù)節(jié)點投票才能選舉出Leader帚屉。這樣的方式可以確保leader的唯一性,要么選出唯一的一個leader,要么選舉失敗。在zookeeper中Quorums作用如下:
【1】 集群中最少的節(jié)點數(shù)用來選舉leader保證集群可用漾峡。
【2】 通知客戶端數(shù)據(jù)已經(jīng)安全保存前集群中最少數(shù)量的節(jié)點數(shù)已經(jīng)保存了該數(shù)據(jù)攻旦。一旦這些節(jié)點保存了該數(shù)據(jù),客戶端將被通知已經(jīng)安全保存了生逸,可以繼續(xù)其他任務(wù)牢屋。而集群中剩余的節(jié)點將會最終也保存了該數(shù)據(jù)。
假設(shè)某個leader假死槽袄,其余的followers選舉出了一個新的leader伟阔。這時,舊的leader復(fù)活并且仍然認(rèn)為自己是leader掰伸,這個時候它向其他followers發(fā)出寫請求也是會被拒絕的皱炉。因為每當(dāng)新leader產(chǎn)生時,會生成一個epoch標(biāo)號(標(biāo)識當(dāng)前屬于那個leader的統(tǒng)治時期)狮鸭,這個epoch是遞增的合搅,followers如果確認(rèn)了新的leader存在,知道其epoch歧蕉,就會拒絕epoch小于現(xiàn)任leader
epoch的所有請求灾部。那有沒有follower不知道新的leader存在呢,有可能惯退,但肯定不是大多數(shù)赌髓,否則新leader無法產(chǎn)生。Zookeeper的寫也遵循quorum機(jī)制,因此锁蠕,得不到大多數(shù)支持的寫是無效的夷野,舊leader即使各種認(rèn)為自己是leader,依然沒有什么作用荣倾。
2悯搔、添加冗余的心跳線,例如雙線條線舌仍,盡量減少“裂腦”發(fā)生機(jī)會妒貌。
3、啟用磁盤鎖铸豁。正在服務(wù)一方鎖住共享磁盤灌曙,"裂腦"發(fā)生時,讓對方完全"搶不走"共享磁盤資源节芥。但使用鎖磁盤也會有一個不小的問題平匈,如果占用共享盤的一方不主動"解鎖",另一方就永遠(yuǎn)得不到共享磁盤〔毓牛現(xiàn)實中假如服務(wù)節(jié)點突然死機(jī)或崩潰增炭,就不可能執(zhí)行解鎖命令。后備節(jié)點也就接管不了共享資源和應(yīng)用服務(wù)拧晕。于是有人在HA中設(shè)計了"智能"鎖隙姿。即正在服務(wù)的一方只在發(fā)現(xiàn)心跳線全部斷開(察覺不到對端)時才啟用磁盤鎖,平時就不上鎖了厂捞。
4输玷、設(shè)置仲裁機(jī)制。例如設(shè)置參考IP(如網(wǎng)關(guān)IP)靡馁,當(dāng)心跳線完全斷開時欲鹏,2個節(jié)點都各自ping一下IP,不通則表明斷點就出在本端臭墨,不僅"心跳"赔嚎、還兼對外"服務(wù)"的本端網(wǎng)絡(luò)鏈路斷了,即使啟動(或繼續(xù))應(yīng)用服務(wù)也沒有用了胧弛,那就主動放棄競爭尤误,讓能夠ping通參考IP的一端去起服務(wù)。更保險一些结缚,ping不通IP的一方干脆就自我重啟损晤,以徹底釋放有可能還占用著的那些共享資源。
綜合分析红竭,無論采取什么樣的方案尤勋,狀態(tài)決策都不可能做到任何場景下都沒有問題喘落,但完全不做高可用方案又會產(chǎn)生更大的問題,如何選取適合系統(tǒng)的高可用方案最冰,也是一個復(fù)雜的分析瘦棋、判斷和選擇的過程。
總之锌奴,上面通過Redis兽狭、Zookeeper為例重點介紹腦裂問題憾股,列舉了一些常用的解決方案鹿蜀,但是針對業(yè)務(wù)系統(tǒng),永遠(yuǎn)都是具體情況具體分析服球,沒有最好茴恰,只有最合適。
最后斩熊,如果我的文章對你有所幫助或者有所啟發(fā)往枣,歡迎關(guān)注公眾號(微信搜索公眾號:首席架構(gòu)師專欄),里面有許多技術(shù)干貨粉渠,也有我對技術(shù)的思考和感悟分冈,還有作為架構(gòu)師的驗驗分享;關(guān)注后回復(fù) 【面試題】霸株,有我準(zhǔn)備的面試題雕沉、架構(gòu)師大型項目實戰(zhàn)視頻等福利 , 小編會帶著你一起學(xué)習(xí)去件、成長坡椒,讓我們一起加油!S攘铩倔叼!