天天看點

mysql主從複制原理詳解_MySQL主從複制叢集—gtid實作詳解

mysql主從複制原理詳解_MySQL主從複制叢集—gtid實作詳解

老哥唠叨

上一篇發了

MySQL

主從複制叢集搭建流程,不過好像小夥伴們對這個文章并不感興趣,但是老哥出于對技術的熱愛,和對小夥伴們的負責,我還是要寫主從複制另一種實作方式:

GTID

。這些技術真的蠻重要的,希望你們能學習。

GTID 簡介

從 MySQL 5.6.5 版本新增了一種主從複制方式:

GTID

,其全稱是

Global Transaction Identifier

,即全局事務辨別。通過

GTID

保證每個主庫送出的事務在叢集中都有唯一的一個

事務ID

。強化了資料庫主從的一緻性和故障恢複資料的容錯能力。在主庫當機發生主從切換的情況下。

GTID

方式可以讓其他從庫自動找到新主庫複制的位置,而且

GTID

可以忽略已經執行過的事務,減少了資料發生錯誤的機率。

GTID 組成

GTID

是對一個已經送出事務的編号,并且是全局唯一的。

GTID

是由

UUID

TID

組成的。

UUID

MySQL

執行個體的唯一辨別,

TID

代表該執行個體上已經送出的事務數量,随着事務送出數量遞增。

舉個例子:

3E11FA47-71CA-11E1-9E33-C80AA9429562:23

,冒号前面是

UUID

,後面是

TID

GTID 工作原理

  • 主庫 master 送出一個事務時會産生 GTID,并且記錄在 binlog 日志中
  • 從庫 salve I/O 線程讀取 master 的 binlog 日志檔案,并存儲在 slave 的 relay log 中。slave 将 master 的 GTID 這個值,設定到 gtid_next 中,即下一個要讀取的 GTID 值。
  • slave 讀取這個 gtid_next,然後對比 slave 自己的 binlog 日志中是否有這個 GTID
  • 如果有這個記錄,說明這個 GTID 的事務已經執行過了,可以忽略掉
  • 如果沒有這個記錄,slave 就會執行該 GTID 事務,并記錄到 slave 自己的 binlog 日志中。在讀取執行事務前會先檢查其他 session 持有該 GTID,確定不被重複執行。
  • 在解析過程中會判斷是否有主鍵,如果沒有就用二級索引,如果沒有就用全部掃描。

GTID實作

環境

這裡我們準備兩台機器,一主一從。

  • 主(master):192.168.216.111
  • 從(salve):192.168.216.222

master主庫配置

[mysqld]

下配置,配置完需要重新開機

#GTID:
server_id=111  #伺服器id,一般設定為機器 IP 位址後三位
gtid_mode=on  #開啟gtid模式

#強制gtid一緻性,開啟後對于特定create table不被支援
enforce_gtid_consistency=on

#binlog
log_bin = 二進制日志檔案存放路徑
log-slave-updates=true

#強烈建議,其他格式可能造成資料不一緻
binlog_format=row

#relay log
skip_slave_start=1
           

slave從庫配置

[mysqld]

下配置,配置完需要重新開機

#GTID:
gtid_mode=on #開啟gtid模式
enforce_gtid_consistency=on

#伺服器id,一般設定為機器 IP 位址後三位
server_id=222

#binlog
log-bin=slave-binlog
log-slave-updates=true

#強烈建議,其他格式可能造成資料不一緻
binlog_format=row

#relay log
skip_slave_start=1
           

檢查GTID是否開啟

show variables like '%gtid%';
           
mysql主從複制原理詳解_MySQL主從複制叢集—gtid實作詳解

主庫建立授權使用者

# 建立授權使用者
GRANT REPLICATION SLAVE ON *.* TO '使用者名'@'從機IP' IDENTIFIED BY '密碼';
# 重新整理MySQL的系統權限相關表
FLUSH PRIVILEGES;
           

salve連接配接到master

CHANGE MASTER TO  
MASTER_HOST='master的IP',    
MASTER_USER='使用者名',    
MASTER_PASSWORD='密碼',    
MASTER_PORT=端口号,    
# 1 代表采用GTID協定複制
# 0 代表采用老的binlog複制
MASTER_AUTO_POSITION = 1;
           

開啟主從複制

start slave;
           

檢視slave狀态

show slave statusG
           

在master上檢視salve資訊

show slave hosts;
           
mysql主從複制原理詳解_MySQL主從複制叢集—gtid實作詳解

至此

GTID

主從複制方式搭建完畢,可以操作主庫驗證一下從庫是否同步了資料。

IT 老哥

一個在大廠做進階Java開發的程式猿

搜尋VX:IT 老哥 ,擷取更多學習資源