自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

安全 應(yīng)用安全 MySQL
MySQL最常見的集群架構(gòu),是一主多從,主從同步,讀寫分離的架構(gòu)。但經(jīng)常有朋友問,MySQL雙主的一致性問題,今天簡(jiǎn)單聊一聊。

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

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

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

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

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

如果MySQL雙主架構(gòu),同時(shí)提供服務(wù),可能會(huì)引發(fā)數(shù)據(jù)的一致性問題。因?yàn)閿?shù)據(jù)的同步有一個(gè)時(shí)間差,并發(fā)的寫入可能導(dǎo)致數(shù)據(jù)同步失敗,引起數(shù)據(jù)丟失。

舉個(gè)栗子:

如上圖所述,假設(shè)主庫(kù)使用了auto increment來作為自增主鍵:

  • 兩個(gè)MySQL主庫(kù)設(shè)置雙向同步可以用來保證主庫(kù)的高可用;
  • 數(shù)據(jù)庫(kù)中現(xiàn)存的記錄主鍵是1,2,3;
  • 主庫(kù)1插入了一條記錄,主鍵為4,并向主庫(kù)2同步數(shù)據(jù);
  • 數(shù)據(jù)同步成功之前,主庫(kù)2也插入了一條記錄,由于數(shù)據(jù)還沒有同步成功,插入記錄生成的主鍵也為4,并向主庫(kù)1也同步數(shù)據(jù);
  • 主庫(kù)1和主庫(kù)2都插入了主鍵為4的記錄,雙主同步失敗,數(shù)據(jù)不一致;

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

可以的,只需要為兩個(gè)主庫(kù)的自增ID:

設(shè)置不同的初始值;

設(shè)置相同的增長(zhǎng)步長(zhǎng);

如上圖所示:

  • 兩個(gè)MySQL主庫(kù)設(shè)置雙向同步可以用來保證主庫(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ù)也能夠保證寫庫(kù)的高可用。

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

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

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

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

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

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

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

如上圖所示:

  • 兩個(gè)MySQL主庫(kù)設(shè)置雙向同步可以用來保證主庫(kù)的高可用;
  • 只有主庫(kù)1對(duì)外提供寫入服務(wù);
  • 兩個(gè)主庫(kù)設(shè)置相同的虛IP,在主庫(kù)1掛掉或者網(wǎng)絡(luò)異常的時(shí)候,虛IP自動(dòng)漂移,備用主庫(kù)頂上,保證主庫(kù)的高可用;

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

如上圖所示:

  • 兩個(gè)MySQL主庫(kù)設(shè)置雙向同步,可以用來保證主庫(kù)的高可用,并設(shè)置了相同的虛IP;
  • 網(wǎng)絡(luò)抖動(dòng)前,主庫(kù)1對(duì)上游提供寫入服務(wù),插入了一條記錄,主鍵為4,并向備用主庫(kù)2同步數(shù)據(jù);
  • 突然主庫(kù)1網(wǎng)絡(luò)異常,keepalived檢測(cè)出異常后,實(shí)施虛IP漂移,備用主庫(kù)2開始提供服務(wù);
  • 在主鍵4的數(shù)據(jù)同步成功之前,主庫(kù)2插入了一條記錄,也生成了主鍵為4的記錄,結(jié)果導(dǎo)致數(shù)據(jù)不一致;

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

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

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

  • 使用內(nèi)網(wǎng)域名連接數(shù)據(jù)庫(kù),例如:db.kg.org;
  • 主庫(kù)1和主庫(kù)2設(shè)置雙主同步,不使用相同虛IP,而是分別使用ip1和ip2;
  • 一開始db.kg.org指向ip1;
  • 用一個(gè)小腳本輪詢探測(cè)ip1主庫(kù)的連通性;
  • 當(dāng)ip1主庫(kù)發(fā)生異常時(shí),腳本delay一個(gè)x秒的延時(shí),等待主庫(kù)2同步完數(shù)據(jù)之后,再將db.kg.org解析到ip2;
  • 應(yīng)用程序以內(nèi)網(wǎng)域名進(jìn)行重連,即可自動(dòng)連接到ip2主庫(kù),并保證了數(shù)據(jù)的一致性;

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

總結(jié)

MySQL主庫(kù)高可用,主庫(kù)一致性,一些小技巧:

  • 雙主同步是一種常見的保證寫庫(kù)高可用的方式;
  • 設(shè)置相同步長(zhǎng),不同初始值,可以避免auto increment生成沖突主鍵;
  • 不依賴數(shù)據(jù)庫(kù),業(yè)務(wù)調(diào)用方自己生成全局唯一ID是一個(gè)好方法;
  • 雙主保證寫庫(kù)高可用,只有一個(gè)寫庫(kù)提供服務(wù),并不能完全保證一致性;
  • 內(nèi)網(wǎng)DNS探測(cè),可以實(shí)現(xiàn)在主庫(kù)1出現(xiàn)問題后,延時(shí)一個(gè)時(shí)間,再進(jìn)行主庫(kù)切換,以保證數(shù)據(jù)一致性,但犧牲了幾秒鐘的高可用;

【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】

戳這里,看該作者更多好文

 

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2022-12-06 17:30:04

2018-01-25 14:53:20

iPhone技巧刪除照片

2018-10-28 17:54:00

分布式事務(wù)數(shù)據(jù)

2014-04-11 09:22:17

MySQL雙主架構(gòu)單點(diǎn)故障

2023-11-01 14:49:07

2021-02-07 08:13:18

@DateTimeFo@NumberFormSpring

2022-01-04 08:00:48

前端技術(shù)Esbuild

2017-11-27 12:24:02

命令行代碼指令

2017-11-06 19:09:45

在線抓娃娃機(jī)

2016-12-02 20:43:28

Android

2014-04-11 13:47:14

雙主架構(gòu)MySQL

2014-03-31 14:59:08

大數(shù)據(jù)

2021-04-19 07:35:01

Linuxhistory命令

2021-04-26 10:24:52

Linux 開發(fā)操作系統(tǒng)

2021-04-19 05:42:51

Mmap文件系統(tǒng)

2022-06-01 07:49:43

索引數(shù)據(jù)Mysql

2024-10-17 16:55:08

2022-10-31 08:47:21

人臉識(shí)別按鍵鍵盤

2023-10-11 08:16:42

客戶端服務(wù)器內(nèi)容

2017-10-28 23:13:43

微服務(wù)架構(gòu)開發(fā)單體應(yīng)用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)