服务器比较多,操作系统比较杂,有liunx,win,freebsd,debain。由于数据库与应用服务器时间不同步,出了很多问题,刚开始的时候让win 自己同步ms时间服务器,linux 同步其他操作系统通过ntp 同步互联网时间服务器,可是时间久了发现一个问题。win时间同步有时会出错,无法同步,导致时间会慢下来。于是想到在自己的小网络里面启一个ntp服务器,所有服务器都同步这一台。可是问题又来了,某一天这台ntp服务器出问题了,需要重启安装。导致几个小时其他服务器都没法同步到这台时间服务器,(我使用的ntpdate cron方式)。结果服务器时间又出问题。最后想到用lvs,后面挡几台ntp,这样随便down一台都关系不大。在这过程当中发现,freebsd ntp server 同步时间很快,ntp server 启动client 就可以同步了,但是linux(centos,redhat)的ntp server 启动后至少1,2分钟或者是更长时间client 都无法同步(以至于增加了我对freebsd的好感)。
对于lvs 配置,刚开始使用的是redhat 的piranha,发现很不稳定。最后换成keepalived(DR模式)。结果是一波三折。刚开始用的是MISC_CHECK加shell,开始配置成功,测试也成功,可以正确检测到 123端口shutdown,up。但是过了两天后发现无法检测到udp 端口状态变化了,无论端口是否变化,但是keepalived 一直检测端口是up的。shell 脚本:
cat ntp_status.sh
#!/bin/bash
ntp_status=`/usr/sbin/ntpdate -q $1`
function my_ntp(){
if [[ ! -z $ntp_status ]]
then
echo "success"
else
echo "failed"
fi
}
my_ntp
手工直接查看输出结果一切正常,把echo 改成return 0或者是1 也不行,很诡异。最后直接在keepalivsed中配置,结果一切正常:
具体配置:
virtual_server 192.88.50.41 123 {}
这样在日志中可以看到端口状态变化,(通过shell 是无法看到的)
Keepalived_healthcheckers[24765]: Misc check to [192.88.50.28] for [/usr/sbin/ntpdate -q 192.88.50.28 > /dev/null] success.
Keepalived_healthcheckers[24765]: Adding service [192.88.50.28]:123 to VS [192.88.50.41]:123
Keepalived_healthcheckers[24765]: Misc check to [192.88.50.28] for [/usr/sbin/ntpdate -q 192.88.50.28 > /dev/null] failed.
Keepalived_healthcheckers[24765]: Removing service [192.88.50.28]:123 from VS [192.88.50.41]:123
这个地方很奇诡,keepalived 怎么无法扑捉到shell返回的结果,但是我的另外一个dns lvs(udp 53 端口,不是tcp 53) 也是通过shell 直接返回结果,keepalived 就可以扑捉到返回结果,附dns check 脚本:
cat /etc/keepalived/dnscheck
#!/bin/bash
#$Id: keepalivepin,v 1.2 2006/02/27 07:30:41 hmy Exp hmy $
#use dig check the powerdns's status.
#in the dns database,have a IN TXT RR keepalivepin.vmmatrix.net,content is "AaBbCcDdEeFf"
# Source: http://puppet-manifest-share.googlecode.com/svn/trunk/vmx-puppet/modules/lvs/files/keepalived.dns-pin
#
RR=mydns.test.com
[ $# -le 1 ]&&{ echo "usage: ${0} -h <ip>"; exit 126;}
while getopts "h:" OPT;do
case $OPT in
h)host=$OPTARG;;
*)echo "usage: $0 -h <ip>"&&exit 1;;
esac
done
dig @${host} txt ${RR}|grep "\<mydns\>" >/dev/null
exit $?
其实这个脚本也是返回直行结果shell 状态。为什么就可以,有越到和我同一问题的小伙伴们有什么意见。难道是MISC_CHECK 有什么其他状态的参数?