目录
前言
1 、 LVS 环境组网
2 、 ipvsadm 安装前准备
3 、 httpd 与 ipvsadm 下载
4 、 LVS 负载均衡配置
5 、真实 WEB 服务器配置及 arp 抑制
6 、 LVS 负载均衡测试
7 、附: arp 抑制参数
前言
本文主要讲解 centos5.x LVS DR 模式,环境搭建,理论知识请参考 LVS 中文官网
http://www.linuxvirtualserver.org/zh/index.html
该页面可能显示乱码,如果有乱码,在 IE 上右键勾上状态栏,然后在页面栏下拉选项中选择编码,有( GB2312 和 UTF-8 ),如果 UTF-8 显示乱码,则选 GB2312 。如果 GB2312 显示乱码,则选
1 、 LVS 环境组网
由于是使用的 VM 环境,自己 PC 当作客户机(即公网地址),调度器与服务器都是 VM 中虚拟机,所以客户和所有服务器之间都是物理直接相连网络 , 逻辑拓扑图如下:
2 、 ipvsadm 安装前准备
外部 IP 地址 | 内部 IP 地址 | 角色 |
10.0.0.30/24 | 192.168.1.1/24 | 调度器(虚拟机) |
10.0.0.237/24 | 192.168.1.2/24 | (虚拟机) |
10.0.0.238/24 | 192.168.1.3/24 | (虚拟机) |
10.0.0.130/24 | 无 | 客户机(自己电脑) |
注:实际应用中 RS1 RS2 没有外部地址,当前环境中,没有物理双网卡环境,都采用一个网卡配置多个 IP 地址。
3 、 httpd 与 ipvsadm 下载
)在各服务器上修改主机名:
hostname LVS1
hostname RS1
hostname RS2
)在 RS1 RS2 上安装 httpd 服务
yum installhttpd –y
/etc/init.d/httpd start
ps -ef|grephttpd
yum installhttpd –y
/etc/init.d/httpdstart
ps -ef|grephttpd <== 查看 httpd 服务是否起来
cat/etc/httpd/conf/httpd.conf|grep DocumentRoot <== 查找系统站点目录路径
# DocumentRoot: The directoryout of which you will serve your
DocumentRoot"/var/www/html"
# This should be changed towhatever you set DocumentRoot to.
# DocumentRoot/www/docs/dummy-host.example.com
[root@RS1 ~]# echo"RS1" >/var/www/html/index.html
[root@RS2 src]# echo"RS2" >/var/www/html/index.html
服务测试:
测试成功!
)下载
wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
我所使用的源包下载目录
我的 LVS 环境:
cat/etc/redhat-release
CentOS release 5.8 (Final)
uname -rm
2.6.18
对内核有要求,要求内核版本在 2.6.28 及以后的版本,如果符合了系统环境,还要安装依赖包 yum install libnl*popt* -y 。
我的内核版本不满足,使用 ipvsadm-1.24 。
tar -zxfipvsadm-1.24.tar.gz
[root@LVS1 src]# ln -s /usr/src/kernels/2.6.18-348.12.1.el5-x86_64/usr/src/linux<== 编译有使用的路径为 /usr/src/linux ,可在 Makefile 中查看,如果不做链接,会编译失败
ll /usr/src/
total 16
drwxr-xr-x 2 root root 4096 May11 2011 debug
drwxr-xr-x 3 root root 4096Aug 5 03:53 kernels
lrwxrwxrwx1 root root 43 Aug 5 03:56 linux ->/usr/src/kernels/2.6.18-348.12.1.el5-x86_64 <== 要使用 ll /usr/src/ 查看,如果软链接一闪一闪的,代表链接失败
cd ipvsadm-1.24
make&&make install <== 如果编译失败,请按上面步骤一步一步排错。
lsmod |grepip_vs <== 查看内核模块是否有 ipvsadm
ipvsadm
IP Virtual Server version 1.2.1(size=4096)
Prot LocalAddress:PortScheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
# 还有一种加载 ipvsadm 方法,用 modprobe ip_vs
lsmod |grepip_vs <== 查看内核模块,有代表 ipvsadm加载进内核当中,此时 LVS 安装完毕
ip_vs 122113 0
4 、 LVS 负载均衡配置
)配置 VIP 和
配置参考步骤 2 安装准备
ifconfig eth010.0.0.30 netmask 255.255.255.0 #VIP
ifconfigeth0:1 192.168.1.1 netmask 255.255.255.0 #DIP
)添加真实服务器
ipvsadm –C <== 手工清空原来表内容
ipvsadm --set30 5 60 <== 设置连接超时值
ipvsadm -A -t10.0.0.30:80 -s wrr -p 20 <== -A 添加地址, -t 指定 VIP TCP 端口, -s 指定调度算法 –p 会话保持时间
<== 查看表内容,添加了一组 VIP 地址和端口
IP Virtual Server version 1.2.1(size=4096)
Prot LocalAddress:PortScheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.30:80 wrr persistent 20
ipvsadm -a -t10.0.0.30:80 -r 192.168.1.2:80 -g -w 1 <== -a 指定真实服务器, -t lvs 上 VIP , -r 真实服务器 ip 及端口, -w 权重值 , -g 先择 DR 模式( -m 为 NAT 模式)
ipvsadm -a -t10.0.0.30:80 -r 192.168.1.3:80 -g -w 1
ipvsadm -L –n <== 查看表内容,添加了两台负载转发的真实服务器
IP Virtual Server version 1.2.1(size=4096)
Prot LocalAddress:PortScheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.30:80 wrr persistent 20
-> 192.168.1.2:80 Route 1 0 0
-> 192.168.1.3:80 Route 1 0 0
如果添加服务器地址写错了,可用如下命令删除,即大 A 添加改为大 D 删除,小 a添加改为小 d 删除
ipvsadm –D –t10.0.0.30:80 –s wrr
ipvsadm –d –t10.0.0.30:80 –r 192.168.1.2:80
5 、真实 WEB 服务器配置及 arp 抑制
<== 此地址用来自己电脑用 CRT 软件登陆设备,同时也用来发送 arp 请求客户机 MAC (因为是直接返回页面给客户机,而当前网络是同一物理网段,必须同网段才正常)。
inet addr:10.0.0.237 Bcast:10.0.0.255 Mask:255.255.255.0
<== 配置内部 IP地址
<== 每台真实服务器都需要配置 VIP
为什么要绑定 VIP 呢? 因为 DR 模式原理是 LVS 调度器修改 mac 地址为真实服务器地址,报文的目的 IP 还是 VIP 没修改,,网卡只会把目的 MAC 和目的 IP 都是自己的报文上送 CPU ,所以真实服务器上必须配置 VIP!
为什么使用 lo 口呢? 因为 lo 口为本地环回口,防止本地局域网 IP 地址冲突 !
<== 此地址用来自己电脑用 CRT 软件登陆设备,同时也用来发送 arp 请求客户机 MAC (因为是直接返回页面给客户机,而当前网络是同一物理网段,必须同网段才正常)。
inet addr:10.0.0.238 Bcast:10.0.0.255 Mask:255.255.255.0
<== 配置内部 IP 地址
[root@RS2 src]# ifconfig lo10.0.0.30 netmask 255.255.255.255
此时配置完成,只是测试时出现一个问题,再次登陆 CRT 中 10.0.0.30 地址时,登陆到 RS1 上去了,再刷新,登陆到 RS2 上去了。怎么解决呢?
通过分析,得出,访问 10.0.0.30 时,会发送 arp 请求 10.0.0.30 的 mac, 而这个网络中有 3 个 10.0.0.30 地址,此时,那谁给的 arp 回应到客户机,访问的就是谁了。如果 RS1 的 arp 回应先到,就访问的 RS1 了
解决方法:
抑制 ARP 响应
[root@RS1 ~]# echo"1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS1 ~]# echo"2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@RS1 ~]# echo"1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS1 ~]# echo"2" >/proc/sys/net/ipv4/conf/all/arp_announce
[root@RS2 src]# echo"1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS2 src]# echo"2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@RS2 src]# echo"1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS2 src]# echo"2" >/proc/sys/net/ipv4/conf/all/arp_announce
都代表什么内容,可在最后附录中查看,也可自己网上搜索
6 、 LVS 负载均衡测试
显示的值是 RS1, 则此时该链接是分配到 192.168.1.2 上
我们使用的是 wrr 调度算法,该算法中,谁的权重值高,会优先分配给谁
查看配置,发现权重值一样
ipvsadm -L -n
IP Virtual Server version 1.2.1(size=4096)
Prot LocalAddress:PortScheduler Flags
Weight
TCP 10.0.0.30:80 wrr persistent 20
1
1
由于有会话保持功能,接下来修改权重值
删除原来配置
重新配置权重值为
[root@LVS1 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1(size=4096)
Prot LocalAddress:PortScheduler Flags
Weight
TCP 10.0.0.30:80 wrr persistent 20
2
1
再次进行测试:
7 、附: arp 抑制参数
arp 响应限制
)
定义对目标地址为本地 IP 的 ARP 询问不同的应答模式
默认值 ): 回应任何网络接口上对任何本地 IP 地址的 arp 查询请求
1 - 只回答目标地址是来访网络接口本地地址的 ARP 查询请求
只回答目标 IP 地址是来访网络接口本地地址的 ARP 查询请求 , 且来访 IP 必须在该网络接口的子网段内
不回应该网络界面的 arp 请求,而只对设置的唯一和连接地址做出回应
保留未使用
不回应所有(本地地址)的 arp 查询
)
对网络接口上,本地 IP 地址的发出的, ARP 回应,作出相应级别的限制 : 确定不同程度的限制 , 宣布对来自本地源 IP 地址发出 Arp 请求的接口
默认 ) 在任意网络接口( eth0,eth1 , lo )上的任何本地地址
尽量避免不在该网络接口子网段的本地地址做出 arp 回应 . 当发起 ARP 请求的源IP 地址是被设置应该经由路由达到此网络接口的时候很有用 . 此时会检查来访 IP 是否为所有接口上的子网段内 ip 之一 . 如果改来访 IP 不属于各个网络接口上的子网段内 ,那么将采用级别 2 的方式来进行处理
对查询目标使用最适当的本地地址 . 在此模式下将忽略这个 IP 数据包的源地址并尝试选择与能与该地址通信的本地地址 . 首要是选择所有的网络接口的子网中外出访问子网中包含该目标 IP 地址的本地地址 . 如果没有合适的地址被发现 , 将选择当前的发送网络接口或其他的有可能接受到该 ARP 回应的网络接口来进行发送