1. 程式人生 > 實用技巧 >MySQL 深入瞭解複製之基於全域性事務標示符 三、

MySQL 深入瞭解複製之基於全域性事務標示符 三、

配置複製

這裡呢敘述一下,在使用GTID複製的時候呢,我們要去看一下我們伺服器的GTID 是否開啟,包括開啟之後需要檢視一下是否開啟成功,(我之前遇到一個問題就是在配置檔案配置了gtid_mode=ON,然後直接去配置操作後面的流程,但是後來遇到很多問題,後來排錯的時候原來是GTID 沒有開啟成功,當時我就樂了呀

show variables like '%gtid%'; // 用來檢視GTID 是否開啟,這裡主要看一下紅線框的資料

MySQL 使用GTID配置複製的時候,有兩種情況:

  1、修改傳統複製模式,將其更改為GTID複製

  2、使用兩臺全新伺服器,直接配置GTID複製模式

一、線上開啟基於GTID的複製

  在配置MySQL GTID 複製的時候,我是基於傳統的配置進行了更改(關於傳統複製的方式可以參考 MySQL基於日誌配置複製);

此段落主要講述如何使伺服器在不需要離線的過程當中配置GTID,並且適合在生產中使用。但是,如果在啟用GTID事務時可以使伺服器離線,則此過程會更容易。

此種情況必須滿足以下兩種條件:

  • 伺服器都必須使用MySQL 5.7.6或更高版本。除非拓撲中的所有伺服器都使用此版本,否則您不能在任何單個伺服器上線上啟用GTID事務

  • 所有伺服器均gtid_mode設定為預設值OFF

首先我們需要先了解一下 ENFORCE_GTID_CONSISTENCY 配置的引數:

  • OFF所有操作允許。
  • ON不允許違反gtid的操作,並且報錯
  • WARN在MySQL 5.7.6新增,所有操作允許,但是違反GTID的操作會報出警告。

啟用GTID交易:

  1. 在每臺伺服器上,執行:

    mysql> SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;

    ⚠️: 這裡需要去檢視一下error 日誌,檢視在日誌中是否引起任何警告,確定事務都支援gtid,不會在error-log中出現警告如下。這是重要的第一步。您必須確保在繼續下一步之前在錯誤日誌中未生成任何警告。如果沒有問題開啟enforce_gtid_consistency操作

  2.在每臺伺服器上,執行:

mysql> SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;

  3.在每臺伺服器上,執行SET @@GLOBAL.GTID_MODE:

首先配置的時候先了解一下 gtid_mode 引數:

    • OFF
    • OFF_PERMISSIVE
    • ON_PERMISSIVE
    • ON

⚠️:gtid_mode根據上述順序,一次只能更改一個狀態。例如,如果gtid_mode當前設定為OFF_PERMISSIVE,則可以更改為OFFON_PERMISSIVE不能直接更改為ON

  

mysql> SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE; 

當主庫設定完gtid_mode=off_permissive之後,這個時候也要在從庫執行到這一步,為的是slave可以應用匿名事務和GTID事務。切記,主從設定是交叉的,如果從庫沒有設定到gtid_mode=off_permissive,而主庫下一步操作gtid_mode = on_permissive後,從庫的IO執行緒就會斷掉。帶來的後果就是如果主從有延遲,那麼主從資料很有可能會不一致。並且這種情況下,也不能算是一個完整的線上切換複製型別,只能算是半線上。

正確的做法就是如下操作,在從庫也先進行如下設定:

mysql> SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;

  

在每臺伺服器上,等待狀態變數ONGOING_ANONYMOUS_TRANSACTION_COUNT為零。可以使用以下命令進行檢查:

mysql> SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';

⚠️:在副本上,從理論上講,這有可能顯示為零,然後再次顯示為非零。這不是問題,只要顯示一次為零即可。

mysql> SELECT @@GLOBAL.GTID_OWNED;

等待生成的所有事務複製到所有伺服器。您可以在不停止更新的情況下執行此操作:唯一重要的是複製所有匿名事務。

如果你在此時寫一個程序指令碼,不斷插入資料,你就會發現此時的Retrieved_Gtid_Set/Executed_Gtid_Set正常增長(甚至你可以在slave上使用:

SELECT MASTER_POS_WAIT(file, position);

  

來強制等待slave端直到指定位置,這個位置就是你確定的使用GTID事務的位置)。
可以看到當主庫設定完gtid_mode = on_permissive後,二進位制狀態變成了GTID模式。這個時候就可以在從庫開啟gtid_mode = on_permissive了。

下面就可以在主庫和從庫上分別設定gtid_mod = on了

set global gtid_mode=on;

當到這裡的時候所有的工作已經完成了,我們可以使用 SHOW SLAVE STATUS 在SLAVE 檢視連線資訊等等。

⚠️: 由於我們未將配置寫入 配置檔案當中,所以當我們重啟MySQL的時候就會失效。

二、基於全新伺服器設定GTID

首先我們需要了解一下配置檔案的地址

locate my.cnf  // 此命令可以檢視所有的 my.cnf 檔案位置

啟動mysql後,我們可以通過檢視mysql的程序,看看是否有設定使用指定目錄的my.cnf檔案,如果有則表示mysql啟動時是載入了這個配置檔案。

ps aux|grep mysql|grep 'my.cnf'

如果上面的命令沒有輸出,表示沒有設定使用指定目錄的my.cnf。

檢視預設的配置檔案,檔案位置靠前的,配置的擁有最大的優先順序

mysql --help|grep 'my.cnf'

瞭解了mysql 預設啟動的配置檔案之後,我們就可以對my.cnf進行配置了。 下面需要對master 和 slave 都進行一下配置

gtid_mode=ON
enforce-gtid-consistency=ON

這樣配置好之後,不要忘記文章的第一步,檢查一下GTID檢視是否開啟成功了。

當所有當流程配置完之後,在SLAVE端修改CHANGEMASTER語句使用GTID 進行自動定位;

mysql> CHANGE MASTER TO  MASTER_HOST = host, MASTER_PORT = port,  MASTER_USER = user,MASTER_PASSWORD = password, MASTER_AUTO_POSITION = 1;
mysql> START SLAVE; // MySQL 8.0.22 需要使用 START REPLICA。

到這裡兩種情況就大功告成了,接下來我們可以通過修改一下資料庫,或者去新增幾條資料看看是否成功了吧。