初学perl 写了个lvs监控的脚本 请各位纠错 谢谢

初学perl 写了个lvs监控的脚本 请各位纠错 谢谢

主要是为了监控realserver 还有 master_dr slave_dr的状态
这两天学perl 弄了这么一个东西 请大家帮忙看看什么地方可以改好些
因为刚学 所以用到perl的定义包 想练练手
像hidden forwa....等东西 还是在正常环境下启动时加上
master dr 在cluster.pl中 把SERVER_TYPE改成master slave dr 则改成slave

cluster.conf

[Copy to clipboard] [ - ]
CODE:
##############
# Director   #
##############
vhost_ip=192.168.0.200
master_dr=192.168.0.201
slave_dr=192.168.0.202
##############
# RealServer #
##############
port=80
realserver=192.168.0.201
realserver=192.168.0.202
realserver=***
port=21
realserver=***

cluster.pl

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use IO::Socket;
use CONF;
use Net::Ping;
my %DR_CONF = ();
my @SERVER_CONF = ();
my $SERVER_TYPE = "slave";
my $master_status = "ON";
my $chkofping;
my @REAL_STATUS = ();
my $SERVICE_STATUS = "START";
%DR_CONF = CONF::GET();
@SERVER_CONF = CONF::GET_GROUP();
@REAL_STATUS = $CONF::REAL_SERVER_STATUS;
$chkofping = Net::Ping->new();
my $OFF_COUNT=0;
my $FOR_COUNT;
my $GO_COUNT=0;
print "Vhost ip:".$DR_CONF{vhost_ip}."n";
print "Master dr :".$DR_CONF{master_dr}."n";
print "Slave dr :".$DR_CONF{slave_dr}."n";
while(my $q=1 < 2)
{
        if($SERVER_TYPE eq "slave")
        {
               if($chkofping->ping($DR_CONF{master_dr})){
                        if($master_status eq "OFF")
                        {
                            system("ifconfig eth1 down");
                            system("ifconfig lo:0 ".$DR_CONF{vhost_ip}." netmask 255.255.255.255 broadcast");
                            system("route add -host ".$DR_CONF{vhost_ip}." dev lo:0");
                            system("echo 1 > /proc/sys/net/ipv4/conf/all/hidden");
                            system("echo 1 > /proc/sys/net/ipv4/conf/lo/hidden");
                        }
                        $master_status = "ON";
                        $OFF_COUNT=0;
                }else{
                        $OFF_COUNT++;
                        if($OFF_COUNT == 3)
                        {
                                                        system("ifconfig lo:0 down");
                                                        system("ifconfig eth1 ".$DR_CONF{vhost_ip}." netmask 255.255.255.255 broadcast");
                                                        system("route -vF del ".$DR_CONF{vhost_ip}." dev lo:0");
                                                        system("echo 0 > /proc/sys/net/ipv4/conf/all/hidden");
                                                        system("echo 0 > /proc/sys/net/ipv4/conf/lo/hidden");
                                                        $master_status = "OFF";
                        }
                }
                print "OFF COUNT:".$OFF_COUNT."n";
        }
                if(($master_status eq "OFF" and $SERVER_TYPE eq "slave") || $SERVER_TYPE eq "master")
                {
                        my $i=1;
                        if($SERVICE_STATUS eq "START")
                        {
                                        system("ipvsadm -C");
                                        while($i < scalar(@SERVER_CONF))
                                        {
                                                        system("ipvsadm -A -t ".$DR_CONF{vhost_ip}.":".$SERVER_CONF[$i][0]." -s wlc");
                                                        my $run_count=1;
                                                        while($run_count <= (scalar(@{$SERVER_CONF[$i]})-1))
                                                        {
                                                                        system("ipvsadm -a -t ".$DR_CONF{vhost_ip}.":".$SERVER_CONF[$i][0]." -r ".$SERVER_CONF[$i][$run_count][0]." -g");
                                                                        $run_count++;
                                                        }
                                                        $i++;
                                        }
                                        $i = 1;
                                        $SERVICE_STATUS="RUNING";
                        }
                        while($i < scalar(@SERVER_CONF))
                        {
                                        sleep 1;
                                        print "Server Group port :".$SERVER_CONF[$i][0]."n";
                                        print "Server Num :".(scalar(@{$SERVER_CONF[$i]})-1)."n";
                                        my $server_while=1;
                                        while($server_while <= (scalar(@{$SERVER_CONF[$i]})-1))
                                        {
                                                        my $socket_test;
                                                        if($socket_test=IO::Socket::INET->new(PeerAddr=>$SERVER_CONF[$i][$server_while][0],PeerPort=>$SERVER_CONF[$i][0],Proto=>"tcp",Type=>SOCK_STREAM))
                                                        {
                                                                        if($SERVER_CONF[$i][$server_while][1] eq "OFF")
                                                                        {
                                                                                        system("ipvsadm -a -t ".$DR_CONF{vhost_ip}.":".$SERVER_CONF[$i][0]." -r ".$SERVER_CONF[$i][$server_while][0]." -g");
                                                                        }
                                                                        $SERVER_CONF[$i][$server_while][1] = "ON";

                                                        }else{
                                                                        if($SERVER_CONF[$i][$server_while][1] eq "ON")
                                                                        {
                                                                                        system("ipvsadm -d -t ".$DR_CONF{vhost_ip}.":".$SERVER_CONF[$i][0]." -r ".$SERVER_CONF[$i][$server_while][0]);
                                                                        }
                                                                        $SERVER_CONF[$i][$server_while][1] = "OFF";
                                                        }
                                                        close($socket_test);
                                                        print "Real Server status:".$SERVER_CONF[$i][$server_while][1]." IP addres:".$SERVER_CONF[$i][$server_while][0]."n";
                                                        $server_while++;
                                        }
                                        $i++;
                        }
                }else{
                        sleep 1;
                        system("service ipvsadm stop");
                        $SERVICE_STATUS="START";
                }
}

CONF.pm

[Copy to clipboard] [ - ]
CODE:
package CONF;
BEGIN{
}
sub GET
{
        my $CONF_FILE="cluster.conf";
        my $DATA;
        my $CONF;
    if(open(CONF_FILE,$CONF_FILE))
        {
                my $DATA;
        my $CONF;
        while($DATA = <CONF_FILE>)
        {
                        if($DATA !~ /#/)
            {
                                split(/=/,$DATA);
                if($_[0] eq "vhost_ip")
                {
                                        $CONF{vhost_ip} = $_[1];
                    chomp($CONF{vhost_ip});
                }elsif($_[0] eq "master_dr"){
                                        $CONF{master_dr} = $_[1];
                    chomp($CONF{master_dr});
                }elsif($_[0] eq "slave_dr"){
                                        $CONF{slave_dr} = $_[1];
                    chomp($CONF{slave_dr});
                }
            }
        }
        close(CONF_FILE);
        }else{
                print "ERRORtCan't load $CONF_FILE file!n";
    }
    return %CONF;
}
sub GET_GROUP
{
        my $CONF_FILE="cluster.conf";
        my $DATA;
        if(open(CONF_FILE,$CONF_FILE))
        {
                my $DATA;
        my $SERVER_CONF;
                my $SERVER_GROUP = 1;
                my $SERVER_COUNT = 1;
                while($DATA = <CONF_FILE>)
                {
                        if($DATA !~ /#/)
                        {
                                split(/=/,$DATA);
                                if($_[0] eq "port"){
                                        $SERVER_CONF[$SERVER_GROUP][0] = $_[1];
                                        chomp($SERVER_CONF[$SERVER_GROUP][0]);
                                $SERVER_GROUP++;
                                $SERVER_COUNT = 1;
                                }elsif($_[0] eq "realserver"){
                                        $SERVER_CONF[$SERVER_GROUP-1][$SERVER_COUNT][0] = $_[1];
                                        $SERVER_CONF[$SERVER_GROUP-1][$SERVER_COUNT][1] = "ON";
                                        chomp($SERVER_CONF[$SERVER_GROUP-1][$SERVER_COUNT][0]);
                                        chomp($SERVER_CONF[$SERVER_GROUP-1][$SERVER_COUNT][1]);
                                        $SERVER_COUNT++;
                                        $REAL_SERVER_COUNT++;
                        }
                        }
                }
                close(CONF_FILE);
        }else{
        print "ERRORtCan't load $CONF_FILE file!n";
        }
    return @SERVER_CONF;
}
return 1;
END{
}

监控端口是否打开我用socket 但如果被master拔掉网线 就会卡住 不知道还有什么好方法


QUOTE:
原帖由 duketang 于 2005-11-14 14:30 发表
监控端口是否打开我用socket 但如果被master拔掉网线 就会卡住 不知道还有什么好方法

netstat可以看端口是否打开吧?
netstat 能不能看远程?


QUOTE:
原帖由 duketang 于 2005-11-14 14:24 发表
主要是为了监控realserver 还有 master_dr slave_dr的状态
这两天学perl 弄了这么一个东西 请大家帮忙看看什么地方可以改好些
因为刚学 所以用到perl的定义包 想练练手
像hidden forwa....等东西 还是在正常环 ...

前年我研究过LVS..而且也在Linux版里面贴了篇LVS安装手册...不过我的平台是RedHat 8.0
....里面我叁考LVS官方网站的作法,利用Mon这个daemon去作监测Real Server的动作...
他里面可以针对HTTP作监测.....也可以监测网路的状态...
当时我的作法:
1.关於Real Server是否OK..利用Mon的http mointor去察看http protocol是否有啟動?
2.关於自己网络是否OK?我是利用Mon的ping monitor去查看Gateway是否OK...因为自己网络线如果断线,
   自然Ping不到gateway...
给你当叁考吧....

帖子里面有些url已经不存在..得自己叁考LVS官方网站的作法....


QUOTE:
原帖由 duketang 于 2005-11-14 14:46 发表
netstat 能不能看远程?

1.要查看http是否有启动..可以用socket连上去..输入"\n\n";
看系统回传值有没有出现200 OK....如果有表示Server是好的...
2.看网络状态用ping的方式..定时去Ping一个一定会live的机器....如果Ping不到表示自己网络断了...
基本上我还是比较建议Mon的方式....只要设定一些东西即可..不需要写太多代码...
就是因为不想用Mon才写的这个 因为那些东西各个关联包太多了
我记得Mon好像只能监控realserver
我这个也是socket检测端口 就是没有发送包 只要连通就认为存在
就是现在有个问题 被监控机如果拔掉网线 socket就会长久等待 关掉机器就没有问题
两个DR之间也是用的Ping


写这个只是为了实现功能之外 练手perl



QUOTE:
原帖由 duketang 于 2005-11-14 19:09 发表
就是因为不想用Mon才写的这个 因为那些东西各个关联包太多了
我记得Mon好像只能监控realserver
我这个也是socket检测端口 就是没有发送报 只要连通就认为存在
就是现在有个问题 被监控机如果拔掉网线 socket就 ...

2个lvs之间的心跳监测何必自己coding嘛,配置下Piranha就可以了。
那个好像要用到xwin阿


QUOTE:
原帖由 duketang 于 2005-11-14 19:15 发表
那个好像要用到xwin阿

不用的呀,偶们公司都是用这个东东的,还可以监视realserver吧,不过我不熟。