早上剛睜眼,看到了一堆資料庫告警的簡訊,其中一個內容如下: 眼看這是剛從其他DBA交接過來的資料庫,不敢怠慢,立馬起來查看從庫日誌信息如下: 即非正常停止。 再登錄主庫機器查看主庫錯誤日誌,信息如下 從主庫日誌可以看出,2個從庫是主庫主動斷開的,而給出的信息也指出了原因failed on flush ...
早上剛睜眼,看到了一堆資料庫告警的簡訊,其中一個內容如下:
Problem started at 05:02:58 on 2019.10.12
Problem name: Slave is stopped on 192.168.56.31:3306
Host: 192.168.56.31
Severity: High
眼看這是剛從其他DBA交接過來的資料庫,不敢怠慢,立馬起來查看從庫日誌信息如下:
2019-10-12T05:01:16.506540+08:00 1 [Note] Slave I/O thread killed while reading event for channel ''
2019-10-12T05:01:16.506605+08:00 1 [Note] Slave I/O thread exiting for channel '', read up to log 'mybinlog.001265', position 388024306
即非正常停止。
再登錄主庫機器查看主庫錯誤日誌,信息如下
2019-10-12T05:01:59.414412+08:00 373818 [Note] Aborted connection 373818 to db: 'unconnected' user: 'repl' host: '192.168.56.31' (failed on flush_net())
2019-10-12T05:01:59.414424+08:00 407536 [Note] Aborted connection 407536 to db: 'unconnected' user: 'repl' host: '192.168.56.49' (failed on flush_net())
從主庫日誌可以看出,2個從庫是主庫主動斷開的,而給出的信息也指出了原因failed on flush_net()。另外還有很多 Got timeout reading communication packets 的信息。
因為mysqld是一個多線程的C/S架構的網路應用,主從同步及數據的讀取是通過網路來讀寫數據,所以可能會出現寫數據失敗的情況。如果mysql的錯誤日誌中出現failed on flush_net()這類的錯誤時,即說明主庫的mysqld在向客戶端發送網路包時失敗導致的。在主從這種複製場景下則說明是複製過程中master向slave推送binlog寫網路數據包失敗。
出現此類問題的可能是TCP擁堵等情況造成的,因此建議生產環境的操作系統參數進行調整。可參考如下方式修改
/** 在 /etc/sysctl.conf 文件目錄末尾增加如下參數 */ kernel.sem=250 32000 100 128 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 30 /** 使參數生效 */ sysctl -p
生產環境涉及MySQL數據的操作系統部分參數需要根據情況進行調整,同時MySQL參數也需要根據操作系統的配置情況及實際網路情況進行調整,這樣資料庫才能穩定、高效的運行。
本次優化的參數在之前MySQL部署時有提及,需要瞭解的同學可以回看,也可以與我溝通,謝謝。
想進一步溝通或想瞭解其他文章的同學可以關註我的微信公眾號進行交流。