基于红帽企业Linux ES4的LVS+HeartBeat 安装

来源:互联网 发布:java程序设计基础篇 编辑:程序博客网 时间:2024/05/01 03:17

软件环境:

Winxp作为宿主操作系统,

安装VMware 6.0 ,

在虚拟机中分别装有4Redhat ES4 虚拟主机。

分别装好基本系统和GCC等软件,网络结构图如下图:

LVS主服务器(DR1:192.168.1.185)

LVS备用服务器(DR2:192.168.1.186)

Apache服务器(RS1:192.168.1.181)

Apache服务器(RS2:192.168.1.182)

公司网络

心跳线(双机互连)

 

对外虚拟IP(192.168.1.180)

 

LVS主服务器(DR1:192.168.1.185)

LVS备用服务器(DR2:192.168.1.186)

Apache服务器(RS1:192.168.1.181)

Apache服务器(RS2:192.168.1.182)

公司网络

心跳线(双机互连)

 

对外虚拟IP(192.168.1.180)

特别注意要检查以下几个文件:
/etc/hosts
/etc/host.conf
/etc/resolv.conf
/etc/sysconfig/network
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/nsswitch.conf

#vi /etc/hosts
DR1
hosts内容如下:
127.0.0.1        localhost.localdomain   localhost
192.168.1.185   DR1              HA01
10.0.0.201       HA01
10.0.0.202       HA02
192.168.1.186  DR2

DR2hosts内容如下:
127.0.0.1       localhost.localdomain   localhost
192.168.1.186  DR2              HA02
10.0.0.202      HA02
10.0.0.201      HA01
192.168.1.185  DR1

RS1hosts内容如下:
127.0.0.1       localhost.localdomain   localhost
192.168.1.181  RS1

#cat /etc/host.conf
order hosts,bind

#cat /etc/resolv.conf
nameserver 192.168.1.10    //DNS
地址

#cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=DR1           //
主机名
GATEWAY="192.168.1.2"    //
网关
GATEWAY="eth0"           //
网关使用网卡
ONBOOT=YES               //
启动时加载
FORWARD_IPV4="yes"       //
只允许IPV4

#cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.1.185
NETMASK=255.255.255.0
GATEWAY=192.168.10.1
TYPE=Ethernet
IPV6INIT=no

#cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
BOOTPROTO=none
IPADDR=10.0.0.201
NETMASK=255.255.255.0
TYPE=Ethernet

[DR1] [DR2] 在上面的配置中,除了
/etc/hosts
/etc/sysconfig/network
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfg-eth1
要各自修改外,其他一致。

配置完成后,试试在各自主机上ping对方的主机名,应该可以ping:

 

 

1.1  LVS安装

LVSLINUX VIRTUL SERVER的简称,是由章文嵩博士主持的著名开放源码项目,一个实现三高系统的解决方案。LVS旨在解决高速发展的Web商务中日益凸现的问题:如何在有限资金投入的情况下,最大幅度的提高Web站点的潜在服务性能。核心就是通过一组服务器来进行负载均衡,通过前端的负载调度器(Load Balancer),无缝地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户是透明的,客户访问集群系统提供的网络服务就像访问一台高性能、高可用的服务器一样。客户程序不受服务器集群的影响不需作任何修改。

 

1.1.1编译支持LVS的内核

: 如果使用的系统内核是2.6.x以上就不用进行以下操作。

 

  LVSLinuxkernel进行了修改和增加,所以要重新编译 linux kernel。我们先从http://www.linuxvirtualserver.org下载到LVS的内核补丁,对原有内核源代码进行更新,然后重新编译Linuxkernel

  下载LVS的内核补丁时要注意补丁版本要和kernel版本相一致,对于RH9.0,它的Linux核心版本是2.4.20,所以对应内核补丁应该是http://www.linuxvirtualserver.org/software/kernel-2.4/linux-2.4.20-ipvs-1.0.9.patch.gz

  另外还有一个补丁是用来解决某些情况下ARP协议不能正常工作问题的,从http://www.ssi.bg/~ja/hidden-2.4.20pre10-1.diff下载。


  把上面下载的两个补丁复制到/usr/src目录下,然后执行以下命令:

  cd /usr/src
  
gzip -cd linux-2.4.20-ipvs-1.0.9.patch.gz
  
cd /usr/src/linux
  
patch -p1 < ../linux-2.4.20-ipvs-1.0.9.patch
  patch -p1 < ../hidden-2.4.20pre10-1.diff

  make mrproper
  make menuconfig

  执行make menuconfig时,我们将进入一个图形化的界面,在其中可以对Linux Kernel进行详细设置。与LVS相关的kernel选项都在“Networking options”中,进入“Networking options”,可以查看到“IP: Virtual Server Configuration”选项,将其它所有的子选项都选上:

  <M> virtual server support (EXPERIMENTAL)
  
[*] IP virtual server debugging
  
(12) IPVS connection table size (the Nth power of 2)
  
--- IPVS scheduler
  
<M> round-robin scheduling
  
<M> weighted round-robin scheduling
  
<M> least-connection scheduling scheduling
  
<M> weighted least-connection scheduling
  
<M> locality-based least-connection scheduling
  
<M> locality-based least-connection with replication scheduling
  
<M> destination hashing scheduling
  
<M> source hashing scheduling
  
<M> shortest expected delay scheduling
  
<M> never queue scheduling
  
--- IPVS application helper
  <M> FTP protocol helper

  另外,“Networking options”中的“IP: Netfilter Configuration"中的选项的所有子项,除了以下两项不要选之外,其它全可以选:

  < > ipchains (2.2-style) support
  < > ipfwadm (2.0-style) support

  还有,“Networking options”中还有一些关于网络的选项,要注意按自己的需要去选择:

  <*> Packet socket
  
[ ] Packet socket: mmapped IO
  
<*> Netlink device emulation
  
[*] Network packet filtering (replaces ipchains)
  
[*] Network packet filtering debugging
  
[*] Socket Filtering
  
<*> Unix domain sockets
  
[*] TCP/IP networking
  
[*] IP: multicasting
  
[*] IP: advanced router
  
[*] IP: policy routing
  
[ ] IP: use netfilter MARK value as routing key
  
[ ] IP: fast network address translation
  <M> IP: tunneling

  对于kernel的其它选项,你可以根据需要进行选择。kernel的配置是一项很需要经验、细心和耐心的工作,不当的配置可能会导致编译过程中出现错误或者是新的kernel不能驱动原有的设备等问题。

  退出保存,然后继续执行以下命令:

  make dep
  
make clean
  
make bzImage
  
make modules
  make modules_install

  以上各步可能需要一点时间,如果出错请重新检查你的kernel配置,如果没有出现任何错误就继续执行以下命令:

  depmod -a
  
cp arch/i386/boot/bzImage /boot/vmlinuz-lvs
  cp System.map /boot/System.map-lvs

  cd /boot
  
rm System.map
  ln -s System.map-lvs System.map

  然后修改你的lilo.conf使用新的kernel启动,比如在lilo.conf中以增加下几行以增加关于新的支持LVSkernel的启动项:

  image=/boot/vmlinuz-lvs
  
label=lvs
  
read-only
  root=/dev/sda1

  注:如果使用Grub做启动引导程序的,请自行做对应的修改,以增加关于新的支持LVSkernel的启动项。

  重新启动Linux,选择lvs项进入Linux

1.1.2 安装ipvsadm

  如果正常启动了,就开始安装IP虚拟服务器软件ipvsadm。因为我们用的是RH,所以我们直接下载RPM包进行安装。RPM包从以下地址下载:
  http://www.ultramonkey.org/download/heartbeat/2.0.4/rhel4/ipvsadm-1.24-5.i386.rpm

  用以下命令来安装ipvsadm:

rpm -Uvh /usr/src/redhat/RPMS/i386/ ipvsadm-1.24-5.i386.rpm

至此,LVS的安装算是完成了一半。就是说,现在的Linux已经具备了实现LVS的能力了,接下来的问题就是如果使用LVS来构建一组cluster了。要想实现一组cluster,我们就要使用ipvsadm工具进行配置,而在我们开始使用ipvsadm进行配置之前,我们需要了解一些基本的LVS的知识,特别是以下三个要点:LVS的结构、LVS的三种包转发方式、LVS的八种调度算法。只有了解了这些知识以后,我们才能理该如何使用ipvsadm来进行配置。下面简单介绍LVS的这三个要点:

  1. LVS的结构

  LVS方式的cluster从结构上可分为两部分:前端的负载均衡器(称之为director)和后端的真实服务器(称之为real server)cluster前端的director将来自外界的请求调度到cluster后端不同的real server去执行。real server负责真正的提供各种应用服务,比如:WebFTPMail等服务。real server的数量可以根据实际需求进行增加、减少。

  2. LVS的三种包转发方式

  LVS提供了三种包转发方式:NAT(网络地址映射)IP Tunneling(IP隧道)Direct Routing(直接路由)。不同的转发模式决定了不同的cluster的网络结构,下面对三种转发方式分别介始:

  NAT(网络地址映射)

  NAT方式可支持任何的操作系统,以及私有网络,并且只需一个Internet IP地址,但是整个系统的性能受到限制。因为执行NAT每次需要重写包,有一定的延迟;另外,大部分应用有80%的数据是从服务器流向客户机,也就是用户的请求非常短,而服务器的回应非常大,对负载均衡器形成很大压力,成为了新的瓶颈。

  IP Tunneling(IP隧道)

  director分配请求到不同的real serverreal server处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。IP Tunneling技术极大地提高了director的调度处理能力,同时也极大地提高了系统能容纳的最大节点数,可以超过100个节点。real server可以在任何LANWAN上运行,这意味着允许地理上的分布,这在灾难恢复中有重要意义。服务器必须拥有正式的IP地址用于与客户机直接通信,并且所有服务器必须支持IP隧道协议。

  Direct Routing(直接路由)

  与IP Tunneling类似,负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性。Direct RoutingIP Tunneling相比,没有IP封装的开销,但由于采用物理层(修改MAC地址)技术,所有服务器都必须在一个物理网段。

  3. LVS的八种调度算法

  LVS已实现了以下八种调度算法:

  1.轮叫调度(Round-Robin Scheduling
  2.加权轮叫调度(Weighted Round-Robin Scheduling
  3.最小连接调度(Least-Connection Scheduling
  4.加权最小连接调度(Weighted Least-Connection Scheduling
  5.基于局部性的最少链接(Locality-Based Least Connections Scheduling
  6.带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling
  7.目标地址散列调度(Destination Hashing Scheduling
  8.源地址散列调度(Source Hashing Scheduling

  注:如果想了解关于以上几点的技术细节,LVS的主页查询。LVS的主页是:

  http://www.LinuxVirtualServer.org/
  http://www.linux-vs.org/

  了解了LVS的三个要点之后,接下来我们来配置一个采用Direct Routing包转发方式、轮叫调度算法的cluster

  我们知道Direct Routing包转发方式是通过改写请求报文的MAC地址,将请求发送到real server。前台的director机器只需要接收和调度外界的请求,而不需要负责返回这些请求的反馈结果。director机器和real server都有一块网卡连在同一物理网段上。

  director机器上需要进行如下配置:

  设置好本机的IP192.168.1.185
  然后执行以下命令:

  ifconfig eth0:0 192.168.1.180 netmask 255.255.255.255 broadcast
  192.168.1.180 up
  
route add -host 192.168.1.180 dev eth0:0
  
echo 1 > /proc/sys/net/ipv4/ip_forward
  
echo 1 >/proc/sys/net/ipv4/conf/all/hidden

ipvsadm -C
  ipvsadm -A -t 192.168.1.180:80 -s wlc
  
ipvsadm -a -t 192.168.1.180:80 -r 192.168.1.181 -g
  ipvsadm -a -t 192.168.1.180:80 -r 192.168.1.182 –g

real server机器上需要进行如下配置:

  对于第一台real server(RS1),设置好本机的IP192.168.1.181 然后执行以下命令:

  ifconfig lo:0 192.168.1.180 netmask 255.255.255.255 broadcast
  192.168.1.180 up
  route add -host 192.168.1.180 dev eth:0

对于其它real serverRS2RS3RS4......,做相类的设定。

也可将以上操作配置成LVS 脚本,如下
[root@dr ~]# more /etc/init.d/lvsdr
#!/bin/sh
# description: start LVS of Directorserver
VIP=192.168.1.180
RIP1=192.168.1.181
RIP2=192.168.1.182
#RIPn=192.168.1.n
GW=192.168.1.2
. /etc/rc.d/init.d/functions
case $1 in
start)
echo "start LVS of DirectorServer"
# set the Virtual IP Address
/sbin/ifconfig lo:0  $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
#Clear IPVS table
/sbin/ipvsadm -C
#set LVS
/sbin/ipvsadm -A -t $VIP:80 -s rr
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -i
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -i
#/sbin/ipvsadm -a -t $VIP:80 -r $RIP3:80 -i
#Run LVS
/sbin/ipvsadm
#end
;;
stop)
echo "close LVS Directorserver"
ifconfig lo:0 down
/sbin/ipvsadm -C
;;
*)
echo "Usage: $0" {start|stop}
exit 1
esac

3
、配置realserver
[root@localhost ~]# more /etc/init.d/lvsrs

#!/bin/sh
# ghb in 20060812
# description: Config realserver tunl port and apply arp patch
VIP=192.168.1.180

. /etc/rc.d/init.d/functions
case $1 in
start)
echo "Tunl port starting"
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP up
/sbin/route add -host $VIP dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p
;;
stop)
echo "Tunl port closing"
ifconfig lo:0 down
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage: $0" {start|stop}
exit 1
esac
如果有多个Virutal IP,可以使用lo:0,lo:1...

此脚本分别在realserver上执行,目的使realserver忽略arp响应,并设定vip.
测式同样按照上面的方法测试。

ARP响应问题 另外的解决办法:

可以加到系统配置里面 以便系统重起时即生效,实验中这个办法更好。

/etc/sysctl.conf

net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.lo.arp_announce = 2

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

 

/etc/sysconfig/network-scripts/ifcfg-lo:1

DEVICE=lo:1

IPADDR=192.168.0.57

NETMASK=255.255.255.255

NETWORK=192.168.0.0

ONBOOT=yes

ARP=no

 

  完成以上设置后,所有对192.168.1.18080端口的访问都会通过director机器分配到后面的real server上去,而real server的处理后结果将直接反馈给客户。至此,我们完成了一个cluster的例子。通过这个例子,相信您也可以轻松地利用Linux架设起一组cluster来。其实在cluster架设到这里之后,还并不能达到正式应用的要求,实际应用中还有一些问题需要解决,比如要安装监视软件,监视集群的运作,要能及时发现real server的故障并对应调整real server的列表。还有后台real server节点的数据一致性等问题。这些在一些商用的cluster软件产品中就得到了很好的解决,而网络也有一些非商用的软件,比如mon就是这样的系统资源监控程序,可以监控网络服务可用性、服务器问题等,最重要的是mon提供了一个框架,用户可以自行定义和扩展。这些内容请参阅其它文章。

2.1 heartbeat 安装

【一】 HeartBeat 简介.

这里的heartbeat就是linux-ha项目,被许多高可用系统采用。我们这里lvs必须是个高可用系统,所以我们采用heartbeat。本文也以lvs作为高可用服务来说明heartbeat的使用。Heartbeat的高版本可以负责3个及以上的节点。本文2个节点来说明,在你的两台机器(一台作为主节点,另一台为从节点)上运行heartbeat, 并配置好相关的选项,最重要的是lvs资源一定要配置进去。那么开始时主节点提供lvs服务,一旦主节点崩溃,那么从节点立即接管lvs服务。如果是自己开启了其它的服务资源,那么接管的时候,该服务资源相应的tcp连接必须重连,而且主从节点的应用层逻辑状态有应用层自己保证一致。Lvs不存在应用层的逻辑状态。

具体介绍请参考:http://www.linux-ha.org/

 

【二】 DR1 , DR2 进行心跳线连接

       DR1,DR2 都是双网卡,其中一块网卡和公司网络相连,另一块网卡用双绞线将DR1DR2相连,组成心跳线,IP分别设置成10.0.0.2  /   10.0.0.3

【三】安装HA HA依赖包
========================================================
rpm -Uvh libnet-1.1.2.1-1.rh.el.um.1.i386.rpm  //
可以不装
rpm -Uvh heartbeat-pils-2.0.4-1.el4.i386.rpm
rpm -Uvh heartbeat-stonith-2.0.4-1.el4.i386.rpm
rpm -Uvh heartbeat-2.0.4-1.el4.i386.rpm
rpm -Uvh ipvsadm-1.24-5.i386.rpm

【四】 配置 HA的各配置文件
========================================================

heartbeat的配置信息非常复杂,但是最关键也就是那么几项。如果你要自己弄懂所有配置选项,那么自己参考:http://www.linux-ha.org/ConfiguringHeartbeat中的文档,特别是《Getting Started with Linux-HA(heartbeat)》文档。

这里需要配置文件有三个:ha.cfharesourcesauthkeys。这三个配置文件需要在/etc/ha.d目录下面,但是默认是没有这三个文件的,所以你要

copy存放路径/ heartbeat-2.0.4/doc/ha.cf /etc/ha.d/

copy存放路径/ heartbeat-2.0.4/doc/ haresources /etc/ha.d/

copy存放路径/ heartbeat-2.0.4/doc/ authkeys /etc/ha.d/


---------------------------
配置心跳的加密方式:authkeys
---------------------------
#vi /etc/ha.d/authkeys

如果使用双机对联线(双绞线),可以配置如下:
#vi /etc/hc.d/authkeys
auth 1
1 crc

存盘退出,然后
#chmod 600 authkeys

---------------------------
配置心跳的监控:haresources
---------------------------
#vi /etc/ha.d/haresources
各主机这部分应完全相同。

DR1  192.168.1.180  ipvsadm

指定 DR1 调用ipvsadm ,系统附加一个虚拟IP 192.168.1.180 eth0:0
这里如果DR1宕机后,DR2可以自动启动服务,并新分配IP 192.168.1.180DR2eth0:0

---------------------------
配置心跳的配置文件:ha.cf
---------------------------
#vi /etc/ha.d/ha.cf

logfile /var/log/ha_log/ha-log.log   ## ha的日志文件记录位置。如没有该目录,则需要手动添加
bcast eth1     ##
使用eht1做心跳监测
keepalive 2    ##
设定心跳(监测)时间时间为2
warntime 10
deadtime 30
initdead 120
hopfudge 1
#udpport 694    ##
使用udp端口694 进行心跳监测
auto_failback on
node DR1  ##
节点1,必须要与 uname -n 指令得到的结果一致。
node DR2  ##
节点2
ping 192.168.1.2  ##
通过ping 网关来监测心跳是否正常。
respawn hacluster /usr/lib64/heartbeat/ipfail
apiauth ipfail gid=root uid=root
debugfile /Datas/logs/ha_log/ha-debug.log

---------------------------
设置ipvsadm的巡回监测
---------------------------
ipvsadm -A -t 192.168.1.180:80 -s rr
ipvsadm -a -t 192.168.1.180:80 -r 192.168.1.181:80  -m
ipvsadm -a -t 192.168.1.180:80 -r 192.168.1.182:80  -m

执行后进行监测:
#ipvsadm --list
如果返回结果与下相同,则设置正确。
IP Virtual Server version 1.2.0 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.180:http rr
  -> RS1:http               Local   1      0          0
  -> RS2:http               Masq    1      0          0

【五】 HA服务的启动、关闭以及测试
=================================================
启动HA: service heartbeat start
关闭HA; service heartbeat stop
系统在启动时已经自动把heartbeat 加载了。

编辑各RS主机的测试用html文件,放到/var/www/html/目录下。
启动DR1heartbeat,并执行这个指令进行监控: heartbeat status

【六】 防火墙设置
====================================================
heartbeat
默认使用udp 694端口进行心跳监测。 如果系统有使用iptables 做防火墙,应记住把这个端口打开。
#vi /etc/sysconfig/iptables
加入以下内容
-A RH-Firewall-1-INPUT -p udp -m udp --dport 694 -d 10.0.0.201 -j ACCEPT
意思是udp 694端口对 对方的心跳网卡地址 10.0.0.201 开放。
#service iptables restart
重新加载iptables

结束.