服務器比較多,操做系統比較雜,有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的好感)。 linux
對於lvs 配置,剛開始使用的是redhat 的piranha,發現很不穩定。最後換成keepalived(DR模式)。結果是一波三折。剛開始用的是MISC_CHECK加shell,開始配置成功,測試也成功,能夠正確檢測到 123端口shutdown,up。可是過了兩天後發現沒法檢測到udp 端口狀態變化了,不管端口是否變化,可是keepalived 一直檢測端口是up的。shell 腳本: 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中配置,結果一切正常: centos
具體配置: bash
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 tcp
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 svn
這個地方很奇詭,keepalived 怎麼沒法撲捉到shell返回的結果,可是個人另一個dns lvs(udp 53 端口,不是tcp 53) 也是經過shell 直接返回結果,keepalived 就能夠撲捉到返回結果,附dns check 腳本: oop
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 有什麼其餘狀態的參數?