LVS是基于第4层来做负载均衡调度的,默认也是基于端口来做后端服务器的健康状态检测。
kernel 2.6.x 已内建LVS模组,kernel 2.4.x 需打补丁。rhel 5 预设安装即可使用LVS模组,另以yum 安装ipvsadm 套件。
Real Server:
VS/NAT 可使用任何平台的网络伺服器当 Real Server
VS/NAT:只有调度器需要VIP
在一组服务器前有一个调度器,它们是通过Switch/HUB相连接的。这些服务器提供相同的网络服
务、相同的内容,即不管请求被发送到哪一台服务器,执 行结果是一样的。服务的内容可以复制到
每台服务器的本地硬盘上,可以通过网络文件系统(如NFS)共享,也可以通过一个分布式文件系统
来提供。
VS/NAT 的优点是服务器可以运行任何支持TCP/IP的操作系统,它只需要一个IP地址配置在调度器
上,服务器组可以用私有的IP地址。缺点是它的伸缩能力有限, 当服务器结点数目升到20时,调度
器本身有可能成为系统的新瓶颈,因为在VS/NAT中请求和响应报文都需要通过负载调度器。
VS/TUN 需支持 IP Tunneling
VS/TUN:调度器和real server都需要VIP
它的连接调度和管理与VS/NAT中的一样,只是它的报文转发方法不同。调度器根据各个服务器的负
载情况,动态地选择一台服务器,将请求报文封装在另一个 IP报文中,再将封装后的IP报文转发给
选出的服务器;服务器收到报文后,先将报文解封获得原来目标地址为VIP的报文,服务器发现VIP
地址被配置在本 地的IP隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给
客户。
在VS/TUN 的集群系统中,负载调度器只将请求调度到不同的后端服务器,后端服务器将应
答的数据直接返回给用户。这样,负载调度器就可以处理大量的请求,它甚至可以调 度百台
以上的服务器(同等规模的服务器),而它不会成为系统的瓶颈。即使负载调度器只有
100Mbps的全双工网卡,整个系统的最大吞吐量可超过 1Gbps。所以,VS/TUN可以极大地增加负载调度器调度的服务器数量。VS/TUN调度器可以调度上百台服务器,而它本身不会成
为系统的瓶颈,可以 用来构建高性能的超级服务器。
VS/DR 需支持Non-ARP网络设备
下面做的是VS/DR 环境
VS/DR:调度器和real server都需要VIP
跟VS/TUN方法相同,VS/DR利用大多数Internet服务的非对称特点,负载调度器中只负责调度请求,
而服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量
调度器和服务器组都必须在物理上有一个网卡通过不分断的局域网相连,如通过交换机或者高速的
HUB相连。VIP地址为调度器和服务器组共享,调度器配置的 VIP地址是对外可见的,用于接收虚拟
服务的请求报文;所有的服务器把VIP地址配置在各自的NonARP
网络设备上,它对外面是不可见
的,只是用于处 理目标地址为VIP的网络请求。
在VS/DR中,调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为选出服务器的MAC地址,再将修改后的数据帧在与服务器组的局域网上发送。因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中解封可以获得该IP报文。当服务器发现报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。
在调读度器
yum install ipvsadm -y
加载rule
ll /etc/sysconfig/ipvsadm-config
ipvsadm -L (显示策略) 大写L和小写l是一样的
ipvsadm -C #清除以前的rules
ipvsadm -A -t 192.168.0.200:80 -s rr #-A 改选项用于添加虚拟服务,-s rr选择轮转调度,总共有八种调度算法
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.3:80 -g #-a 选项是作为添realserver服务器,-g表示直连
ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.4:80 -g #-g选择表示直连DR,-m表示的是NAT
此时ipvsad9 -l 显示你刚才的你填写的策略,策略写在内存里面,和iptables相似,默认在/etc/sysconfig/ipvsadm
保存rule
service ipvsadm save 将策略写进/etc/sysconfig/ipvsadm
邦定vip
ifconfig eth0:0 192.168.0.200 netmask 255.255.255.255 up #up是直接启动
RealServer设置(两台主机上)
vi /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1 下面这2条是屏蔽arp封包
net.ipv4.conf.all.arp_announce = 2
sysctl p
ifconfig lo:0 192.168.0.200 netmask 255.255.255.255(此处如果配置成 255.255.255.0,主机则会与外网断开,所以要配置成 255.255.255.255) up
route add -host 192.168.0.200 dev lo:0 #real server不添加好像也可以
yum install httpd -y
echo `hostname` > /var/www/html/index.html
service httpd start
测试
访问192.168.0.200反复刷新网页,每次出现的网页不同则表示成功。
此时如果将一台主机的httpd服务关掉,条度器还会给它分配任务,即在正常页面和无法打开的页面之间切换
在调度机上用 watch ipvsadm -l 可以看到客户端连接的次数
在real server上 netstat -antlp 可以看到客户端的tcp连接
如果访问时只能访问一台real server,则需手动设置arp:
arp -a 查看
arp -d 192.168.0.240 删除之前的arp缓存
arp -s 192.168.0.240 52:54:00:53:1f:c3
这样可以临时解决,但过一段时间又变了,和以前一样了。
lvs本身没有对后端real server 做健康检查的机制,所以使用时要么自己写脚本监控,要么使用其他工具。
做完之后,最好做下lvs的压力测试。可以思考下后续的优化。
查看client连接的条目:ipvsadm -Lcn
输出如下:
IPVS connection entries
pro expire state source virtual destination
TCP 01:53 FIN_WAIT 10.0.2.90:48406 10.0.2.250:80 10.0.2.201:80
TCP 01:54 FIN_WAIT 10.0.2.90:48408 10.0.2.250:80 10.0.2.201:80
TCP 01:53 FIN_WAIT 10.0.2.90:48407 10.0.2.250:80 10.0.2.202:80
TCP 01:54 FIN_WAIT 10.0.2.90:48409 10.0.2.250:80 10.0.2.202:80
TCP 01:52 FIN_WAIT 10.0.2.90:48404 10.0.2.250:80 10.0.2.201:80
TCP 01:53 FIN_WAIT 10.0.2.90:48405 10.0.2.250:80 10.0.2.202:80