概述

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在UNIX/LINUX平台下实现负载均衡集群功能,工作在网络模型的7层。

IPVS:LVS 是基于内核态的 netfilter 框架实现的 IPVS 功能,工作在内核态。那么用户是如何配置 VIP 等相关信息并传递到 IPVS 呢,就需要用到了 ipvsadm 工具。

ipvsadm:ipvsadm 是 LVS 用户态的配套工具,可以实现 VIP 和 RS 的增删改查功能。它是基于 netlink 或 raw socket 方式与内核 LVS 进行通信的,如果 LVS 类比于 netfilter,那么 ipvsadm 就是类似 iptables 工具的地位。

LVS 调度算法

  • 轮询rr - 这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。
  • 加权轮询wrr - 这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多。实际生产环境的服务器配置可能不同,根据服务器配置适当设置权重,可以有效利用服务器资源。
  • 最少连接lc - 这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1
  • 加权最少链接 wlc - 这个算法比 lc 多了一个权重的概念。
  • 基于局部性的最少连接调度算法 lblc - 这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器。
  • 复杂的基于局部性最少的连接算法 lblcr - 记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
  • 目标地址散列调度算法 dh - 该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
  • 源地址散列调度算法 sh - 与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。

工具安装

yum install ipvsadm -y

ipvsadm参数

参数(短格式)参数(长格式)参数说明
-A--add-service在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。
-E--edit-service编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D--delete-service删除内核虚拟服务器表中的一条虚拟服务器记录。
-C--clear清除内核虚拟服务器表中的所有记录。
-R--restore恢复虚拟服务器规则
-S--save保存虚拟服务器规则,输出为-R 选项可读的格式
-a--add-server在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器
-e--edit-server编辑一条虚拟服务器记录中的某条真实服务器记录
-d--delete-server删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l--list显示内核虚拟服务器表
-Z--zero虚拟服务表计数器清零(清空当前的连接数量等)
---set tcp tcpfin udp设置连接超时值
---start-daemon启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的VRRP 功能。
---stop-daemon停止同步守护进程
-h--help显示帮助信息
-t--tcp-service service-address [vip:port] or [real-server-ip:port]说明虚拟服务器提供的是tcp 的服务
-u--udp-service service-address [vip:port] or [real-server-ip:port]说明虚拟服务器提供的是udp 的服务
-f--fwmark-service fwmark说明是经过iptables 标记过的服务类型。
-s--scheduler scheduler使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq默认的调度算法是: wlc
-p--persistent [timeout]持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300秒。
-M--netmask netmaskpersistent granularity mask
-r--real-server server-address真实的服务器[Real-Server:port]
-g--gatewaying指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
-i--ipip指定LVS 的工作模式为隧道模式
-m--masquerading指定LVS 的工作模式为NAT 模式
-w--weight weight真实服务器的权值
---mcast-interfaceinterface 指定组播的同步接口
-c--connection显示LVS 目前的连接 如:ipvsadm -L -c
---timeout   显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout
---daemon    显示同步守护进程状态
---stats     显示统计信息
---rate      显示速率信息
---sort      对虚拟服务器和真实服务器排序输出
---numeric -n输出IP 地址和端口的数字形式

示例配置环境

lb-192.168.1.10
web01-192.168.1.11
web02-192.168.1.12
VIP-192.168.1.100

DR(直接路由)模式

通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器将响应后的处理结果直接返回给客户端用户。
DR技术可极大地提高集群系统的伸缩性。但要求调度器LB与真实服务器RS都有一块物理网卡连在同一物理网段上,即必须在同一局域网环境。

lb配置

ipvsadm -C #清楚原有规则
ipvsadm -A -t 192.168.1.100:80 -s rr #添加tcp服务
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:80 -g #添加web01服务器
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.12:80 -g #添加web02服务器
ipvsadm -ln -t 192.168.1.100:80 #查看配置信息

web配置(网页显示内容应有些许不同,方便区分)

#配置lo
ifconfig lo:0 192.168.1.100 broadcast 192.168.1.100 netmask 255.255.255.0 up
#配置内核参数
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

测试(curl 192.168.1.100或者访问网页查看)

NAT 模式

通过网络地址转换,重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器,真实服务器的响应报文处理之后,返回时必须要通过调度器,经过调度器时报文的源地址被重写,再返回给客户,完成整个负载调度过程。

lb配置

echo 1 > /proc/sys/net/ipv4/ip_forward #配置允许转发
ipvsadm -C #清楚原有规则
ipvsadm -A -t 192.168.1.100:80 -s rr #添加tcp服务
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:80 -m #添加web01服务器
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.12:80 -m #添加web02服务器
ipvsadm -ln -t 192.168.1.100:80 #查看配置信息

web配置(网页显示内容应有些许不同,方便区分)

route add default gw 192.168.1.10 dev ens33 #配置默认网关

测试(curl 192.168.1.100或者访问网页查看)


Tunnel 模式

采用NAT技术时,由于请求和响应的报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈,为了解决这个问题,调度器把请求的报文通过IP隧道(相当于ipip或ipsec )转发至真实服务器,而真实服务器将响应处理后直接返回给客户端用户,这样调度器就只处理请求的入站报文。由于一般网络服务应答数据比请求报文大很多,采用 Tunnel技术后,集群系统的最大吞吐量可以提高10倍。
Tunnel工作流程,它的连接调度和管理与NAT中的一样,只是它的报文转发方法不同。调度器根据各个服务器的负载情况,连接数多少,动态地选择一台服务器,将原请求的报文封装在另一个IP报文中,再将封装后的IP报文转发给选出的真实服务器;真实服务器收到报文后,先将收到的报文解封获得原来目标地址为VIP地址的报文, 服务器发现VIP地址被配置在本地的IP隧道设备上(此处要人为配置),所以就处理这个请求,然后根据路由表将响应报文直接返回给客户

lb配置

ipvsadm -C #清楚原有规则
ipvsadm -A -t 192.168.1.100:80 -s rr #添加tcp服务
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:80 -i #添加web01服务
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.12:80 -i #添加web02服务器
ipvsadm -ln -t 192.168.1.100:80 #查看配置信息

web配置(网页显示内容应有些许不同,方便区分)

modprobe ipip
ifconfig tunl0 192.168.1.100 broadcast 192.168.1.100 netmask 255.255.255.0 up
echo "0" > /proc/sys/net/ipv4/ip_forward
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter
echo "0" > /proc/sys/net/ipv4/conf/tunl0/rp_filter

测试(curl 192.168.1.100或者访问网页查看)