http://down.51cto.com/data/535616 文档下载地址 由于图片显示不好哈~

Lvs+ Piranha
一、 背景和目的
1. 为应用服务器提供高可用性和负载均衡的能力 ,满足大量并发访问的需要;
2. 节约成本 ,替代商业的硬件负载均衡器,为起步型IT公司提供价格低廉的解决方案理想选择.
二、 软件简介
1. LVS简介
LVS是一个开源的软件,由毕业于国防科技大学的章文嵩博士于 1998年5月创立,可以实现LINUX平台下的简单负载均衡。LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器。
1.1工作原理
LVS由前端的负载均衡器 (Load Balancer,LB)和后端的真实服务器(Real Server,RS)群组成。RS间可通过局域网或广域网连接。结构对用户是透明的,用户只能看见一台作为LB的虚拟服务器(Virtual Server),而看不到提供服务的RS群。
当用户的请求发往虚拟服务器, LB根据设定的包转发策略和负载均衡调度算法将用户请求转发给RS。RS再将用户请求结果返回给用户。同请求包一样,应答包的返回方式也与包转发策略有关。
1.2三层结构
(1) Load Balancer(负载均衡器 ):
调度器是整个集群系统的前端,负责把客户请求转发到 Real Server上;
Backup是备份负载调度器,当Master Load Balancer不可用时,有Backup接替,成为Master Load Balancer;
Load Balancer通过Ldirectord监测各Real Server的健康状况。在Real Server不可用时把它从群中剔除,恢复时重新加入。
(2) Server pool(服务器池 ):
Server pool是一组运行实际应用服务的机器,比如WEB, Mail, FTP, DNS, Media等等。
(3) Shared Storage(共享存储 ):
Shared Storage为所有Real Server提供共享存储空间和一致的数据内容。
1.3实现模式
(1)Virtual Server via NAT
VS/NAT: 即( Virtual Server via Network Address Translation)
也就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时报文的目标端口也改成选定的Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到数据后,Real Server返回数据给用户时,需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。
可以看出,在 NAT方式下,用户请求和响应报文都必须经过Director Server地址重写,当用户请求越来越多时,调度器的处理能力将称为瓶颈。
(2)Virtual Server via IP Tunneling
  VS/TUN :即( Virtual Server via IP Tunneling)
也就是IP隧道技术实现虚拟服务器。它的连接调度和管理与VS/NAT方式一样,只是它的报文转发方法不同,VS/TUN方式中,调度器采用IP隧道技术将用户请求转发到某个Real Server,而这个Real Server将直接响应用户的请求,不再经过前端调度器,此外,对Real Server的地域位置没有要求,可以和Director Server位于同一个网段,也可以是独立的一个网络。因此,在TUN方式中,调度器将只处理用户的报文请求,集群系统的吞吐量大大提高。
(3)Virtual Server via Direct Routing
    VS/DR:即( Virtual Server via Direct Routing)
也就是用直接路由技术实现虚拟服务器。它的连接调度和管理与VS/NAT和VS/TUN中的一样,但它的报文转发方法又有不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上
1.4 调度算法
IPVS的负载调度算法有十种:
1) 轮叫( Round Robin):“轮叫”调度也叫1:1调度,调度器通过“轮叫”调度算法将外部用户请求按顺序1:1的分配到集群中的每个Real Server上,这种算法平等地对待每一台Real Server,而不管服务器上实际的负载状况和连接状态
2) 加权轮叫( Weighted Round Robin):“加权轮叫”调度算法是根据Real Server的不同处理能力来调度访问请求。可以对每台Real Server设置不同的调度权值,对于性能相对较好的Real Server可以设置较高的权值,而对于处理能力较弱的Real Server,可以设置较低的权值,这样保证了处理能力强的服务器处理更多的访问流量。充分合理的利用了服务器资源。同时,调度器还可以自动查询Real Server的负载情况,并动态地调整其权值
3)       最少链接( Least Connections):“最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。
4) 加权最少链接( Weighted Least Connections)“加权最少链接调度”是“最少连接调度”的超集,每个服务节点可以用相应的权值表示其处理能力,而系统管理员可以动态的设置相应的权值,缺省权值为1,加权最小连接调度在分配新连接请求时尽可能使服务节点的已建立连接数和其权值成正比。
5) 基于局部性的最少链接( Locality-Based Least Connections)
6) 带复制的基于局部性最少链接( Locality-Based Least Connections with Replication)
7) 目标地址散列( Destination Hashing )
8) 源地址散列( Source Hashing)
9) 最短期望延迟 (Shortest Expected Delay)
10)无须队列等待( Never Queue)
2. Piranha简介
一款类似于 keepalived的web配置软件,优点是方便而而且直观,在30分钟内可配置一套基于LVS基础的负载均衡高可用解决方案。
2.1 piranha组件介绍
> Pluse
负责主调度器和备份调度器之间的的健康状态检测, heartbest的通信进程。
> Lvsd
Lvsd进程活动在 LVS路由器中,读取/etc/sysconfig/ha/lvs.cf,调用ipvsadm来构建和维护IPVS路由表,并为每个配置LVS服务分配nanny。
> Ipvsadm
此服务更新和维护内核中的 IPVS路由表,LVS进程通过调用ipvsadm来添加、修改或删除IPVS路由表。
> Nanny
Nanny存在于状态是 Active的的路由器中。通过此进程,活动状态的调度器可以检测每个realserver的状态,同时管理监控负载状态。每个realserver中定义的每一个服务都有一个独立的nanny进程管理。
> Send_arp
在活动调度器失效时,备用调度器调用 send_arp将虚拟地址切换到备份调度器。并在公网和局域网发送命令关掉lvsd进程,同时启动备份掉武器的LVSD进程。
具体图解如下:

备注:活跃和备用 LVS 路由器中都会运行 pulse 守护进程。在备用路由器中,pulse 向活跃服务器的公共接口发送一个 heartbeat 来确定活跃路由器仍可正常工作。在活跃服务器中,pulse 启动 lvs 守护进程,并回应来自备用 LVS 路由器的 heartbeat 查询。启动后,lvs 守护进程调用 ipvsadm 程序来配置和维护内核中的 IPVS 路由表,并为每个真实服务器中配置的虚拟服务器启动 nanny 进程,同时告知 lvs 该真实服务器中的服务是否正常工作。如果发现故障,lvs 守护进程会向 ipvsadm 发出指令将那个真实服务器从 IPVS 路由表中删除。如果备用路由器没有收到来自活跃路由器的响应,它会通过调用 send_arp 启动失效切换来将所有虚拟IP 地址重新分配到备用节点的 NIC 硬件地址(MAC 地址),并通过公共和专用网络接口向活跃路由器发送一个命令来关闭活跃路由器中的 lvs 守护进程,启动备用节点中的 lvs 守护进程来为配置的虚拟服务器接收请求
 
2.2 LVS+DR模式
具体图解如下:

备注:在典型的直接路由设置中, LVS 路由器通过虚拟 IP(VIP)接收进入服务器的请求,使用调度算法将请求路由到真实服务器中。真实服务器会处理这些请求,并将回复绕过 LVS 路由器直接发送给客户端。
这种路由方法允许在不增加 LVS 路由器将外发数据包从真实服务器路由到客户端负担的情况下添加真
实服务器的能力,以免在网络负载较重的情况下形成瓶颈
 
 
三、 服务器相关配置信息
3.1方案IP信息列表

名称
IP 地址
心跳地址
LVS-MASTER
Eht0:192.168.1.130/24
Eth1:10.0.0.1/24
LVS-SLAVE
Eht0:192.168.1.131/24
Eht1:10.0.0.2/24
Real-Server1
Eht0:192.168.1.132/24
 
Real-Server2
Eht0:192.168.1.133/24
 
LVS-VIP
192.168.1.134/32
 
Gateway
192.168.1.1/24
 
3.2 环境预约

配置平台:
Director: 两台虚拟机 redhat5.6_x86_64
RealServer:两台虚拟机 redhat5.6_x86_64
配置方式: VS/DR(直接路由)
               配置软件: ipvsadm+piranha
 
3.3 Virtual Server部署
3.3.1 配置Lvs-master服务器IP如下,lvs-salve根据如下修改相应的ip

[root@lvs-master network-scripts]# cat ifcfg-eth0
# Intel Corporation 82545EM Gigabit Ethernet Controller (Copper)
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.1.130
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
ONBOOT=yes
[root@lvs-master network-scripts]# cat ifcfg-eth1
# Intel Corporation 82545EM Gigabit Ethernet Controller (Copper)
DEVICE=eth1
BOOTPROTO=static
IPADDR=10.0.0.1
NETMASK=255.255.255.0
ONBOOT=yes
 
 
3.3.2配置主机host(所有server一样)
 

[root@lvs-master ~]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1        localhost
192.168.1.130    lvs-master
192.168.1.131    lvs-slave
192.168.1.132    real-server1
192.168.1.133    real-server2
192.168.1.134    lvs-vip
10.0.0.1         lvs-priv01
10.0.0.2         lvs-priv02
 
 
3.3.3关闭服务和卸载包(分别在 lvs-master和lvs-slave执行)

[root@lvs-master ~]#sh rc.sh
[root@lvs-master ~]# cat rc.sh
service bluetooth stop
service netfs stop
service ip6tables stop
chkconfig bluetooth off
chkconfig ip6tables off
chkconfig netfs off
chkconfig kudzu off
chkconfig nfs off
chkconfig smartd off
chkconfig cups off
chkconfig rhnsd off
chkconfig iptables off
chkconfig autofs off
chkconfig acpid off
chkconfig apmd off
rpm -e --nodeps sendmail
iptables –F
iptables –X
service iptables save
 
 
3.3.4关闭selinux,避免影响piranha-gui的启动;

[root@lvs-master ~]# vi /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#        enforcing - SELinux security policy is enforced.
#        permissive - SELinux prints warnings instead of enforcing.
#        disabled - SELinux is fully disabled.
SELINUX=disabled
 
将 SELINUX= enforcing改为 disabled
 
执行如下命令直接生效
[root@lvs-master ~]# setenforce 0
 
 
3.3.5查看内核是否支持IPVS模块

[root@lvs-master ~]# modprobe -l |grep ipvs
/lib/modules/2.6.18-238.el5/kernel/net/ipv4/ipvs/ip_vs.ko
/lib/modules/2.6.18-238.el5/kernel/net/ipv4/ipvs/ip_vs_dh.ko
/lib/modules/2.6.18-238.el5/kernel/net/ipv4/ipvs/ip_vs_ftp.ko
/lib/modules/2.6.18-238.el5/kernel/net/ipv4/ipvs/ip_vs_lblc.ko
/lib/modules/2.6.18-238.el5/kernel/net/ipv4/ipvs/ip_vs_lblcr.ko
/lib/modules/2.6.18-238.el5/kernel/net/ipv4/ipvs/ip_vs_lc.ko
/lib/modules/2.6.18-238.el5/kernel/net/ipv4/ipvs/ip_vs_nq.ko
/lib/modules/2.6.18-238.el5/kernel/net/ipv4/ipvs/ip_vs_rr.ko
/lib/modules/2.6.18-238.el5/kernel/net/ipv4/ipvs/ip_vs_sed.ko
/lib/modules/2.6.18-238.el5/kernel/net/ipv4/ipvs/ip_vs_sh.ko
/lib/modules/2.6.18-238.el5/kernel/net/ipv4/ipvs/ip_vs_wlc.ko
/lib/modules/2.6.18-238.el5/kernel/net/ipv4/ipvs/ip_vs_wrr.ko
 
 
3.3.6配置YUM仓库(所有服务器都配置)

1.挂载RHEL5.6安装光盘至/mnt目录
mount /dev/cdrom /mnt
2. 修改YUM文件
vi /etc/yum.repos.d/rhel-debuginfo.repo
内容如下:
[Cluster]
name=Red Hat Enterprise Linux $releasever - $basearch - Cluster
baseurl=file:///mnt/Cluster
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[ClusterStorage]
name=Red Hat Enterprise Linux $releasever - $basearch - ClusterStorage
baseurl=file:///mnt/ClusterStorage
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[Server]
name=Red Hat Enterprise Linux $releasever - $basearch - Server
baseurl=file:///mnt/Server
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[VT]
name=Red Hat Enterprise Linux $releasever - $basearch - VT
baseurl=file:///mnt/VT
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
3. 新建 rhel/目录
mkdir -p /var/rhel/{Cluster,ClusterStorage,Server,VT}
4. 安装createrepo
rpm -ivh /mnt/Server/createrepo-0.4.11-3.el5.noarch.rpm
createrepo -o /var/rhel/Cluster -g /mnt/Cluster/repodata/comps-rhel5-cluster.xml /mnt/Cluster
createrepo -o /var/rhel/ClusterStorage -g /mnt/ClusterStorage/repodata/comps-rhel5-cluster-st.xml /mnt/ClusterStorage
createrepo -o /var/rhel/Server -g /mnt/Server/repodata/comps-rhel5-server-core.xml /mnt/Server
createrepo -o /var/rhel/VT -g /mnt/VT/repodata/comps-rhel5-vt.xml /mnt/VT
5. 挂载
mount --bind /var/rhel/Cluster/repodata /mnt/Cluster/repodata
mount --bind /var/rhel/ClusterStorage/repodata /mnt/ClusterStorage/repodata
mount --bind /var/rhel/Server/repodata /mnt/Server/repodata
mount --bind /var/rhel/VT/repodata /mnt/VT/repodata
6. 刷新
yum clean all
 
 
3.3.7安装ipvsadm和piranha(LVS-MASTER和LVS-SLAVE两台都安装)
 

安装
#yum install ipvsadm piranha
检验包是否安装
[root@lvs-master ~]# rpm -qa |grep ipvsadm
ipvsadm-1.24-12.el5
[root@lvs-master ~]# rpm -qa |grep piranha
piranha-0.8.4-19.el5
3.3.8 配置Piranha
3.3.8.1主LVS-MASTER服务器:

#vim /etc/sysctl.conf //修改系统参数
Net.ipv4.ip_forward = 1 //将默认 0修改为1,开启IP转发
#sysctl – p //执行命令即时生效
3.3.8.2启动piranha配置服务

#/etc/init.d/piranha-gui start     //启动 piranha服务
#/usr/sbin/piranha-passwd      //设置 piranha登录密码 welcome
使用浏览器打开管理页面: Http://192.168.1.130:3636(图001)和图(002)
 
登录管理页面用户名: piranha 密码:之前设置的登入密码welcome
【图 002】
3.3.9配置主LVS服务器

Ø 点击 GLOBAL SETTINGS(图003)
Ø Primary server public IP: 192.168.1.130
Ø Primary server private IP: 10.0.0.1 //心跳地址
Ø Use network type: Direct Routing //直接路由方式 —或者选择NAT模式
Ø 点击 ACCEPT //保存
 
 
 
【图 003】
3.3.10配置Backup Server (不部署备用LVS直接查看3.3.11)

Ø 点击 ENABLE激活冗余服务器(图004)
Ø Redundant server public IP: 192.168.1.131 //备份 LVS地址
Ø Heartbeat interval (seconds): 6 //心跳网络检测时间
Ø Assume dead after(seconds): 18 //死亡转移时间
Ø Heartbeat runs on port: 539 //监控的端口
Ø Monitor NIC links for failures : 不勾选 //网卡链路失效选项—-根据实际情况勾选
Ø Syncdaemon: 不勾选 //同步守护进程选项—-根据实际情况勾选
 
【图 004】
3.3.11配置虚拟服务器

Ø 点击 VIRTUAL SERVERS- ADD,添加一条新的记录并编辑(图005)
Ø Name: LVS-VIP //自定义名称
Ø Application port: 80 //监控应用端口号
Ø Protocol: TCP //监控网络的类型
Ø Virtual IP Address: 192.168.1.134 //虚拟服务器的IP地址
Ø Virtual IP Network Mask: 255.255.255.0//虚拟服务掩码
Ø Firewall Mark: null 当目标应用要使用多个 IP端口时,结合IPTABLE设定防火墙标记。
Ø Device: eth0:1 //虚拟 IP设备宿主
Ø Re-entry time: 15 //移除 RS后从新加入时间
Ø Service timeout: 6 //RS失效后存活时间
Ø Quiesce server: null 一旦有Real Server加入或恢复,则所有负载队列记录均归"0"并重新进
Ø 行分配
Ø Load monitoring tool:在 Real Server中通过ruptime或rup命令获得系统负载,以结合
Ø 相应用的 Scheduling算法进行调度计算。
Ø Scheduling: WLC //调度算法 ---根据实际情况使用不同调度算法
Ø Persistence: null //同一客户端长连接的保持时间
Ø Persistence Network Mask:默认 //长连接保持的子网掩码(网段)范围
 
【图 005】
3.3.12配置Real-server1

Ø 点击 REAL SERVER - ADD - EDIT 新建一条RS记录(图006)
Ø NAME: [Real-Server01] //自定义RS名称
Ø Address: 192.168.1.132 //RS1服务器IP地址
Ø Port: 80 //服务的端口
Ø Weight: 1 //调度权重
 
【图 006】
3.3.13 配置Real-Server2

Ø 点击 REAL SERVER - ADD - EDIT 新建一条RS记录(图007)
Ø NAME: Real-Server02 //自定义RS名称
Ø Address: 192.168.1.133 //RS2服务器IP地址
Ø Port: 80 //服务的端口
Ø Weight: 1 //调度权重
 
【图 007】
3.3.14 激活服务器
完成上述操作后,要激活虚拟服务器(图 008)及所有的真实服务器(图009),使其为”UP”状态。
【图 008】
 
【图 009】
3.3.15单击"MONITORING SCRIPTS",配置LVS使之检查Real Server中对目标应用的规则,如下【图010】
所示。
【图 010】

备注: Sending Program:通过程序实现Real Server中对应用服务可用性的判断(不能与Send同
时使用 )。
Send:直接通过 VIRTUAL SERVER中指定的端口发送指令。
Expect: Sending Program或Send后的返回值,如果与此返回值匹配,则表明此应用服务
在当前 Real Server中运行正常。
Treat expect string as a regular expression:将 Expect中的值作为正则表达式与返回
值进行比对。
注意:
此处的功能与 RHCS中的"集群脚本"相似,主要用于判断Real Server中的目标服务运行是
否正常,如果发现服务失效,则主动在此 VIRTUAL SERVER中隔离该Real Server
 
 
 
3.3.16启动LVS服务(lvs-master)

#service pulse start
3.3.17 SLAVE SERVER 配置
如安装主 LVS服务器一样安装备份LVS服务器软件, 复制 MASTER服务器lvs.cf脚本到备份服务器,并启动服务器

#scp /etc/sysconfig/ha/lvs.cf 192.168.1.131:/etc/sysconfig/ha
#service pulse start //启动服务
3.4 Real Server部署
3.4.1配置真实服务器( Real-Server1和Real-Server2)
在 lvs的DR和TUn模式下,用户的访问请求到达真实服务器后,是直接返回给用户的,而不再经过前端的Director Server,因此,就需要在每个Real server节点上增加虚拟的VIP地址,这样数据才能直接返回给用户,增加VIP地址的操作可以通过创建脚本的方式来实现,创建文件/etc/init.d/lvsrs.sh
脚本内容如下:
 
配置 RealServer 脚本

#vim /usr/local/sbin/lvsrs.sh
#!/bin/bash
VIP=192.168.1.134
case "$1" in
start)
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Started"
;;
stop)
ifconfig lo:0 down
route del $VIP > /dev/null 2>&1
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
脚本添加可执行权限:
Chmod 755  /usr/local/sbin/ lvsrs.sh
编写完成后,分别在 RealServer1和Realserver2执行。

#/usr/local/sbin/ lvsrs.sh start
此操作是在回环设备上绑定了一个虚拟 IP地址,并设定其子网掩码为255.255.255.255,与Director Server上的虚拟IP保持互通,然后禁止了本机的ARP请求。
由于虚拟 ip,也就是上面的VIP地址,是Director Server和所有的Real server共享的,如果有ARP请求VIP地址时,Director Server与所有Real server都做应答的话,就出现问题了,因此,需要禁止Real server响应ARP请求。而lvsrs脚本的作用就是使Real Server不响应arp请求。
对于2.4以下低版本,在Real Server上要安装ARP hidden内核补丁,幸运的是,在2.6内核中通过调整内核参数即可忽略ARP广播回应。
 
3.4.2查看LVS服务状态

#ipvsadm –ln
[root@lvs-salve ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
 -> RemoteAddress:Port            Forward Weight ActiveConn InActConn
TCP 192.168.1.134:80 wlc
 -> 192.168.1.132:80              Route   1      0          0
 -> 192.168.1.133:80              Route   1      0          0
 
Ifconfig 可以看到 lvs-vip地址eth0:1 192.168.1.134已经启动,如下图
 
详细细节查看 LVS服务监听日志

#tail /var/log/message
3.4.3 访问测试页面
在 IE访问lvs-vip, http://192.168.1.134一直按F5刷新页面可以看到real-server1和real-server2两个http页面切换,说明负载正常如【图 011】和【图012】
 
 
【图 011】
【图 012】
3.4.4关闭lvs-master主节点服务,查看是否切换到lvs-salve查看lvs-vip是否在lvs-master服务器启动起来(lvs-master和lvs-slave时间一定要同步否则切换会失效)
1)关闭 lvs-master主节点服务

#service pulse stop
 
2) lvs-master主节点服务关闭如【图013】所示:
【图 013】
3)登入 lvs-slaver服务器, 查看日志可以看到VIP已经漂移过来,如图【014】和图【015】
 
【图 014】
 
图【 015】
4)登入 Lvs-slave查询lvs-vip eth0:1是否已经启动,输入如下命令:

# ifconfig
图【 016】
 
5)Ipvsadm –ln 可以看到服务已经接管负载,如图【 017】所示:
图【 017】
 
3.4.5关闭lvs-slave服务器节点服务

#service pulse stop
看到在 lvs-master,vip eth0:1已经漂移过来,并且集群已经接管如图【018】和【019】所示:
 
图【 018】
 
图【 019】
 
---------------------------------------------------------------------------------------------------------------------------------
提示:
关闭 arp响应永久的做法如下:
分别在 real-server1和real-server2添加

Vi /etc/sysctl.conf加入:
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
 
 

注释 :arp_ignore=1,系统只回答目的IP为是本地的包。(也就是对广播包不做响应)
arp_announce = 2,系统忽略 IP包的源地址,而根据目标主机,选择本地地址
arp_ignore:integer 定义对目标地址为本地 IP的arp询问不同的应答模式,相关代码在arp_announce函数中默认为0
0-(默认值):回应任何网络接口上对任何本地 IP地址的arp查询请求(比如eth0 =192.168.1.130/24,eth1=10.0.0.1/24,那麽即使eth0收到来自10.0.0.2这样地址发起的对10.0.0.1的arp查询也会回应—而原本这个请求该是出现在eth1上,也该由eth1回应的)
1-   只回答目标 IP地址是来访网络接口本地地址的ARP查询请求(比如eth0=192.168.1.130/24,eth1=10.0.0.1/24,即eth0收到来自10.0.0.2这样IP地址发起对192.168.1.130的查询会回答,而对10.0.0.1的arp查询不会回应)
2-   只回答目标 IP地址是来访网络接口本地地址的arp查询请求,且来访IP必须在该网络接口的子网段内(比如eth0=192.168.1.130/24,eth1=10.0.0.1/24,eth1收到来自10.0.0.2这样地址发起的对192.168.0.1的查询不会回答,而对192.168.0.131发起的对192.168.0.130的arp查询会回应
3-   不回应该网络界面的 arp请求,而只对设置的唯一和连接地址出回应
 
arp_announce : INTEGER不同取值表示对网络接口上本地 IP地址发出的ARP回应做出相应级别的限制:相关代码默认为0
确定不同程度的限制 ,宣布对来自本地源IP地址发出Arp请求的接口
0 - (默认) 在任意网络接口上的任何本地地址
1 -尽量避免不在该网络接口子网段的本地地址. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送;
当内网的机器要发送一个到外部的 IP包,那么它就会请求路由器的MAC地址,发送一个arp请求,这个arp请求里面包括自己的IP地址和MAC地址,而linux默认是使用IP地址作为arp里面的源IP地址,而不是使用设备上面的,如果设置arp_announce为2,则使用发送设备上的IP。all/ 和{interface}/ 下两者同时比较,取较大一个值生效.
 
 
 
3.5配置FTP(前面细节已经说明ftp直接图解不在详细说明)
3.5.1假设配置 real-server1上的ftp, 配置vrtual_server具体如下图:
【图 020】
3.5.2添加 real_server如图【021】
【图 021】
 
3.5.3激活 [lvs-ftp] vrtual_servers up如图【022】
【图 022】
3.5.4单击"MONITORING SCRIPTS",配置LVS使之检查Real Server中对目标应用的规则,如下【图023】所示。
 
【图 023】
 
3.5.5重启 lvs-master pulse服务,可以看到21端口已经启动
【图 024】
 
3.5.6 ftp工具登入 192.168.1.134,正常连接实验完成
 
备注: piranha具体配置lvs.cf内容如下,直接修改文件不通过piranha操作也可以,修改完成需要重启pulse服务;

[root@lvs-master ha]# cat lvs.cf
serial_no = 54
primary = 192.168.1.130
primary_private = 10.0.0.1
service = lvs
backup_active = 1
backup = 192.168.1.131
backup_private = 10.0.0.2
heartbeat = 1
heartbeat_port = 539
keepalive = 6
deadtime = 18
network = direct
debug_level = NONE
monitor_links = 0
syncdaemon = 0
virtual [lvs-vip] {
     active = 1
     address = 192.168.1.134 eth0:1
     vip_nmask = 255.255.255.0
     port = 80
     send = "GET / HTTP/1.0\r\n\r\n"
     expect = "HTTP"
     use_regex = 0
     load_monitor = none
     scheduler = wlc
     protocol = tcp
     timeout = 6
     reentry = 15
     quiesce_server = 0
     server [Real-Server01] {
         address = 192.168.1.132
         active = 1
         port = 80
         weight = 1
     }
     server [Real-Server02] {
         address = 192.168.1.133
         active = 1
         port = 80
         weight = 1
     }
}
virtual [lvs-ftp] {
     active = 1
     address = 192.168.1.134 eth0:1
     vip_nmask = 255.255.255.0
     port = 21
     use_regex = 0
     load_monitor = none
     scheduler = wlc
     protocol = tcp
     timeout = 6
     reentry = 15
     quiesce_server = 0
     server [real-server1] {
         address = 192.168.1.132
         active = 1
         weight = 1
     }
}
 
 
 
 
 
 
方案二 Lvs+piranha+nat模式
 

备注:在本示例中,活跃 LVS 路由器中有两个 NIC。用于互联网的 NIC 在 eth0 中有一个真实 IP 地址,并有一个别名为 eth0:1 的浮动 IP 地址。用于专用网络接口的 NIC 在 eth1 中有一个真实 IP 地址,并
有一个别名为 eth1:1 的浮动 IP 地址。在发生失效切换时,面向互联网的虚拟接口和面向虚拟接口的
专用接口同时由备用 LVS 路由器取代。所有位于专用网络中的真实服务器为 NAT 路由器使用浮动 IP
地址,因为它们默认路由是和活跃 LVS 路由器沟通,以便不会影响到对来自互联网请求的回应。使用这种布局,活跃 LVS 路由器可接收请求并将其路由到适当的服务器。然后真实服务器处理该请求并将数据包返回到 LVS 路由器,该路由器使用网络地址转换将数据包中的真实服务器地址替换为 LVS路由器公共 VIP 地址。这个过程被称为 IP 伪装,因为发出请求的客户端无法看到真实服务器的实际 IP 地址。
使用这种 NAT 路由,真实服务器可以是运行各种操作系统的机器。最大的缺点就是在较大群集部署中
 LVS 路由器可能会成为瓶颈,因为它必须处理外发和进入请求。
 
 
4.1概述 NAT LVS 网络
NAT 布局允许大限度利用现有硬件,但因为所有进出服务器池的数据包都经过 LVS 路由器,所以会限
制其处理大负载的能力。
 
网络布局
使用 NAT 路由的 LVS 布局是根据网络方案透视进行配置的最简单的方法,因为只需要一个切入
点访问公共网络。真实服务器会将所有请求返回到 LVS 路由器,这样就可以让它们在其专用网络
中了。
 
硬件
从硬件考虑, NAT 布局是最灵活的布局,因为真实服务器不一定是 Linux 机器才能正常工作。在
NAT 布局中,每个真实服务器只需要一个 NIC,因为它只响应 LVS 路由器。另一方面,LVS 路由
器需要两个 NIC 来在两个网络间路由流量。因为此布局在 LVS 路由器中产生了网络瓶颈,所以可
以在每个 LVS 路由器中部署千兆以太网 NIC(gigabit Ethernet NIC)来提高 LVS 路由器可处理的
带宽。如果在 LVS 路由器中使用了千兆以太网 NIC,每个连接真实服务器和 LVS 路由器的开关
必须至少有两个千兆以太网端口来有效处理负载。
 
软件
因为 NAT 布局需要使用 iptables 进行某些配置,所以在 Piranha Configuration Tool之外还需要配置
相当数量的软件。特别是在使用 FTP 服务和防火墙标记时需要额外手动配置 LVS 路由器以便正确
路由请求。
 
4.2方案IP信息列表

名称
IP 地址
心跳地址
LVS-MASTER
Eht0:192.168.1.130/24
Eth1:10.0.0.1/24        Gateway: 192.168.1.1/24
LVS-SLAVE
Eht0:192.168.1.131/24
Eht1:10.0.0.2/24      Gateway: 192.168.1.1/24
Real-Server1
Eht0:10.0.0.3/24
Gateway:10.0.0.254/24
Real-Server2
Eht0:10.0.0.4/24
Gateway:10.0.0.254/24
LVS-VIP
192.168.1.134/32
 
4.2.1 环境预约

配置平台:
Director: 两台虚拟机 redhat5.6_x86_64
RealServer:两台虚拟机 redhat5.6_x86_64
配置方式: VS/NAT(直接路由)
               配置软件: ipvsadm+piranha
 
4.2.2 配置Lvs-master服务器IP如下,lvs-salve根据如下修改相应的ip

[root@lvs-master network-scripts]# cat ifcfg-eth0
# Intel Corporation 82545EM Gigabit Ethernet Controller (Copper)
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.1.130
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
ONBOOT=yes
[root@lvs-master network-scripts]# cat ifcfg-eth1
# Intel Corporation 82545EM Gigabit Ethernet Controller (Copper)
DEVICE=eth1
BOOTPROTO=static
IPADDR=10.0.0.1
NETMASK=255.255.255.0
ONBOOT=yes
 
4.2.3配置主机host(所有server一样)

[root@lvs-master network-scripts]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1        localhost
192.168.1.130    lvs-master
192.168.1.131    lvs-slave
192.168.1.134    lvs-vip
10.0.0.1         lvs-priv01
10.0.0.2         lvs-priv02
10.0.0.3         real-server1
10.0.0.4         real-server2
10.0.0.254       lvs-gw
 
4.2.4启动piranha配置服务

#/etc/init.d/piranha-gui start   //启动 piranha服务
#/usr/sbin/piranha-passwd      //设置 piranha登录密码 welcome
1)使用浏览器打开管理页面: Http://192.168.1.130:3636如图【001】所示                                         【图 001】
 
2)登录管理页面用户名: piranha 密码:之前设置的登入密码welcome,如图【002】
【图 002】
4.2.5配置主LVS服务器

Ø 点击 GLOBAL SETTINGS(图003)
Ø Primary server public IP: 192.168.1.130
Ø Primary server private IP: 10.0.0.1 //心跳地址
Ø Use network type: NAT //选择 NAT模式
Ø Nat router ip 10.0.0.254 //在此文本字段输入专用浮动 IP,该浮动 IP 应该作为真实服务器的网关使用
Ø NAT Router netmask:255.255.255.0 //子网掩码
Ø NAT Router device:eth1:1 //使用此文本字段为浮动 IP 地址的网络接口定义设备名称,比如 eth1:1。
Ø 点击 ACCEPT //保存
 
图【 003】
4.2.6配置Backup Server 见图【004】

 
Ø Redundant server public IP: 192.168.1.131 //备份 LVS地址
Ø Redundant server private IP : 10.0.0.2
Ø Heartbeat interval (seconds): 6 //心跳网络检测时间
Ø Assume dead after(seconds): 18 //死亡转移时间
Ø Heartbeat runs on port: 539 //监控的端口
Ø Monitor NIC links for failures : 不勾选 //网卡链路失效选项—-根据实际情况勾选
Ø Syncdaemon: 不勾选 //同步守护进程选项—-根据实际情况勾选
 
 
 
图【 004】
4.2.7配置虚拟服务器

Ø 点击 VIRTUAL SERVERS- ADD,添加一条新的记录并编辑(图005)
Ø Name: LVS-VIP //自定义名称
Ø Application port: 80 //监控应用端口号
Ø Protocol: TCP //监控网络的类型
Ø Virtual IP Address: 192.168.1.134 //虚拟服务器的IP地址
Ø Virtual IP Network Mask: 255.255.255.0//虚拟服务掩码
Ø Firewall Mark: 8001 当目标应用要使用多个 IP端口时,结合IPTABLE设定防火墙标记。
Ø Device: eth0:1 //虚拟 IP设备宿主
Ø Re-entry time: 15 //移除 RS后从新加入时间
Ø Service timeout: 6 //RS失效后存活时间
Ø Quiesce server: null 一旦有Real Server加入或恢复,则所有负载队列记录均归"0"并重新进
Ø 行分配
Ø Load monitoring tool:在 Real Server中通过ruptime或rup命令获得系统负载,以结合
Ø 相应用的 Scheduling算法进行调度计算。
Ø Scheduling: WLC //调度算法 ---根据实际情况使用不同调度算法
Ø Persistence: null //同一客户端长连接的保持时间
Ø Persistence Network Mask:默认 //长连接保持的子网掩码(网段)范围
 
 
图【 005】
4.2.8配置Real-server1

Ø 点击 REAL SERVER - ADD - EDIT 新建一条RS记录(图006)和图007
Ø NAME: [Real-Server01] //自定义RS名称
Ø Address: 10.0.0.3 //RS1服务器IP地址
Ø Port: 80 //服务的端口 可以填可以不填
Ø Weight: 1 //调度权重
 
 
图【 006】
【图 007】
4.2.9 激活服务器
完成上述操作后,要激活虚拟服务器及所有的真实服务器(图 009),使其为”UP”状态。
 
图【 009】
4.2.10单击"MONITORING SCRIPTS",配置LVS使之检查Real Server中对目标应用的规则,如下【图010】
 
【图 010】
4.2.11 Real Server部署(real-server1和real-server2)
配置网络如下
 

 [root@real-server1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
# Intel Corporation 82545EM Gigabit Ethernet Controller (Copper)
DEVICE=eth0
BOOTPROTO=static
IPADDR=10.0.0.3
NETMASK=255.255.255.0
ONBOOT=yes
GATEWAY=10.0.0.254
 
测试是否可以上网 ,网络是通的
[root@real-server1 ~]# ping g.cn
PING g.cn (203.208.46.144) 56(84) bytes of data.
64 bytes from 203.208.46.144: icmp_seq=1 ttl=55 time=45.9 ms
64 bytes from 203.208.46.144: icmp_seq=2 ttl=55 time=46.6 ms
 
 
 
4.3启动LVS服务(lvs-master)

#service pulse start
# ipvsadm –ln //查看服务器是节点是否都加载见图【 011】
【图 011】
4.4 SLAVE SERVER 配置
如安装主 LVS服务器一样安装备份LVS服务器软件, 复制 MASTER服务器lvs.cf脚本到备份服务器,并启动服务器

#scp /etc/sysconfig/ha/lvs.cf 192.168.1.131:/etc/sysconfig/ha
#service pulse start //启动服务
4.5配置防火墙
执行 fw.sh脚本(lvs-master和lvs-salve)

[root@lvs-master ~]# sh fw.sh
[root@lvs-master ~]# cat fw.sh
iptables -P INPUT DROP
iptables -P INPUT ACCEPT
iptables -P FORWARD DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT DROP
iptables -P OUTPUT ACCEPT
iptables -X
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -t nat -A POSTROUTING -j MASQUERADE
sysctl -q -w net.ipv4.ip_forward=1
iptables-save >/etc/sysconfig/iptables
 
iptables -t nat -A POSTROUTING -j MASQUERADE //表示开启 nat
sysctl -q -w net.ipv4.ip_forward=1 //包转发开启
 
 
4.6打开IE浏览器,按F5可以看到页面分别指向不同的real-server1和real-server2页面(这里apache安装以及vsftp安装部署省略)见图012和013
图【 012】
图【 013】
4.7关闭lvs-master主节点服务,查看是否切换到lvs-salve查看lvs-vip是否在lvs-master服务器启动起来(lvs-master和lvs-slave时间一定要同步否则切换会失效)
1)关闭 lvs-master主节点服务

#service pulse stop
 
2) lvs-master主节点服务关闭如【图014】所示
 
 
图【 014】
 
3)登入 lvs-slaver服务器, 查看日志可以看到VIP已经漂移过来,如图【015】和图【016】
 
图【 015】
 
图【 016】
4.8关闭lvs-slave服务器节点服务

#service pulse stop
看到在 lvs-master,vip eth0:1已经漂移过来,并且集群已经接管如图【017】和【018】【019】
 
【图 017】
【图 018】
【图 019】
 
4.9配置 FTP
4.9.1 假设配置 real-server1上的ftp, 配置vrtual_server具体如下图020
 
 
【图 020】
 
4.9.2加 real_server如图【021】
【图 021】
 
 
 
 
 
 
 
 
 
 
 
4.9.3激活 [lvs-ftp] vrtual_servers up如图【022】
【图 022】
4.9.4单击 "MONITORING SCRIPTS",配置LVS使之检查Real Server中对目标应用的规则,如下【图023】所示。
【图 023】
 
 

官方:要确定为给定服务发送什么,您可以打开真实服务器中连接 telnet 的端口,并看返回了什么。
例如, FTP 在端口 220 报告连接,那么应该在「Send」字段输入 quit,并在「Expect」字段输
入 220,但是测试结果都无效,所以这里空着采用防火墙映射办法解决
 
 
 
假设需要访问 real_server2 ftp服务器,需要在(lvs-master或者lvs-slave)上添加防火墙策略,将10.0.0.3的21端口需要映射给 lvs-vip 命令如下:

iptables -t nat -A PREROUTING -p tcp -d "192.168.1.134/32" --dport 21 -j DNAT --to-destination 10.0.0.3:21
 
 
 
客户端测试正常
 
以上配置完成 lvs.cf内容如下

[root@lvs-master ha]# cat lvs.cf
serial_no = 83
primary = 192.168.1.130
primary_private = 10.0.0.1
service = lvs
backup_active = 1
backup = 192.168.1.131
backup_private = 10.0.0.2
heartbeat = 1
heartbeat_port = 539
keepalive = 6
deadtime = 18
network = nat
nat_router = 10.0.0.254 eth1:1
nat_nmask = 255.255.255.0
debug_level = NONE
monitor_links = 0
syncdaemon = 0
virtual [lvs-vip] {
     active = 1
     address = 192.168.1.134 eth0:1
     vip_nmask = 255.255.255.0
     port = 80
     send = "GET / HTTP/1.0\r\n\r\n"
     expect = "HTTP"
     use_regex = 0
     load_monitor = none
     scheduler = wlc
     protocol = tcp
     timeout = 6
     reentry = 15
     quiesce_server = 0
     server [Real-Server01] {
         address = 10.0.0.3
         active = 1
         weight = 1
     }
     server [Real-Server02] {
         address = 10.0.0.4
         active = 1
         weight = 1
     }
}
virtual [lvs-ftp] {
     active = 1
     address = 192.168.1.134 eth0:1
     vip_nmask = 255.255.255.0
     port = 21
     use_regex = 0
     load_monitor = none
     scheduler = wlc
     protocol = tcp
     timeout = 6
     reentry = 15
     quiesce_server = 0
     server [real-server1] {
         address = 10.0.0.3
         active = 1
         weight = 1
     }
}
 
 
 
 
 
 
参考范文: nat lvs.cf配置文件以下为80端口和443端口

[root@CN07-VM-FS piranha]# cat lvs.cf
serial_no = 312
primary = 192.168.1.130
primary_private = 10.10.0.1
service = lvs
backup_active = 1
backup = 192.168.131
backup_private = 10.0.0.2
heartbeat = 1
heartbeat_port = 539
keepalive = 6
deadtime = 18
network = nat
nat_router = 10.10.0.254 eth1:1
nat_nmask = 255.255.255.0
debug_level = NONE
monitor_links = 0
syncdaemon = 0
virtual [lvs-vip-80] {
     active = 1
     address = 192.168.1.134 eth0:1
     vip_nmask = 255.255.255.0
     port = 80
     send = "GET / HTTP/1.1\r\n\r\n"
     expect = "HTTP"
     use_regex = 0
     load_monitor = none
     scheduler = wlc
     protocol = tcp
     timeout = 6
     reentry = 15
     quiesce_server = 0
     server [Real-Server01] {
         address = 10.0.0.3
         active = 1
         weight = 1
     }
     server [Real-Server02] {
         address = 10.0.0.4
         active = 1
         weight = 1
     }
}
virtual [lvs-vip-443] {
     active = 1
     address = 192.168.1.134 eth0:1
     vip_nmask = 255.255.255.0
     port = 443
     use_regex = 0
     load_monitor = none
     scheduler = wlc
     protocol = tcp
     timeout = 6
     reentry = 15
     quiesce_server = 0
        server [Real-Server01] {
         address = 10.0.0.3
         active = 1
         weight = 1
     }
     server [Real-Server02] {
         address = 10.0.0.4
         active = 1
         weight = 1
     }
}

 
 


 

 
完毕谢谢!