掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
經(jīng)常有朋友問,MySQL雙主的一致性問題,今天簡單聊一聊。

MySQL為什么要使用雙主架構(gòu)?
MySQL最常見的集群架構(gòu),是一主多從,主從同步,讀寫分離的架構(gòu)。通過這種方式,能夠擴充數(shù)據(jù)庫的讀性能,保證讀庫的高可用,但此時寫庫仍然是單點。
為了保證MySQL寫庫的高可用,可以在一個MySQL數(shù)據(jù)庫集群中可以設(shè)置兩個主庫,并設(shè)置雙向同步,以冗余寫庫的方式,來保證寫庫的高可用。
MySQL雙主架構(gòu),會存在什么問題?
如果MySQL雙主架構(gòu),同時提供服務(wù),可能會引發(fā)數(shù)據(jù)的一致性問題。因為數(shù)據(jù)的同步有一個時間差,并發(fā)的寫入可能導(dǎo)致數(shù)據(jù)同步失敗,引起數(shù)據(jù)丟失。
舉個栗子:
如上圖所述,假設(shè)主庫使用了auto increment來作為自增主鍵:
能否在MySQL層面,保證兩個主庫生成的主鍵一定不沖突呢?
可以的,只需要為兩個主庫的自增ID:
設(shè)置不同的初始值;
設(shè)置相同的增長步長;
如上圖所示:
如上圖所示,兩個主庫最終都將包含1/2/3/4/5/6/7/8所有數(shù)據(jù),即使有一個主庫掛了,另一個主庫也能夠保證寫庫的高可用。
上述方案,依賴與數(shù)據(jù)庫的配置,能不能由應(yīng)用程序,來保證數(shù)據(jù)的一致性呢?
答案是肯定的,應(yīng)用程序使用統(tǒng)一的ID生成器,可以保證ID的生成不沖突。
如上圖所示,調(diào)用方插入數(shù)據(jù)時,帶入全局唯一ID,而不依賴于數(shù)據(jù)庫的auto increment,也能解決這個問題。
畫外音:如何生成全局唯一趨勢遞增的ID,不展開。
引發(fā)不一致的根本原因,是保證高可用的兩個主庫都對外提供服務(wù),如果只有一個主庫對外提供服務(wù),另一個主庫平時不提供服務(wù),僅僅在主庫掛了的時候提供服務(wù),能否消除上述數(shù)據(jù)不一致呢?
答案是悲觀的,仍然不行。
使用虛IP+keepalived的方式保證數(shù)據(jù)庫主庫的高可用,平時只有一臺主庫提供服務(wù),也可能出現(xiàn)數(shù)據(jù)不一致。
如上圖所示:
切換過程中,由于虛IP沒有變化,所以切換過程對調(diào)用方是透明的,但在極限的情況下,仍可能引發(fā)數(shù)據(jù)不一致。
如上圖所示:
有沒有辦法緩解上述問題呢?
虛IP漂移,雙主同步延時導(dǎo)致的數(shù)據(jù)不一致,本質(zhì)上,需要在雙主同步完數(shù)據(jù)之后,再實施虛IP偏移。
使用內(nèi)網(wǎng)DNS探測,緩解上述問題:
畫外音:本質(zhì)上,這是一個可用性與一致性的折衷。
總結(jié)
MySQL主庫高可用,主庫一致性,一些小技巧:

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流