网络安全 频道

RedHat 8.0/9.0 LVS安裝手冊3

PART II:LVS设定

  系统架构

  一、简易设定:

  1、IP Tunnel的设定:

Load Balance : 10.144.43.175(nb8048)
Real Server:10.144.43.142(linux142)、10.144.43.187(linux187)
Virtual IP :10.144.43.185(VIP)
 


  Nb8048上面的设定:

  1、先建立一个Subinterface

# ifconfig eth0:0 10.144.43.185 netmask 255.255.255.255 broadcast ||
  10.144.43.185 up
 


  2、建立IP Tunnel的Rule

  2.1、先打开IP Forwarding

# echo 1 > /proc/sys/net/ipv4/ip_forward
 


  2.2、建立IP Tunnel的Rule,先建立Service

# ipvsadm -A -t 10.144.43.185:23 -s wlc
 

 

  2.3、加入两台Real Server的IP

# ipvsadm -a -t 10.144.43.185:23 -r 10.144.43.187 -i
# ipvsadm -a -t 10.144.43.185:23 -r 10.144.43.142 -i
 


  linux142与linux187上面的设定:

  1、另外建立一个Tunnel0

# ifconfig tunl0 10.144.43.185 netmask 255.255.255.255 broadcast 10.144.43.185
 


  2、将host加入routing table

# route add -host 10.144.43.185 dev tunl0
 


  3、将接口的hidden属性打开:

# echo 1 > /proc/sys/net/ipv4/ip_forward
# echo 1 > /proc/sys/net/ipv4/conf/all/hidden
# echo 1 > /proc/sys/net/ipv4/conf/tunl0/hidden
 


  4、Direct Routing的设定

Load Balance:10.144.43.175
Virtual IP: 10.144.43.185
RealServer1:10.144.43.175(nb8048)
RealServer2:10.144.43.142(linux142)
RealServer3:10.144.43.187(linux187)
 

 

  网络架构图如上所示,其中DR与RealServer1、RealServer2在同一个网段,其IP Address配置如附图,基本设定如下,包含避免ARP Problem的设定:

  DR(Direct Routing Server):

# ifconfig eth0 10.144.43.175 netmask 255.255.255.0 broadcast 10.144.43.255
# route add -net 10.144.43.0 dev eth0
# ifconfig eth0:0 10.144.43.185 netmask 255.255.255.255 broadcast 10.144.43.185
# echo 1 > /proc/sys/net/ipv4/ip_forward
# ipvsadm -A -t 10.144.43.185:23 -s rr (用Round Robin方式)
# ipvsadm -a -t 10.144.43.185:23 -r 10.144.43.175 -g
# ipvsadm -a -t 10.144.43.185 :23 -r 10.144.43.142 -g
# ipvsadm -a -t 10.144.43.185 :23 -r 10.144.43.187 -g
 

 

  RealServer1 与RealServer2的设定:

# ifconfig eth0 10.144.43.142 netmask 255.255.255.0 broadcast 10.144.43.255
# route add -net 10.144.43.0 dev eth0
# ifconfig lo:0 10.144.43.185 netmask 255.255.255.255 broadcast 10.144.43.185
# route add -host 10.144.43.185 dev lo:0
# echo 1 > /proc/sys/net/ipv4/ip_forward
# echo 1 > /proc/sys/net/ipv4/conf/all/hidden
# echo 1 > /proc/sys/net/ipv4/conf/lo/hidden
 


  测试:

  从10.16.1.16机器上,对10.144.43.185作telnet 测试,三次联机三次都连到不同的Server,所以测试正常。

 

  二、进阶的设定:

  看完前面的设定,如果你有测试成功的话,一定会发现万一Real Server死掉了怎么办?负责转送封包的DR并不晓得Real Server已经故障无法使用,还是会将封包往故障的Real Server处送,这样会影响用户的使用权益,为了解决这个问题在LVS正式网站上有几种解法,而我安装过Piranha(RedHat的方法)与「mon、heartbeat、fake、coda」方法,发现piranha-gui需要apache 1.3的rpm档,而且还需要php 模块安装在上面,但是RedHat 8.0预设只提供apache 2.0.40 (httpd-2.0.40),因此在安装piranha-gui的时候一直安装不起来,我也试过将apache 1.3安装上去,但是还另外需要安装一堆有的没的RPM,所以我就决定放弃不用piranha,采用「mon、heartbeat、fake、coda」(http://www.linuxvirtualserver.org/HighAvailability.html )的解法。

  那因为我只有三部机器,且只有一部要当Director,所以hearbeat、fake对我的情形来说并不需要,另外我的档案也不需要全部统一放置在同一个地方,所以coda对我而言并没有用,最后我只需要安装mon这个服务(Daemon)。

  Mon的官方网站,在http://www.kernel.org/software/mon/,有兴趣可以去看看。废话不多说,开始进行安装。

  1、安装服务

  安装可以采用tarball或rpm安装,但是因为tarball安装需要花比较多时间,为了省时间,所以全部采用RPM安装,只有perl-Mon模块采用tarball安装。

  2、下载源码

  首先上http://rpmfind.net 搜寻下列档案,其中Mon-0.11.tar.gz请从Mon的正式网站上抓取。

fping-2.2b1-2.i386.rpm ------------------------ 可以一次Ping多个ip
perl-Convert-BER-1.31-3.i386.rpm----------  perl Convert::BER module
perl-Net-Telnet-3.01-9.i386.rpm--------------  perl Net::Telnet module
Mon-0.11.tar.gz----------------------------------  perl Mon module
perl-Period-1.20-9.i386.rpm ------------------  perl Period module
mon-0.99.2-8.i386.rpm-------------------------  mon daemon rpm
 

 

  然后

# rpm -ivh fping-2.2b1-2.i386.rpm
# rpm -ivh perl-Convert-BER-1.31-3.i386.rpm
# rpm -ivh perl-Net-Telnet-3.01-9.i386.rpm
# rpm -ivh perl-Period-1.20-9.i386.rpm
# gzip -dc Mon-0.11.tar.gz|tar xvf -
# cd Mon-0.11
# perl Makefile.PL && make && make test && make install
# cd ..
# rpm -ivh -nodeps mon-0.99.2-8.i386.rpm
 

 

  用chkconfig -list mon 检查是否有安装mon daemon,

  3、就这样安装完成了,接着进行mon的设定。

  3.1、配置MON

  Mon的设定档放在/etc/mon/mon.cf,而在我们的例子中需要针对LVS写一个(lvs.alert)程序。这个程序主要是用来新增移除Director的Routing Rule,如同在基本配置里面(这次的Director改为10.144.43.142这部机器),我们的设定:

ipvsadm -A -t 10.144.43.185:23 -s rr
ipvsadm -a -t 10.144.43.185:23 -r 10.144.43.175 -g
ipvsadm -a -t 10.144.43.185 :23 -r 10.144.43.142 -g
ipvsadm -a -t 10.144.43.185 :23 -r 10.144.43.187 -g
 

 

  现在假设10.144.43.175网络断线,或机器当机不能正常工作,这时候mon daemon就会自动呼叫lvs.alert,

ipvsadm -d -t 10.144.43.185 :23 -r 10.144.43.175
 

 

  将这笔拿掉,然后持续监控,直到10.144.43.175 又正常工作时,再呼叫lvs.alert将10.144.43.175加入Route中。

#!/usr/bin/perl
#
# lvs.alert - Linux Virtual Server alert for mon
#
# It can be activated by mon to remove a real server when the
# service is down , or add the server when the service is up
#
#
use Getopt::Std;
getopts("s:g:h:t:l:P:V:R:W:F:u");
$ipvsadm = "/sbin/ipvsadm";
$protocol = $opt_P;
$virtual_services = $opt_V;
$remote = $opt_R;
if($opt_u){
  $weight = $opt_W;
  if($opt_F eq "nat"){
     $forwarding = "-m";
  }elsif($opt_F eq "tun"){
     $forwarding = "-i";
  }else{
     $forwarding = "-g";
  }
  if($protocol eq "tcp"){
    system(
    "$ipvsadm -a -t $virtual_services -r $remote -w $weight $forwarding");
  } else {
    system(
    "$ipvsadm -a -u $virtual_services -r $remote -w $weight $forwarding");
  }
} else {
  if($protocol eq "tcp"){
    system("$ipvsadm -d -t $virtual_services -r $remote");
  } else {
    system("$ipvsadm -d -u $virtual_services -r $remote");
  }
}
 


  3.2、mon daemon的设定

  因为我是以telnet的服务为测试范例,我真正上线使用的系统将会是Web server的监测,因此下面的设定只针对telnet来作设定,需要其它Service的请自行更正,并请自己去看mon的一些设定说明,这儿只简单说明下列的意思。

#
# Extremely basic mon.cf file
# 除了lvs.alert外,事实上还可发送Email,只是我把他拿掉了,
# 因为我的Server并没有激活Sendmail..:)
# global options
#
cfbasedir   = /etc/mon
pidfile     = /var/run/mon.pid
statedir    = /var/run/mon/state.d
logdir      = /var/run/mon/log.d
dtlogfile   = /var/run/mon/log.d/downtime.log
alertdir    = /usr/lib/mon/alert.d
mondir      = /usr/lib/mon/mon.d
maxprocs    = 20
histlength  = 100
randstart   = 60s
authtype    = userfile
userfile    = /etc/mon/userfile
#
# group definitions (hostnames or IP addresses)
# 要监测的机器,一次可以一部也可以多部
# 为了减少麻烦,而且我设备也不多,所以我设定一个group只有一个Server
hostgroup server1  10.144.43.175
hostgroup server2  10.144.43.187
# 监测10.144.43.175
watch server1
# service 后面的telnet名称同/etc/services里面的名称,不是自己乱给的
 service telnet
# 间隔多久测试一次,这儿设定20秒,也可以设定10m、1h。
   interval 20s
# 用哪一个monitor程序去作,基本上telnet.monitor是用perl写的程。
# 所以如果有自己的monitor程序,也可以比照办理。
   monitor telnet.monitor
# 监测的时间
   period wd {Mon-Fri} hr {7am-10pm}
# alert:当有联机失败时会呼叫这个Event,执行后面lvs.alert程序
   alert lvs.alert -P tcp -V 10.144.43.185:23 -R 10.144.43.175 -W 5 -F dr
# uplaert:当当联机失败后,又发现对方活过来时候,会呼叫这个event。
   upalert lvs.alert -P tcp -V 10.144.43.185:23 -R 10.144.43.175 -W 5 -F dr -u 1
watch server2
  service telnet
   interval 20s
   monitor telnet.monitor
   period wd {Mon-Fri} hr {7am-10pm}
   alert lvs.alert -P tcp -V 10.144.43.185:23 -R 10.144.43.187 -W 5 -F dr
   upalert lvs.alert -P tcp -V 10.144.43.185:23 -R 10.144.43.187 -W 5 -F dr -u 1
# See /usr/doc for the original example...
 


  3.3、修改完成后,就可以用service mon start,激活mon daemon,进行监测。

  4、测试

  可以自己作一些测试,例如拔掉网络线,关掉Realserver上的服务,测试看看哪儿有问题。
 
http://netadmin.77169.com/HTML/20040615183500.html

0
相关文章