2011年(65)
分类: LINUX
2011-09-15 10:50:10
------------------------------------------------------------------------- LVS是一个开源的软件,由毕业于国防科技大学的章文嵩博士于1998年5月创立,可以实现LINUX平台下的简单负载均衡。LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器。
关于lvs的十种调度方法和三种工作模式的理论知识在此前的博客里已经详细介绍过了,在此就不做过多说明了。
LVS的工作模式有三种,LVS-NAT,LVS-DR,LVS-TUN,我们今天主要来以案例的方式介绍前两种的具体实现。
-------------------------------------------------------------------------
我们再来介绍一下ipvs和ipvsadm:
-------------------------------------------------------------------------
要想实现LVS,ipvs和ipvsadm是基础。
ipvs称之为IP虚拟服务器(IP Virtual Server,简写为IPVS)。
ipvs主要安装在Director上,用于把对 VIP的请求转发给real server的RIP。它工作在内核中,是一段内核代码。2.4.23之后的内核都已经写入了ipvs,我们实验用的内核是2.5.4版本的,所以我们就只需要安装ipvsadm就可以了,ipvsadm工作在用户空间,用于定义规则,ipvs用于实现规则。
ipvsadm命令的使用:
1.定义集群服务
使用的命令
ipvsadm -A|-E -t|-u VIP:port -s scheduler(-s指定调度算法,默认是wlc)
ipvsadm -D -t|-u VIP:port
-A 在内核的虚拟服务器表中添加一条新的虚拟服务器记录
-E 编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D 删除内核虚拟服务器表中的一条虚拟服务器记录。
-L 实现查看
-t|-u 代表tcp和udp服务
2.有关realserver的规则定义方法
ipvsadm -a|e -t|u VIP:port -r REALSERVER -g|-i|-m [-w weight]
ipvsadm -d -t|-u VIP:port -r REALSERVER
-a 在内核虚拟服务器表的一条记录里添加一条新的真实服务器
-e 编辑一条虚拟服务器记录中的某条真实服务器记录
-d删除一条虚拟服务器记录中的某条真实服务器记录
-r 真实的服务器
-g 指定LVS 的工作模式为直接路由模式(gatewaying)
-i 指定LVS 的工作模式为隧道模式(ipip)
-m 指定LVS 的工作模式为NAT 模式(masquerading)
-z 清空计数器
-n 数字的方式来显示地址
--stats
--rate
3.查看
-Ln
ipvsadm的设置是临时的,可以使用service ipvsadm save
----------------------------------------------------------------------------------
好了,下面我们正式介绍LVS-NAT的实现:
---------------------------------------------------------------------------------
创建LVS-NET Web Cluster模型的具体步骤:
1.准备工作:
准备三台干净的虚拟机,具体规划如下图所示
将real server1和real server2的网卡都设为vm2
将Director的192.168.10.1所在网卡设为vm2,另一张设为bridge桥接。
2.在real server1和real server2上配置并启动apache服务:
real server1上的配置:
hostname server1
yum -y install httpd
vim /var/www/html/index.html
hello server1
:wq
service httpd start
ifconfig eth0 192.168.10.3
real server2的配置:
同real server1,只需要把server1改为server2,192.168.0.3改为192.168.0.2即可。
3.在real server1和real server2上设置默认路由:
route add default gw 192.168.10.1
route -n
4.在Director上安装LVS 软件
Director 两块网卡
ifconfig eth0 192.168.10.1
ifconfig eth1 192.168.0.10
echo 1>/proc/sys/net/ipv4/ip_forward
elinks --dump
elinks --dump (测试director是否能连上server1和server2)
grep -i ip_vs /boot/config-2.6.18-164.el5(查看内核中有关ip_vs的信息)
yum -y install ipvsadm
(ipvsadm在Cluster里,所以必须把Cluster做成yum源才可以使用yum安装)
ipvsadm -Lcn
5.在Director上配置ipvsadm
ipvsadm -A -t 192.168.0.10:80 -s rr
ipvsadm -Ln
ipvsadm -a -t 192.168.0.10:80 -r 192.168.10.2 -m -w 2
ipvsadm -a -t 192.168.0.10:80 -r 192.168.10.3 -m -w 5(-m -w 5表示把权重设为5)
6.测试
通过IE浏览器访问来进行测试,多刷新几次。看看有没有实现负载均衡。
提示:我们还可以更改成别的算法进行测试,使用命令ipvsadm -E -t 192.168.0.83:80 -s wrr,即可改为wrr算法。
-------------------------------------------------------------------------
接着我们来介绍LVS-DR的具体实现:
-------------------------------------------------------------------------
首先介绍一下LVS-DR的工作流程:
1. 数据包在节点间传输靠的是MAC,通过ARP的广播解析IP到MAC;此种模型
中Director仍有VIP、DIP;Real server有VIP、RIP;
2. Director及real server 都连接到一个Switch上;
3. Director及real server 都配置的有VIP;
4. 相同的IP,为防止冲突,在 real server 上采取手段隐藏起VIP地址,使其对
请求VIP地址解析的ARP请求不作响应,这样解析到的VIP地址即为Director,
数据包线传输到Director;
5. Director 接收到数据包后,根据算法找到某个real server(假设
是realserver1) ,并且修改数据包中的目的MAC地址为该real server
的Mac,然后通过Switch转发该数据包;此时,该数据包的源ip仍未CIP,
目标ip为real server1 的VIP;
6. real server接收到数据包后(包中的VIP、目的MAC均匹配自己),处理该包,
返回的数据直接通过Switch出去并过Router传回Client。
在real server上隐藏VIP:
需要用到两个内核参数,arp_announce和arp_ignore
arp_announce 在某个网卡上向外通知自己的mac和ip对应的关系时的限制级别,
即别人来请求时我用哪个地址进行响应。
0 默认 全部响应
1 尽可能的避免使用另外的接口的地址响应客户端的请求
2 只使用可以匹配到客户端的最佳地址响应
arp_ignore 当收到别人的请求我给于响应时的响应类型 ,即我对哪些请求给
于响应,哪些不给于响应。
0 默认 全部响应
1 从接受请求的接口响应,即如果请求解析的网卡不是接受请求的网卡则不给于响应。
所以我们可以在real server上把vip配置在lo回环网卡上,然后令arp_announce=2,arp_ignore=1因为直接连接的应该是eth0网卡,而不是lo网卡,所以即可实现隐藏VIP。
注意:因为当real server1直接将请求的数据发给client时是从eth0出去的,所以系统会默认把eth0的ip作为源ip,而我们需要无论如何将VIP作为源ip,此时我们只需要添加一条主机路由即可。
LVS-DR的具体实现:
规划:
准备三台干净的虚拟机,把网卡都设成bridge模式,vip必须是公网地址,rip可以不是,我们现在把vip,rip,dip三个ip都设置在一个网段。
real server1:rip 192.168.0.20 vip 192.168.0.100
real server2:rip 192.168.0.30 vip 192.168.0.100
Director:dip 192.168.0.40 vip 192.168.0.100
配置:
real server1:
ifconfig eth0 192.168.0.20/24
route -n 不需要指网关
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 2> /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:0 192.168.0.100 broadcast 192.168.0.100 netmask 255.255.255.255 up
ifconfig
route add -host 192.168.0.100 dev lo:0(限定源地址)
real server2:
ifconfig eth0 192.168.0.30/24
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 2> /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:0 192.168.0.100 broadcast 192.168.0.100 netmask 255.255.255.255 up
ifconfig
route add -host 192.168.0.100 dev lo:0(限定源地址)
Director:
ifconfig eth0 192.168.0.40/24
ifconfig
ifconfig eth0:0 192.168.0.100 broadcast 192.168.0.100 netmask 255.255.255.255 up
route add -host 192.168.0.100 dev eth0:0
sysctl -p
ipvsadm -L -n
ipvsadm -C(清空ipvsadm的设置)
ipvsadm -A -t 192.168.0.100:80 -s wlc
ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.20 -g -w5
ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.30 -g -w8
ipvsadm -L -n
在real server1和real server2上安装apache服务:
yum install httpd
vim /var/www/html/index.html
real server1,hello
:wq
service httpd start
然后就可以在浏览器里输入来测试了。
------------------------------------------------------------------------
ok,到此就完成了。