大规模集群中,如何检测一台机器是否宕机?


在大规模集群中,服务器可能遇到各种异常情况,如磁盘故障,断点,访问过于频繁致假死等。而且有可能会遇到假死的机器认为自己还活着仍然提供服务,导致数据以不一致情况。如何制定一个有效机制来检查已经挂掉的机器,并将其从节点中移除?还有就是怎么避免遇到网络延迟出现的误判?

讨论 集群

大馬鹿さん 12 years, 10 months ago

把我这个脚本放在监控服务器上crontab定时跑就行了。interface.php来负责做报警处理。

   
  #!/bin/sh
  
LANG=C

#被监控服务器、端口列表
server_all_list=(\
xxx.xxx.xxx.xxx:80 \
)

date=$(date -d "today" +"%Y-%m-%d_%H:%M:%S")

#采用HTTP POST方式发送检测信息给接口程序interface.php,接口程序负责分析信息,决定是否发送报警MSN消息、手机短信、电子邮件。
send_msg_to_interface()
{
/usr/bin/curl -m 600 -d menu=http -d date=$date -d ip=$server_ip -d port=$server_port -d status=$status http://www.xxx.com/interface.php
}

server_all_len=${#server_all_list[*]}
i=0
while [ $i -lt $server_all_len ]
do
server_ip=$(echo ${server_all_list[$i]} | awk -F ':' '{print $1}')
server_port=$(echo ${server_all_list[$i]} | awk -F ':' '{print $2}')
if curl -m 10 -G http://${server_all_list[$i]}/ > /dev/null 2>&1
then
#status: 0,http down 1,http ok 2,http down but ping ok
status=1
echo "服务器${server_ip},端口${server_port}能够正常访问!"
else
if curl -m 30 -G http://${server_all_list[$i]}/ > /dev/null 2>&1
then
status=1
echo "服务器${server_ip},端口${server_port}能够正常访问!"
else
if ping -c 1 $server_ip > /dev/null 2>&1
then
status=2
echo "服务器${server_ip},端口${server_port}无法访问,但是能够Ping通!"
else
status=0
echo "服务器${server_ip},端口${server_port}无法访问,并且无法Ping通!"
fi
fi
fi
send_msg_to_interface
let i++
done

五月病又犯了 answered 12 years, 10 months ago

Your Answer