LVS監控Realserver狀態實現及時添加刪除ReasServer小腳本

    爲了實現數據庫讀寫分離,使用傳統的 mysql-proxy,變形蟲(ameba),可是mysql-proxy不是很穩定,有的時候直接罷工,而變形蟲不支持事務,而咱們的程序是一個須要支持事務的引擎,因此這個用不到了,因此通過考慮,決定嘗試LVS分發,來實現讀寫分離,可是LVS對後臺realserver沒法實時進行檢測,因此會出現鏈接數據庫失敗的,因此寫個腳本進行自動檢測,而後自動把有故障的提出ipvsadm的隊列,當故障解決了,又再次加到隊列中,這樣就不會出現分發錯誤、鏈接數據庫失敗的問題了,好了接下來就是一個簡單的配置介紹了:
架構設計大體以下:
本架構中涉及到了主從複製,LVS,這些配置很簡單,不在多描述,接着就是主要講述一下LVS的directory檢測後端Realserver狀態,並實現自動添加和刪除對應出現故障的Realserver主機,主從和LVS就很少說了,接下來主要講解的是Direcrtory自動檢測腳本,而後根據slave的同步狀態,同步延遲進行自動添加和刪除。
#!/bin/bash
#:Title:Monitor the realservers
#:Synopsis:
#:Data:2012-04-23 13:36:32
#:Version:1.1
#:Author:LuoWei <luoweiro@126.com>
#:Options:
#-----------------------------------------------
#Monitor RealServer on Direcrory
#-----------------------------------------------
User=connect           //受權鏈接賬號(Slave上對directory主機受權)
Password=redhat        //鏈接Slave的密碼
Behindtime=120         //定義主從延遲時間,若是超過這個時間,就把後端的Realserver刪除
IPVS=/sbin/ipvsadm
VIP=192.168.158.159         //定義VIP
VPORT=3306                  //定義LVS的虛擬端口
RPORT=3306                  //定義Realserver的端口
while [ 0 -lt 1 ];do        //寫個死循環,讓腳本後端執行 
  for I in {165,166};do     //定義Realserver的IP,我這裏兩個地址,你能夠接着寫
  Host1=192.168.158.$I
  del_realserver() {        //定義刪除Realserver的函數
    $IPVS -d -t $VIP:$VPORT -r $Host1:$RPORT 
  }
  add_realserver() {        //定義添加Realserver的函數
    $IPVS -a -t $VIP:$VPORT -r $Host1:$RPORT -g 
  }
  Slave_IO_Running=`mysql -h $Host1 -u$User -p$Password -e "SHOW SLAVE STATUS\G;" | grep "Slave_IO_Running" | awk -F":" '{print $2}'`    //定義Slave_IO_Running
  Slave_SQL_Running=`mysql -h $Host1 -u$User -p$Password -e "SHOW SLAVE STATUS\G;" | grep "Slave_IO_Running" | awk -F":" '{print $2}'`    //定義Slave_SQL_Running
  Seconds_Behind_Master=`mysql -h $Host1 -u$User -p$Password -e "SHOW SLAVE STATUS\G;" | grep "Seconds_Behind_Master" | awk -F":" '{print $2}'`  //定義Seconds_Behind_Master延遲時間
  if  [ $Slave_IO_Running == "Yes" -a $Slave_SQL_Running == "Yes"  -a  $Seconds_Behind_Master -lt $Behindtime ];then    //若是三個參數都符合要求,就添加
    add_realserver                               固然這個添加不是必要的,若是原來有的話,就是防止之前刪除過了,而後再添加,能夠再寫個判斷,筆者就省略了
  elif [ $Slave_IO_Running == "Yes" -a $Slave_SQL_Running == "Yes" -a $Seconds_Behind_Master -gt $Behindtime ];then
    del_realserver
  else 
    del_realserver
  fi
  done
done

下面我就模擬中止 165上的主從,能夠看到164上就會把165的從隊列中刪除。

當把主從開啓的時候,又會添加到隊列中了
好了,如今基本功能都能實現了,可是要是採用文中的死循環的放在後端運行的話,會佔用cpu資源,因此建議修改,而後優化一下腳本
我暫時尚未對腳本優化,望廣大盟友給點優化的建議,之後就用這個腳本進行檢測後端Realserver狀態來自動添加和刪除後端Realserver,避免照成鏈接失敗的情況,同時也能快速檢測Realserver的狀態,能夠在此腳本上添加報警機制,來實現主從同步狀態進行監控。

望你們給點優化腳本的建議,不甚感激!!
相關文章
相關標籤/搜索