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的状态,能够在此脚本上添加报警机制,来实现主从同步状态进行监控。

望你们给点优化脚本的建议,不甚感激!!
相关文章
相关标签/搜索