LVS其工作机制类似iptabls,一部分工作在用户空间(ipvsadmin),一部分工作在内核空间;用户空间:用于定义一些负载均衡的对象与策略,例如对TCP协议的80端口进行持久连接的负载,又或者对TCP协议的3306端口的连接进行负载等一些符合个人需求的一些规则定义
内核空间:用于针对用户空间中所定义的规则对符合要求的数据包进行转发
在整个负载均衡的架构中,所有的角色都使用了一个额外的IP地址---VIP,当一个客户端向VIP发起请求时,此请求必须直接连接至Directory,而不能是后端的realserver。否则的话此负载均衡的架构就毫无任何意义了。
因此,在客户端发出至VIP的连接请求后,只能由Directory将其MAC地址响应给客户端或网络中的路由设备。而Directory将会根据用户所定义的负载规则将该请求按照所定义的某种调度算法转发至后端的realserver了。
如果客户端在请求建立至VIP的连接时由后端的realserver响应了其请求,那么客户端会在其MAC地址表中建立起一个VIP与响应其请求的realserver的MAC的对应关系,用以以后的通信,而此刻在客户端看来只有一个realserver而无法意识到其他服务器的存在,为了避免这种情况的发生,结合实际情况解决方案有四:
1、禁止RealServer响应对VIP的ARP请求;
2、在RealServer上隐藏VIP,以使得它们无法获知网络上的ARP请求;
3、基于“透明代理(Transparent Proxy)”或者“fwmark (firewall mark)”;
4、禁止ARP请求发往RealServers;
在Linux内核2.4.26以后引入了两个新的调整ARP栈的标志:
arp_announce:当向别人通告自己的MAC时所采取的限制级别
arp_ignore:在响应别人的ARP广播请求时,所使用的不同的模型
arp_announce类型:
0--default,使用本地的任何地址,向外通告
1--当本机具有多个IP地址时,试图向同一网段的通告
2--一定使用同一网段的IP进行通告
arp_ignore类型:
0--default,无论是本机的IP地址,就会用任意接口进行响应
1--只响应直接请求的网卡的地址是目标地址
初步了解了以上,就可以动手LVS-DR模型的搭建了:
环境介绍:
系统:RHEL5
DIP:172.23.136.139
RS1:172.23.136.149
RS2:172.23.136.148
VIP:172.23.136.150
(一)、Directory的配置
1、使用ipvsadm进行负载均衡的实现,早期需要重新编译内核,不过现在版本的RedHat默认已经直接做进内核。
##查看内核是否已经支持ipvs
modprobe ip_vs
cat /proc/net/ip_vs
2、安装ipvsadm
yum install ipvsadm -y
并启动ipvsadm
service ipvsadm start
第一次启动会报一个No such file or directory的错误,因为lvs和iptables都是可以讲用户所配置的规则保存在一个文件中,当系统重启或者服务重启后都会重读这个规则文件,已达到规则永久有效的目的。由于是第一次启动并未定义规则,所以这个规则文件是不存在的,在服务启动时重读这个文件时就报错了。
3、启动ipvs脚本:
service ipvs start
#!/bin/bash # # LVS script for VS/DR # . /etc/rc.d/init.d/functions # VIP=172.23.136.150 RIP1=172.23.136.149 RIP2=172.23.136.148 PORT=80 # case "$1" in start) /sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev eth0:1 # Since this is the Director we must be able to forward packets echo 1 > /proc/sys/net/ipv4/ip_forward # Clear all iptables rules. /sbin/iptables -F # Reset iptables counters. /sbin/iptables -Z # Clear all ipvsadm rules/services. /sbin/ipvsadm -C # Add an IP virtual service for VIP 172.23.136.150 port 80 # In this recipe, we will use the round-robin scheduling method. # In production, however, you should use a weighted, dynamic scheduling method. /sbin/ipvsadm -A -t $VIP:80 -s wlc # Now direct packets for this VIP to # the real server IP (RIP) inside the cluster /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1 /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 2 /bin/touch /var/lock/subsys/ipvsadm &> /dev/null ;; stop) # Stop forwarding packets echo 0 > /proc/sys/net/ipv4/ip_forward # Reset ipvsadm /sbin/ipvsadm -C # Bring down the VIP interface /sbin/ifconfig eth0:1 down /sbin/route del $VIP /bin/rm -f /var/lock/subsys/ipvsadm echo "ipvs is stopped..." ;; status) if [ ! -e /var/lock/subsys/ipvsadm ]; then echo "ipvsadm is stopped ..." else echo "ipvs is running ..." ipvsadm -L -n fi ;; *) echo "Usage: $0 {start|stop|status}" ;; esac