LVS简介

2018-05-03|Categories: Cluster, Linux|Tags: |

What is LVS

LVS = Linux Virtual Server(Linux虚拟服务器),是一个虚拟的服务器集群系统,用于实现负载平衡。项目在1998年5月由章文嵩博士成立,是中国大陆最早出现的自由软件项目之一。

LVS项目的目标是:

使用集群技术为Linux构建高性能、高可用性的服务器,并提供良好的可扩展性,可靠性和可维护性。

LVS基础概念

常用术语

  • VS = Virtual Server,前端的调度服务器,也叫做Director(指挥机)
    • VIP = Virtual IP,VS的外网IP
    • DIP = Director IP,VS的内网IP
  • RS = Real Server,后端真正提供服务的服务器
    • RIP = Real server IP
  • CIP = Client IP,客户端的IP地址

组成部分

  • ipvs
    • 工作于内核空间Netfilter模块的INPUT钩子上的框架
      • 因此,尽量不要设置iptables规则,避免干扰LVS
    • 查询LVS集成到内核的模块
      • grep -A10 -i ipvs /boot/config-$(uname -r)
  • ipvsadm
    • 用户空间的命令行工具,规则管理器

工作原理

LVS官方支持三种工作模式:NAT,DR,TUN。

FULLNAT是阿里二次开发的,必须编译内核才能使用,操作相对繁琐。

LVS-NAT

官方提供的LVS-NAT工作原理图如下:

lvs-nat principle

简单来说,LVS-NAT模式就是对用户请求数据包进行目标地址转换(DNAT),具体的转换过程如下图,每一步被转换的地址和端口都用红色字体标示:

how lvs-nat changes packets

由于请求数据包和响应数据包都要经过VS做地址转换,因此NAT模式的性能是最弱的,它的优势在于实现过程很简单。

LVS-DR

LVS-DR是LVS的默认工作模式,DR = Direct Routing(直接路由)。官方同样提供了工作原理图,但非常简略,只是反映了两点:

  • VS必须和RS在同一个物理网络。
  • 响应数据包由RS直接发给客户端,不经过VS。这也是DR这个名称的由来。

lvs-dr principle

要实现直接路由,关键是VS要修改用户请求数据包的MAC地址。说来简单,但实现DR的过程比NAT复杂。

lvs-dr changes mac addresses

LVS-TUN

TUN是Tunnel(隧道)的缩写,官方原理图如下:

lvs-tun principle

LVS-TUN模式的关键是,VS会把用户请求数据包再封装一个IP首部,因此可以允许VS和RS不处于同一个物理网络,而是可以跨广域网。

lvs-tun encapsulates another ip header

对比

这几种模式的大致区别如下:

LVS-NAT LVS-DR LVS-TUN LVS-FULLNAT
网络 LAN LAN LAN/WAN LAN/WAN
RS操作系统 不限 支持Non-ARP Device 支持Tunnel Linux,需要编译内核
RS数量 低(10-20) 高(100) 高(100)
RS网关 VS DIP RS路由器 RS路由器 一般不会指向DIP
请求报文 修改目标IP 修改目标MAC 增加一个IP首部 修改源IP、目标IP
响应报文 发给VS 发给客户端 发给客户端 发给VS

LVS调度算法

LVS共有10种调度算法,分为静态和动态两类:

静态调度算法:不考虑RS的负载

  • RR = Round Robin
  • WRR = Weighted Round Robin
  • SH = Source Hashing
  • DH = Destination Hashing

动态调度算法:考虑RS的负载,负载小的被调度

  • LC = Least Connections
    • Overhead = ActiveConns * 256 + InactiveConns
    • InactiveConns:建立了TCP连接,但没有传输数据
    • 适用于长连接应用
  • WLC = Weighted LC(默认调度方法)
    • Overhead = ( ActiveConns * 256 + InactiveConns ) / weight
    • 如果RS都没有活动连接,将随机挑选
  • SED = Shortest Expection Delay
    • Overhead = ( ActiveConns + 1 ) * 256 / weight
    • 解决WLC的不足,如果RS都没有活动连接,高权重优先
  • NQ = Never Queue
    • 解决SED的不足,首先调度空闲的RS,没有空闲的则SED
  • LBLC = Locality-Based LC
    • 算法官方中文名称:基于局部性的最少链接
    • 「基于局部性的最少链接」调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。
    • 该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用「最少链接」的原则选出一个可用的服务器,将请求发送到该服务器。
  • LBLCR = LBLC with Replication
    • 带复制功能的LBLC
    • 解决LBLC负载不均衡问题,从负载重的RS复制到负载轻的RS

实现LVS-NAT

环境

IP 用途 服务器应用程序 安装命令
VIP: 10.0.0.71
DIP: 172.16.125.71
负载均衡调度器 VS ipvsadm yum install ipvsadm
RIP1: 172.16.125.72 后端服务器 RS1 httpd yum install httpd
RIP2: 172.16.125.73 后端服务器 RS2 httpd yum install httpd
CIP: 10.0.0.61 客户端

网络拓扑:

lvs-nat

配置RS

绑定IP地址、添加网络路由:

ip a add 172.16.125.72/24 dev ens33
ip r add 10.0.0.0/24 via 172.16.125.71

也可以直接添加默认网关:

vim /etc/sysconfig/network-scripts/ifcfg-ens33
GATEWAY=172.16.125.71

# 重启网卡
ifdown ens33
ifup ens33

安装httpd:

yum install httpd -y

准备web页面、启动httpd:

echo 'Real server at 172.16.125.72' > /var/www/html/index.html
systemctl start httpd

对于RS2,只需要把上面所有步骤中的172.16.125.72改为172.16.125.73即可。

配置VS

绑定IP地址:

ip a add 10.0.0.71/24 dev ens33
ip a add 172.16.125.71/24 dev ens33

开启IPv4转发:

echo 1 > /proc/sys/net/ipv4/ip_forward

安装ipvsadm:

yum install ipvsadm -y

添加ipvs规则:

ipvsadm -A -t 10.0.0.71:80 -s wrr
ipvsadm -a -t 10.0.0.71:80 -r 172.16.125.72:80 -m
ipvsadm -a -t 10.0.0.71:80 -r 172.16.125.73:80 -m -w 2

-s wrr表示使用的调度算法是Weighted Round Robin。

-m表示Masquerading(伪装),也就是指定工作模式为LVS-NAT

配置客户端并测试

绑定IP地址:

ip a add 10.0.0.61/24 dev eth3

测试:

$ for i in {1..60}; do curl -s 10.0.0.71; done | sort | uniq -c
     20 Real server at 172.16.125.72
     40 Real server at 172.16.125.73

可以看到,RS2(172.16.125.73)被调度的次数是RS1的2倍,因为RS2的权重(-w 2)是RS1的2倍。

Leave A Comment