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