1. 程式人生 > >Mysql 複製介紹

Mysql 複製介紹

MySQL 複製執行流程

1. Master上語句執行解釋之前,將更新資料庫的操作記錄在二進位制日誌中(select語句不記錄)。

2.Master上有個轉儲執行緒,讀取二進位制日誌檔案的內容傳送到slave機器的I/O執行緒上。

3.slave I/O執行緒接收資料寫入中繼日誌。

4.salve的sql執行緒從中繼日誌讀取並執行

 

 

如果主機和備機要穿越網路,為保證安全性,可以配置SSL或者使用stunnel建立安全連結。

啟停slave機器上的複製執行緒: 

  start/stop slave : 停止I/O執行緒和SQL執行緒    

  START/STOP  SLAVE  IO_THREAD(SQL_THREAD):僅開始或者停機IO執行緒(SQL執行緒)      

 

查詢狀態的命令

  show slave hosts:顯示主機上配置的備機資訊,該備機必須配置了report_host引數

  show master logs:顯示主機上的二進位制日誌檔案和大小

  show master status:給出下一個事件即將寫入二進位制日誌的位置

 show slave status: 檢視備機的執行狀態,幾個關鍵的變數含義如下:

  --- Master_Log_File和Read_Master_Log_Pos: Mater的讀位置,I/O執行緒即將從master二進位制日誌讀取的下一個事件位置。對應slave_master_info表的Mater_Log_name和master_log_pos欄位。

 ---  Relay_Master_Log_File和Exec_Master_Log_Pos: Master的執行位置,SQL執行緒即將執行的master二進位制日誌的下一個位置。對應slave_relay_log_info表的Master_log_name欄位和Master_log_pos欄位

 ---  Relay_Log_File和Relay_Log_Pos:中繼日誌的執行位置,sql執行緒即將執行的slave中繼日誌的下一個位置。對應slave_relay_log_info表的Relay_log_name欄位和Relay_log_pos欄位

---  Seconds_Behind_Master: 正在執行的sql時間與slave當前時間的差值

    

                

相關配置引數

log_bin:二進位制日誌檔名

log_bin_index: 二進位制日誌檔案的目錄列表

relay_log:中繼日誌檔名

relay_log_index:中繼日誌檔案目錄

####以上引數預設採用的是機器名,不安全,如果機器名改變,程式啟動會找不到檔案出錯

server_id: 必須要配置的引數,保持唯一。

expire_logs_days:二進位制日誌的保留天數,mysql會在重新整理日誌檔案的時候將超時的日誌清理。注意二進位制日誌不能自己再系統中刪除,可以通過配置該引數或者purage logs來清理。 

log-slave-updates:來自master上的事件同樣也會寫入備機的二進位制日誌,級聯場景中有用。

 

sync_binlog:控制二進位制日誌寫入磁碟的頻率。0:不主動重新整理到磁碟,由作業系統重新整理到磁碟。 其他:多少個事務重新整理一次。

  如果設定為非1,mysqld崩潰的情況下,資料並沒有丟失。但是如果系統斷電,作業系統沒有重新整理快取,會導致二進位制日誌資料丟失。這個會導致備機slave讀取不到對應位置的日誌,進一步導致備機事務退出。相關errno:1236

innodb_flush_log_at_trx_commit:控制事務日誌的重新整理頻率,0:每秒寫事務日誌(只是重新整理到系統快取)、每秒重新整理到磁碟   1:事務提交時寫日誌,重新整理到磁碟    2:事務提交時寫日誌,每秒重新整理磁碟    

    1是最安全的。 0:mysqld掛掉,會最多丟失一秒內的事務     2:系統掉電,會丟失最多一秒內的事務。mysqld掛掉不會丟失資料

 

 

Retrieved_Gtid_Set:從master獲取的,儲存在中繼日誌的GTID組

Executed_Gtid_Set:在slave上已經執行的GTID組

 

#嘗試重連引數

slave-net-timeout:超過該時間無響應,slave和master已經丟失連線,並嘗試重連

master-connect-retry:兩次嘗試間隔的秒

master-retry-count:最大嘗試次數

 

#複製過濾資料和表

#slave上SQL執行緒的過濾,該過濾可以保證master上二進位制日誌的完整  缺點是佔用網路頻寬

replicate-do-db   replication-ignore-db  replicate-do-table  replicate-ignore-table   replicate-wild-do-table  replicate-wild-ignore-table

#master上的過濾,對應的表和資料庫修改不會記錄到二進位制日誌中,優點減少網路頻寬,缺點二進位制日誌不完整

binlog-do-db   binlog-ignore-db

#過濾操作如果配置為基於行的複製模式沒有問題。如果是基於語句的模式,會根據use語句過濾資料庫,沒法拆分一個語句中對多個表的修改,建議採用以下規則:

# 語句前使用use db,不使用db.table的格式;不要在一個語句中修改多張表;不要在一個語句中跨庫修改表;

 

MySQL的複製模式

MySQL的複製是非同步的,這樣能夠提高處理速度,但是備機上的資料的安全性不能完全保證。

MySQL有外掛支援半同步複製:確保至少有一個slave將變更寫到磁碟。這樣最多隻有一個事務丟失。通過rpl-semi-sync-master-timeout和rpl-semi-sync-master-wait-no-slave引數可以設定超時和無slave連線的情況下將本同步還原為非同步同步。

基於GTID複製: mysql5.6版本引入,但是有些問題,建議在5.7之後的版本中再使用

   GTID=UUID(伺服器唯一ID) + 事務標記符(在一臺機器上唯一標記事務,根據服務提交的順序分配)。GTID可以唯一標記任意一個事務。

   在change master to語句中使用master_auto_position=1,當slave連線master的時候,自動與master協商應該傳送什麼事務。

   變數GTID_EXECUTED表示已經執行的GTID組,GTID_PURED表示已經從二進位制日誌中清除的事務組。

 

   使用GTID進行故障轉移和slave升主都比較容易。

 

 

Slave的安全與恢復

複製不是崩潰安全的。

slave端I/O執行緒要做2件事:重新整理master上的二進位制日誌到中繼日誌檔案;將master上的位置資訊記錄到master_info檔案。

slave段sql執行緒要做2件事:執行中繼日誌中的事務,更新replay_log_info檔案中的位置資訊。

這些操作都是事務型的,在任意位置可能發生崩潰。有2種結果:先執行操作,後記錄位置,如果中間發生崩潰,下次重啟的時候操作會再執行一次;先記錄位置,再執行操作,如果中間發生崩潰,會丟失操作。mysql選擇的前一種,這樣至少不會丟失事務,但是操作可能執行兩次。

解決方法:mysql5.6版本增加事務性複製。將複製資訊寫入innodb表中,從而將要做的2件事處理為事務型的。

  配置:master_info_repository=TABLE     master_log_info_repository=TABLE

 

 

複製的二進位制日誌模式

基於語句複製STATMENT:  缺點:某些場景下不安全,對於事件、觸發器、複製的過濾等。

基於行復制ROW:   基於行的模式對於事件、觸發器、資料庫和表的複製過濾都支援的很好。 但是二進位制日誌的量可能非常大。

   binlog-row-image控制哪些列寫入日誌。如果master和slave上的索引完全一致,可以將binlog-row-image設定為minimal(只有主鍵和需要更改的列寫入二進位制日誌,預設是表的所有列寫入二進位制日誌)。在我的測試環境上二進位制日誌的大小可以減少1/3。

MIXED:預設使用基於語句的模式,如果遇到不安全的語句,才用基於行的模式。如果是Read committed和Read uncommitted隔離級別,會自動切換到基於行的模式。