1. 程式人生 > 實用技巧 >keepalived健康檢查及雙主MySQL健康檢查指令碼

keepalived健康檢查及雙主MySQL健康檢查指令碼

一、http檢查

HTTP_GET:工作在第5層,向指定的URL執行http請求,將得到的結果用md5加密並與指定的md5值比較看是否匹配,不匹配則從伺服器池中移除;此外還可以指定http返回碼來判斷檢測是否成功。HTTP_GET可以指定多個URL用於檢測,這個一臺伺服器有多個虛擬主機的情況下比較好用。

real_server 10.21.10.30 80 {

weight 1
HTTP_GET {
        url {
        path /keeptest/index.html
        digest 3b9bc8d36a113971683321ad4fa02daf
        }
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        }

}

  

#使用命令獲取URL的hash
/usr/bin/genhash  -s 10.21.10.30 -p 80 -u /keeptest/index.html

二、tcp埠檢查

SSL_GET:跟上面的HTTP_GET相似,不同的只是用SSL連線 

三、tcp埠檢查

TCP_CHECK:工作在第4層,keepalived向後端伺服器發起一個tcp連線請求,如果後端伺服器沒有響應或超時,那麼這個後端將從伺服器池中移除。

    real_server 172.16.0.66 3306 {
        weight 1
        TCP_CHECK {
             connect_timeout 3 
             retry 3
             delay_before_retry 3  
             connect_port 3306    
        } 
    }   

  

四、指令碼檢查

MISC_CHECK:用指令碼來檢測,指令碼如果帶有引數,需將指令碼和引數放入雙引號內。指令碼的返回值需為: 0)檢測成功 1)檢測失敗,將從伺服器池中移除 2-255)檢測成功;如果有設定misc_dynamic,權重自動調整為退出碼-2,如退出碼為200,權重自動調整為198=200-2。

五、郵件檢查

SMTP_CHECK:用來檢測郵件服務的smtp的。沒用過不描述了自己搜吧

keepalive的雙主MySQL健康檢查

    real_server 172.16.0.66 3306 {
        weight 1
        TCP_CHECK {
             connect_timeout 3 
             retry 3
             delay_before_retry 3  
             connect_port 3306    
        } 
        MISC_CHECK {
           misc_path "/etc/keepalived/mysql_check.sh 172.16.0.66"
           misc_timeout 3
        }   
    }     

mysql_check.sh內容如下

#!/bin/bash
if [ $# -ne 1 ];then
    echo "Error: please use $0 172.16.0.66"
    exit 1
else
    CHECK_IP=$1
    Slave_status=$(mysql -u guoyabin -p'*********' -h $CHECK_IP -e "show slave status\G" | grep -wE 'Slave_SQL_Running|Slave_IO_Running' | awk -F": " '{print $2}' | wc -l)
    Seconds_Behind_Master=$(mysql -u guoyabin -p'*********' -h $CHECK_IP -e "show slave status\G" | grep -w Seconds_Behind_Master | awk -F": " '{print $2}')
    if [ ${Slave_status} -eq 2 ] && [ ${Seconds_Behind_Master} -lt 300 ];then
        exit 0
    else
        #非同步呼叫釘釘傳送通知。第一次指令碼用了for i in {1..20}次,發現keepalive每次檢查都要傳送釘釘通知,故只通知一次。
        {
            message="$CHECK_IP Slave_status=$Slave_status Seconds_Behind_Master = $Seconds_Behind_Master"
            curl --connect-timeout 2 "https://oapi.dingtalk.com/robot/send?access_token=**********************************************" \
                -H "Content-Type: application/json" \
                -d '{"msgtype": "text", 
                "text": {
                    "content": "'"${message}"'"
                }
            }'
        } &

        exit 1
    fi
fi

  

#注意mysql_check.sh增加可執行許可權