標籤:nec sharp highlight port 資料庫 階段 圖片 state 開發
在高並髮網站架構中,MySQL資料庫主從同步是不可或缺的,不過經常會發生由於網路原因或者操作錯誤,MySQL主從經常會出現不同步的情況,那麼如何監控MySQL主從同步,也變成網站正常啟動並執行重要環節。
MySQL同步功能由3個線程(master上1個,slave上2個)來實現,簡單的說就是:master發送日誌一個,slave接收日誌一個,slave作業記錄一個。
首先,我們解釋一下 show slave status 中重要的幾個參數:
Slave_IO_Running: I/O線程是否被啟動並成功地串連到主伺服器上。
Slave_SQL_Running: SQL線程是否被啟動。
Seconds_Behind_Master:和主庫比同步延遲的秒數
本欄位是從屬伺服器“落後”多少的一個指示。當從屬SQL線程正在運行時(處理更新),本欄位為在主伺服器上由此線程執行的最近的一個事件的時間標記開始,已經過的秒數。當此線程被從屬伺服器I/O線程趕上,並進入閑置狀態,等待來自I/O線程的更多的事件時,本欄位為零。總之,本欄位測量從屬伺服器SQL線程和從屬伺服器I/O線程之間的時間差距,單位以秒計。
如何監控從伺服器是否正常運行呢?
[[email protected] ~]# mysql -u root -proot -e "show slave status\G;"*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.0.31 #當前的mysql master伺服器主機 Master_User: myslave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000003 Read_Master_Log_Pos: 471 Relay_Log_File: relay-log-bin.000002 Relay_Log_Pos: 252 Relay_Master_Log_File: master-bin.000003 Slave_IO_Running: Yes #I/O線程是否被啟動並成功地串連到主伺服器上。 Slave_SQL_Running: Yes #SQL線程是否被啟動。 Master_SSL_Key: Seconds_Behind_Master: 0 #和主庫比同步延遲的秒數
下面編寫shell指令碼監控mysql主從同步,實現如下功能:
階段1:開發一個守護進程指令碼每30秒實現檢測一次。
階段2:如果同步出現如下錯誤號碼(1158,1159,1008,1007,1062),請跳過錯誤
階段3:請使用數組技術實現上述指令碼(擷取主從判斷及錯誤號碼部分)
#!/bin/bashmysql_cmd="mysql -u root -proot"errornum=(1158 1159 1008 1007 1062)while truedo array=($($mysql_cmd -e "show slave status\G"|egrep ‘_Running|Behind_Master|Last_SQL_Errno‘|awk ‘{print $NF}‘)) if [ "${array[0]}" == "Yes" -a "${array[1]}" == "Yes" -a "${array[2]}" == "0" ] then echo "MySQL is slave is running" else for ((i=0;i<${#errornum[*]};i++)) do if [ "${array[3]}" = "${errornum[$i]}" ];then $mysql_cmd -e "stop slave &&set global sql_slave_skip_counter=1;start slave;" fi done char="MySQL slave is downed" echo "$char" echo "$char"|mail -s "$char" [email protected] break fi sleep 30done
監控mysql主從同步狀態