兩地三中心,如何部署奇數(shù)個(gè)節(jié)點(diǎn)?
文末本文轉(zhuǎn)載自微信公眾號(hào)「小姐姐味道」,作者小姐姐養(yǎng)的狗。轉(zhuǎn)載本文請(qǐng)聯(lián)系小姐姐味道公眾號(hào)。
兩地三中心,是有錢的公司,為保障數(shù)據(jù)安全和高可用,一個(gè)常見的需求,通常指的是 “同城雙活,異地備份”。
2 + 1 = 3,從描述上來看,就知道它們之間是有階級(jí)屬性的。
異地備份的機(jī)房,level上自然就比同城雙活的兩個(gè)機(jī)房低了一個(gè)檔次,否則也不會(huì)淪為備胎。辯證的看待這個(gè)問題,我們就能夠自如的處理感情上腳踏多只船的問題。
1. 部署結(jié)構(gòu)
為了描述方便,我們把同城的兩個(gè)機(jī)房,稱為A和B。把可憐的備份機(jī)房,稱作機(jī)房C。
同城的兩個(gè)機(jī)房,距離上自然就近了一些。我們可以用圖直觀的表示一下這個(gè)距離差異。
所以這個(gè)備份機(jī)房,非常的沒有存在感。實(shí)際上,它也非常的有自知之明,只把自己放在一個(gè)備份的場(chǎng)景,能夠接受非常大的請(qǐng)求延遲和比較長(zhǎng)的數(shù)據(jù)不一致窗口。
這么算下來,就只剩下A和B兩位陪你玩了,此之為雙活。
2. 奇數(shù)節(jié)點(diǎn)的意義
雙活的意思,是兩個(gè)機(jī)房要同時(shí)對(duì)外提供服務(wù)。運(yùn)行在不同機(jī)房的服務(wù),分為兩種,一種是有狀態(tài)的,一種是無狀態(tài)的。
無狀態(tài)的服務(wù),由于自身并不存儲(chǔ)數(shù)據(jù),只是作為傳話筒,處理上自然行云流水,沒什么值得好討論的。
難搞的是有狀態(tài)的服務(wù)。即使它像魚一樣記憶只有5秒,這部分記憶依然會(huì)對(duì)整個(gè)系統(tǒng)提出了高標(biāo)準(zhǔn)的要求------
我們需要有個(gè)集中的地方來存儲(chǔ)這些數(shù)據(jù)。
大家都是搞技術(shù)的,那就舉例幾個(gè)常見的組件。
Zookeeper動(dòng)物園,需要做集中的配置中心或者分布式協(xié)調(diào)工作
Redis Cluster需要處理一些全局的緩存數(shù)據(jù)
ElasticSearch進(jìn)行數(shù)據(jù)存儲(chǔ)
無數(shù)個(gè)案例告訴我們,要部署這些服務(wù),得部署奇數(shù)個(gè)節(jié)點(diǎn)才行。為什么不能部署偶數(shù)個(gè)?因?yàn)橛袀€(gè)腦殘的問題,那就是腦裂。
我們拿Zookeeper來說,假如我們部署了6個(gè)節(jié)點(diǎn),那么你要兩個(gè)集群能夠可用,需要至少4個(gè)存活才行。你要是設(shè)置成了3個(gè),那它就會(huì)出現(xiàn)問題。
如下圖,在6個(gè)節(jié)點(diǎn)的場(chǎng)景中,A和B機(jī)房網(wǎng)絡(luò)產(chǎn)生了閃斷。A機(jī)房的三個(gè)節(jié)點(diǎn)發(fā)現(xiàn)不能再連接B機(jī)房的節(jié)點(diǎn),于是它們?nèi)齻€(gè)自己組個(gè)集群,并寫入了 a = 100, b = 300兩條數(shù)據(jù);同理,B機(jī)房也組了個(gè)局,寫入了a = 100, b = 600兩條記錄。
而且它們都寫成功了。
一個(gè)集群變成了兩個(gè),并寫入了不同的數(shù)據(jù)。那我到底以誰的數(shù)據(jù)為準(zhǔn)呢?真是要了命。
這就是腦裂問題,我們不能把集群要求的最小節(jié)點(diǎn)設(shè)置成3,而是起碼要為4。
所以你看不管是ES還是raft協(xié)議,不管是paxos和zab,都推薦部署奇數(shù)個(gè)節(jié)點(diǎn),然后把最小可用集群節(jié)點(diǎn)設(shè)置成 (n / 2 + 1) --- 此所謂有一半以上節(jié)點(diǎn)投票才成,且有更好的容錯(cuò)性。
3. 如何部署奇數(shù)個(gè)節(jié)點(diǎn)
那這個(gè)問題該如何解決呢?
假如是同城三活,那么我們只需要在每個(gè)機(jī)房部署一個(gè)節(jié)點(diǎn)就可以了。但即使是雙活,都是公司非常有錢才能搞得起。現(xiàn)在搞個(gè)三活,你大概率會(huì)贏得老板一個(gè)心虛的白眼。
當(dāng)然也可以采用 2 + 2 + 1的模式。
找不到一個(gè)專用的機(jī)房部署一套集群,但找?guī)讉€(gè)第三方的服務(wù)器,部署一下我們的幾個(gè)服務(wù)節(jié)點(diǎn)倒是可以的。
聽起來很美好,但實(shí)際上不會(huì)這么做。因?yàn)檫@批第三方的服務(wù)器,對(duì)帶寬、延遲 、安全、穩(wěn)定的要求,一點(diǎn)都不低。
還是老老實(shí)實(shí)的在兩個(gè)中心玩吧,野花野草聞著香,但大概率有毒。
實(shí)際上,即使是姐妹花,A和B總是有些差異。只要我們別把A和B看的太對(duì)等,問題就好處理。
如上圖,在A機(jī)房部署3個(gè)節(jié)點(diǎn),在B機(jī)房部署2個(gè)節(jié)點(diǎn)。只要你這么部署了,在你的腦子里,A就是要B的level高一些,雖然你對(duì)外宣稱它們是一樣的。
就像你腳踏兩只船,你和2人說都很愛ta。但一旦ta倆有沖突,你還是會(huì)毫不猶豫的選一個(gè)。
這就是考驗(yàn)。
我們切回上圖,看一下幾種情況。在這種部署情況下,當(dāng)發(fā)生腦裂,B機(jī)房的2個(gè)節(jié)點(diǎn)是無法提供服務(wù)的,所以也不會(huì)有異常數(shù)據(jù)進(jìn)入。
當(dāng)B機(jī)房整個(gè)發(fā)生問題,A機(jī)房還是能夠正常運(yùn)行。
當(dāng)A機(jī)房整個(gè)發(fā)生問題,B機(jī)房此時(shí)只有2個(gè)節(jié)點(diǎn),不滿足最小的3個(gè)節(jié)點(diǎn)。這個(gè)時(shí)候該怎么辦呢?
沒錯(cuò),我們手動(dòng)啟動(dòng)一個(gè)。你看節(jié)點(diǎn)6的邊框是虛線的,也就意味著它是一個(gè)待命狀態(tài),隨時(shí)待命轉(zhuǎn)正,完全的接管A的工作。
代價(jià)也是有的,畢竟A才是你心中的No.1。ta離你而去,給你造成了困擾。自己的選擇,就是含著淚,你也得把B給頂上去。
相信我,不過是小時(shí)段的陣痛,你很快會(huì)再次進(jìn)入雙活的世界。到時(shí)候你是把B當(dāng)作No.1,還是繼續(xù)換回A,都沒有問題。
而且這選擇很沒意義。
比起誰的level高,你想要雙活的根本原因,那就是誰都不相信。所以,就把未來交給薛定諤的貓吧----
誰讓你是個(gè)多情又多疑的程序員呢。
作者簡(jiǎn)介:小姐姐味道 (xjjdog),一個(gè)不允許程序員走彎路的公眾號(hào)。聚焦基礎(chǔ)架構(gòu)和Linux。十年架構(gòu),日百億流量,與你探討高并發(fā)世界,給你不一樣的味道。