1、集群概念 2、LVS工作模型 3、ipvsadm用法 4、LVS-DR模型 5、LVS-NAT模型 6、防火墙标记 7、session绑定 8、ARP问题 9、LVS配置官方示例 ================================================================================================================================================ 集群概念 1、计算机集群 计算机集群简称集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作。 在某种意义上,他们可以被看作是一台计算机。集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的 可能连接方式。集群计算机通常用来改进单个计算机的计算速度和/或可靠性。一般情况下集群计算机比单个计算机,比如工作 站或超级计算机性能价格比要高得多。 2、计算机集群按组织结构可分为: 负载均衡集群(Load balancing (LB) clusters) 高可用性集群(High-availability (HA) clusters) 高性能计算集群(High-performance (HPC) clusters) LB:负载均衡集群运行时,一般通过一个或者多个前端负载均衡器,将工作负载分发到后端的一组服务器上,从而达到整个系统的 高性能和高可用性。这样的计算机集群有时也被称为服务器群(Server Farm)。一般高可用性集群和负载均衡集群会使用类 似的技术,或同时具有高可用性与负载均衡的特点。 HA:一般是指当集群中有某个节点失效的情况下,其上的任务会自动转移到其他正常的节点上。还指可以将集群中的某节点进行离线 维护再上线,该过程并不影响整个集群的运行。 3、负载均衡集群的实现(LB) 硬件 F5 BIG-IP Citrix NetScaler A10 Array Redware 软件,基于工作协议层次划分:传输层:lvs;应用层:HArproxy、nginx、ats、perlbal lvs 由于直接工作在内核,所以有非常强的并发能力。 haproxy nginx ats perlbal Perl编写 4、分布式系统 Hadoop spark ================================================================================================================================================ LVS工作模型 1、LVS(Linux Virtual Server) 一组服务器通过高速的局域网或者地理分布的广域网相互连接,在它们的前端有一个负载调度器(Load Balancer)。负载调度器能无缝 地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户是透明的,客户访问集群系统提供的网络服务就像访 问一台高性 能、高可用的服务器一样。系统的伸缩性通过在服务机群中透明地加入和删除一个节点来达到,通过检测节点或服务进程故障和正确地 重置系统达到高可用性。由于我们的负载调度技术是在Linux内核中实现的,我们称之为Linux虚拟服务器(Linux Virtual Server)。 LVS实现了使用集群技术和Linux操作系统实现一个高性能、高可用的服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability) 和可管理性(Manageability)。 LVS是在内核中实现的一个功能,工作于[传输层]。LVS根据请求报文的目标IP和PORT根据挑选算法将其转发至后端主机集群中的某一个主机。 在LVS框架中,提供了含有三种IP负载均衡技术的IP虚拟服务器软件分别是IPVS、Layer-7、KTCPVS。 实现IP负载均衡的软件IPVS实现了三种技术: 1、Virtual Server via Network Address Translation(VS/NAT) 通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过 调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。 2、Virtual Server via Direct Routing(VS/DR) VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术一样,VS/DR技术可极大地 提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器 都有一块网卡连在同一物理网段上。 3、Virtual Server via IP Tunneling(VS/TUN) 采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个 问题,调度器把请求报文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网 络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。 2、ipvsadm/ipvs 工作在用户的控件的工具的ipvsadm,用于管理集群服务,而在内核空间的是ipvs。工作于内核空间netfilter的INPUT钩子上的框架 1、VS/NAT 实现原理: 地址转换模型,前端负载均衡器接受到客户端请求报文,将报文中的目标IP修改为真实服务器IP并转交给真实服务器。真实服务器将通过指向前端 均衡器的网关将报文响应给前端负载均衡器,前端负载均衡器再将源IP修改后发送给客户端。真实服务器应使用私有网络地址,且网关要指向负载 均衡服务器;真实服务器IP和负载均衡服务器IP必须在同一个网段,请求和响应报文都要经由负载均衡服务器转发;支持端口映射。 2、VS/DR 实现原理: Director:VIP、DIP RS:RIP、VIP 负载均衡调度器和真实服务器需要在同一个物理网络中,即需要可以通过广播找到MAC地址。前端路由器将目标IP为负载均衡器的报文发送给Director。 RS的RIP可以使用私有网络地址,也可以使用公网IP地址。不支持端口映射。负载均衡器接受到外部请求后,通过ARP协议解析MAC地址进行封装然后转 交给真实服务器。真实服务器收到报文后,拆除MAC帧,直接响应客户端。 3、VS/TUN 不修改请求报文的的IP首部,而是通过原有IP首部之外,再次封装一个IP,然后转交给真实服务器。真实服务器处理后直接响应客户端。可以跨互联网, 通过路由。全部主机必须有公网地址。在原IP报文之前再封装一个IP首部,源IP的DIP,目标IP是RIP。 DIP、VIP、RIP可以是公网地址也可以的私有地址;不支持端口映射 4、VS/Full-NAT 负载均衡服务器接收到客户端的请求报文后,修改报文中的源IP和目标IP;真实服务器将报文返回负载均衡服务器再将报文中的源IP和目的IP修改,最后 发给发出请求的客户端。 3、session保持 由于http是stateless(无状态)的连接协议,所以对与负载均衡网络来说,不能任意分发内容给客户端。要解决这个问题的方案有: 1、session保持 (session sticky) 将来自同一个用户的请求不作负载均衡,始终定向到同一台真实服务器。负载均衡器需要识别session信息,并将同一请求调度到真实服务器。 调度器根据源IP地址分析进而调度到同一台真实服务器。 2、session集群 session保持有一个严重的问题就是如果真实服务器当中某一台宕机,则session信息将会随机丢失。session集群将session内容分别复制到后端 的真实服务器内,保证session的统一,这样客户端即便被重新调度,session内容也不变。 3、session服务器 专门设立一台session服务器,将session存储到专用的一台服务器。Mencached、Redis 4、lvs调度算法(IPVS scheduler) 调度算法分为静态方法和动态方法: 静态方法,仅仅根据算法本身进行调度,不受其他因素干扰 RR 轮叫调度(Round-Robin Scheduling) 以轮叫的方式依次调度到不同的服务器,每一台服务器接受的调度力度是相同的。这种调度算法假设每台真实服务器的性能都相同,都能 够承受相同的连接数。但性能相差较大的服务器,不适应此种调度算法。另外,当请求时间跨度较大时,会造成负载不均衡的问题。 无需记录当前所有连接的状态,所以它是一种无状态调度。 WR 加权轮叫调度(Weighted Round-Robin Scheduling) 在轮叫调度的基础上,引入另外一种机制,当某台真实服务器的权值为0时,表示不给此真实服务器调度请求,以便于对服务器进行 维护和更换。{引入权值的概念,可以根据权值调度到后端服务器} i = (i + 1) mod n SH 源地址散列调度(Source Hashing Scheduling) 与目标地址散列调度相反。实现session保持的机制来自同一IP的请求将始终调度到同一台服务器。根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器。适应于缓存场景中的负载均衡。 DH 目标地址散列调度(Destination Hashing Scheduling) 根据目标IP地址的负载均衡,通过一个hash函数将请求的目标IP调度到服务器上。 动态方法,根据算法及各个真实服务器的真实负载状况进行调度 LC 最小连接调度(Least-Connection Scheduling) 算法会把请求调度到当前连接数最少的真实服务器上去。 WLC 加权最小连接调度(Weighted Least-Connection Scheduling) 每台真实服务器都设置有权值,默认为1。在调度新连接时,调度器会尽可能的将已建立的连接数与权值成比例。 LBLC 基于局部性的最少链接(Locality-Based Least Connections Scheduling) 算法是针对请求报文的目标IP地址的负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群中客户请求报文的目标IP地址是变化的。 这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的请求调度到同一台服 务器,来提高各台服务器的访问局部性和主存Cache命中率,从而整个集群系统的处理能力。 LBLCR 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling) 动态DH算法。根据负载情况进行调度 LBLCR算法先根据请求的目标IP地址找出该目标IP地址对应的服务器组;按“最小连接”原则从 该服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载; 则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发 送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删 除,以降低复制的程度。 SED 最短预期延时调度(Shortest Expected Delay Scheduling) 初始连接高权重优先 NQ 不排队调度(Never Queue Scheduling) SED的优化方案,第一个均匀分配,后期使用SED算法 ================================================================================================================================================ ipvsadm用法 一个ipvs主机可以定义多个集群服务,一个集群服务上至少应有一个RS。查看内核是否支持ipvs:/sbin/modprobe -l | grep ipvs 1、管理集群服务 1、ipvsadm -A|E -t|u|f service-address [-s scheduler] -A 添加 -E 编辑 -D, --delete-service 删除一个集群服务 -t|u|f 指定集群协议类型 service-address -t ip:port -u ip:port -f mark -s 指定调度算法 默认是WLC {rr、wrr、lc、wlc、lblc、lblcr、dh、sh、sed、nq} 2、ipvsadm -D -t|u|f service-address 2、管理集群服务中的RS 1、ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] -a, --add-server -e, --edit-server -t, --tcp-service service-address -u, --udp-service service-address -f, --fwmark-service integer -d, --delete-server -L, -l, --list -Z, --zero -u, --udp-service service-address server-address ip:port [-g|i|m] --> lvs-type -g gatway dr模型,默认类型 -i ipip ip模型 -m nat模型 [-w weight] 权重 2、ipvsadm -d -t|u|f service-address -r server-address # 删除RS 3、查看和清理 ipvsadm -C ipvsadm -L|l [options] option: -n:基于数字显示地址和端口 -c:显示当前ipvs建立的连接 --stats:显示统计数据 --rate:速率 --exact:显示精确值,不作单位换算 4、保存和重载 ipvsadm -R ipvsadm -S [-n] /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm #保存 /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm #重载 5、置零计数器 ipvsadm -Z [-t|u|f service-address] 6、ipvasadm程序包 /etc/sysconfig/ipvsadm-config # ipvsadm配置文件 /usr/lib/systemd/system/ipvsadm.service # 服务脚本 /usr/sbin/ipvsadm # 二进制程序 /usr/sbin/ipvsadm-restore # 重载工具 /usr/sbin/ipvsadm-save # 保存工具 /etc/sysconfig/ipvsadm # ipvs规则保存文件 7、相关内核信息 /proc/net/ip_vs /proc/net/ip_vs_conn 参考 http://www.linuxvirtualserver.org ================================================================================================================================================ LVS-NAT模型 1、LVS-NAT模型图示 2、LVS-NAT模型实现原理 1、客户端向Director Server发出请求,此时请求报文中的源IP是CIP,目标IP是VIP 2、Director Server接受到报文后,根据调度算法选中一台Real server,并将目标IP修改为RIP 3、将修改后的报文转发至后端Real server 4、后端Real server处理报文后,将报文响应给Director Server 5、Director Server收到响应的报文,此时报文源IP是RIP,Director Server将RIP修改为VIP之后,发送给客户端 3、LVS-NAT模型特点 1、由于请求响应报文都通过Director Server,所以当后端服务器达到一个数量时,Directore Server会成为一个瓶颈 2、前端负载均衡器和后端真实服务器要在同一个网段 3、后端服务器(Real Server)的默认网关要指向Director Server 4、后端服务器(Real Server)RIP是私网地址 5、支持端口映射 4、LVS-NAT配置实例 Director Server有两块网卡,VIP为192.168.1.150,DIP作为192.168.2.1,两台Real Server的IP地址分别为192.168.2.2、192、168.2.3 1、Director Server配置 1、安装ippvsadm yum install ipvsadm 2、开启DIrector Server转发功能 echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p 3、集群配置 ipvsadm -A -t 192.168.1.150:80 -s rr ipvsadm -a -t 192.168.1.150:80 -r 192.168.2.2 -g ipvsadm -a -t 192.168.1.150:80 -r 192.168.2.3 -g 2、Real Server配置(web服务) 1、安装apache并提供网页文件 2、配置默认路由,网关指向192.168.2.1 编辑网卡配置文件,设定默认网关 3、测试 curl 192.168.1.150 ================================================================================================================================================ LVS-DR模型 1、LVS-DR结构及工作流程 基本结构 跟VS/TUN方法相同,VS/DR利用大多数Internet服务的非对称特点,负载调度器中只负责调度请求,而服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量。 调度器和服务器组都必须在物理上有一个网卡通过不分断的局域网相连,如通过交换机或者高速的HUB相连。VIP地址为调度器和服务器组共享,调度器配置的VIP 地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为 VIP的网络请求。 工作流程 它的连接调度和管理与VS/NAT和VS/TUN中的一样,它的报文转发方法又有不同,将报文直接路由给目标服务器。在VS/DR中,调度器根据各个服务器的负载情况, 动态地选择一台服务器,不修改也不封装IP报文,[而是将数据帧的MAC地址改为选出服务器的MAC地址],再将修改后的数据帧在与服务器组的局域网上发送。因为 数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该IP报文。当服务器发现报文的目标地址VIP是在本地的网络设备上,服 务器处理这个报文,然后根据路由表将响应报文直接返回给客户。 在VS/DR中,请求报文的目标地址为VIP,响应报文的源地址也为VIP,所以响应报文不需要作任何修改,可以直接返回给客户,客户认为得到正常的服务,而不会 知道是哪一台服务器处理的。 2、DR模型特点 1、每一个Real Server都配置VIP,以作为相应报文的源IP 2、请求报文到达,经过前端路由设备时,路由器进行ARP解析广播,寻找Director Server,由于目标IP是VIP,且Real Server也配置有VIP,所以Real Server会 作出响应,为了使得Real Server不作出路由的解析广播响应,需要配置Real Server的内核参数,即接收到前端路由的ARP解析请求也不予响应。 3、为了避免RIP上配置的VIP地址冲突。将VIP配置到每一个Real Server的lo接口的别名上 4、Director Server接受到请求报文后,MAC地址是Director Server的网卡MAC地址,通过修改MAC地址调度转发给Real Server 5、Director Server物理网卡配置DIP,网卡别名上配置VIP 6、由于修改后的报文MAC地址是Real Server中的某一台的MAC地址,所Real Server接收报文,Real Server接受报文后发现目标IP是VIP,于是转发给lo接口, 最后报文送达主机用户空间,用户空间处理后通过lo接口,最后经物理网卡转发出 3、IP配置 Director Server DIP:eth0:192.168.1.150 VIP:eth0:0 192.168.1.149 Real Server-1 eth0:RIP:192.169.1.151 lo:0:VIP:192.168.1.149 Real Server-2 eth0:RIP:192.169.1.152 lo:0:VIP:192.168.1.149 4、修改Real Server内核参数 arp_ignore = 0|1|2 # 定义本机对外部ARP询问的不同应答模式 0:默认是0,响应来自任何网络接口对任何本地IP地址的ARP解析请求 1:只响应目标IP是来访网络接口的的本地IP地址的ARP解析请求 2:只响应目标IP是来访网络接口的的本地IP地址的ARP解析请求且只响应来自同一网段的请求 arp_announce = 0|1|2 # 对网络接口上,接收的ARP请求是否接收并作出响应的限制 0:将本地IP地址的ARP解析都响应给请求方 1:尽量避免将不在网络接口的网段的IP地址的ARP请求响应出去 2:总是用来访网络接口作为ARP响应 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 4、配置过程 1、Director Server配置VIP vim /etc/sysconfig/network-scripts/ifcfg-eno16777736:0 TYPE=Ethernet BOOTPROTO=static IPADDR=192.168.1.149 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DEVICE=eno16777736:0 ONBOOT=yes 或者 ip addr add 192.168.1.149/24 dev eno16777736:0 2、Director Server配置路由 ip route add 192.168.1.149 via 192.168.1.149 dev eno16777736:0 或者 route add -host 192.168.1.149 dev eno16777736:0 或者 /etc/sysconfig/network-scripts/route-eno16777736 192.168.1.149/255.255.255.0 via 192.168.1.149 dev eno16777736:0 3、Real Server修改内核参数 vim /etc/sysctl.conf net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 4、Real Server配置VIP vim /etc/sysconfig/network-scripts/ifcfg-lo:0 DEVICE=lo:0 IPADDR=192.168.1.149 NETMASK=255.255.255.255 BROADCAST=192.168.1.149 ONBOOT=yes 或者 ifconfig lo:0 192.168.1.149/32 broadcast 192.168.1.149 up 5、Real Server配置路由 route add -host 192.168.1.149 dev lo:0 # 使得Real Serve接收到目标地址是192.168.1.149的报文时,转发到lo:0接口上 或者 ip route add 192.168.1.149 via 192.168.1.149 dev lo:0 6、添加ipvs规则 ipvsadm -A -t 192.168.1.149:80 -s rr ipvsadm -a -t 192.168.1.149:80 -r 192.168.1.151 -g ipvsadm -a -t 192.168.1.149:80 -r 192.168.1.152 -g ================================================================================================================================================ 防火墙标记 1、防火墙标记 在mange表PREROUTING链上给通过的某几种种报文做相同的特定的标记,然后在用ipvsadm定义集群规则,定义调度集群,这样可以达到的目的是 可以同时调度不同的服务。 例如:对所有目的地址是192.168.1.149,端口是80和22的报文,作一个标记 iptables -t mangle -A PREROUTING -d 192.168.1.149 -p tcp --dport 80 -j MARK --set-mark 10 iptables -t mangle -A PREROUTING -d 192.168.1.149 -p tcp --dport 22 -j MARK --set-mark 10 2、利用防火墙标记定义集群服务 ipvsadm -A -f 10 -s rr ipvsadm -a -f 10 -r 192.168.1.151 -g ipvsadm -a -f 10 -r 192.168.1.152 -g 3、将80和443端口同时调度的集群服务 1、将192.168.1.150创建为私有CA cd /etc/pki/CA (umask 077;openssl genrsa -out private/cakey.pem) touch index.txt echo 01 serial # 生成自签证书 openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365 2、Real Server申请证书 cd /etc/httpd/ mkdir ssl # 生成秘钥 (umask 077;openssl genrsa -out httpd.key 1024) # 生成请求文件 openssl req -new -key httpd.key -out httpd.csr # 将申请文件发给CA服务器 scp http.key root@192.168.1.150:/tmp 3、签署证书 openssl ca -in /tmp/htt.csr -out /tmp/httpd.crt 4、将证书发送给申请证书的服务器 scp /tmp/httpd.crt root@192.168.1.151:/tmp scp /tmp/httpd.crt root@192.168.1.152:/tmp 5、配置ssl 6、配置防火墙规则 iptables -t mangle -A PREROUTING -d 192.168.1.149 -p tcp --dport 80 -j MARK --set-mark 10 iptables -t mangle -A PREROUTING -d 192.168.1.149 -p tcp --dport 443 -j MARK --set-mark 10 7、配置ipvsadm ipvsadm -A -f 10 -s rr ipvsadm -a -f 10 -r 192.168.1.151 -g ipvsadm -a -f 10 -r 192.168.1.152 -g session保持 ================================================================================================================================================ session绑定 lvs的sh调度算法对某一个特定服务为可以实现session保持,但对多个共享RS的集群服务,则需要统一进行绑定。 lvs的persistence机制,即持久连接,可以实现将来自同一客户端的请求在一定时间内调度到同一个Real Server中。 此种方式对适用于任何算法。 LVS持久连接有多种方式, 要实现LVS持久连接,需要维护一个持久连接模板。记录客户端和第一个请求调度到那个 Real Server中信息,及保持记录的时间。 iptables -t mangle -A PREROUTING -d 192.168.1.149 -p tcp --dport 80 -j MARK --set-mark 10 iptables -t mangle -A PREROUTING -d 192.168.1.149 -p tcp --dport 443 -j MARK --set-mark 10 2、持久连接实现方式: 1、单服务持久调度。每端口持久:PPC ipvsadm -A -t 192.168.1.149:80 -s rr -p ipvsadm -a -t 192.168.1.149:80 -r 192.168.1.151 -g ipvsadm -a -t 192.168.1.149:80 -r 192.168.1.151 -g 2、单FWM持久调度。每FWM持久:PFWMC ::基于防火墙标记定义集群服务; 可实现将多个端口上的应用统一调度,即所谓的port Affinity ipvsadm -A -f 10 -s rr ipvsadm -a -f 10 -r 192.168.1.151 -g ipvsadm -a -f 10 -r 192.168.1.152 -g 3、单客户端持久调度。每客户端持久,PPC,对所有集群服务都有效基于0端口(表示所有服务)定义集群服 务,即将客户端对所有应用的请求都 调度至后端主机,必须定义 为持久模式,使用-p选项指定持久连接时间,默认为360秒 示例: ipvsadm -A -t 192.168.1.149:0 -s rr -p ipvsadm -a -t 192.168.1.149:0 -r 192.168.1.151 -g ipvsadm -a -t 192.168.1.149:0 -r 192.168.1.151 -g ================================================================================================================================================ ARP问题:(马哥笔记) __________ | | | client | |________| | | (router) | | | __________ | DIP | | |------| director | | VIP |__________| | | | ------------------------------------ | | | | | | RIP1, VIP RIP2, VIP RIP3, VIP ______________ ______________ ______________ | | | | | | | realserver1 | | realserver2 | | realserver3 | |______________| |______________| |______________| 在如上图的VS/DR或VS/TUN应用的一种模型中(所有机器都在同一个物理网络),所有机器(包括Director和RealServer)都使用了一个相同的IP地址,即VIP。当一个客户端向VIP发出一个连接请求时,此请求必须要连接至Director的VIP,而不能是RealServer的。因为,LVS的主要目标就是要Director负责调度这些连接请求至RealServer的。 因此,在Client发出至VIP的连接请求后,只能由Director将其MAC地址响应给客户端(也可能是直接与Director连接的路由设备),而Director则会相应的更新其ipvsadm table以追踪此连接,而后将其转发至后端的RealServer之一。 如果Client在请求建立至VIP的连接时由某RealServer响应了其请求,则Client会在其MAC table中建立起一个VIP至RealServer的对就关系,并以至进行后面的通信。此时,在Client看来只有一个RealServer而无法意识到其它服务器的存在。 为了解决此问题,可以通过在路由器上设置其转发规则来实现。当然,如果没有权限访问路由器并做出相应的设置,则只能通过传统的本地方式来解决此问题了。这些方法包括: 1、禁止RealServer响应对VIP的ARP请求; 2、在RealServer上隐藏VIP,以使得它们无法获知网络上的ARP请求; 3、基于“透明代理(Transparent Proxy)”或者“fwmark (firewall mark)”; 4、禁止ARP请求发往RealServers; 传统认为,解决ARP问题可以基于网络接口,也可以基于主机来实现。Linux采用了基于主机的方式,因为其可以在大多场景中工作良好,但LVS却并不属于这些场景之一,因此,过去实现此功能相当麻烦。现在可以通过设置arp_ignore和arp_announce,这变得相对简单的多了。 Linux 2.2和2.4(2.4.26之前的版本)的内核解决“ARP问题”的方法各不相同,且比较麻烦。幸运的是,2.4.26和2.6的内核中引入了两个新的调整ARP栈的标志(device flags):arp_announce和arp_ignore。基于此,在DR/TUN的环境中,所有IPVS相关的设定均可使用arp_announce=2和arp_ignore=1/2/3来解决“ARP问题”了。 arp_annouce:Define different restriction levels for announcing the local source IP address from IP packets in ARP requests sent on interface; 0 - (default) Use any local address, configured on any interface. 1 - Try to avoid local addresses that are not in the target's subnet for this interface. 2 - Always use the best local address for this target. arp_ignore: Define different modes for sending replies in response to received ARP requests that resolve local target IP address. 0 - (default): reply for any local target IP address, configured on any interface. 1 - reply only if the target IP address is local address configured on the incoming interface. 2 - reply only if the target IP address is local address configured on the incoming interface and both with the sender's IP address are part from same subnet on this interface. 3 - do not reply for local address configured with scope host, only resolutions for golbal and link addresses are replied. 4-7 - reserved 8 - do not reply for all local addresses 在RealServers上,VIP配置在本地回环接口lo上。如果回应给Client的数据包路由到了eth0接口上,则arp通告或请应该通过eth0实现,因此,需要在sysctl.conf文件中定义如下配置: #vim /etc/sysctl.conf net.ipv4.conf.eth0.arp_ignore = 1 net.ipv4.conf.eth0.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 以上选项需要在启用VIP之前进行,否则,则需要在Drector上清空arp表才能正常使用LVS。 到达Director的数据包首先会经过PREROUTING,而后经过路由发现其目标地址为本地某接口的地址,因此,接着就会将数据包发往INPUT(LOCAL_IN HOOK)。此时,正在运行内核中的ipvs(始终监控着LOCAL_IN HOOK)进程会发现此数据包请求的是一个集群服务,因为其目标地址是VIP。于是,此数据包的本来到达本机(Director)目标行程被改变为经由POSTROUTING HOOK发往RealServer。这种改变数据包正常行程的过程是根据IPVS表(由管理员通过ipvsadm定义)来实现的。 ================================================================================================================================================ EXAMPLE 1 - Simple Virtual Service The following commands configure a Linux Director to distribute incoming requests addressed to port 80 on 207.175.44.110 equally to port 80 on five real servers. The forwarding method used in this example is NAT, with each of the real servers being masqueraded by the Linux Director. ipvsadm -A -t 207.175.44.110:80 -s rr ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.1:80 -m ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.2:80 -m ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.3:80 -m ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.4:80 -m ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.5:80 -m Alternatively, this could be achieved in a single ipvsadm command. echo " -A -t 207.175.44.110:80 -s rr -a -t 207.175.44.110:80 -r 192.168.10.1:80 -m -a -t 207.175.44.110:80 -r 192.168.10.2:80 -m -a -t 207.175.44.110:80 -r 192.168.10.3:80 -m -a -t 207.175.44.110:80 -r 192.168.10.4:80 -m -a -t 207.175.44.110:80 -r 192.168.10.5:80 -m " | ipvsadm -R As masquerading is used as the forwarding mechanism in this example, the default route of the real servers must be set to the linux director, which will need to be configured to forward and masquerade packets. This can be achieved using the following commands: echo "1" > /proc/sys/net/ipv4/ip_forward EXAMPLE 2 - Firewall-Mark Virtual Service The following commands configure a Linux Director to distribute incoming requests addressed to any port on 207.175.44.110 or 207.175.44.111 equally to the corresponding port on five real servers. As per the previous example, the forwarding method used in this example is NAT, with each of the real servers being masqueraded by the Linux Director. ipvsadm -A -f 1 -s rr ipvsadm -a -f 1 -r 192.168.10.1:0 -m ipvsadm -a -f 1 -r 192.168.10.2:0 -m ipvsadm -a -f 1 -r 192.168.10.3:0 -m ipvsadm -a -f 1 -r 192.168.10.4:0 -m ipvsadm -a -f 1 -r 192.168.10.5:0 -m ================================================================================================================================================