keepalive安装(配合mysql主主复制)

系统:centos5.5_64

#vip为程序读取mysql的IP,应和程序服务器的网卡一个网段

主库实际IP   192.168.10.48
从库实际IP   192.168.10.49
虚拟VIP      192.168.10.50   #该IP供程序连接使用

【一】、keepalived安装步骤,这里建议使用keepalived-1.1.17,不可使用过高版本

wget http://www.keepalived.org/software/keepalived-1.1.17.tar.gz

tar zxvpf keepalived-1.1.17.tar.gz
cd keepalived-1.1.17
./configure
#不使用lvs只需要Use VRRP Framework为Yes
make
make install

#拷贝配置文件并创建配置问文件目录
cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/
#suse使用keepalived.suse.init启动脚本覆盖/etc/init.d/keepalived
cp /usr/local/sbin/keepalived /usr/sbin/
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived

【二】、定义配置文件

vim /etc/keepalived/keepalived.conf   #(见下面文件详细配置)

#启动服务
/etc/init.d/keepalived start

#启动后加载配置文件(一般无需该操作,只有在更新了配置之后重新加载时使用)
/usr/sbin/keepalived -f /etc/keepalived/keepalived.conf


#如下是keepalived.conf配置文件内容,因为我们的需求是主主热备,无需其他功能,故主从的配置文件一致即可
#在同一局域网内,两组keepalived两参数 router_id 和 virtual_router_id 不可以一致
#
#主从库需要区别修改的三处如下:
#
# state 初始状态值,主库对应参数为 MASTER 从库对应的参数为 BACKUP
# priority 主库的优先级参数为150 从库的优先级参数为 100  注意这里的参数,从库的优先级一定要低于主库
# virtual_ipaddress 定义虚拟VIP地址以及绑定的网卡参数
#
###########################keepalived.conf配置内容##########################
! Configuration File for keepalived
global_defs {
    router_id mysql     #keepalive主机标识,这里的标识很重要,影响到主从库之间的keepalived通讯
}
vrrp_script check_run {
    script "/etc/keepalived/check_mysql.sh"    #服务器检查脚本,主要检查mysql是否可以正常访问
    interval 3                                 #服务检查周期,单位:秒
}
vrrp_sync_group VG1 {
    group {
        VI_1    #服务组名,多个时候一个出错就切换
    }
    notify_master  /etc/keepalived/takeover.sh    #状态切换为从库接管时执行该脚本,即主库宕机时,从库接管
    notify_backup  /etc/keepalived/recovery.sh    #状态切换为主库接管时执行该脚本,即主库恢复时,从库归还
}
vrrp_instance VI_1 {
    state BACKUP           #初始状态,都设置为BACKUP,配合不抢占参数
    interface eth1         #实例绑定网卡
    virtual_router_id 11   #VRID标识0-255
    priority 150           #主库的高优先级竞选为MASTER,从库的优先级要低于主库,故需要设置为100
    advert_int 1           #检查时间,单位:秒
    nopreempt              #不抢占,只能设置在BACKUP上
    authentication {
        #验证方式
        auth_type PASS
        auth_pass 1qaz@WSX
    }
    track_script {
        check_run          #定义程序的检查方法,调用脚本
    }
    virtual_ipaddress {
        #VIP
        10.10.20.205 dev eth1 label eth1:1
    }
}
##########################end#############################################
【三】、注意事项

1、无论主从服务器mysql都要优先keepalived启动,所以mysql开机启动权值应高于keepalived
2、将启动脚本加入系统服务启动项,需在脚本加入如下一段内容,位置放到`#!/bin/sh`下即可,注意前面的`#`号需要添加

`# chkconfig: 2345 90 80 `

#解释如下:
# chkconfig   系统命令通过该命令获取参数
# 2345        启动顺序
# 20          开机启动优先权  故mysql的启动优先权一定要高于keepalived优先权,建议将mysql设置为15 ,keepalived设置为80
# 80          关机停止优先权  故mysql的停止优先权一定要高于keepalived优先权,建议将mysql设置为60 ,keepalived设置为80

3、添加启动

chkconfig --add keepalived
chkconfig --level 35 keepalived on

4、如果需要主从两台服务器关机维护时,如迁移机房,应先关闭从库服务器上的mysql和keepalived,再关闭主库的服务,避免因为先关闭主库而导致从库接管服务

【四】、需要配合的检查脚本及报警脚本如下

##########################################################################
#!/bin/bash
#脚本位置:/etc/keepalived/check_mysql.sh
#脚本作用:mysql状态检测脚本

mysql -urepl -p"repl"  -h127.0.0.1 -P3306 -e "show status;" >/dev/null 2>&1
if [ "$?" -ne 0 ];then
/etc/init.d/keepalived stop
fi
#脚本结束
##########################################################################

chmod 700 /etc/keepalived/check_mysql.sh

##########################################################################
#!/bin/sh
#脚本位置:/etc/keepalived/takeover.sh
#脚本作用:接管服务报警脚本

#报警短信手机号
Phonenumber=13811080724

LANG="zh_CN.GBK"
export LANG

IP=`/sbin/ifconfig|awk -v RS="Bcast:" '{print $NF}'|awk -F: '/addr/{print $2}'|awk '{printf"%s_",$0}' | sed 's/_$//'`

node=`ls /data1/*mysql5*/data/*_mysql5_*_[0-9][0-9]*|awk -F "/" '{print $NF}'|awk -F"_" '{print $1}'`

case $node in
master)
    #报警信息
    SMS="${node}库`hostname`已恢复服务_${IP}_`date +%Y%m%d_%R`"
    #邮件报警
    echo $SMS | /bin/mail -s "keepalived恢复通知" mis@pearlinpalm.com
    #短信报警
    java -cp "/root/sh" SmsDelegate $Phonenumber "$SMS"
;;
slave)
    #备用节点接管后,停止数据库备份
    sed -i  's/\(.*\)dbbackup\.sh\(.*\)/#\1dbbackup\.sh\2/' /var/spool/cron/root
    #报警信息
    SMS="${node}库`hostname`已接管服务_${IP}_`date +%Y%m%d_%R`"
    #邮件报警
    echo $SMS | /bin/mail -s "keepalived接管通知" mis@pearlinpalm.com
    #短信报警
    java -cp "/root/sh" SmsDelegate $Phonenumber "$SMS"
        
;;
esac

#记录日志
echo $SMS >> /etc/keepalived/keepalived.log
    
#脚本结束
##########################################################################

chmod 700 /etc/keepalived/takeover.sh

##########################################################################
#!/bin/sh
#脚本位置:/etc/keepalived/recovery.sh
#脚本作用:关闭服务通知脚本

Phonenumber=15801177843

LANG="zh_CN.GBK"
export LANG

IP=`/sbin/ifconfig|awk -v RS="Bcast:" '{print $NF}'|awk -F: '/addr/{print $2}'|awk '{printf"%s_",$0}' | sed 's/_$//'`

node=`ls /data1/*mysql5*/data/*_mysql5_*_[0-9][0-9]*|awk -F "/" '{print $NF}'|awk -F"_" '{print $1}'`
case $node in
master)
SMS="${node}库`hostname`已等待接管_${IP}_`date +%Y%m%d_%R`"
;;
slave)
SMS="${node}库`hostname`已等待接管_${IP}_`date +%Y%m%d_%R`"
#主节点恢复后,启动数据库备份
sed -i  's/#\(.*\)dbbackup\.sh\(.*\)/\1dbbackup\.sh\2/' /var/spool/cron/root
;;
esac

#记录日志
echo $SMS >> /etc/keepalived/keepalived.log

#脚本结束
##########################################################################

chmod 700 /etc/keepalived/recovery.sh

【五】、测试结果

1、首先需要保证mysql和keepalived都正常启动,且mysql优先启动于keepalived.可以ifconfig查看到主库的虚拟VIP网卡,从库是正常网卡

2、将主库服务器电源直接断电,从库自动接管,时间预计2秒钟左右.从库将自动启动虚拟VIP网卡,并接管成功,访问数据库正常。在接管的同时从库会发出报警告知。

3、重新启动主库,待主库正常启动,从库将自动归还,这时从库的虚拟VIP将消失,主库的虚拟VIP加载。同时从库在归还的同时将发出报警告知。

4、如果结果vip不生效,从接管VIP后主动刷新arp:  /sbin/arping -I em1 -c 10 -s vip gateway&>/dev/null