記一次生產環境ES腦裂
下午業務部門發來訊息說搜尋引擎的同一個查詢語句會出現不同的查詢結果,經過反覆debug最終發現是因為這個資料所在的叢集發生了“腦裂”的現象。
所謂腦裂就是ES叢集中的兩個節點都認為自己是master,導致原有的叢集被分割為兩個獨立的叢集。我們這個ES叢集有兩臺負載,而前段時間機房發生過一次交換機掛掉導致的機櫃斷網事件,其中一臺ES負載就位於這個發生了斷網的機櫃之中。斷網導致兩臺負載之間的網路連線斷開,進而導致兩個節點都把自己選舉為主節點,等到網路恢復連線之後,本來一個叢集就變成了兩個叢集。
因為搜尋引擎有一些uwsgi程序連線到了負載1所在的叢集,還有一些則連線到了負載2所在的叢集,此時所有的讀寫操作都是在兩個叢集上發生的。一段時間之後,這兩個叢集之中的資料就出現了不一致的情況,此時再查詢就會因為查詢的叢集不一致而導致查詢結果不一致的情況,具體表現就是同一個查詢語句出現了不同的查詢結果。
最終我們向叢集中添加了一臺新的節點,3個節點能夠通過多數派的方式來確定唯一的叢集,我們設定成為master的前提是該節點得到n/2+1
個選票,具體在這裡就是需要2個選票才能夠成為master。如果任意一個節點脫離網路,那麼剩下的兩個節點會選舉得到一個master,而脫離的那個節點因為 1 < 2,所以不能成為master。如果三個節點全部斷開網路連線,則三個節點都不能成為master,整個叢集掛掉。
添加了新節點之後,新節點會加入一箇舊節點的叢集之中。此時把剩下的那個節點重啟,之後該節點也會加入那個叢集,此時所有節點都組成了一個叢集,腦裂現象消失。不過因為此時所有資料都由master確定,所以被重啟的那個節點上的資料會發生丟失的現象,這也是腦裂的最大危害:導致資料的混亂或丟失。
不過好在我們所有的資料都是從業務部門的主庫中同步過來的,所以這裡只需要重新重新整理一遍資料即可。