在生产环境中,负载均衡的实现方式有多种,常见的集中方式有:DNS方式、专业负载均衡设备(硬件)、众多的负载均衡软件,如nginx、lvs、haproxy等..

三种实现的方式相比较的话,使用负载均衡软件实现是最常用的,优点配置简单、灵活、扩展性强。

软件的实现方式又可以按工作层进行划分,有的是软件是工作在四层(传输层),而有的软件是工作在七层(应用层)

工作层/

优点

缺点

传输层/四层


通用、灵活、效率高、

无套接字限制


 不能识别应用层报文

应用层/七层

精确、根据报文的内容进行分发

 受限于随机套接字限制

 

 

 

 

 

 

 

 

 

lvs学习记录-NO.1_mac地址

 

lvs学习记录-NO.1_首部_02

 

lvs学习记录-NO.1_客户端_03

 介绍一下lvs

lvs由中国的章文嵩博士研发,全称Linux Virtual Server;

lvs是工作在四层上的负载均衡软件;内置多种调度算法,可以工作在不同的模式上;

lvs由VS(Virtula server)和RS(real server)组成,VS也可以称为Director,负责调度后端的RS;

lvs是由内核中的netfilter实现对报文的控制的,类似于iptables的工作原理;

通过下图了解netfilter的工作机制:

lvs学习记录-NO.1_服务器_04

 

 netfilter是内核系统中的Linux防火墙,提供了一套hook函数的管理机制:

iptables是用户空间的管理工具;

netfilter是内核空间上的框架;

再看一下lvs和工作机制:

LVS是基于netfilter框架,工作在INPUT链上,在INPUT上注册ip_vs_in HOOK函数,进行IPVS主流程,大概原理如下图:

lvs学习记录-NO.1_请求报文_05bo

用户发起的请求报文通过层层路由后到达LVS主机的网卡上,进入内核网络层,进入PREROUTING后经路由查找,确定访问的目的IP为本机IP地址,所有数据包进入INPUT链上。

IPVS 是工作在INPUT链上,会根据访问的ip+port判断报文是否输入IPVS定义的服务,如果是IPVS负责分发的服务则根据调度算法选择一台后端RS服务器,修改报文的IP或MAC或PROT后发送至POSTROUTING链上,转发至RS服务器上;

lvs学习记录-NO.1_客户端_06

CIP:客户端的IP

VIP:lvs主机负责接收客户端请求的IP

DIP:lvs主机负责与后端RS服务器通信的IP

RIP:RS服务器与lvs主机通信的IP

NAT模式实现原理

 lvs学习记录-NO.1_首部_07

 用户发出请求数据包经过层层网络,此时数据包源IP是CIP,目的IP是VIP,到达lvs主机;

lvs接收,检查数据包是否为ipvs的集群服务,如果是,将数据包的目标IP修改为RS服务器中其中一台的RIP(根据调度算法选择RS),然后发往后端RS,此时数据包源IP为CIP,目标IP为RIP;

到达RS服务器的数据包经过检查确认,确认后生成响应数据包,因为RS的默认网关设置为lvs服务器的DIP,所以发回给lvs服务器(VS端),发出的数据包源IP为RIP,目标IP为CIP;

lvs接收到RS的响应数据包后,将数据包的源IP修改为VIP后发送至客户端,此时数据包源IP是VIP,目的IP是CIP;这样就完成了一次请求和响应的交互;

lvs-nat模式是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑选出的RS的RIP和PORT实现转发;

要点:1.RIP和DIP必须在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP; 2.请求报文和响应报文都必须由Director转发;Director易于称为系统瓶颈; 3.支持端口映射,可修改请求报文的目标PORT; 4.vs必须是Linux系统,rs可以是任意系统;

 

DR模式实现原理

lvs学习记录-NO.1_mac地址_08

 

lvs-DR:

 1.客户端发起请求报文,数据包经过互联网中的层层路由到达lvs服务器的网关路由器,网关路由经过交换机到达lvs服务器所在的局域网内,数据包内源IP是客户端的CIP,目标IP是LVS对外的VIP,此时源MAC地址是CMAC,其实是连接LVS的路由器或交换机的MAC地址( 为了容易理解记为CMAC),目标MAC地址是VIP对应的MAC,记为VMAC;

 2.lvs接收数据包后判断是否为IPVS服务的集群服务,如果是,根据调度算法选择一台RS,然后将目标MAC地址修改为选择的RS的MAC地址,记为RMAC,源MAC修改为LVS和RS同网段通信对应的MAC地址,记为DMAC,然后通过交换机发送给RS;

 3.请求数据包到达RealServer后,链路层检查目的MAC地址是自己网卡的地址,到网络层,检查到目的IP是VIP地址(lo上配置了VIP),判断是自己的数据包,开始响应,发出响应报文,源IP为VIP,目的IP为CIP,源MAC是ReadServer的RMAC,目标MAC是下一跳(路由器)的MAC地址,记为CMAC(方便理解),然后数据包通过路由器转发至网络到客户端;

 小总结:

  DR模式是通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变;

  VS和RS都要配置使用VIP;

  1.确保前端路由器将目标IP为VIP的请求报文发送Director;三种方式

    a.在前端网关做静态绑定;

    b.在RS上使用arptables;

    c.在RS上修改内核参数以限制arp通告及应答级别;

      arp_announce

      arp_ignore

  2.RS的RIP可以使用私网地址,也可以是公网地址;RIP和DIP在同一IP网络;RIP的网关不能指向DIP;确保响应报文不会经由Director;

  3.RS跟Director要在同一个物理网络;

  4.不支持端口映射;

 

LVS-Tunnel模式

lvs学习记录-NO.1_服务器_09

 

1.用户请求数据包经过层层网络到达lvs网卡,此时数据包源IP是CIP,目的IP是VIP;

2.lvs判断是否为IPVS服务的集群,如果是则根据算法选择一台RS,然后在数据包上额外增加一个Tunnel头部,Tunnel头部的源IP为DIP,目标IP为RIP,经过层层路由发送至RS所属的网络中;

3.后端RS服务器接收到数据包后,ipip模块将Tunnel头部拆除,正常看到源IP是CIP,目标IP为VIP,由于所有RealServer的tunl0上都配置了VIP,则RS判断为本机IP数据包,应用层生成响应数据包发送给客户端,发出的数据包源IP为VIP,目标IP为CIP;

 

lvs-tun

转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原IP报文之外再额外封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP);

  1.DIP,VIP,RIP都应该是公网地址;

  2.RS的网关不能,也不可能指向DIP;

  3.请求报文要经由Diretor,但响应不能经由Director;

  4.不支持端口映射;

  5.RS的OS得支持隧道功能;

 

LVS-FULLNAT模式

lvs学习记录-NO.1_首部_10

 总结:

  lvs-nat,lvs-fullnat:请求和响应报文都要经由Director;

    lvs-nat:RIP的网关的要指向DIP;

    lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信;

  lvs-dr,lvs-tun:

    lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发;

    lvs-tunnel:通过在原IP报文额外封装新的IP首部实现转发,支持远距离通信;