(1)LVS实现四层负载均衡的原理与配置

目录
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
(1)LVS实现四层负载均衡的原理与配置

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
⑥、响应报文最终送达至客户端
(1)LVS实现四层负载均衡的原理与配置

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
⑥、响应报文最终送达至客户端
(1)LVS实现四层负载均衡的原理与配置

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

转载于:https://blog.51cto.com/7603402/2084872

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值