slave庫寫redo、binlog不實時丟資料的場景

chenfeng發表於2017-07-27
1.slave涉及相關檔案

  slave讀取master的binlog日誌後,需要落地3個檔案:relay log、relay log info、master info:

relay log:      即讀取過來的master的binlog,內容與格式與master的binlog一致
relay log info: 記錄SQL Thread應用的relay log的位置、檔案號等資訊 
master info:    記錄IO Thread讀取master的binlog的位置、檔案號、延遲等資訊


如果當這3個檔案如果不及時落地,則主機crash後會導致資料的不一致。


2.資訊儲存方式


在MySQL 5.6.2之前,slave記錄的master資訊以及slave應用binlog的資訊存放在檔案中,即master.info與relay-log.info。在5.6.2版本之後,允許記錄到table中,引數設定如下:


master-info-repository  = TABLE             
relay-log-info-repository = TABLE   


對應的表分別為mysql.slave_master_info與mysql.slave_relay_log_info,且這兩個表均為innodb引擎表。


3.控制重新整理引數


relay log、relay log info與master info還有3個引數控制重新整理:


?sync_relay_log:預設為10000,即每10000次sync_relay_log事件會重新整理到磁碟。為0則表示不重新整理,交由OS的cache控制。
?sync_relay_log_info:若relay_log_info_repository為FILE,當設定為0,交由OS重新整理磁碟,預設為10000次重新整理到磁碟;若relay_log_info_repository為TABLE,且為INNODB儲存,則無論為任何值,則都每次evnet都會更新表。
?sync_master_info:若master-info-repository為FILE,當設定為0,則每次sync_master_info事件都會重新整理到磁碟,預設為10000次重新整理到磁碟;若master-info-repository為TABLE,當設定為0,則表不做任何更新,設定為1,則每次事件會更新表 預設為10000


4.建議引數設定


sync_relay_log = 1             
sync_master_info = 1         
sync_relay_log_info = 1             
master-info-repository  = TABLE 
relay-log-info-repository = TABLE     


當這樣設定,導致呼叫fsync()/fdatasync()隨著master的事務的增加而增加,且若slave的binlog和redo也實時重新整理的話,會帶來很嚴重的IO效能瓶頸。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2142655/,如需轉載,請註明出處,否則將追究法律責任。

相關文章