lvs+ntp 使用记录与疑问

        服务器比较多,操作系统比较杂,有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 {
    delay_loop 6
    lb_algo wlc
    lb_kind DR
    persistence_timeout 60
    protocol UDP

    real_server 192.88.50.28 123 {
        weight 2
         MISC_CHECK  {
            connect_timeout 2
            misc_path "/usr/sbin/ntpdate -q 192.88.50.28 > /dev/null"
           
        }

    }

    real_server 192.88.50.26 123 {
        weight 1
         MISC_CHECK  {
            connect_timeout 2
            misc_path " misc_path "/usr/sbin/ntpdate -q 192.88.50.26 > /dev/null""
           
        }
    }
    real_server 192.88.50.132 123 {
        weight 10
         MISC_CHECK  {
            connect_timeout 2
            misc_path "/usr/sbin/ntpdate -q 192.88.50.132 > /dev/null"
           
        }
    }

}

这样在日志中可以看到端口状态变化,(通过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 有什么其他状态的参数?


你可能感兴趣的:(keepalived,LVS,ntp,upd)