跳转至

keepalived

1 安装

$ ./configure --prefix=/path/to/install
$ make && make install

2 配置

! Configuration File for keepalived
global_defs {
    router_id web136                # 通常设置成机器名(每一台机器都要修改)
    # vrrp_skip_check_adv_addr
    # vrrp_strict
    # vrrp_garp_interval 0
    # vrrp_gna_interval 0
    script_user shuhw             #替换成实际部署用户
    #enable_script_security       # 关闭,否则以root权限执行的notify_master不能执行
}
vrrp_script chk_ganesha {
    script  "/home/shuhw/env/keepalived/tools/keepalived_check_tool.sh" #检测脚本的路径
    interval   2                                           #脚本执行间隔
    weight    -10                                          #节点权重值
}
vrrp_instance VI_1 {
    state BACKUP        # 每台都是BACKUP,不设置MASTER,主备由priority决定
    interface bond1     # vip绑定的网卡
    virtual_router_id 51
    priority 100        # 每台优先级需要设置相同
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    unicast_src_ip 10.20.29.136 ## 当前机器ip
    unicast_peer {
        10.20.29.137 #其它keepalived机器IP地址
        10.20.29.138
    }
    virtual_ipaddress {
        10.20.29.160/25 dev bond1   # 选择一个没有被分配的地址
    }
    track_script {
        chk_ganesha
    }
    #notify_master "/home/shuhw/env/keepalived/tools/export_nfs.sh" root  #修改路径,需要root用户执行
}

3 启动

通常我们会有启动脚本来方便运行 keepalived,同时还要有一个 check 脚本

3.1 启动脚本

#!/bin/bash
KEEPAlIVED_PAHT=/home/shuhw/env/keepalived      #注意替换keepalived 安装路径
LOCAL_NUMBER=0                       #注意这里要与rsyslog 配置文件一致
KEEPAlIVED_CONFIG_FILE=$KEEPAlIVED_PAHT/cfg/keepalived.conf
KEEPAlIVED_BIN=$KEEPAlIVED_PAHT/sbin/keepalived
KEEPAlIVED_PID_FILE=$KEEPAlIVED_PAHT/run/keepalived.pid
KEEPAlIVED_PID=
function echo_help() {
    echo ""
    echo "Usage: $0 [OPTION]"
    echo "  start                                           运行 keepalived 服务."
    echo "  status                                          查看 keepalived 服务运行状态."
    echo "  stop                                            停止 keepalived 服务."
    echo "  check                                           校验配置文件是否有效."
    echo ""
}
function get_keepalived_pid() {
if [ -f $1 ]; then
    KEEPAlIVED_PID=`cat $1`
fi
}
function keepalived_start() {
$KEEPAlIVED_BIN -f $KEEPAlIVED_CONFIG_FILE -D -d -S $LOCAL_NUMBER -p $KEEPAlIVED_PID_FILE
}

function keepalived_stop() {
get_keepalived_pid $KEEPAlIVED_PID_FILE
kill $KEEPAlIVED_PID
}
function keepalived_check_config() {
message=`$KEEPAlIVED_BIN -t  -f $KEEPAlIVED_CONFIG_FILE`
echo $message
}
function check_run_state() {

get_keepalived_pid $KEEPAlIVED_PID_FILE

if [[ -n $KEEPAlIVED_PID ]]; then

    nCount=`ps -C keepalived --no-heading |grep $KEEPAlIVED_PID |wc -l`

    if [ $nCount -eq "1" ]; then
        echo "keepalived is running, pid=$KEEPAlIVED_PID"
    fi
fi

}
function service_start() {
state=`check_run_state`

if [[ ! -n $state ]]; then
    keepalived_start
else
    echo $state
fi

}

function service_stop() {
state=`check_run_state`

if [[ ! -n $state ]]; then
    echo "The keepalived is not running"
else
    keepalived_stop
fi

}

function service_status() {
state=`check_run_state`

if [[ ! -n $state ]]; then
    echo "The keepalived is not running"
else
    echo $state
fi

}

if [[ $1 = "start" ]]; then
    service_start
elif [[ $1 = "status" ]]; then
    service_status
elif [[ $1 = "stop" ]]; then
    service_stop
elif [[ $1 = "check" ]]; then
    keepalived_check_config
else 
    echo_help
fi

3.2 监控脚本

#!/bin/bash
## 检查ganesha服务是否在线
VIP=10.20.29.40
Process=haproxy

function check_process_run() {
state=`ip addr | grep $VIP`
if [[ ! -n $state ]]; then
    exit 0
fi
nCount=`ps -C $Process --no-heading |grep -v defunct|wc -l`
if [ "$nCount" -eq "0" ]; then
    exit 1
else
    exit 0
fi
}
check_process_run