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