LVS

简介

LVS 是 Linux Virtual Server 的简称,也就是 Linux 虚拟服务器 , 是一个由章文嵩博士发起的自由软件项
目,它的官方站点是 www.linuxvirtualserver.org 。
现在 LVS 已经是 Linux 标准内核的一部分,在 Linux2.4 内核以前,使用 LVS 时必须要重新编译内核以
支持 LVS 功能模块,但是从 Linux2.4 内核以后,已经完全内置了 LVS 的各个功能模块,无需给内核打
任何补丁,可以直接使用 LVS 提供的各种功能。
LVS 主要用于服务器集群的负载均衡。其优点有:

  • 工作在网络层,可以实现高性能,高可用的服务器集群技术。
  • 廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。
  • 易用,配置非常简单,且有多种负载均衡的方法。
  • 稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。
  • 可扩展性也非常好。

安装配置

linux 内核 2.4 版本以上的基本都支持 LVS ,要使用 lvs ,只需要再安装一个 lvs 的管理工具: ipvsadm
yum install ipvsadm

ipvsadm 用法
其实 LVS 的本身跟 iptables 很相似 , 而且连命令的使用格式都很相似 , 其实 LVS 是根据 iptables 的框架开
发的 , 那么 LVS 的本身分成了两个部分:
第一部分是工作在内核空间的一个 IPVS 的模块,其实 LVS 的功能都是 IPVS 模块实现的,
第二部分是工作在用户空间的一个用来定义集群服务的一个工具 ipvsadm, 这个工具的主要作用是将管理员
定义的集群服务列表传送给工作在内核空间中的 IPVS 模块,下面来简单的介绍下 ipvsadm 命令的用法
ipvsadm 组件定义规则的格式:
virtual-service-address: 是指虚拟服务器的 ip 地址
real-service-address: 是指真实服务器的 ip 地址
scheduler :调度方法
ipvsadm 的用法和格式如下:

ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p[timeout]] [-M netmask]
ipvsadm -D -t|u|f virtual-service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface]
ipvsadm --stop-daemon
ipvsadm -h

命令选项解释:有两种命令选项格式,长的和短的,具有相同的意思。在实际使用时,两种都可以。

-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 # 说明虚拟服务器提供的是 tcp 的服务 [vip:port] or [real-server-ip:port]
-u --udp-service service-address # 说明虚拟服务器提供的是 udp 的服务 [vip:port] or [real-server-
ip:port]
-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 # 子网掩码
-r --real-server server-address # 真实的服务器 [Real-Server:port]
-g --gatewaying 指定 LVS 的工作模式为直接路由模式(也是 LVS 默认的模式)
-i --ipip # 指定 LVS 的工作模式为隧道模式
-m --masquerading # 指定 LVS 的工作模式为 NAT 模式
-w --weight weight # 真实服务器的权值
--mcast-interface interface # 指定组播的同步接口
-c --connection # 显示 LVS 目前的连接 如: ipvsadm -L -c
--timeout # 显示 tcp tcpfin udp 的 timeout 值 如: ipvsadm -L --timeout
--daemon # 显示同步守护进程状态
--stats # 显示统计信息
--rate # 显示速率信息
--sort # 对虚拟服务器和真实服务器排序输出
--numeric -n # 输出 IP 地址和端口的数字形式

LVS 三种工作模式:NAT(地址转换)、DR(直接路由)、TUN(隧道)

DR:直接路由

架构图
这里写图片描述
工作方式:
1, 首先用户用 CIP 请求 VIP
2, 根据上图可以看到,不管是 Director Server 还是 Real Server 上都需要配置 VIP,那么当用户请求
到达我们的集群网络的前端路由器的时候,请求数据包的源地址为 CIP 目标地址为 VIP,
此时路由器会发广播问谁是 VIP,那么我们集群中所有的节点都配置有 VIP,此时谁先响应路由器那么路由
器就会将用户请求发给谁,这样一来我们的集群系统是不是没有意义了,
那我们可以在网关路由器上配置静态路由指定 VIP 就是 Director Server,或者使用一种机制不让
Real Server 接收来自网络中的 ARP 地址解析请求,这样一来用户的请求数据包都会经过 Director
Servrer
3,当 Director Server 收到用户的请求后根据此前设定好的调度算法结果来确定将请求负载到某台 Real
Server 上去,假如说此时根据调度算法的结果,会将请求负载到 RealServer 1 上面去,
此时 Director Server 会将数据帧中的目标 MAC 地址修改为 Real Server1 的 MAC 地址,然后再将数
据帧发送出去
4,当 Real Server1 收到一个源地址为 CIP 目标地址为 VIP 的数据包时,Real Server1 发现目标地址为
VIP,而 VIP 是自己,于是接受数据包并给予处理,当 Real Server1 处理完请求后,
会将一个源地址为 VIP 目标地址为 CIP 的数据包发出去,此时的响应请求就不会再经过 Director
Server 了,而是直接响应给用户。
实验环境:
Director Server : server1 eth0 DIP:172.25.254.1/16
eth0:0 VIP:172.25.254.100/24
Gateway:172.25.254.1
Real Server1 : server2 eth0:172.25.254.2/16
lo:0 VIP:172.25.254.100
Gateway:172.25.254.1
Real Server2 : server3 eth0:172.25.254.3/16
lo:0 VIP:172.25.254.100Gateway:172.25.254.1
部署
在 Server2 和 Server3 上做以下配置

# 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
#以上命令需填加到/etc/rc.local 文件中让其开机自动生效
# vim /etc/sysconfig/network-scripts/ifcfg-lo:0 内容如下
DEVICE=lo:0
IPADDR=172.25.254.100
NETMASK=255.255.255.255
BROADCAST=172.25.254.100
ONBOOT=yes
NAME=loopback

#ifdown lo:0
#ifup lo:0
#route add -host 172.25.254.100 dev lo:0
#echo "route add -host 172.25.254.100 dev lo:0" >> /etc/rc.local

在 Server1 上做以下配置

# vim /etc/sysconfig/network-scripts/ifcfg-eth0:0 内容如下
DEVICE=eth0:0
IPADDR=172.25.254.100
NETMASK=255.255.255.255
BROADCAST=172.25.254.100
ONBOOT=yes
#命令
# ifdown eth0:0
# ifup eth0:0
# route add -host 172.25.254.10 dev eth0:0
# echo "route add -host 172.25.254.100 dev eth0:0" >> /etc/rc.local
# echo "1" > /proc/sys/net/ipv4/ip_forward
# echo "echo "1" > /proc/sys/net/ipv4/ip_forward" >> /etc/rc.local
# ipvsadm -A -t 172.25.254.100:80 -s wlc
# ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.2 -g -w 2
# ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.3 -g -w 1

测试:
这里写图片描述
成功!

NAT(地址转换):

这个是通过网络地址转换的方法来实现调度的。首先调度器(LB)接收到客户的请求数据包时(请求的目
的 IP 为 VIP),根据调度算法决定将请求发送给哪个 后端的真实服务器(RS)。然后调度就把客户端发
送的请求数据包的目标 IP 地址及端口改成后端真实服务器的 IP 地址(RIP),这样真实服务器(RS)就
能够接收到客户的请求数据包了。真实服务器响应完请求后,查看默认路由(NAT 模式下我们需要把 RS
的默认路由设置为 LB 服务器。)把响应后的数据包发送 给 LB,LB 再接收到响应包后,把包的源地址改
成虚拟地址(VIP)然后发送回给客户端。
原理图简述:
1) 客户端请求数据,目标 IP 为 VIP
2) 请求数据到达 LB 服务器, LB 根据调度算法将目的地址修改为 RIP 地址及对应端口(此 RIP 地址是
根据调度算法得出的。)并在连接 HASH 表中记录下这个连接。
3) 数据包从 LB 服务器到达 RS 服务器 webserver ,然后 webserver 进行响应。 Webserver 的网关必须是
LB ,然后将数据返回给 LB 服务器。
4) 收到 RS 的返回后的数据,根据连接 HASH 表修改源地址 VIP& 目标地址 CIP ,及对应端口 80. 然后数
据就从 LB 出发到达客户端。
5) 客户端收到的就只能看到 VIP\DIP 信息。
NAT 模式优缺点:
1 、 NAT 技术将请求的报文和响应的报文都需要通过 LB 进行地址改写,因此网站访问量比较大的时候
LB 负载均衡调度器有比较大的瓶颈,一般要求最多之能 10-20 台节点
2 、只需要在 LB 上配置一个公网 IP 地址就可以了。
3 、每台内部的节点服务器的网关地址必须是调度器 LB 的内网地址。
4 、 NAT 模式支持对 IP 地址和端口进行转换。即用户请求的端口和真实服务器的端口可以不一致。
实验环境:
LB 服务器: server1 eth0:172.25.254.1
VIP:172.25.1.254
Gateway:172.25.254.1
RealServer1:server2:172.25.254.2
Gateway:172.25.254.1
RealServer2:server3:172.25.254.3
Gateway:172.25.254.1
部署:
Server1:
开启路由机制
vim /etc/sysctl.conf
这里写图片描述

[root@server1 ~]# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
加载 nat 模块
modprobe iptable_nat
注 : 如果不加载此模块 , 也可以在第一次访问时成功 , 但是会在再次访问时出现延迟过长 , 或访问超
时现象
加载 rule
ipvsadm -A -t 172.25.1.254:80 -s rr
ipvsadm -a -t 172.25.1.254:80 -r 172.25.254.2:80 -m
ipvsadm -a -t 172.25.1.254:80 -r 172.25.254.3:80 -m
保存 rule
service ipvsadm save
[root@server1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port   Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 rr
-> 172.25.254.2:80  Masq    1 0 0
-> 172.25.254.3:80  Masq    1 0 0

邦定 vip
ifconfig eth0:0 172.25.1.254 netmask 255.255.255.0 up
server2,server3:
Gateway 设置为 serverIP 即 172.25.254.1
测试:
浏览器中输入 VIP 反复刷新,每次访问到内容不同
这里写图片描述
这里写图片描述

TUN(隧道):

原理:
(a) 当用户请求到达 Director Server,此时请求的数据报文会先到内核空间的
PREROUTING 链。 此时报文的源 IP 为 CIP,目标 IP 为 VIP 。
(b) PREROUTING 检查发现数据包的目标 IP 是本机,将数据包送至 INPUT 链
(c) IPVS 比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层
IP 报文,封装源 IP 为为 DIP,目标 IP 为 RIP。然后发至 POSTROUTING 链。 此时源 IP
为 DIP,目标 IP 为 RIP
(d) POSTROUTING 链根据最新封装的 IP 报文,将数据包发至 RS(因为在外层封装多了
一层 IP 首部,所以可以理解为此时通过隧道传输)。 此时源 IP 为 DIP,目标 IP 为 RIP
(e) RS 接收到报文后发现是自己的 IP 地址,就将报文接收下来,拆除掉最外层的 IP 后,
会发现里面还有一层 IP 首部,而且目标是自己的 lo 接口 VIP ,那么此 时 RS 开始处理此
请求,处理完成之后,通过 lo 接口送给 eth0 网卡,然后向外传递。 此时的源 IP 地址为
VIP,目标 IP 为 CIP
(f) 响应报文最终送达至客户端
LVS-Tun 模型特性

  • RIP 、 VIP 、 DIP 全是公网地址
  • RS 的网关不会也不可能指向 DIP
  • 所有的请求报文经由 Director Server ,但响应报文必须不能进过 Director Server
  • 不支持端口映射
  • RS 的系统必须支持隧道

    实验环境:
    LB 服务器: server1 eth0:172.25.254.1
    VIP:172.25.254.100
    RealServer1:server2:172.25.254.2
    VIP:172.25.254.100
    RealServer2:server3:172.25.254.3
    VIP:172.25.254.100
    部署:
    Server1
    设置 VIP 调整内核参数

#ifconfig eth0:0 172.25.254.100 broadcast 172.25.254.100 netmask 255.255.255.255 up
#route add -host 172.25.254.100 dev eth0:0
#echo "0" > /proc/sys/net/ipv4/ip_forward
#echo "1" > /proc/sys/net/ipv4/conf/all/send_redirects
#echo "1" > /proc/sys/net/ipv4/conf/default/send_redirects#echo "1" > /proc/sys/net/ipv4/conf/eth0/send_redirects
ipvsadm -A -t 172.25.254.100:80 -s rr
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.2:80 -i
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.3:80 -i
ipvsadm-save
ipvsadm -Ln

Realserver 服务器上的配置:
提供服务的 RealServer1 和 RealServer2 不需要安装任何 IPVS 软件,只需要设置每台机器的 IP 地址及修改
内核参数,并开启 apache 服务器就好。

#ifconfig lo:tun 172.25.254.100 broadcast 172.25.254.100 netmask 255.255.255.255 up
#route add -host 172.25.254.100 dev lo:tun
#echo 0 > /proc/sys/net/ipv4/ip_forward
#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
#echo 0 > /proc/sys/net/ipv4/conf/lo/rp_filter
#echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter

测试:
这里写图片描述

LVS 的八种调度算法

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
与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值