1. 程式人生 > >mysql主主複製+Keepalived高可用實踐

mysql主主複製+Keepalived高可用實踐

最近領導交給我一個任務,說是研究一下mysql的高可用方案,方向為keepalived+mysql的主主複製功能。

剛開始一臉懵逼,竟然連“高可用”、“主主複製”、“keepalived”這些詞都是第一次聽說,真是汗顏。於是,趕緊惡補,原來複制(replication)功能是mysql自身的基本功能,用於資料同步,有主主複製和主從複製兩種,說是兩種,其實也是一種,因為主主複製可以理解成互為主從的關係。

所謂的高可用,是指服務最大限度的提供服務,不能因為服務宕掉而發生服務不可訪問。下面就聊一聊keepalived,關於keepalived的一些書面知識我不在贅述,網上有很多,現在我把通過親身實踐而得到一些感悟總結一下。

首先keepalived是一個軟體,需要安裝在linux系統上,由於對linux也並不是很熟練,所以導致整個研究花費了兩週半的時間,也是有點長了。言歸正傳,keepalived有主機(MASTER)和備機(BACKUP)之分,他們是按照自身的優先順序進行競選,優先順序高的便自動榮升為MASTER,比如,現在初始化主機為192.168.0.38,其優先順序為101,備機為192.168.0.39,優先順序為100,同時把keepalived服務啟動起來,按照競選機制,38便成為了主機,對外提供服務,佔據VIP資源。假如現在有一種故障造成38主機的優先順序降低為98,那麼39主機就會搶佔變為主機,他們之間是怎麼競選的呢?下面我講一個類似的場景,比如說,公司裡面有員工A和員工B,以及領導C,一般情況下,外界有活的時候,都會直接找到C,然後C與內部員工進行溝通,這裡C就相當於VIP,A的能力值為101,B的能力值為100,正常情況下,C會直接把活派給能力高的A,B處於閒置狀態,有一天A感冒了,不在狀態,能力值變為了99,在B之下,這個時候C就會漂移到B。現在我們已經知道競選的機制是優先順序高的來接活,但是A和B是怎麼溝通的呢,他們的機制到底是什麼呢?

原來是這樣,每天上班,作為主機的一方都會把自己的優先順序和ip廣播出來,喊上一嗓子,“我是***(IP地址),我的優先順序是多少,誰敢與我大戰三百回合!哈哈哈”,然後這個時候B就會聽到訊息(收到vrrp廣播包),然後再看看自己的能力是不是能打得過他,如果感覺自己不行(當然就是優先順序低),那自己就老老實實不說話了,假如B發現自己的能力值高於主裝置的能力值了,那麼B就會站出來,不服氣的對A說:“瞧你那熊樣,老子弄死你”,因為A在明,B在暗,B明知自己比A強,所以B就會一招制敵,將A打敗,自己成為老大,A就不吭氣了,成為了備用機,這時候B就成為了MASTER,然後就會吆喝起來,“燕人張翼德在此,誰敢與我大戰三百回合!”,然後再重複之前的步驟。這裡還有一種情況,那就是假如B耳朵有問題,聽不見A剛開始吆喝的廣播,也就是不知道A發沒發廣播,以及A的優先順序什麼一概不知道,那麼B就會認為A宕掉了,那麼他就會站出來搶佔vip,這種情況下,可以認為是B沒有自知之明或者說B不懂事,因為明明A的優先順序可能比B高,但是B聽不到,還去搶,認為自己是老大,還發廣播,但是A聽到B的優先順序後,知道自己比B強的話,也是不服輸,這種情況就是腦裂,就是主備同時搶佔VIP,誰也不服誰。這種場景主要是B可能收不到A發出的廣播,很可能就是因為防火牆把vrrp給卡住了,然後這裡B給自己的防火牆打聲招呼,不要再攔截啦,那麼B就聽見了,聽見之後就老老實實的了。也就是說記住一點,誰在吆喝自己有多牛逼,誰就是老大。

那麼如何知道誰在吆喝呢,通過命令tcpdump -i eno16777736 vrrp來看,如下圖,就是0.38在吹牛逼,說自己的優先順序是101。

但是這裡有個疑問,假如B聽不見A的吆喝,但是在B上通過上述命令抓包,也能看到有A的廣播,但是B就是聽不到,這是因為,上述的抓包命令是在防火牆門外抓的,也就是就算在門外抓住了A放的話,但是不一定代表B就真能聽得到,因為這中間還有個防火牆呢,如果防火牆不讓過,那麼B還是不知道,跟個二傻子似的。這種情況就會出現下面的情況,A和B都在吹牛逼,但是是A有理,B沒理,B被蒙在了鼓裡。如下圖,B的優先順序只有100,如果他知道A的優先順序是101,他就不會嘚瑟了,關鍵在於自己不知道A的真實情況,還以為A掛了,其實是他的管家(防火牆)沒告訴他A的情況。