Elastic Search跨AZ腦裂問題討論
AZ概念
AZ(可用區(qū),Availability Zone)這個(gè)是AWS發(fā)明的概念,AWS引入可用區(qū)設(shè)計(jì)主要是為了提升用戶應(yīng)用程序的高可用性。因?yàn)榭捎脜^(qū)與可用區(qū)之間在設(shè)計(jì)上是相互獨(dú)立的,也就是說(shuō)它們會(huì)有獨(dú)立的供電、獨(dú)立的網(wǎng)絡(luò)等,這樣假如一個(gè)可用區(qū)出現(xiàn)問題時(shí)也不會(huì)影響另外的可用區(qū)。在一個(gè)區(qū)域內(nèi),可用區(qū)與可用區(qū)之間是通過(guò)高速網(wǎng)絡(luò)連接,從而保證有很低的延時(shí)。
ES腦裂問題
說(shuō)完可用區(qū),再來(lái)看看ES(Elastic Search)主動(dòng)選舉機(jī)制:
elasticsearch集群一旦建立起來(lái)以后,會(huì)選舉出一個(gè)master,其他都為slave節(jié)點(diǎn)。但是具體操作的時(shí)候,每個(gè)節(jié)點(diǎn)都提供寫和讀的操作。就是說(shuō),你不論往哪個(gè)節(jié)點(diǎn)中做寫操作,這個(gè)數(shù)據(jù)也會(huì)分配到集群上的所有節(jié)點(diǎn)中。
這里有某個(gè)節(jié)點(diǎn)掛掉的情況,如果是slave節(jié)點(diǎn)掛掉了,那么首先關(guān)心,數(shù)據(jù)會(huì)不會(huì)丟呢?不會(huì)。如果你開啟了replicate,那么這個(gè)數(shù)據(jù)一定在別的機(jī)器上是有備份的。別的節(jié)點(diǎn)上的備份分片會(huì)自動(dòng)升格為這份分片數(shù)據(jù)的主分片。這里要注意的是這里會(huì)有一小段時(shí)間的yellow狀態(tài)時(shí)間。
如果是主節(jié)點(diǎn)掛掉怎么辦呢?當(dāng)從節(jié)點(diǎn)們發(fā)現(xiàn)和主節(jié)點(diǎn)連接不上了,那么他們會(huì)自己決定再選舉出一個(gè)節(jié)點(diǎn)為主節(jié)點(diǎn)。但是這里有個(gè)腦裂的問題,假設(shè)有5臺(tái)機(jī)器,3臺(tái)在一個(gè)機(jī)房,2臺(tái)在另一個(gè)機(jī)房,當(dāng)兩個(gè)機(jī)房之間的聯(lián)系斷了之后,每個(gè)機(jī)房的節(jié)點(diǎn)會(huì)自己聚會(huì),推舉出一個(gè)主節(jié)點(diǎn)。這個(gè)時(shí)候就有兩個(gè)主節(jié)點(diǎn)存在了,當(dāng)機(jī)房之間的聯(lián)系恢復(fù)了之后,這個(gè)時(shí)候就會(huì)出現(xiàn)數(shù)據(jù)沖突了。
解決的辦法就是設(shè)置參數(shù):
- discovery.zen.minimum_master_nodes
為3(超過(guò)一半的節(jié)點(diǎn)數(shù)),那么當(dāng)兩個(gè)機(jī)房的連接斷了之后,就會(huì)以大于等于3的機(jī)房的master為主,另外一個(gè)機(jī)房的節(jié)點(diǎn)就停止服務(wù)了。
AZ可用 + 腦裂放一塊怎么辦?
其實(shí)很難辦,為了做到不腦裂,就要設(shè)置最小可用節(jié)點(diǎn)要超過(guò)整個(gè)集群的一半。但是同樣,但是這樣做同樣,AZ通信斷了或者掛了一個(gè)AZ,整個(gè)服務(wù)可能節(jié)點(diǎn)數(shù)就不到集群的一半,服務(wù)就無(wú)法使用了,好像AZ的可靠性就沒有起到作用。
AWS是怎么弄的?
看AWS的開發(fā)文檔里面有如下說(shuō)明:
每個(gè) AWS 區(qū)域都是一個(gè)獨(dú)立的地理區(qū)域,其中包含多個(gè)相互隔離的位置,這些位置稱為可用區(qū)。為避免數(shù)據(jù)損失,并***限度地減少節(jié)點(diǎn)和數(shù)據(jù)中心故障時(shí)導(dǎo)致的停機(jī)時(shí)間,您可以使用 Amazon ES 控制臺(tái),在同一區(qū)域的兩個(gè)可用區(qū)之間,分配屬于 Elasticsearch 群集的節(jié)點(diǎn)和副本索引分片。此分配稱為區(qū)域感知。如果啟用區(qū)域感知,則您還必須使用本機(jī) Elasticsearch API 為您的群集創(chuàng)建副本分片。Amazon ES 在可用區(qū)的各節(jié)點(diǎn)之間分配副本,這會(huì)增加您的群集的可用性。為群集啟用區(qū)域感知會(huì)略微增加網(wǎng)絡(luò)延遲。
Important
區(qū)域感知要求實(shí)例數(shù)量為偶數(shù)。所有索引的默認(rèn)配置均為副本數(shù)量等于 1。如果您為一個(gè)索引指定。副本數(shù)量等于 0,則區(qū)域感知不復(fù)制分片到第二個(gè)可用區(qū)。如果沒有副本分片,則無(wú)需將副本分發(fā)。到第二個(gè)可用區(qū),啟用該功能不提供數(shù)據(jù)損失保護(hù)。
下圖顯示了啟用區(qū)域感知的四節(jié)點(diǎn)群集。該服務(wù)將所有主索引分片放在一個(gè)可用區(qū)中,將所有副本分片放在第二個(gè)可用區(qū)中。
不難看出來(lái),AWS并沒有解決這個(gè)問題,而是做了一個(gè)取舍,要求兩個(gè)AZ節(jié)點(diǎn)數(shù)都為偶數(shù),更多的是為了AZ之間更好的數(shù)據(jù)均衡。
【本文為51CTO專欄作者“大數(shù)據(jù)和云計(jì)算”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)微信公眾號(hào)獲取聯(lián)系和授權(quán)】