MySQL 5.6 複製:GTID 的優點和限制(第一部分)

huidaoli發表於2013-08-02
全域性事務標示符(Global Transactions Identifier)是MySQL 5.6複製的一個新特性。它為維護特定的複製拓撲結構下伺服器的DBA們大幅度改善他們的工作狀況提供了多種可能性。然而,你還應該明白當前實現的一些侷限。本博文是專門對在生產環境中啟用GTID到底意味著什麼進行討論的一系列文章的第一部分。

這個手冊非常到位地描述瞭如何才能切換到基於GTID的複製,我就不再鏊敘。

其基本步驟如下所示:

  • 讓主機成為只讀模式,這樣就可以讓從機執行所有的時間從而同主機保持為同步狀態。
  • 修改所有伺服器的配置並對它們進行重啟
  • 使用CHANGE MASTER TO,讓所有的伺服器使用GTID
  • 關閉主機的只讀模式

這個步驟會把你所有的伺服器從普通複製切換到GTID複製。但是,如果你執行的是生產系統,你可能會想一點一點啟用GTID,這樣一旦除了什麼問題,也更容易進行回滾了。相關文件中有些條目寫得不是很清楚。

比如:

  • 我們真地需要同時重啟所有的伺服器嗎? 停機時間可是我們千方百計要避免的事情!
  • 有必要讓主機變成只讀模式嗎?
  • 我們能不能在有些從機中使用普通複製的同時,在另外的一些從機上使用GTID複製?

為了找到這些問題的答案,先讓我們建立一個比較簡單的複製配置,其中有一個主機和兩個從機,所有伺服器執行的都是MySQL 5.6,都未啟用GTID。

首試:僅將其中的一個伺服器配置為啟用GTID

讓我們先停止2號從機的服務,修改配置後重啟:

1 mysql> show slave status\G
2 [...]
3 Slave_IO_Running: No
4 Slave_SQL_Running: Yes
5           [...]
錯誤日誌說明了為什麼IO執行緒沒有啟動起來:
1 2013-05-17 13:21:26 3130 [ERROR] Slave I/O: The slave IO thread stops because the master has GTID_MODE OFF and this server has GTID_MODE ON, Error_code: 1593

看來,很不幸的是,如果想要複製正常執行,gtid_mode必須在所有的伺服器上都是ON或者都是OFF才行, 半半拉拉的絕對不行。

要是我們對主機進行重新配置會怎樣?這次,1號從機的複製會停止執行:

1 2013-05-17 13:32:08 2563 [ERROR] Slave I/O: The slave IO thread stops because the master has GTID_MODE ON and this server has GTID_MODE OFF, Error_code: 1593

這兩個簡單的試驗回答了頭兩個問題:只有在所有的伺服器中的gtid_mode具有相同的值時,複製才能正常執行,因此,你應該對它們同時進行重啟,而且最好是在將主機成為只讀模式後進行。然而,“同時”的意思是“在同一個binlog位置上”,所以你完全可以一個接一個對伺服器進行重啟。

再試:啟用GTID,混合使用普通複製和GTID複製

這次我們在1號從機而不是2號從機上啟用GTID:

1 # slave #1
2 mysql> change master to master_auto_position = 1;
3 mysql> start slave;
接下來讓我們在主機上建立一個新表: 
1 mysql> create table test.t (id int not null auto_increment primary key);

在兩個從機上都執行SHOW TABLES FROM test表明,所有的伺服器都建立了這個新表。因此,一旦在所有的伺服器上啟用GTID,你就可以讓某些從機使用基於檔案的定位而讓另外一些從機使用基於GTID的定位。

這就回答了第二個問題:我們可以讓不同的伺服器具有不同的複製模式,但所有的伺服器必須將將gtid_mode設定為ON。在gtid_mode為ON的情況下還執行基於檔案的複製,這能有什麼意思?我還沒有發現這有什麼用處,所以在實踐中,你可能會要麼只用基於檔案的複製在(所有伺服器都設定為gtid_mode=off),要麼只用基於GTID的複製(所有伺服器都設定為gtid_mode=on)。

還有一個問題:如何通過檢視SHOW SLAVE STATUS的輸出才能看出來一個從機是不是基於GTID的複製?這可以通過檢視最後一個欄位,Auto_Position,的值進行區分:

1 # Slave #1
2 mysql> show slave status\G
3 [...]
4 Auto_Position: 1  -> GTID-based positioning
5 # Slave #2
6 mysql> show slave status\G
7 [...]
8 Auto_Position: 0  -> File-based positioning

結束語

如果你的應用輕易不能容忍停機時間或者只讀模式,那麼基於GTID的複製啟用起來就會非常棘手,特別在需要重新配置大量伺服器的情況下,便更是如此了。要是能將gtid_mode為ON的伺服器同gtid_mode為OFF的伺服器混合使用就好了,因為這樣的話,就就能夠簡化轉向基於GTID的複製的所需的過程,如果出了錯還更容易進行回滾。

相關文章