LVS(Linux Virtual Server)

一,LVS组件

ipvs:工作在内核空间的一段代码,是真正实现调度的代码。

ipvsadm:工作在用户空间,用于编写框架规则,定义谁是集群服务,谁是后端服务器。

二,LVS算法

静态算法

  • 轮询算法(rr):按顺序将请求发送给后端服务器,循环往复。

缺点:无法考虑服务器的性能,导致负载不均

  • 加权轮询算法·(wrr):在轮询基础上赋予权重,权重高的获得更多的请求

缺点:无法动态感知服务器变化,权重需要人为干预

  • 最小连接算法(lc):将新的请求分给当前连接数最少的服务器。

缺点:无法考虑服务器性能差异

  • 加权最小连接算法(wlc):将最小连接算法赋予权重,将请求分配给(连接数/权重)最小的服务器

动态算法

  • 源地址哈希(sh):根据客户端源ip的哈希值固定分配到某个固定的后台服务器。

缺点:可能会导致流量分配不均,来自同一台路由器的请求会都会被分发到同一台服务器。

  • 目的地址哈希(dh):根据目标地址的hash值分配请求。

缺点:与sh类似,也可能会导致流量的分配不均。

  • 最短预期延迟(sed):选择(当前连接数+1/权重)最小的服务器分配资源。

缺点:比WLC更加精细,但计算较为复杂,开销大。

  • 永不排队(nq):再sed基础上,有空闲服务器则分配给空闲服务器,没有则使用sed算法

缺点:可能会导致服务其的频繁切换

三,LVS三层结构:

负载调度器:位于后端服务器与客户之间,负责将客户的请求流量按照调度算法转发到后端服务器

服务器池:一组真实工作的后端服务器,可作为web访问使用。

共享存储:为服务器提供一个共享存储区,使得整个服务器拥有相同的内容,避免新的流量访问到不同服务器时,出现存储错误。

四,LVS专业术语

RS:后端真实的服务器

DS:前端负载均衡器节点

DIP:用于和内部主机通信的ip

CIP:前端客户端ip

RIP:后端真实服务器ip

VIP:向外部直接暴露,用于用户请求的ip

五,LVS工作模式

NAT模式:

工作原理:

  1. 前端流量到达负载调度器,流量会首先到达内核层PREROUTING链,此时的源ip为cip,目标ip为vip。
  2. PREROUTING发现目标ip是本主机ip,就会将流量给到input链。
  3. ipvs发现对比数据包请求的服务是否为集群服务,如果是,就将数据包做修改,源ip为cip,目标ip改为rip,同时将流量给到POSTOUTING链,POSTOUTING将流量给到后端服务器。
  4. 后端服务器收到请求后,发现数据包ip为本主机IP,于是进行响应报文构建,源ip为rip,目标ip为cip。
  5. 流量在到达调度器时,将报文进行修改,目标ip为cip,源ip为vip,然后发给客户端主机。

实验环境:

一台客户机,网卡nat模式,ip:192.168.79.134/24,网关192.168.79.136

一台调度器,双网卡。nat模式,ip:192.168.79/136。仅主机模式,ip:192.168.80.2

两台后端服务器,仅主机模式,ip1:192.168.80.3/24,ip2:192.168.80.4/24。网关都为80.2

配置:

客户端:

chmod 600 ens160.nmconnection---给与文件权限

nmcli connection reload------重新加载配置文件

nmcliconnection up <id=>-----激活网卡生效

调度器:

1,网络配置

nat网卡:

仅主机网卡:

chmod 600 ens160.nmconnection---给与文件权限

nmcli connection reload------重新加载配置文件

nmcliconnection up <id=>-----激活网卡生

在 /etc/sysctl.conf文件下添加net.ipv4.ip_forward=1----内核转发

2,调度器配置

下载ipvsadm软件,编写规则。

server1:

chmod 600 ens160.nmconnection---给与文件权限

nmcli connection reload------重新加载配置文件

nmcliconnection up <id=>-----激活网卡生

配置nginx作为web网页访问

server2:

chmod 600 ens160.nmconnection---给与文件权限

nmcli connection reload------重新加载配置文件

nmcliconnection up <id=>-----激活网卡生

配置nginx作为网页访问

利用客户进行访问:

DR模式:

工作原理:

  1. 用户流量到负载调度器,流量首先会到内核层PREROUTING链,此时源ip为cip,目标IP为vip
  2. PREROUTING链查看数据包发现目标ip是本主机ip,于是将流量转发到input链。
  3. ipvs对比数据包查看请求是否找的是集群服务,如果是就将数据包的源MAC改为dip的MAC,目标ip改为rip的mac然后将流量发送到POSTOUTING链。
  4. DS与RS处于同一网段中,通过二层直接进行转发。
  5. 后端服务器收到请求后构建响应报文,源ip为vip,目标ip为cip通过lo接口向外发出

实验环境:

一台客户机:nat模式IP:192.168.79.134/24,网关192.168.79.136

一台路由器(双网卡):nat模式ip:192.168.79.136/24,仅主机模式ip:192.168.80.2/24

一台lvs:仅主机模式IP:192.168.80.5/24,网关192.168.80.2

server1:仅主机模式IP:192.168.80.3/24,网关192.168.80.2

server2:仅主机模式IP:192.168.80.4/24,网关192.168.80.2

配置:

网络配置与NAT工作模式类似,同时还要在lvs调度器,server1和server2上分别绑定vip

注:vip要与后端服务器在同一网段且未被使用的ip,同时vip如果绑定在lo接口上要使用32位掩码

以lvs为例,server1与server2相同

server1和server2解决vip响应

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

客户端测试:

tunnel模式:

  1. 客户端发送请求数据包,包内有源IP+vip+dport
  2. 到达vs调度器后对客户端发送过来的数据包重新封装添加IP报文头,新添加的IP报文头中包含 TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并发送到RS1
  3. RS收到VS调度器发送过来的数据包做出响应,生成的响应报文中包含SRCIP(VIP)+DSTIP(CIP) +port,响应数据包通过网络直接回传给client

fullnat模式:

  1. VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
  2. RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
  3. 请求和响应报文都经由Director

六,防火墙解决轮询调度

当web服务开启多个端口的时候,默认轮询是分开调度的,这样就会出现调度错乱。

例如:web服务开启80和8080端口,当第一次访问80端口时会调度到server1上,当第二次访问8080端口时还会被调度到server1上,这样就会出现调度错误。通过在防火墙添加标签可以来解决这个问题。

**配置:**以nat工作模式为例:

1.两个server后端服务器都开启80和8080端口

2.调度器:

iptables -t mangle -A PREROUTING -d 192.168.79.136 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 666

ipvsadm -A -f 666 192.168.79.136 -s rr

ipvsadm -a -f 666 -r 192.168.80.3 -m

ipvsadm -a -f 666 -r 192.168.80.4 -m

3.客户端访问: