日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務,提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

經(jīng)常有朋友問,MySQL雙主的一致性問題,今天簡單聊一聊。

MySQL為什么要使用雙主架構(gòu)?

MySQL最常見的集群架構(gòu),是一主多從,主從同步,讀寫分離的架構(gòu)。通過這種方式,能夠擴充數(shù)據(jù)庫的讀性能,保證讀庫的高可用,但此時寫庫仍然是單點。

 

為了保證MySQL寫庫的高可用,可以在一個MySQL數(shù)據(jù)庫集群中可以設置兩個主庫,并設置雙向同步,以冗余寫庫的方式,來保證寫庫的高可用

MySQL雙主架構(gòu),會存在什么問題?

如果MySQL雙主架構(gòu),同時提供服務,可能會引發(fā)數(shù)據(jù)的一致性問題。因為數(shù)據(jù)的同步有一個時間差,并發(fā)的寫入可能導致數(shù)據(jù)同步失敗,引起數(shù)據(jù)丟失

舉個栗子:

我C,MySQL雙主架構(gòu),原來能這么玩

 

如上圖所述,假設主庫使用了auto increment來作為自增主鍵:

(1)兩個MySQL主庫設置雙向同步可以用來保證主庫的高可用;

(2)數(shù)據(jù)庫中現(xiàn)存的記錄主鍵是1,2,3;

(3)主庫1插入了一條記錄,主鍵為4,并向主庫2同步數(shù)據(jù);

(4)數(shù)據(jù)同步成功之前,主庫2也插入了一條記錄,由于數(shù)據(jù)還沒有同步成功,插入記錄生成的主鍵也為4,并向主庫1也同步數(shù)據(jù);

(5)主庫1和主庫2都插入了主鍵為4的記錄,雙主同步失敗,數(shù)據(jù)不一致

 

能否在MySQL層面,保證兩個主庫生成的主鍵一定不沖突呢?

可以的,只需要為兩個主庫的自增ID:

(1)設置不同的初始值

(2)設置相同的增長步長

 

我C,MySQL雙主架構(gòu),原來能這么玩

 

如上圖所示:

(1)兩個MySQL主庫設置雙向同步可以用來保證主庫的高可用;

(2)庫1的自增初始值是1,庫2的自增初始值是2,增長步長都為2;

(3)庫1中插入數(shù)據(jù)主鍵為1/3/5/7,庫2中插入數(shù)據(jù)主鍵為2/4/6/8,不沖突;

(4)數(shù)據(jù)雙向同步后,兩個主庫會包含全部數(shù)據(jù)

我C,MySQL雙主架構(gòu),原來能這么玩

 

如上圖所示,兩個主庫最終都將包含1/2/3/4/5/6/7/8所有數(shù)據(jù),即使有一個主庫掛了,另一個主庫也能夠保證寫庫的高可用

 

上述方案,依賴與數(shù)據(jù)庫的配置,能不能由應用程序,來保證數(shù)據(jù)的一致性呢?

答案是肯定的,應用程序使用統(tǒng)一的ID生成器,可以保證ID的生成不沖突。

我C,MySQL雙主架構(gòu),原來能這么玩

 

如上圖所示,調(diào)用方插入數(shù)據(jù)時,帶入全局唯一ID,而不依賴于數(shù)據(jù)庫的auto increment,也能解決這個問題。

畫外音:如何生成全局唯一趨勢遞增的ID,不展開。

 

引發(fā)不一致的根本原因,是保證高可用的兩個主庫都對外提供服務,如果只有一個主庫對外提供服務,另一個主庫平時不提供服務,僅僅在主庫掛了的時候提供服務,能否消除上述數(shù)據(jù)不一致呢?

答案是悲觀的,仍然不行。

使用虛IP+keepalived的方式保證數(shù)據(jù)庫主庫的高可用,平時只有一臺主庫提供服務,也可能出現(xiàn)數(shù)據(jù)不一致。

我C,MySQL雙主架構(gòu),原來能這么玩

 

如上圖所示:

(1)兩個MySQL主庫設置雙向同步可以用來保證主庫的高可用;

(2)只有主庫1對外提供寫入服務;

(3)兩個主庫設置相同的虛IP,在主庫1掛掉或者網(wǎng)絡異常的時候,虛IP自動漂移,備用主庫頂上,保證主庫的高可用;

 

切換過程中,由于虛IP沒有變化,所以切換過程對調(diào)用方是透明的,但在極限的情況下,仍可能引發(fā)數(shù)據(jù)不一致。

我C,MySQL雙主架構(gòu),原來能這么玩

 

如上圖所示:

(1)兩個MySQL主庫設置雙向同步,可以用來保證主庫的高可用,并設置了相同的虛IP;

(2)網(wǎng)絡抖動前,主庫1對上游提供寫入服務,插入了一條記錄,主鍵為4,并向備用主庫2同步數(shù)據(jù);

(3)突然主庫1網(wǎng)絡異常,keepalived檢測出異常后,實施虛IP漂移,備用主庫2開始提供服務

(4)在主鍵4的數(shù)據(jù)同步成功之前,主庫2插入了一條記錄,也生成了主鍵為4的記錄,結(jié)果導致數(shù)據(jù)不一致

 

有沒有辦法緩解上述問題呢?

虛IP漂移,雙主同步延時導致的數(shù)據(jù)不一致,本質(zhì)上,需要在雙主同步完數(shù)據(jù)之后,再實施虛IP偏移

使用內(nèi)網(wǎng)DNS探測,緩解上述問題:

(1)使用內(nèi)網(wǎng)域名連接數(shù)據(jù)庫,例如:db.kg.org;

(2)主庫1和主庫2設置雙主同步,不使用相同虛IP,而是分別使用ip1和ip2;

(3)一開始db.kg.org指向ip1;

(4)用一個小腳本輪詢探測ip1主庫的連通性;

(5)當ip1主庫發(fā)生異常時,腳本delay一個x秒的延時,等待主庫2同步完數(shù)據(jù)之后,再將db.kg.org解析到ip2;

(6)應用程序以內(nèi)網(wǎng)域名進行重連,即可自動連接到ip2主庫,并保證了數(shù)據(jù)的一致性;

畫外音:本質(zhì)上,這是一個可用性與一致性的折衷。

 

總結(jié)

MySQL主庫高可用,主庫一致性,一些小技巧:

(1)雙主同步是一種常見的保證寫庫高可用的方式;

(2)設置相同步長,不同初始值,可以避免auto increment生成沖突主鍵;

(3)不依賴數(shù)據(jù)庫,業(yè)務調(diào)用方自己生成全局唯一ID是一個好方法;

(4)雙主保證寫庫高可用,只有一個寫庫提供服務,并不能完全保證一致性;

(5)內(nèi)網(wǎng)DNS探測,可以實現(xiàn)在主庫1出現(xiàn)問題后,延時一個時間,再進行主庫切換,以保證數(shù)據(jù)一致性,但犧牲了幾秒鐘的高可用;

希望大家有收獲,謝轉(zhuǎn)。

來源公眾號:架構(gòu)師之路

作者:沈劍

分享到:
標簽:架構(gòu) MySQL
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定