目录 1、LVS简介 2、LVS组成 3、LVS常用术语 4、LVS工作类型 NAT模型 DR模型 TRUNK模型 5、LVS多种调度方式 6、LVS配置 DR配置、NAT配置 7、LVS后端健康状态检查 8、LVS优化 9、LVS常见故障 10、LVS持久链接 下一篇博文: 通过LVS+Keepalived实现负载均衡的高可用

请注意: 全文全部手打,肯定有错误之处,如果有错误请指出。 有问题去解决问题,便于加深记忆!!

一、lvs介绍

LVS(Linux Virtual Server 虚拟服务器):是一个虚拟的四层路由交换器集群系统,根据目标地址和目标端口实现用户请求转发。 是中国人发明的哟#############本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。

lvs工作原理 1、当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间 2、PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链 3、IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链 4、POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器

二、lvs的组成

lvs有两段代码组成,ipvsadm和ipvs

  • ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
  • ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)。

三、lvs的术语

  • Direstor Server(DS)
  • Real Server(RS) lvs关于IP的术语
  • VIP:virtual IP 向外部直接面向用户请求,作为用户请求的目标的IP地址。
  • DIP:Director Server IP,主要用于和内部主机通讯的IP地址
  • RIP:Real Server IP
  • CIP:Client IP,客户端IP

四、lvs的类型

根据架构有3种不同的模型 1、lvs-nat (Network Address Translation) 建议小规模使用 2、lvs-dr (Direct Routing 直接路由) 建议大规模使用,也是现在较多使用场景的方法 3、lvs-tun (Tunneling 隧道) lvs-tun模型比较少用,因为他不能实现全局负载均衡,不能根据用户区域的距离来挑选最近的机房。这个最多为了实现异地容灾来实现的。比方说日本的机房地震了,而此时美国的机房仍然可使用,那么只要将指向到美国机房即可。而一般只有这种场景下才会用到隧道机制

4.1 LVS-NAT模型

重点:修改目标IP地址为挑选出的RS的IP地址。 NAT模型的工作原理:<需要有一定iptables基础> ①、当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。 ②、PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链 ③、IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP ④、POSTROUTING链通过选路,将数据包发送给Real Server ⑤、Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP ⑥、Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP

LVS-NAT模型的特性 1、RS应该使用私有地址,RS的网关必须指向DIP 2、DIP和RIP必须在同一个网段内 3、请求和响应报文都需要经过Director Server,高负载场景中,Director Server易成为性能瓶颈 4、支持端口映射 5、RS可以使用任意操作系统 缺陷:对Director Server压力会比较大,请求和响应都需经过director server

4.2 LVS-DR模型

重点:将请求报文的目标MAC地址设定为挑选出的RS的MAC地址

①、当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。 ②、PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链 ③、IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址 ④、由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。 ⑤、RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP ⑥、响应报文最终送达至客户端

LVS-DR模型的特性 1、保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS 解决方案:

  • 在前端路由器做静态地址路由绑定,将对于VIP的地址仅路由到Director Server 存在问题:用户未必有路由操作权限,因为有可能是运营商提供的,所以这个方法未必实用
  • arptables:在arp的层次上实现在ARP解析时做防火墙规则,过滤RS响应ARP请求。这是由iptables提供的
  • 修改RS上内核参数(arp_ignore和arp_announce)将RS上的VIP配置在lo接口的别名上,并限制其不能响应对VIP地址解析请求。(最容易实现) 2、RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问 3、RS跟Director Server必须在同一个物理网络中 4、所有的请求报文经由Director Server,但响应报文必须不能进过Director Server 5、不支持地址转换,也不支持端口映射 6、RS可以是大多数常见的操作系统 7、RS的网关绝不允许指向DIP(因为我们不允许他经过director) 8、RS上的lo接口配置VIP的IP地址 缺陷:RS和DS必须在同一机房中

4.3 LVS-Tun模型

重点:在原有的IP报文外再次封装多一层IP首部,内部IP首部(源地址为CIP,目标IP为VIP),外层IP首部(源地址为DIP,目标IP为RIP)

①、当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。 ②、PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链 ③、IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP ④、POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP ⑤、现是自己的IP地RS接收到报文后发址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP ⑥、响应报文最终送达至客户端

LVS-Tun模型特性 1、RIP、VIP、DIP全是公网地址 2、RS的网关不会也不可能指向DIP 3、所有的请求报文经由Director Server,但响应报文必须不能进过Director Server 4、不持端口映射 5、RS的系统必须支持隧道支

五、LVS算法调度

LVS算法分为静态方法和动态方法 静态方法 仅根据调度算法本身,不考虑背后服务器的负载

  • rr:round robin,轮流,轮询 调度器通过“轮询”的调度算法,按照顺序将请求分配到后端的真实服务器上,无论后端服务器的负载状态如何,都会平均“轮询”调度。
  • wrr:weightd round robin,带权重的轮序 指的是能者多劳,服务器性能强的,就会分配的比较多。所以根据后端真实服务器的性能来进行调度,根据后端真实服务器负载情况,修改权重值来实现动态的调度
  • sh:source hashing 源地址hash 将来自于同一个源IP的请求将始终被定向至同一个RS,这个目的是为了session持久功能,仅实现session的绑定.
  • dh:destination hashing,目标地址hash,用于实现当你的内部主机上有多个防主要火墙出口时有用。 (仅作了解) 动态方法 根据算法及各RS当前的负载状况进行调度
  • lc:least connection,最少连接,通过监控后端RS的连接数,根据TCP协议中的某些计数器来判断。将请求调度到已建立的连接数最少后端的真实服务器上。 计算方法:Overhead=Active*256+Inactive Overhead:负载状态 Overhead越小,表示负载越低
  • wlc:weight lc,加权的lc 在集群系统中的服务器,如果性能差异较大的情况下,调度器可以根据采用“加权的最少连接”调度算法来提高负载均衡性能,如果权重值较高的RS,将会承接更大比例的连接负载,所以调度器可以根据“加权的最少连接”来判断服务器的负载情况,并动态调整期权重值。 计算方法:Overhead=(Active*256+Inactive)/weight
  • sed:shortest expertion delay最短期望延迟 基于WLC算法,Overhead = (ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。 计算方法:Overhead=((Active+1)*256)/weight 让权重大的优先接收请求
  • nq:Never Queue,永不排队 可以理解第一个请求上来先轮一圈,就是每个都先响应一次,然后在接着使用上面那种方法计算让谁响应。如果有台Real Server的连接数=0就直接分配过去,不需要在进行sed运算。
  • lblc:Locality-Based Least connection基于本地的最小连接 基于局部性的最少连接算法是针对请求报文的目标IP地址的负载均衡调度。主要用于Cache集群系统,因为Cache中客户请求报文的目标IP会不断发生改变。所以该算法根据请求的目标IP地址找出该目标IP地址最近使用的Real Server,若该服务器是可用的且没有超载,就会使用“最少链接”来挑选一台可用的服务器,将请求发送到该服务器。
  • lblcr:Replicated lblc带复制功能的lblc,是dh算法的一种改进 带复制功能的lblc也是针对目标IP地址做负载均衡。主要是根据请求的目标IP找到目标IP对应的服务器组,根据“最小连接”原则,从服务器组中挑选一台服务器。若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。 总结 调度方式:

六、LVS模型配置

6.1 环境准备

使用centos2.4以上的内核,ipvs已经被收录到了内核为2.4以上版本

6.2 检查内核是否支持ipvs

# modprobe -l | grep ipvs

6.3 安装ipvsadm命令

shell>yum -y install ipvsadm 即可安装

6.4 ipvsadm:命令格式

6.4.1 管理集群服务DS
    添加:-A -t|u|f service-address [-s scheduler]
        -t: TCP协议的集群
        -u: UDP协议的集群
        -f: FWM: 防火墙标记
            service-address: Mark Number
					-s  调度方式
    修改:-E
    删除:-D -t|u|f service-address

范例1:添加一个lvs集群服务 shell> ipvsadm -A -t 172.16.100.1:80 -s rr //为轮询的调度方式

6.4.2管理集群服务中的RS
    添加 : -a -t|u|f service-address -r server-address [-g|i|m]   [-w weight]
        -t|u|f service-address:事先定义好的某集群服务
				-r server-address: 某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射;
        -g|i|m  LVS类型
            -g: DR   
            -i: TUN
            -m: NAT
							-w : weight  定义服务器权重
    修改:-e
    删除:-d -t|u|f service-address -r server-address					

范例2:添加一个lvs集群服务 shell> ipvsadm -A -t 172.16.100.1:80 -s rr //为轮询的调度方式 shell>ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 -m -w 1 //权重为1 shell>ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -m -w 2 //权重为2

6.4.3查看DS配置
    -L|l
        -n: 数字格式显示主机地址和端口
        --stats:统计数据
        --rate:速率
        --timeout: 显示tcp、tcpfin和udp的会话超时时长
        -c:显示当前的ipvs连接状况
6.4.4 集群服务管理
    -C:清空ipvs规则

    -S:保存规则

shell> ipvsadm -S > /path/to/somefile

    -R:载入此前的规则:

shell> ipvsadm -R < /path/form/somefile

6.5 NAT模型配置

Client 测试客户端 Director LVS服务器 Real Server 应答服务器 业务端地址:192.168.200.132 real server地址:192.168.100.x 环境:64位CentOS 6.5 配置好主机名称与host文件、完成时间同步

1.软件安装 [root@linuxidc Packages]# yum install ipvsadm -y //挂载光盘,搜索ipvsadm工具安装包

2、ipvsadm的相关参数和用法 可以使用man命令查看具体用法,或者使用help查看命令

3.拓扑架构如下图: Director 配置 业务网卡1 :192.168.200.132/24 内部通信网卡2 :192.168.100.132/24 #vim /etc/sysctl.conf //nat模型,开启路由转发功能 net.ipv4.ip_forward = 1

#ipvsadm -A -t 192.168.200.132:80 -s rr #ipvsadm -a -t 192.168.200.132:80 -r 192.168.100.134:80 -m {-w #} #ipvsadm -a -t 192.168.200.132:80 -r 192.168.100.133:80 -m {-w #}

real server 配置 ADDR 192.168.100.134 NETMASK 255.255.255.0 GATEWAY 192.168.100.132

real server 配置 ADDR 192.168.100.133 NETMASK 255.255.255.0 GATEWAY 192.168.100.132

6.6 DR模型配置

集群节点跟director必须在同一个物理网络中; RIP可以使用公网地址,实现便捷的远程管理和监控; director仅负责处理入站请求,响应报文则由realserver直接发往客户端; realserver不能将网关指向DIP; 不支持端口映射; realserver关闭arp响应(在同一个局域网中vip广播避免realserver 收到影响调度) 关于时间同步:各节点间的时间偏差不大于1s,建议使用统一的ntp服务器进行更新时间;

VIP: MAC(DVIP) arptables: kernel parameter: arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式0 0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求 1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求 2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内 3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应 4-7 - 保留未使用 8 -不回应所有(本地地址)的arp查询

arp_announce:对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口 0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址 1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理. 2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.

DR模型配置规划 规划业务网段:192.168.200.x VIP:192.168.200.137 #ntpdata 192.168.200.132 //同步lvs的时间

6.6.1director配置

DIP: 192.168.200.132 255.255.255.0 //添加到配置文件 #ifconfig eth0:0 192.168.200.137 broadcast 192.168.200.137 netmask 255.255.255.255 up //保存到配置文件 #vim /etc/sysconfig/network-scripts/ifcfg-eth0:0 内容如下 DEVICE=eth0:0 IPADDR=192.168.200.137 NETMASK=255.255.255.255 BROADCAST=192.168.200.137 ONBOOT=yes #ifdown eth0:0 #ifup eth0:0 #echo 'rout add -host 192.168.200.137 dev eth0:0 ' >> /etc/rc.local #ipvsadm -A -t 192.168.200.137:80 -s wlc #ipvsadm -a -t 192.168.200.137:80 -r 192.168.200.133 -g -w 1 #ipvsadm -a -t 192.168.200.137:80 -r 192.168.200.134 -g -w 1 #ipvsadm -a -t 192.168.200.137:80 -r 192.168.200.135 -g -w 1 #service ipvsadm save //保存 #ipvsadm -S > /backconf/lvsfile //备份配置文件到制路径 #ipvsadm -R < /backconf/lvsfile //恢复制定文件夹配置

6.6.2 realserver 配置

RIP: 192.168.200.133 255.255.255.0 #echo '1' >/proc/sys/net/ipv4/conf/eth0/arp_ignore //有解释为什么修改成为 1 #echo '2' > /proc/sys/net/ipv4/conf/eth0/arp_announce #echo '1' > /proc/sys/net/ipv4/conf/all/arp_ignore #echo '2' > /proc/sys/net/ipv4/conf/all/arp_announce 以上只需要设置一处就可以 eth0 或者all 注意: 在配置VIP之前,先把响应的网卡的ARP的响应关掉。以防止VIP的响应干扰。 以上命令需填加到/etc/rc.local文件中让其开机自动生效 #ifconfig lo:0 192.168.200.137 broadcast 192.168.200.137 netmask 255.255.255.255 up #vim /etc/sysconfig/network-scripts/ifcfg-lo:0 DEVICE=lo:0 IPADDR=192.168.200.137 NETMASK=255.255.255.255 BROADCAST=192.168.200.137 ONBOOT=yes NAME=loopback

#ifdown lo:0 #ifup lo:0 #echo "route add -host 10.0.0.1 dev lo:0" >> /etc/rc.local

Windows 添加环回口地址: 操作: 从控制面板选择添加硬件; 选择"是,硬件已连好"; 选择"添加新的硬件设备"; 选择"安装我手动从列表选择的硬件"; 选择"网络适配器"; 从厂商列表选择"Microsoft",从网卡列表选择"Microsoft Loopback Adapter"; 点下一步开始安装硬件,安装完毕后出现一个新的网卡,配置好IP和子网掩码。Windows子网掩码无法配置成255.255.255.255,我们可以先按默认的保存配置,然后从注册表修改子网掩码。 注册表修改子网掩码: 从注册表 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces]下找到对应的网卡,将SubnetMask修改成255.255.255.255。然后禁用再启用该网卡即可。

shell> ipvsadm -L -n --stats 统计数据 shell>ipvsadm -L --timeout //显示tcp、tcpfin和udp的会话超时时长 shell> ipvsadm -L -c //显示当前ipvs连接状态

6.6.3脚本实现

脚本实现一键配置real server 和DR server 脚本配置很简单,有时间后期补充, 脚本其实就是一堆命令的堆砌。

七、后端健康状态检查

注释:一般lvs不会单独使用会结合Keepalived实现高可用,形成LVS+Keepalived的架构模式,keepalived组件自带后端real-server的监控检查,如果后端服务器故障,自动屏蔽。 但是如果我们只使用单台lvs做四层负载均衡如何实现后端健康状态检查呢? 那么我们可以使用heartbeat的组件 ldirectord

1)ldirectord用来实现LVS负载均衡资源在主、备节点间的故障转移。在首次启动时,ldirectord可以自动创建IPVS表。此外,它还可以监控各RealServer的运行状态,一旦发现某RealServer运行异常时,还可以将其从IPVS表中移除。 2) ldirectord进程通过向RealServer的RIP发送资源访问请求并通过由RealServer返回的响应信息来确定RealServer的运行状态。在Director上,每一个VIP需要一个单独的ldirectord进程。如果RealServer不能正常响应Director上ldirectord的请求,ldirectord进程将通过ipvsadm命令将此RealServer从IPVS表中移除。而一旦RealServer再次上线,ldirectord会将其重新添加至IPVS表中。 3)例如,为了监控一组提供web服务的RealServer,ldirectord进程使用HTTP协议请求访问每台RealServer上的某个特定网页。ldirectord进程根据自己的配置文件中事先定义的RealServer正常响应结果来判断当前的返回结果是否正常。比如,在每台web服务器的网站目录中存放一个页面".ldirectord.html",其内容为"Nice",ldirectord进程每隔一段时间就访问一次此网页,并根据获取到的响应信息来判断RealServer的运行状态是否正常。如果其返回的信息不是"Nice",则表明服务不正常。

ldirectord 官方下载地址:现ldirectord可从heartbeat源码包里获得,或者从以下官方链接获得。 http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/

ldirectord:http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/x86_64/ldirectord-3.9.6-0rc1.1.1.x86_64.rpm resource-agents:http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/x86_64/resource-agents-3.9.6-0rc1.1.1.x86_64.rpm cluster-glue-libs:http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/x86_64/cluster-glue-libs-1.0.12-1.16.1.x86_64.rpm

实现过程:在上一篇文章已经配置好VS/DR,进而直接进行ldirectord配置。 1、安装ldirectord及其依赖 shell> yum -y install localinstall ldirectord-3.9.6-0rc1.1.1.x86_64.rpm resource-agents-3.9.6-0rc1.1.1.x86_64.rpm cluster-glue-libs-1.0.12-1.16.1.x86_64.rpm**

2、配置ldirectord shell>rpm -ql ldirectord shell>cp /usr/share/doc/ldirectord-3.9.6/ldirectord.cf /etc/ha.d/ //配置文件

shell> vim /etc/ha.d/ldirectord.cf #Global Directives checktimeout=3 # ldirectord等待RealServer健康检查完成的时间,单位为秒; checkinterval=1 # 每次检查的时间间隔,即检查的频率; autoreload=yes # 此项用来定义ldirectord是否每隔一段时间检查此配置文件是否发生改变并自动重新加载; logfile="/var/log/ldirectord.log" # 定义日志文件存放位置; quiescent=yes # 当某台RealServer出现异常,此项可将其设置为静默状态(即其权重为"0")从而不再响应客户端的访问请求;

#Sample for an http virtual service virtual=192.168.200.137:80 # 此项用来定义LVS服务及其使用的VIP和PORT real=10.10.10.200:133 gate 100 # 定义RealServer,语法:real=RIP:port gate|masq|ipip [weight] real=10.10.10.200:134 gate 300 fallback=127.0.0.1:80 gate # 当IPVS表没有任何可用的RealServer时,此"地址:端口"作为最后响应的服务; service=http # 定义基于什么服务来测试RealServer; scheduler=wlc # 调度算法为wlc; #persistent=600 # 持久连接超时时间; #netmask=255.255.255.255 protocol=tcp # 定义此虚拟服务用到的协议; checktype=negotiate # ldirectord进程用于监控RealServer的方法;{negotiate|connect|A number|off} checkport=80 # 指健康检查使用的端口; request=".ldirectord.html" # 检查RealServer用到的页面 receive="Nice" # 检查RealServer用到的页面内容

3、提供当后端RS全部宕掉后,返回的fallback页面,为本机httpd服务 shell> yum install httpd shell>echo "404 Page." > /var/www/html/index.html shell>service httpd start

4、启动ldirectord /etc/rc.d/init.d/ldirectord start 至此,Director服务器配置完毕。

5、RS1、RS2提供".ldirectord.html"检测页面 shel>echo "good" > /var/www/html/.ldirectord.html**

6、浏览器访问:http://192.168.200.137

7、模拟后端RS故障 RS1:service httpd stop RS2:service httpd stop

8、Director查看ipvs信息,并使用浏览器访问http://192.168.200.137 shell> ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.101.168:80 wlc -> 10.10.10.11:80 Route 0 0 12 -> 10.10.10.12:80 Route 0 0 101 -> 127.0.0.1:80 Local 1 0 0

9、测试后端RS恢复

RS1:service httpd start

RS2:service httpd start

八、 LVS优化

8.1 建议将hash table的值设置不低于并发连接数

LVS的调优建议将hash table的值设置为不低于并发连接数。例如,并发连接数为200,Persistent时间为200S,那么hash桶的个数应设置为尽可能接近200x200=40000,2的15次方为32768就可以了。当ip_vs_conn_tab_bits=20 时,哈希表的的大小(条目)为 pow(2,20),即 1048576,对于64位系统,IPVS占用大概16M内存,可以通过demsg看到:IPVS: Connection hash table configured (size=1048576, memory=16384Kbytes)。对于现在的服务器来说,这样的内存占用不是问题。所以直接设置为20即可。 关于最大“连接数限制”:这里的hash桶的个数,并不是LVS最大连接数限制。LVS使用哈希链表解决“哈希冲突”,当连接数大于这个值时,必然会出现哈稀冲突,会(稍微)降低性能,但是并不对在功能上对LVS造成影响。

8.2 调整ip_vs_conn_tab_bit的方法

在/etc/modprobe.d/目录下添加文件ip_vs.conf,内容为: options ip_vs conn_tab_bits=20 查看 ipvsadm -l 如果显示IP Virtual Server version 1.2.1 (size=4096),则前面加的参数没有生效 modprobe -r ip_vs modprobe ip_vs

8.3 系统参数优化

2.1 关闭网卡LRO和GRO 现在大多数网卡都具有LRO/GRO功能,即 网卡收包时将同一流的小包合并成大包 (tcpdump抓包可以看到>MTU 1500bytes的数据包)交给 内核协议栈;LVS内核模块在处理>MTU的数据包时,会丢弃; 因此,如果我们用LVS来传输大文件,很容易出现丢包,传输速度慢; 解决方法,关闭LRO/GRO功能,命令: ethtool -k eth0 查看LRO/GRO当前是否打开 ethtool -K eth0 lro off 关闭GRO ethtool -K eth0 gro off 关闭GRO 2.2 禁用ARP,增大backlog并发数 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.core.netdev_max_backlog = 500000

8.4 lvs自身配置调优

1 尽量避免sh算法 一些业务为了支持会话保持,选择SH调度算法,以实现 同一源ip的请求调度到同一台RS上;但 SH算法本省没有实现一致性hash,一旦一台RS down,当前所有连接都会断掉;如果配置了inhibit_on_failure,那就更悲剧了,调度到该RS上的流量会一直损失; 实际线上使用时,如需 会话保持,建议配置 persistence_timeout参数,保证一段时间同一源ip的请求到同一RS上。 2 增大hash桶锁个数 对于一个16核的服务器来说,可以将桶锁个数调整为8. ipvs源码目录下,修改文件vim ip_vs_conn.c - #define CT_LOCKARRAY_BITS 8;

可以参考以下优秀博文: http://blog.csdn.net/yanziguishi/article/details/7284793

九、LVS常见故障处理

范例1:从内部可以打开负载业务,从互联网无法访问 如网站业务,通过互联网或者时手机中断无法打开网站,通过内部网络地址可以正常访问,那么就要考虑是否时负载均衡出现故障。 错误排查流程: 1)ping负载均衡器的真实IP和虚拟IP,判断网络连通性。检测防火墙等相关配置。 2)在负载均衡器上,检查负载均衡器和后端服务器的状态。 1.ifconfig查看负载均衡器虚拟IP绑定是否成功 2.ipvsadm -ln --short #观察后端服务器是否被剔除,同时确认连接数。 3.cat /var/log/messages | grep -i keepalived 查看日志是否有后端服务器超时连接被剔除。 3)后端服务器测试http服务和防火墙配置是否正常。 4)检测后端服务器虚拟IP绑定是否成功。 5)检测后端服务器Arp相关设置是否生效。 6)主从切换故障时,首先要确定虚拟IP的MAC地址是否被更新。

范例2: lvs负载均衡的后端业务,如网站有时候能打开有时候不能打开,打开有时候打开巨慢 1.通过互联网测试网站打开的速度,多刷新几遍,ping查看延时,观察现象 2.通过内部网络打开网站,多刷新几遍,ping查看延时,观察现象 3.登录LVS服务器查看我们的状态信息, 看会话状态(一般负载均衡使用的调度方式时wcl,最小连接数,博主现在用的也是) 4.如果后端服务器的会话不均衡的话,查看是否时因为后端服务器有问题导致,而lvs健康状态检查没有检查到,也调度到故障服务器 出现这种情况的一般是,后端健康状态检查是用80端口作为检查依据,如果80端口存活就认为正常,继续调度到该故障服务器,导致业务打开缓慢

故障原因:做后端健康状态检查,不应该只使用80端口作为检查依据,建议使用url作为检查依据

范例3:或者出现白版界面,无任何信息,也不报错。 导致该原因的问题时后台发布了空页面,而且后端健康状态检查也是只监控了80端口的存活

十、LVS persistence : lvs的持久链接

作用:无论IPVS使用何种调度方式,其都能实现将来自于同一个client的请求始终定向至第一次调度时挑选出的RS:

和sh调度比较的优点: sh:会一直将一个用户请求定义道要给后端server,不会考虑后端服务状态 持久链接:第一次会根据设置的调度算法(rr wrr )调度到后端,在指定的回话存活事件使用持久链接,回话时间到期之后,还是根据调度算法进行调度。

persistence template:持久连接模板:将多个集群服务归并到一起统一调度 PPC:每端口持久;持久连接生效范围仅为单个集群服务;如果有多个集群服务,每服务被单独持久调度; PCC:每客户端持久;持久连接生效范围为所有服务;定义集群服务时,其TCP或UDP协议的目标端口要使用0; PFWM:每FWM持久:持久连接生效范围为定义为同一个FWM下的所有服务;

lvs持久链接模版语法: shell>ipvsadm -A t|u|f server-address -s scheduler -p [#] 无-p选项:不启用持久链接 -p # :指定持久时长,省略时长,默认360秒

定义一个PPC持久链接服务 (请求同一个集群服务,永远调用在同一个realserver) shell>ipvsadm -A -t 192.168.200.139 -s rr -p shell>ipvadm -a -t 192.168.200.139 -r 192.168.200.132 -g -w 1 shell>ipvsadm -a -t 192.168.200.139 -r 192.168.200.133 -g -w 1 设置完成后,客户端访问的同一个集群服务,始终调度到同一台RS服务器。

定义一个PCC持久链接服务(客户端的所有请求都调度到同一个realserver) shell>ipvsadm -A -t 192.168.200.139:0 -s rr -p shell>ipvsadm -a -t 192.168.200.139:0 -r 192.168.200.132 -g shell>ipvsadm -a -t 192.168.200.139:0 -r 192.168.200.133 -g

定义一个FWM持久链接服务 (根据防火墙标记,将相同的标记的调度到同一个realserver) shell>iptables -t mangle -A PREROUTING -d 192.168.200.139 -p tcp --dport 80 -j MARK --set-mark 10 shell>iptables -t mangle -A PREPOUTING -d 192.168.200.139 -p tcp --dport 443 -j MARK --set-mark 10 shell> ipvsadm -A -f 10 -s rr -p shell> ipvsadm -a -f 10 -r 192.168.200.132 -g -w 1 shell>ipvsadm -a -f 10 -r 192.168.200.133 -g -w 1 shell>iptables -L -t mangle //查看策略

80/443 的请求都会调用到同一个realserver