LVS基础-四种模式原理与实现

简介

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。现在 LVS 已经是 Linux 内核标准的一部分。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。

LVS集群的类型

  • lvs-nat:修改请求报文的目标IP;
  • lvs-dr:操纵封装新的MAC地址;
  • lvs-tun:在原请求IP报文之外新加一个IP首部;
  • lvs-fullnat:修改请求报文的源和目标IP;

ipvsadm命令:

ipvsadm命令:
ipvs工作在内核,ipvsadm用来管理ipvs的用户空间工具
格式:

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]               
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r server-address [options]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]

常用的命令:

新增一个集群服务

ipvsadm -A -t|u|f service-address [-s scheduler] [-p [ti meout]]
-A:新增一个集群服务
service-address:一般是vip,提供给用户访问的ip
-t|u|f:
        -t: TCP协议的端口,VIP:TCP_PORT
        -u: UDP协议的端口,VIP:UDP_PORT
        -f:firewall MARK,是一个数字;
-s:调度方法,默认wlc
-p:持久链接时间

删除一个集群服务

ipvsadm -D -t|u|f service-address
-t|u|f:
        -t: TCP协议的端口,VIP:TCP_PORT
        -u: UDP协议的端口,VIP:UDP_PORT
        -f:firewall MARK,是一个数字;

在集群中新增一个RS

ipvsadm -a -t|u|f service-address -r server-address [-g|i|m] [-w weight]

-a:在集群中新增一个RS
-t|u|f:
        -t: TCP协议的端口,VIP:TCP_PORT
        -u: UDP协议的端口,VIP:UDP_PORT
        -f:firewall MARK,是一个数字;
 -r server-address :后端Real server ip
 [-g|i|m]: 
       -g:gateway, dr类型
       -i: ipip, tun类型
       -m: masquerade, nat类型
-w:指定权重

从集群中删除某个RS

ipvsadm -d -t|u|f service-address -r server-address

-d:删除
-t|u|f:
        -t: TCP协议的端口,VIP:TCP_PORT
        -u: UDP协议的端口,VIP:UDP_PORT
        -f:firewall MARK,是一个数字;
 -r server-address :后端Real server ip

清空定义的所有内容

ipvsadm -C

查看:

ipvsadm -L|l [options]
options:
        --numeric, -n:用数字的格式输出ip和端口
        --exact:expand numbers (display exact values)
        --connection, -c:输出当前ipvs连接
        --stats:输出状态信息
        --rate :查看速率

保存和重载:

ipvsadm -S  #保存规则
ipvsadm -R  #重载规则

相关术语

  • DS:Director Server。指的是前端负载均衡器节点。
  • RS:Real Server。后端真实的工作服务器。
  • VIP:Virtual ip向外部直接面向用户请求,作为用户请求的目标的IP地址。
  • DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
  • RIP:Real Server IP,后端服务器的IP地址。
  • CIP:Client IP,访问客户端的IP地址。

调度方法

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

nat模式

这里写图片描述
过程

  1. 当用户访问Director Server,数据包会先进入内核空间的PREPOUTING链,这时候源ip地址为cip(用户自己的ip),目的ip为vip
  2. 在PREPOUTING链上检查发现,vip是自己,于是发送到内核空间的INPUT链
  3. ipvs工作在INPUT链上,发现vip是集群服务。修改数据包的目的ip为后端服务器的rip(后端服务器可以不止一个,上图只是假设分配给了第一台real server)然后发送数据包到POSTROUTING链
  4. Director Server将数据包发送到rip1
  5. rip1收到请求做出处理,构建响应报文,此时数据包源地址为rip1,目的地址为cip
  6. 当响应的数据包到达Director Server,Director Server会自动将源ip改为vip,这时候返回给用户的报文源ip为vip,目的ip为cip

nat模式特点

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

实验测试:
拓扑图
这里写图片描述

DIP:192.168.253.141
RIP1:192.168.253.140
RIP2:192.168.253.129

实验内容:负载均衡一个web服务。RS1和RS2提供web服务。DR负责将请求分发到2个RS上,因为是校园网,没办法使用桥接网络。所以这里DR服务器上DIP和VIP都是192.168.253.141

第一步:现在DR上下载ipvsadm,ipvs的用户空间管理工具

yum install ipvsadm

第二步:在DR上新建一个集群服务

##新建一个集群服务
ipvsadm -A -t 192.168.253.141:80 -s rr  
##添加2个RS
ipvsadm -a -t 192.168.253.141:80 -r 192.168.253.140:80 -m -w 1
ipvsadm -a -t 192.168.253.141:80 -r 192.168.253.129:80 -m -w 1

第三步:在RS1和RS2上搭建web服务。

RS1:
yum install httpd
echo "192.168.253.140" > /var/www/html/index.html
systemctl  start httpd

RS2:
yum install httpd
echo "192.168.253.129" > /var/www/html/index.html
systemctl  start httpd

第四步:测试
这里写图片描述
成功。

DR模式

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

这里写图片描述

过程:

  1. 用户发送请求到DR,首先进入DR内核空间的PREROUTING链,检查发现VIP是自己,于是将数据包发送到INPUT链
  2. INPUT链上工作着ipvs,检查是否是集群服务,如果是则将目标MAC地址修改为后端服务Real server的mac地址,然后将数据包发送到POSTROUTING链,此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RS的MAC地址
  3. 当RS收到数据包的时候,拆开的时候,发现mac是自己,于是接受报文发往INPUT链再到用户空间处理,然后将响应报文发送出去。这里不需要将数据包发送到DR,可以通过别的网卡出去。 此时的源IP地址为VIP,目标IP为CIP,源MAC地址为RSMAC,目的MAC地址为CMAC
  4. 数据包到达客户端

DR模式特点:

  1. 确保前端路由器将目标IP为VIP的请求报文发往Director,因为RS和DR都拥有VIP,如果前端的路由器发起arp广播询问谁是VIP拥有者,这时候如果DR和RS都应答自己拥有VIP就会出现争抢。导致DR无法正常分配请求给后端RS。解决的方法有几种

    • 在前端网关做静态绑定,将VIP的mac绑定在DR上
    • 在RS上使用arptables;在arp的层次上实现在ARP解析时做防火墙规则,过滤RS响应ARP请求。缺点:配置麻烦,复杂
    • 在RS上修改内核参数(arp_announce,arp_ignore)以限制arp通告及应答级别;(最常用)
      限制响应级别:arp_ignore
      0:默认值,表示可使用本地任意接口上配置的任意地址进行响应;
      1: 仅在请求的目标IP配置在本地主机的接收到请求报文接口上时,才给予响应;
      限制通告级别:arp_announce
      0:默认值,把本机上的所有接口的所有信息向每个接口上的网络进行通告;
      1:尽量避免向非直接连接网络进行通告;
      2:必须避免向非本网络通告;
  2. RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director;

  3. RS跟Director要在同一个物理网络;
  4. 请求报要文经由Director,但响应不能经由Director,而是由RS直接发往Client;
  5. 不支持端口映射;

实验测试:
环境:
DR:
VIP:192.168.253.192
DIP:192.168.253.141
RS1:
VIP:192.168.253.192(lo:0接口上)
RIP1:192.168.253.140
RS2:
VIP:192.168.253.192(lo:0接口上)
RIP1:192.168.253.129

第一步:在DR上设置VIP

ifconfig ens33:0 192.168.253.192 up

第二步:在DR上创建集群服务

ipvsadm -A -t 192.168.253.192:80 -s rr
ipvsadm -a -t 192.168.253.192:80 -r 192.168.253.129 -g  -w 1
ipvsadm -a -t 192.168.253.192:80 -r 192.168.253.140 -g  -w 1

第三步:在RS1上配置VIP,修改内核参数

配置VIP
ifconfig lo:0 192.168.253.192/32   up
修改内核参数
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/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

第四步:在RS2上配饰VIP,修改内核参数

ifconfig lo:0 192.168.253.192/32   up
修改内核参数
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/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

第五步:测试,别的服务器上测试
这里写图片描述

根据这个过程我们可以作2个脚本,一个用于DR配置,另一个用于RS配置
DR端配置脚本

#!/bin/bash
#
vip='192.168.253.192'
iface='en33:0'
mask='255.255.255.255'
port='80'
rs1='192.168.253.140'
rs2='192.168.253.129'
scheduler='rr'
type='-g'

case $1 in
start)
    ifconfig $iface $vip netmask $mask broadcast $vip up
    iptables -F

    ipvsadm -A -t ${vip}:${port} -s $scheduler
    ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
    ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
    ;;
stop)
    ipvsadm -C
    ifconfig $iface down
    ;;
*)
    echo "Usage $(basename $0) start|stop"
    exit 1
    ;;
esac    

RS端配置脚本

#!/bin/bash
#
vip=192.168.253.192
mask='255.255.255.255'

case $1 in
start)
    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/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

    ifconfig lo:0 $vip netmask $mask broadcast $vip up
    route add -host $vip dev lo:0
    ;;
stop)
    ifconfig lo:0 down

    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

    ;;
*) 
    echo "Usage $(basename $0) start|stop"
    exit 1
    ;;
esac    

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) 请求报文要经由Director,但响应不能经由Director;
(4) 不支持端口映射;
(5) RS的OS得支持隧道功能;

fullnat模式(不常用)

通过同时修改请求报文的源IP地址和目标IP地址进行转发;此类型默认不支持;

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

参考:
https://www.cnblogs.com/lipengxiang2009/p/7451050.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值