新聞中心
一、雙主保證高可用

超過(guò)十多年行業(yè)經(jīng)驗(yàn),技術(shù)領(lǐng)先,服務(wù)至上的經(jīng)營(yíng)模式,全靠網(wǎng)絡(luò)和口碑獲得客戶,為自己降低成本,也就是為客戶降低成本。到目前業(yè)務(wù)范圍包括了:網(wǎng)站制作、網(wǎng)站建設(shè),成都網(wǎng)站推廣,成都網(wǎng)站優(yōu)化,整體網(wǎng)絡(luò)托管,微信小程序,微信開(kāi)發(fā),重慶App定制開(kāi)發(fā),同時(shí)也可以讓客戶的網(wǎng)站和網(wǎng)絡(luò)營(yíng)銷和我們一樣獲得訂單和生意!
MySQL數(shù)據(jù)庫(kù)集群常使用一主多從,主從同步,讀寫(xiě)分離的方式來(lái)擴(kuò)充數(shù)據(jù)庫(kù)的讀性能,保證讀庫(kù)的高可用,但此時(shí)寫(xiě)庫(kù)仍然是單點(diǎn)。
在一個(gè)MySQL數(shù)據(jù)庫(kù)集群中可以設(shè)置兩個(gè)主庫(kù),并設(shè)置雙向同步,以冗余寫(xiě)庫(kù)的方式來(lái)保證寫(xiě)庫(kù)的高可用。
二、并發(fā)引發(fā)不一致
數(shù)據(jù)冗余會(huì)引發(fā)數(shù)據(jù)的一致性問(wèn)題,因?yàn)閿?shù)據(jù)的同步有一個(gè)時(shí)間差,并發(fā)的寫(xiě)入可能導(dǎo)致數(shù)據(jù)同步失敗,引起數(shù)據(jù)丟失:
如上圖所述,假設(shè)主庫(kù)使用了auto increment來(lái)作為自增主鍵:
- 兩個(gè)MySQL-master設(shè)置雙向同步可以用來(lái)保證主庫(kù)的高可用
- 數(shù)據(jù)庫(kù)中現(xiàn)存的記錄主鍵是1,2,3
- 主庫(kù)1插入了一條記錄,主鍵為4,并向主庫(kù)2同步數(shù)據(jù)
- 數(shù)據(jù)同步成功之前,主庫(kù)2也插入了一條記錄,由于數(shù)據(jù)還沒(méi)有同步成功,插入記錄生成的主鍵也為4,并向主庫(kù)1也同步數(shù)據(jù)
- 主庫(kù)1和主庫(kù)2都插入了主鍵為4的記錄,雙主同步失敗,數(shù)據(jù)不一致
三、相同步長(zhǎng)免沖突
能否保證兩個(gè)主庫(kù)生成的主鍵一定不沖突呢?
回答:
- 設(shè)置不同的初始值
- 設(shè)置相同的增長(zhǎng)步長(zhǎng)
就能夠做到。
如上圖所示:
- 兩個(gè)MySQL-master設(shè)置雙向同步可以用來(lái)保證主庫(kù)的高可用
- 庫(kù)1的自增初始值是1,庫(kù)2的自增初始值是2,增長(zhǎng)步長(zhǎng)都為2
- 庫(kù)1中插入數(shù)據(jù)主鍵為1/3/5/7,庫(kù)2中插入數(shù)據(jù)主鍵為2/4/6/8,不沖突
- 數(shù)據(jù)雙向同步后,兩個(gè)主庫(kù)會(huì)包含全部數(shù)據(jù)
如上圖所示,兩個(gè)主庫(kù)最終都將包含1/2/3/4/5/6/7/8所有數(shù)據(jù),即使有一個(gè)主庫(kù)掛了,另一個(gè)主庫(kù)也能夠保證寫(xiě)庫(kù)的高可用。
四、上游生成ID避沖突
換一個(gè)思路,為何要依賴于數(shù)據(jù)庫(kù)的自增ID,來(lái)保證數(shù)據(jù)的一致性呢?
完全可以由業(yè)務(wù)上游,使用統(tǒng)一的ID生成器,來(lái)保證ID的生成不沖突:
如上圖所示,調(diào)用方插入數(shù)據(jù)時(shí),帶入全局***ID,而不依賴于數(shù)據(jù)庫(kù)的auto increment,也能解決這個(gè)問(wèn)題。
至于如何生成全局***,趨勢(shì)遞增的ID,參見(jiàn)文章《分布式ID生成算法》。
五、消除雙寫(xiě)不治本
使用auto increment兩個(gè)主庫(kù)并發(fā)寫(xiě)可能導(dǎo)致數(shù)據(jù)不一致,只使用一個(gè)主庫(kù)提供服務(wù),另一個(gè)主庫(kù)作為shadow-master,只用來(lái)保證高可用,能否避免一致性問(wèn)題呢?
如上圖所示:
- 兩個(gè)MySQL-master設(shè)置雙向同步可以用來(lái)保證主庫(kù)的高可用
- 只有主庫(kù)1對(duì)外提供寫(xiě)入服務(wù)
- 兩個(gè)主庫(kù)設(shè)置相同的虛IP,在主庫(kù)1掛掉或者網(wǎng)絡(luò)異常的時(shí)候,虛IP自動(dòng)漂移,shadow master頂上,保證主庫(kù)的高可用
這個(gè)切換由于虛IP沒(méi)有變化,所以切換過(guò)程對(duì)調(diào)用方是透明的,但在極限的情況下,也可能引發(fā)數(shù)據(jù)的不一致:
如上圖所示:
- 兩個(gè)MySQL-master設(shè)置雙向同步可以用來(lái)保證主庫(kù)的高可用,并設(shè)置了相同的虛IP
- 網(wǎng)絡(luò)抖動(dòng)前,主庫(kù)1對(duì)上游提供寫(xiě)入服務(wù),插入了一條記錄,主鍵為4,并向shadow master主庫(kù)2同步數(shù)據(jù)
- 突然主庫(kù)1網(wǎng)絡(luò)異常,keepalived檢測(cè)出異常后,實(shí)施虛IP漂移,主庫(kù)2開(kāi)始提供服務(wù)
- 在主鍵4的數(shù)據(jù)同步成功之前,主庫(kù)2插入了一條記錄,也生成了主鍵為4的記錄,結(jié)果導(dǎo)致數(shù)據(jù)不一致
六、內(nèi)網(wǎng)DNS探測(cè)
虛IP漂移,雙主同步延時(shí)導(dǎo)致的數(shù)據(jù)不一致,本質(zhì)上,需要在雙主同步完數(shù)據(jù)之后,再實(shí)施虛IP偏移,使用內(nèi)網(wǎng)DNS探測(cè),可以實(shí)現(xiàn)shadow master延時(shí)高可用:
- 使用內(nèi)網(wǎng)域名連接數(shù)據(jù)庫(kù),例如:db.58daojia.org
- 主庫(kù)1和主庫(kù)2設(shè)置雙主同步,不使用相同虛IP,而是分別使用ip1和ip2
- 一開(kāi)始db.58daojia.org指向ip1
- 用一個(gè)小腳本輪詢探測(cè)ip1主庫(kù)的連通性
- 當(dāng)ip1主庫(kù)發(fā)生異常時(shí),小腳本delay一個(gè)x秒的延時(shí),等待主庫(kù)2同步完數(shù)據(jù)之后,再將db.58daojia.org解析到ip2
- 程序以內(nèi)網(wǎng)域名進(jìn)行重連,即可自動(dòng)連接到ip2主庫(kù),并保證了數(shù)據(jù)的一致性
七、總結(jié)
主庫(kù)高可用,主庫(kù)一致性,一些小技巧:
- 雙主同步是一種常見(jiàn)的保證寫(xiě)庫(kù)高可用的方式
- 設(shè)置相同步長(zhǎng),不同初始值,可以避免auto increment生成沖突主鍵
- 不依賴數(shù)據(jù)庫(kù),業(yè)務(wù)調(diào)用方自己生成全局***ID是一個(gè)好方法
- shadow master保證寫(xiě)庫(kù)高可用,只有一個(gè)寫(xiě)庫(kù)提供服務(wù),并不能完全保證一致性
- 內(nèi)網(wǎng)DNS探測(cè),可以實(shí)現(xiàn)在主庫(kù)1出現(xiàn)問(wèn)題后,延時(shí)一個(gè)時(shí)間,再進(jìn)行主庫(kù)切換,以保證數(shù)據(jù)一致性
【本文為專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】
本文題目:MySQL雙主一致性架構(gòu)優(yōu)化
網(wǎng)站URL:http://fisionsoft.com.cn/article/dhopogg.html


咨詢
建站咨詢
