【複製系列】基於binlog文件和位置的 傳統複製 原 薦

 

前言

基於日誌文件和位置的 傳統複製,是根據binlog文件和master_log_position確定複製的。

 

傳統複製的原理

在master上,線程:dump_thread ;日誌:binlog

在slave上,線程:IO_thread SQL_thread;日誌:relay log

1、在主庫master中,記錄二進制日誌

在事務準備提交前,主庫將更新的事件記錄到binlog中,然後事務提交。注意,在binlog文件記錄的事務均是按照事務提交順序來記錄的。

2、從庫將主庫的binlog複製到自己的relay log中

從庫中的IO_thread 與主庫建立一個連接,在主庫,每當有新事件時,dump_thread會讀取該事件,併發送給IO_thread,IO_thread 將接收到的事件記錄在從庫的relay log中。

3、SQL_thread 執行復制過來的事件

從庫中的SQL_thread會執行relay log中記錄的事件,以此更新從庫的數據。但是,SQL_thread是否會將執行的事件記錄到本地的binlog中,由參數log_slave_updates控制。

 

傳統複製的搭建

機器環境:

  • 以 一主一從爲例。
  • Master IP: 172.16.100.100
  • Slave IP: 172.16.100.101 
  • 兩機器均已安裝MySQL。

配置步驟:

# 主庫(master)

  • 在 my.cnf 中添加 or 修改:
    • server-id=1003306      #  IP最後一個字段+端口號
    • log-bin=/data/mysql/mysql3306/mysql-bin
    • binlog_format = row
  • 在mysql中創建複製使用的賬戶:
    • mysql> create user 'repl'@'172.16.100.101' identified by '123123';
    • mysql> grant replication slave on *.* to 'repl'@'172.16.100.101' ;  
    • mysql> show master status\G

# 從庫(slave)

  • 在 my.cnf 中添加 or 修改:
    • server-id=1013306       #  IP最後一個字段+端口號
    • log-bin=/data/mysql/mysql3306/mysql-bin
    • binlog_format = row
    • log_slave_updates        # 使從庫產生binlog,若不配置,即使開啓log-bin參數,也不會產生binlog,若不需要binlog,則不用配置該參數
  • 使 從庫 指向 從庫(保證該操作之前複製線程已停止!)
    • mysql>change master to master_host='172.16.100.100',master_user='repl',master_password='123123',master_log_file='mysql-bin.000001',master_log_pos=330;

# 開啓和關閉複製(在從庫操作)

  • start slave;       # 開啓複製
  • show slave status\G              # 查看複製情況

 

解讀 show slave status 的主要字段

  • Master_Log_File:IO thread 當前在讀的主庫binlog文件
  • Read_Master_Log_Pos:IO thread 已讀到的主庫binlog的位置
  • Relay_Log_File:SQL thread 正在讀取的relay log文件
  • Relay_Log_Pos:SQL thread 已讀取的relay log中的位置
  • Relay_Master_Log_File:SQL thread最近執行的事件 所在主庫的binlog文件
  • Slave_IO_Running:IO thread 是否在運行(必須爲Yes,否則有問題)
  • Slave_SQL_RunningSQL thread 是否在運行(必須爲Yes,否則有問題)
  • Replicate_Do(Ignore)_DB:在複製時,複製或忽略複製的庫
  • Last_Errno/Last_Error:錯誤碼/錯誤說明;通常主從報錯時在這裏顯示錯誤的原因
  • Exec_Master_Log_Pos:705904595     # SQL thread已執行事件的主庫binlog的位置,也標誌 將要處理下一個事件或事務的開始;通常這個位置在主庫對應binlog文件中是這樣的:
……

#170713 15:52:16 server id 1003306  end_log_pos 705904595 CRC32 0xaee2b643    Xid = 5191672348
COMMIT/*!*/;
# at 705904595
#170713 16:02:10 server id 1003306  end_log_pos 705904674 CRC32 0x97e59f40    Query   thread_id=1442126       exec_time=0     error_code=0
SET TIMESTAMP=1499932930/*!*/;
BEGIN     
/*!*/;

……
  • Seconds_Behind_Master:從庫正在處理事件時,此時從庫的時間戳 與 正被處理的事件在主庫上記錄的時間戳的差值(單位爲秒)。實際上,該值測量的是SQL 線程和IO線程之差,在主從的網絡很好的情況下,從庫的IO線程和主庫很接近,SQL線程和IO線程之差 也就近似 SQL線程和主庫之差(即是第一句的意思),因此,只有在網絡很好的情況下,這個值纔有參考性;而在網絡不好的情況下,即使值爲0,也不能說明沒有延遲。
  • Last_IO_Error/Last_SQL_Error:IO thread出錯的原因 / SQL thread出錯的原因
  • SQL_Delay:從庫必須滯後主庫的秒數;因爲有時會特意設置一個延遲的從庫,用作誤操作恢復
  • Retrieved_Gtid_Set:IO線程從主庫所複製事務對應的GITD集合;但若沒有開啓GTID,則爲空
  • Executed_Gtid_Set:在從庫中已寫入binlog的GTID集合,也是 在從庫show master status的Executed_Gtid_Set值;但若沒有開啓GTID,則爲空
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章