LVS的工做机制以及其调度算法等一些初步了解在我以前的文章里面已有记录。请看这里php
LVS其工做机制相似iptabls,一部分工做在用户空间(ipvsadmin),一部分工做在内核空间;用户空间:用于定义一些负载均衡的对象与策略,例如对TCP协议的80端口进行持久链接的负载,又或者对TCP协议的3306端口的链接进行负载等一些符合我的需求的一些规则定义算法
内核空间:用于针对用户空间中所定义的规则对符合要求的数据包进行转发数据库
在整个负载均衡的架构中,全部的角色都使用了一个额外的IP地址---VIP,当一个客户端向VIP发起请求时,此请求必须直接链接至Directory,而不能是后端的realserver。不然的话此负载均衡的架构就毫无任何意义了。后端
所以,在客户端发出至VIP的链接请求后,只能由Directory将其MAC地址响应给客户端或网络中的路由设备。而Directory将会根据用户所定义的负载规则将该请求按照所定义的某种调度算法转发至后端的realserver了。bash
若是客户端在请求创建至VIP的链接时由后端的realserver响应了其请求,那么客户端会在其MAC地址表中创建起一个VIP与响应其请求的realserver的MAC的对应关系,用以之后的通讯,而此刻在客户端看来只有一个realserver而没法意识到其余服务器的存在,为了不这种状况的发生,结合实际状况解决方案有四:服务器
一、禁止RealServer响应对VIP的ARP请求;网络
二、在RealServer上隐藏VIP,以使得它们没法获知网络上的ARP请求;架构
三、基于“透明代理(Transparent Proxy)”或者“fwmark (firewall mark)”;负载均衡
四、禁止ARP请求发往RealServers;tcp
在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的配置
一、使用ipvsadm进行负载均衡的实现,早期须要从新编译内核,不过如今版本的redhat默认已经直接作进内核。
##查看内核是否已经支持ipvs
modprobe ip_vs
cat /proc/net/ip_vs
二、安装ipvsadm
yum install ipvsadm -y
并启动ipvsadm
service ipvsadm start
第一次启动会报一个No such file or directory的错误,由于lvs和iptables都是能够讲用户所配置的规则保存在一个文件中,当系统重启或者服务重启后都会重读这个规则文件,已达到规则永久有效的目的。因为是第一次启动并未定义规则,因此这个规则文件是不存在的,在服务启动时重读这个文件时就报错了。
三、启动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
(二)、RealServer端配置
在各个realserver端分别运行ipvsclient脚本,脚本内容以下:
- #!/bin/bash
- #
- # Script to start LVS DR real server.
- # description: LVS DR real server
- #
- . /etc/rc.d/init.d/functions
- VIP=172.23.136.150
- host=`/bin/hostname`
- case "$1" in
- start)
- # Start LVS-DR real server on this machine.
- /sbin/ifconfig lo down
- /sbin/ifconfig lo up
- 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
- /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
- /sbin/route add -host $VIP dev lo:0
- ;;
- stop)
- # Stop LVS-DR real server loopback device(s).
- /sbin/ifconfig lo:0 down
- echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
- echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
- echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
- echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
- ;;
- status)
- # Status of LVS-DR real server.
- islothere=`/sbin/ifconfig lo:0 | grep $VIP`
- isrothere=`netstat -rn | grep "lo:0" | grep $VIP`
- if [ ! "$islothere" -o ! "isrothere" ];then
- # Either the route or the lo:0 device
- # not found.
- echo "LVS-DR real server Stopped."
- else
- echo "LVS-DR real server Running."
- fi
- ;;
- *)
- # Invalid entry.
- echo "$0: Usage: $0 {start|status|stop}"
- exit 1
- ;;
- esac
(三)、测试
访问172.23.136.150,能够发现负载均衡已正常工做
如今我在后端两台realserver上都配置了phpmyadmin,而且两数据库的帐号密码均相同。如今访问172.23.136.150/phpmyadmin 你会发现一个颇有意思的现象就是始终没法登录上(在使用ipvsadm定义规则时没有定义权重)
所以Directory还须要基于“链接追踪”实现将同一个客户端的请求始终发往其第一次被分配到的realserver,ipvs会在本身的内部维护一个hash表,表中保存着不一样的客户端第一次请求时所分发的后端realserver,以及保存该条目的时间,当该段时间消耗完以后,链接还未断开,那么这段时间会自动延迟你所定义的持久链接时间。当下一个请求达到时,就会去这个表中对比,将请求分发给条目中所对应的realserver用来保证整个请求的完整性。
lvs的持久链接类型分如下几种:
1.pcc:持久客户端链接,在指定规则时,使用0端口表明全部的端口,即全部到达VIP的请求所有按照调度算法负载至后端的realserver
2.ppc:持久端口链接,明确指定请求VIP的哪一个端口的请求分发至后端的realserver
3.Netfilter marked packets:防火墙标记的持久链接,主要用于多端口协议间的关联,例如在电子商务网站上,在80端口挑选了商品后,当付款的时候就会跳转至443端口。
4.FTP持久链接,用于主动链接和被动链接,不多用到。
(一)、pcc
任何类型的持久链接均只须要在Directory上配置,realserver则不须要进行额外配置,由于这些只涉及到Directory的请求分发方法。
ipvsadm -C
ipvsadm -A -t 172.23.136.150:0 -p 360
ipvsadm -a -t 172.23.136.150:0 -r 172.23.136.148
ipvsadm -a -t 172.23.136.150:0 -r 172.23.136.149
在以前的配置基础上执行以上配置便可。
(二)、ppc
ipvsadm -C
ipvsadm -A -t 172.23.136.150:80 -p 360
ipvsadm -a -t 172.23.136.150:80 -r 172.23.136.148
ipvsadm -a -t 172.23.136.150:80 -r 172.23.136.149
(三)、持久防火墙标记
持久防火墙标记须要结合iptables来使用
iptables -t mangle -A PREROUTING -i eth0 -p tcp -d 172.23.136.150 -m multiport --dport 80,443 -j MARK --set-mark 1
###把来自eth0全部目的地址为172.23.136.150的80和443端口的请求绑定在一块儿,标签为1
ipvsadm -C
ipvsadm -A -f 1 -p 360
ipvsadm -a -f 1 -r 172.23.136.148
ipvsadm -a -f 1 -r 172.23.136.149
(四)、FTP持久链接
首先要了解FTP的工做模式:21控制端口 20数据端口
被动链接 是随机从1024---65000内选出一个 做为回应端口号,因此咱们要限制被动链接回应端口的范围。
编辑你所用的FTP软件,vsftpd或者pure-ftpd,设置其端口范围结合iptables打标签
iptables -t mangle -A PREROUTING -i eth0 -p tcp -d 192.168.2.100 --dport 21 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth0 -p tcp -d 192.168.2.100 --dport 10000:12000 -j MARK --set-mark 1
ipvsadm -C
ipvsadm -A -f 1 -p 360
ipvsadm -a -f 1 -r 172.23.136.148
ipvsadm -a -f 1 -r 172.23.136.149
小结:
访问172.23.136.150/phpmyadmin,如今已经能够正常登陆进去,由于这次的链接被持久分发到后端的同一台realserver上。整个请求是完整的。
查看其链接分配状态,能够发现同一个客户端的请求都被定向至后端的同一个realserver。
ipvsadm -lcn
IPVS connection entries
pro expire state source virtual destination
TCP 01:55 FIN_WAIT 172.23.136.93:56944 172.23.136.150:80 172.23.136.149:80
TCP 01:56 FIN_WAIT 172.23.136.93:56947 172.23.136.150:80 172.23.136.149:80
TCP 01:39 FIN_WAIT 172.23.136.93:56928 172.23.136.150:80 172.23.136.149:80
TCP 01:56 FIN_WAIT 172.23.136.93:56946 172.23.136.150:80 172.23.136.149:80
TCP 01:39 FIN_WAIT 172.23.136.93:56930 172.23.136.150:80 172.23.136.149:80
TCP 01:55 FIN_WAIT 172.23.136.93:56943 172.23.136.150:80 172.23.136.149:80
TCP 01:55 FIN_WAIT 172.23.136.93:56945 172.23.136.150:80 172.23.136.149:80
TCP 01:47 FIN_WAIT 172.23.136.93:56933 172.23.136.150:80 172.23.136.149:80
TCP 01:39 FIN_WAIT 172.23.136.93:56931 172.23.136.150:80 172.23.136.149:80
TCP 14:57 ESTABLISHED 172.23.136.93:56948 172.23.136.150:80 172.23.136.149:80
TCP 05:50 NONE 172.23.136.93:0 172.23.136.150:80 172.23.136.149:80
TCP 01:39 FIN_WAIT 172.23.136.93:56932 172.23.136.150:80 172.23.136.149:80
本文出自 “My---Dream.*” 博客,请务必保留此出处http://grass51.blog.51cto.com/4356355/1109825