关于lvs的更详细的信息请参考博文“LVS集群系统详解”http://wangziyin.blog.51cto.com/blog/6948950/1297354

或参考lvs中文网站:http://www.linuxvirtualserver.org/zh/lvs4.html


系统环境: rhel6 x86_64 iptables and selinux disabled
yum 仓库配置:
[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=ftp://192.168.122.1/pub/yum
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

[HighAvailability]
name=Instructor Server Repository
baseurl=ftp://192.168.122.1/pub/yum/HighAvailability
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
enabled=1

[LoadBalancer]
name=Instructor Server Repository
baseurl=ftp://192.168.122.1/pub/yum/LoadBalancer
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
enabled=1

[ResilientStorage]
name=Instructor Server Repository
baseurl=ftp://192.168.122.1/pub/yum/ResilientStorage
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
enabled=1

[ScalableFileSystem]
name=Instructor Server Repository
baseurl=ftp://192.168.122.1/pub/yum/ScalableFileSystem
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
enabled=1
Load Balancer:
kernel 2.6.x 已內建 LVS 模组
kernel 2.4.x 或之前的内核版本需打补丁
rhel5 /rhel6 自带 LVS 软件包 安装 ipvsadm 软件包即可使用


VS/NAT

Load Balance 双网卡 192.168.122.82(外网) 192.168.1.82(内网)


Gateway 192.168.1.82 (注:Realserver 的网关应设为 Load Balance 的内网IP)
Realserver1 192.168.1.33 desk33.example.com
Realserver2 192.168.1.34 desk34.example.com


Virtual IP 192.168.122.122


以下步骤在 desk82 上实施:
#开启路由机制

# vim /etc/sysctl.conf
     net.ipv4.ip_forward = 1
# sysctl -p

#加载 nat 模块
# modprobe iptable_nat
注:如果不加载此模块,也可以在第一次访问时成功,但是会在再次访问时出现延迟过长,或访问超时 现象

yum install ipvsadm -y
ipvsadm -C
ipvsadm -A -t 192.168.122.82:80 -s rr
ipvsadm -a -t 192.168.122.82:80 -r 192.168.1.33:80 -m
ipvsadm -a -t 192.168.122.82:80 -r 192.168.1.34:80 -m
#保存 rule
/etc/init.d/ipvsadm save
#绑定 vip
# ifconfig eth0:0 192.168.122.122 netmask 255.255.255.0


以下步骤在 desk33 和 desk34上实施:

# yum install httpd -y
# echo `hostname` > /var/www/html/index.html
# /etc/init.d/httpd start

测试:
选择一台 192.168.122.0/24 网段主机访问 http:// 192.168.122.122 反复刷新网页,每次出现的网页不同 则表示成功。

VS/DR


以下是 LVS-DR 的工作原理,包括数据包、数据帧的走向和转换过程:

官方的原理说明:Director 接收用户的请求,然后根据负载均衡算法选取一台realserver,将包转发 过去,最后由 realserver 直接回复给用户。


实例场景设备清单:

154446737.png

说明:我这里为了方便,client 是与 vip 同一网段的机器。如果是外部的用户访问,将 client 替换成 gateway 即可,因为 IP 包头是不变的,变的只是源 mac 地址。
1.client 向目标 vip 发出请求,Director 接收。此时 IP 包头及数据帧头信息如下:
154648958.png

2.VS 根据负载均衡算法选择一台 active 的 realserver(假设 192.168.57.122),将此 RIP 所在网 卡的 mac 地址作为目标 mac 地址,发送到局域网里.此时 IP 包头及数据帧头信息如下:
154750519.png

3.realserver(192.168.57.122)在局域网中收到这个帧,拆开后发现目标 IP(VIP)与本地匹配,于是 处理这个报文.随后重新封装报文,发送到局域网.此时 IP 包头及数据帧头信息如下:
154846482.png

4 如果 client 与 VS 同一网段,那么 client(192.168.57.135)将收到这个回复报文.如果跨了网段, 那么报文通过 gateway/路由器经由 Internet 返回给用户.



Realserver 192.168.122.33 desk33.example.com
Realserver 192.168.122.34 desk34.example.com
Load Balance 192.168.122.82 desk82.example.com

Virtual IP 192.168.122.122


以下步骤在 desk82 上实施:

# yum install ipvsadm -y
#加载 rule
# ipvsadm -C (清空 ipvs 转发表 )
# ipvsadm -A -t 192.168.122.122:80 -s rr (-A:添加一个虚拟服务; -t:tcp 服务;-s 调度算法)
# ipvsadm -a -t 192.168.122.122:80 -r 192.168.122.33:80 -g
# ipvsadm -a -t 192.168.122.122:80 -r 192.168.122.34:80 -g
#保存 rule
# /etc/init.d/ipvsadm save
#绑定 vip
# ifconfig eth0:0 192.168.122.122 netmask 255.255.255.0


Realserver必须 屏蔽 arp缓存:


以下步骤在 desk33 上实施:

#关闭 arp
方法一
# yum install arptables_jf -y
# arptables -A IN -d 192.168.122.122 -j DROP
# arptables -A OUT -s 192.168.122.122 -j mangle --mangle-ip-s 192.168.122.33
# /etc/init.d/arptables_jf save
方法二
# vim /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
# sysctl -p
#ifconfig eth0:0 192.168.122.122 netmask 255.255.255.255
#yum install httpd -y
#echo `hostname` > /var/www/html/index.html
#/etc/init.d/httpd start


以下步骤在 desk34 上实施:

#关闭 arp
方法一
# yum install arptables_jf -y
# arptables -A IN -d 192.168.122.122 -j DROP
# arptables -A OUT -s 192.168.122.122 -j mangle --mangle-ip-s 192.168.122.34
# /etc/init.d/arptables_jf save
方法二
# vim /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
# sysctl -p
#ifconfig eth0:0 192.168.122.122 netmask 255.255.255.255
#yum install httpd -y
#echo `hostname` > /var/www/html/index.html
#/etc/init.d/httpd start

测试:
访问 192.168.122.122 反复刷新网页,每次出现的网页不同则表示配置成功。


VS/TUN


VS/TUN 技术对服务器有要求,即所有的服务器必须支持“IP Tunneling”或者“IPEncapsulation”协议。目前,VS/TUN 的后端服务器主要运行 Linux 操作系统。在 VS/TUN 的集群系统中,负载调度器只将请求调度到不同的后端服务器,后端服务器将应答的数据直接返回给用户。这样,负载调度器就可以处理大量的请求,它甚至可以调 度百台以上的服务器(同等规模的服务器),而它不会成为系统的瓶颈。即使负载调度器只有 100Mbps的全双工网卡,整个系统的最大吞吐量可超过 1Gbps。所以,VS/TUN 可以极大地增加负载调度器调度的服务器数量。VS/TUN 调度器可以调度上百台服务器,而它本身不会成为系统的瓶颈,可以 用来构建高性能的超级服务器。

Realserver 192.168.122.33 desk33.example.com
Realserver 192.168.122.34 desk34.example.com
Load Balance 192.168.122.82 desk82.example.com

Virtual IP 192.168.122.122


desk82上进行:

#vi /etc/sysctl.conf
    net.ipv4.ip_forward = 1
#sysctl -p
加载 rule
#ipvsadm -C    #清除以前的 rules
#ipvsadm -A -t 192.168.122.122:80 -s rr
#ipvsadm -a -t 192.168.122.122:80 -r 192.168.122.33:80 -i
#ipvsadm -a -t 192.168.122.122:80 -r 192.168.122.34:80 -i
保存 rule
#service ipvsadm save
邦定 vip
ifconfig eth0:0 192.168.122.122 netmask 255.255.255.255 up

RealServer 设置
Default Gateway 指向 Director 的 LAN IP 即 192.168.122.82

#vi /etc/sysctl.conf
    net.ipv4.ip_forward = 1
    net.ipv4.conf.all.arp_ignore = 1
    net.ipv4.conf.all.arp_announce = 2
#sysctl -p
#ifconfig tunl0 192.168.122.122 netmask 255.255.255.255 up
#route add -host 192.168.122.122 dev tunl0
#echo `hostname` > /var/www/html/index.html
#service httpd start

测试
选择一台主机访问 http:// 192.168.122.122 反复刷新网页,每次出现的网页不同则表示成功。

LVS 常见问题:

1.LVS/DR 如何处理请求报文的,会修改 IP 包内容吗?


1.1vs/dr 本身不会关心 IP 层以上的信息,即使是端口号也是 tcp/ip 协议栈去判断是否正确,vs/dr 本 身主要做这么几个事:
1)接收 client 的请求,根据你设定的负载均衡算法选取一台 realserver的 ip;
2)以选取的这个 ip 对应的 mac 地址作为目标 mac,然后重新将 IP 包封装成帧转发给这台 RS;
3)在 hashtable 中记录连接信息。vs/dr 做的事情很少,也很简单,所以它的效率很高,不比硬件负载均衡设备差多少。
数据包、数据帧的大致流向是这样的:client --> VS --> RS --> client


2. RealServer 为什么要在 lo 接口上配置 VIP,在出口网卡上配置 VIP可以吗?
2.1 既然要让 RS 能够处理目标地址为 vip 的 IP 包,首先必须要让 RS能接收到这个包。在 lo 上配置 vip 能够完成接收包并将结果返回 client。
2.2 答案是不可以将 VIP 设置在出口网卡上,否则会响应客户端的 arprequest,造成 client/gateway/arp table 紊乱,以至于整个 loadbalance 都不能正常工作

3. RealServer 为什么要抑制 arp 帧?
这个问题在上一问题中已经作了说明,这里结合实施命令进一步阐述。我们在具体实施部署的时候都会 作如下调整:
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
我相信很多人都不会弄懂它们的作用是什么,只知道一定得有。我这里也不打算拿出来详细讨论,只是 作几点说明,就当是补充吧。
3.1
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
这两条是可以不用的,因为 arp 对逻辑接口没有意义。
3.2 如果你的 RS 的外部网络接口是 eth0,那么
echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
其实真正要执行的是:
echo "1">/proc/sys/net/ipv4/conf/eth0/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/eth0/arp_announce
所以我个人建议把上面两条也加到你的脚本里去,因为万一系统里上面两条默认的值不是 0,那有可能 是会出问题滴。


4. LVS/DR loadbalancer(director)与 RS 为什么要在同一网段中?
从第一个问题中大家应该明白 vs/dr 是如何将请求转发给 RS 的了吧?它是在数据链路层来实现的,所 以 director 必须和 RS 在同一网段里面。


5. 为什么 director 上 eth0 接口除了 VIP 另外还要配一个 ip(即DIP)?
5.1 如果是用了 keepalived 等工具做 HA 或者 LoadBalance,则在健康检查时需要用到 DIP
5.2 没有健康检查机制的 HA 或者 Load Balance 则没有存在的实际意义.


6. LVS/DRip_forward 需要开启吗?
不需要。因为 director 跟 realserver 是同一个网段,无需开启转发。

7. lvs/dr 里,director 的 vip 的 netmask 没必要设置为255.255.255.255, 也不需要去

route add -host $VIP dev eth0:0

director 的 vip 本来就是要像正常的 ip 地址一样对外通告的,不要搞得这么特殊.

如有问题欢迎指正!!!!!!!!!!!!!!


西安石油大学计算机学院

王兹银

mailofwzy@163.com