日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
MySQL主從模式采用GTID的實踐

你好,我是悟空。

本文主要內(nèi)容如下:

一、背景

為了保證高可用,之前在測試環(huán)境部署了一套 MySQL 雙主模式,當(dāng)一個主庫服務(wù)出現(xiàn)異常,可以將流量切到另外一個主庫,兩個主庫之間相互同步數(shù)據(jù)。

雙主模式

雙主模式的原理圖如下:

但是經(jīng)常出現(xiàn)數(shù)據(jù)沖突的問題,于是我們又把??雙主模式??改為了??主從讀寫分離模式??。主庫作為讀寫庫,再加上一個從庫用來做 I/O 密集型的任務(wù)(如大量的數(shù)據(jù)統(tǒng)計操作)。如下圖所示:

另外從庫復(fù)制的模式采用??位點??的方式:指定 binlog 文件和 binlog 位置,這樣從庫就知道了復(fù)制的起始位置。(下文會講解這種方式)

雖然改為了主從模式,但依舊遇到了些問題:

  • 問題 1:從庫 B 復(fù)制數(shù)據(jù)時,出現(xiàn)了主鍵沖突問題,導(dǎo)致同步失敗,從庫停止復(fù)制。猜測因主庫配置的 binlog 日志的格式為 mixed,從庫同步時出現(xiàn)不一致的情況。
  • 問題 2:從庫 B 停止復(fù)制后,導(dǎo)致很多數(shù)據(jù)未同步到從庫,出現(xiàn)主從大量數(shù)據(jù)不一致的情況。
  • 問題 3:從庫 B 想要恢復(fù)復(fù)制,必須先解決同步失敗的問題才能恢復(fù)。排查難度較大,耗時。
  • 問題 4:從庫 B 恢復(fù)時,必須知道同步位點,也就是從哪個 binlog 文件和 binlog 位置斷開復(fù)制的,且即使找到了位點,也不是精確的。
  • 問題 5:從庫 B 因同步異常導(dǎo)致停止復(fù)制到恢復(fù)復(fù)制這段期間,主庫 A 自動清理了幾天前的 binlog 日志,而這些日志從庫 B 還未來得及同步,進(jìn)而導(dǎo)致再次同步失敗。
  • 問題 6:主從存在同步延遲。

這篇我們來探討下問題 4 和問題 6。

其中問題 4 是一個比較頭疼的問題,我們一般是通過查看從庫 B 當(dāng)前的同步狀態(tài)拿到同步位點,然后設(shè)置同步位點后。但是重新啟動同步的時候又會出現(xiàn)同步異常,比如從庫 B 可能會出現(xiàn) Duplicate entry ‘id_of_R’ for key ‘PRIMARY’ 錯誤,提示出現(xiàn)了主鍵沖突,然后停止同步。

為了減少位點同步引入的復(fù)雜度,我們切換成了 GTID 模式。

對于問題 6,本篇也僅限于探討如何觀察延遲,對于如何減少延遲不在本篇探討范圍之內(nèi)。

接下來我們來展開看下位點同步的痛點。

二、位點同步的痛點

2.1 通過位點同步的原理圖

為了更清晰地理解主從采用位點同步的原理,這里有一個原理圖:

1、主庫會生成多個 binlog 日志文件。

2、從庫的I/O 線程請求指定文件和指定位置的 binlog 日志文件(位點)。

3、主庫 dump 線程獲取指定位點的 binlog 日志。

4、主庫按照從庫發(fā)送給來的位點信息讀取 binlog,然后推送 binlog 給從庫。

5、從庫將得到的 binlog 寫到本地的 relay log (中繼日志) 文件中。

6、從庫的 SQL 線程讀取和解析 relay log 文件。

7、從庫的 SQL 線程重放 relay log 中的命令。

當(dāng)我們使用位點同步的方式時,兩種場景下的操作步驟比較復(fù)雜。

2.2 痛點

痛點1:首次開啟主從復(fù)制的步驟復(fù)雜

  • 第一次開啟主從同步時,要求從庫和主庫是一致的。
  • 找到主庫的 binlog 位點。
  • 設(shè)置從庫的 binlog 位點。
  • 開啟從庫的復(fù)制線程。

痛點2:恢復(fù)主從復(fù)制的步驟復(fù)雜

  • 找到從庫復(fù)制線程停止時的位點。
  • 解決復(fù)制異常的事務(wù)。無法解決時就需要手動跳過指定類型的錯誤,比如通過設(shè)置slave_skip_errors=1032,1062。當(dāng)然這個前提條件是跳過這類錯誤是無損的。(1062 錯誤是插入數(shù)據(jù)時唯一鍵沖突;1032 錯誤是刪除數(shù)據(jù)時找不到行)

不論是首次開啟同步時需要找位點和設(shè)置位點,還是恢復(fù)主從復(fù)制時,設(shè)置位點和忽略錯誤,這些步驟都顯得過于復(fù)雜,而且容易出錯。所以 MySQL 5.6 版本引入了 GTID,徹底解決了這個困難。

三、GTID 方案

3.1 GTID 是什么?

GTID 的全稱是 Global Transaction Identifier,全局事務(wù) ID,當(dāng)一個事務(wù)提交時,就會生成一個 GTID,相當(dāng)于事務(wù)的唯一標(biāo)識。

GTID 長這樣:

c5d74746-d7ec-11ec-bf8f-0242ac110002:1

結(jié)構(gòu):

GTID=server_uuid:gno

server_uuid 是一個實例第一次啟動時自動生成的,是一個全局唯一的值;

gno 是一個整數(shù),初始值是 1,每次提交事務(wù)的時候分配給這個事務(wù),并加 1。

每個 MySQL 實例都維護(hù)了一個 GTID 集合,用來對應(yīng)“這個實例執(zhí)行過的所有事務(wù)”。

3.2 GTID 的優(yōu)勢

  • 更簡單的實現(xiàn) failover,不用以前那樣在需要找位點(log_file 和 log_pos)。
  • 更簡單的搭建主從復(fù)制。
  • 比傳統(tǒng)的復(fù)制更加安全。
  • GTID是連續(xù)的沒有空洞的,保證數(shù)據(jù)的一致性,零丟失。

3.3 如何啟用 GTID

修改主庫和從庫的配置文件:

#GTID:
gtid_mode=on
enforce_gtid_cnotallow=on

從庫配置同步的參數(shù):

CHANGE MASTER TO 
MASTER_HOST=$host_name
MASTER_PORT=$port
MASTER_USER=$user_name
MASTER_PASSWORD=$password
master_auto_positinotallow=1

其中 master_auto_position 標(biāo)識主從關(guān)系使用的 GTID 協(xié)議。

相比之前的配置,MASTER_LOG_FILE 和 MASTER_LOG_POS 參數(shù)已經(jīng)不需要了。

3.4 GTID 同步方案

GTID 同步的原理圖。

GTID 方案:主庫計算主庫 GTID 集合和從庫 GTID 的集合的差集,主庫推送差集 binlog 給從庫。

當(dāng)從庫設(shè)置完同步參數(shù)后,主庫 A 的GTID 集合記為集合 x,從庫 B 的 GTID 集合記為 y。從庫同步的邏輯如下:

  • 從庫 B 指定主庫 A,基于主備協(xié)議簡歷連接。
  • 從庫 B 把集合 y 發(fā)給主庫 A。
  • 主庫 A 計算出集合 x 和集合 y 的差集,也就是集合 x 中存在,集合 y 中不存在的 GTID 集合。比如集合 x 是 1~100,集合 y 是 1~90,那么這個差集就是 91~100。這里會判斷集合 x 是不是包含有集合 y 的所有 GTID,如果不是則說明主庫 A 刪除了從庫 B 需要的 binlog,主庫 A 直接返回錯誤。
  • 主庫 A 從自己的 binlog 文件里面,找到第一個不在集合 y 中的事務(wù) GTID,也就是找到了 91。
  • 主庫 A 從 GTID = 91 的事務(wù)開始,往后讀 binlog 文件,按順序取 binlog,然后發(fā)給 B。
  • 從庫 B 的 I/O 線程讀取 binlog 文件生成 relay log,SQL 線程解析 relay log,然后執(zhí)行 SQL 語句。

GTID 同步方案和位點同步的方案區(qū)別是:

  • 位點同步方案是通過人工在從庫上指定哪個位點,主庫就發(fā)哪個位點,不做日志的完整性判斷。
  • 而 GTID 方案是通過主庫來自動計算位點的,不需要人工去設(shè)置位點,對運(yùn)維人員友好。

四、如何判斷主從庫是否有延遲

上面提到的問題 6 是主從讀寫分離后,從庫復(fù)制存在延遲,接下來我們來探討下如何觀察主從延遲多少的問題。

方案一:判斷從庫的同步狀態(tài)參數(shù) seconds_behind_master 是否為 0。(不準(zhǔn)確)

方案二:對比位點確保主備無延遲。

方案三:對比 GTID 集合確保主備無延遲。

方案一:查看 seconds_behind_master

可以在從庫上執(zhí)行 slow slave status 命令來看執(zhí)行結(jié)果里面的 ??seconds_behind_master?? 參數(shù)的值,如下圖所示,Seconds_Behind_Master 等于 0

Seconds_Behind_Master 的單位是秒,所以精度不準(zhǔn)確。

所以為了保證查詢的數(shù)據(jù)是和主庫一致的,就需要先判斷 seconds_behind_master 是否已經(jīng)等于 0,如果不等于 0,就必須等到這個參數(shù)變?yōu)?0 才能執(zhí)行查詢請求。

方案二:對比位點

可以通過查看從庫當(dāng)前的同步位點來確認(rèn)從庫同步是否有延遲。下圖是在從庫上執(zhí)行 ??show slave status \G??命令后的結(jié)果:

Master_Log_File? 和 Read_Master_Log_Pos 這兩個參數(shù)合起來表示的是讀到的主庫的最新位點,第一參數(shù)是代表讀取到了哪個文件,第二個是讀取到的文件的位置。

Relay_Master_Log_File? 和 Exec_Master_Log_Pos,這兩個參數(shù)合起來表示的是從庫執(zhí)行的最新位點。

如果紅色框起來的兩個參數(shù):Master_Log_File? 和 Relay_Master_Log_File 相等,則說明從庫讀到的最新文件和主庫上生成的文件相同,這里都是 mysql-bin.000934。

如果藍(lán)色框起來的兩個參數(shù) Read_Master_Log_Pos? 和 Exec_Master_Log_Pos 相等,則說明從庫讀到的日志文件的位置和從庫上執(zhí)行日志文件的位置相同,這里都是 59521082。

當(dāng)上面兩組參數(shù)都相等時,則說明沒有延遲。

方案三:對比 GTID 集合

方案三是對比 GTID 集合。首先我們在從庫上執(zhí)行  show slave status \G來查看 GTID 集合。

如下圖所示:

Master_UUID 表示當(dāng)前連接的主庫的 ID。

Auto_Position: 1 表示主備使用了 GTID 協(xié)議。

Retrieved_Gtid_Set 表示從庫收到的所有日志的 GTID 集合。

Executed_Gtid_Set 表示從庫已經(jīng)執(zhí)行完成的 GTID 集合。

如果 Executed_Gtid_Set 集合是包含 Retrieved_Gtid_Set,則表示從庫接收到的日志已經(jīng)同步完成。

比如上圖中 Retrieved_Gtid_Set 值為

c5d74746-d7ec-11ec-bf8f-0242ac110002:1-87323

前面一段是主庫 id,后面一段 1-87383 是 GTID 范圍。而Executed_Gtid_Set 的值有兩個集合

7083ae1f-d7ef-11ec-a329-0242ac110002:1-2,
c5d74746-d7ec-11ec-bf8f-0242ac110002:1-87323

Executed_Gtid_Set 的第二個集合和第一個集合完全一致,第一個集合 id 和 集合范圍是上次同步另外一個主庫的記錄。這里說明從庫已經(jīng)和當(dāng)前主庫同步完成了。

方案二對比位點和方案三的 GTID 比對都要比方案一的seconds_behind_master 更準(zhǔn)確。但是還是沒有達(dá)到精確的程度,需要配合半同步復(fù)制(semi-sync replication)才能達(dá)到。

小結(jié):本篇通過 GTID 的方式更好地實現(xiàn)了主從節(jié)點的同步,以及如何觀察主從同步的延遲。

參考資料:

www.passjava.cn

https://time.geekbang.org/column/article/77636

高性能 MySQL 第四版

千金良方:MySQL性能優(yōu)化金字塔法則

關(guān)于我

8 年互聯(lián)網(wǎng)開發(fā)經(jīng)驗,擅長微服務(wù)、分布式、架構(gòu)設(shè)計。目前在一家大型上市公司從事基礎(chǔ)架構(gòu)和性能優(yōu)化工作。

InfoQ 簽約作者、藍(lán)橋簽約作者、阿里云專家博主、 紅人。


網(wǎng)頁標(biāo)題:MySQL主從模式采用GTID的實踐
本文URL:http://www.dlmjj.cn/article/djsjopi.html