一.LVS简介
LVS 是 Linux Virtual Server 的简写,也就是 Linux 虚拟服务器,是一个虚拟的服务器集群系统,本项目在 1998 年 5 月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。LVS 实际上相当于基于 IP 地址的虚拟化应用,为基于 IP 地址和内容请求分发的负载均衡提出了高效的解决方法,现在 LVS 已经是 Linux 内核标准的一部分。
用处:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,具有良好的可靠性、可扩展性和可操作性,从而以低廉的成本实现最优的性能
二.集群和分布式简介
2.1集群Cluster
Cluster: 集群是为了解决某个特定问题将堕胎计算机组合起来形成的单个系统
Cluster常见的三种类型
1.负载均衡集群(LoadBalancing):简称LB,由多个主机组成,每个主机只承担一部分访问,以此来提高系统的整体性能
2.高可用性集群(High Availiablity):简称HA,以减少服务中断时间为目的的服务器集群技术。它通过保护用户的业务程序对外不间断提供的服务,把因软件/硬件/人为造成的故障对业务的影响降低到最小程度
3.高性能计算性集群(High-performance computing):简称HPC,也称为DAS(数据分析超级计算机),是由LexisNexis风险解决方案开发的开源,数据密集型计算系统平台。HPCC平台整合了在商品计算集群上实现的软件架构,为使用大数据的应用程序提供高性能的数据并行处理
2.2分布式
分布式即将一个任务拆分为多个任务或将不同的任务部署在多台计算机上共同完成任务,以此来提高系统的性能
2.3集群和分布式
集群:同一个业务系统,部署在多台服务器上,集群中,每一台服务器实现的功能没有差别,数据 和代码都是一样的
分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式 中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起 来,才是完整的业务
区别:分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数 来提升效率,
对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器 完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决 定由给哪一台去完成响应,并且台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点, 都完成不同的业务,如果一个节点垮了,那这个业务可能就会失败
三.lvs(Linux virtual server)运行原理
3.1.LVS概念
VS:Virtual Server,lvs服务的逻辑名称,也就是我们外部访问lvs集群时使用的ip地址和端口
RS:Real Server,集群中的真实服务器,用来接收转发来的请求,并且响应结果
CIP:Client IP,客户端的ip地址,发起请求的客户端地址
VIP: Virtual serve IP , lvs集群使用的ip地址,对外提供集群访问的虚拟ip地址
DIP: Director IP ,调度器在集群当中的地址,用于和RS通信
RIP: Real server IP, 后端服务器在集群当中的ip地址
3.2.lvs集群的类型
lvs-nat: 修改请求报文的目标IP,多目标IP的DNAT
lvs-dr: 操纵封装新的MAC地址
lvs-tun: 在原请求IP报文之外新加一个IP首部
lvs-fullnat: 修改请求报文的源和目标IP
3.2.1.nat模式
在nat模式下,lvs会将来自客户端请求报文中的目标ip地址和端口,修改为lvs内部的ip地址和端口。然后把请求转发到后端服务器。响应结果返回客户端的过程中,响应报文经过lvs的处理,把目标ip和端口修改成客户端的ip地址和端口。
优点:对于客户端来说,请求的目标地址始终不变,客户端的配置不需要做特殊修改,只是调度器在对ip和端口进行转换,后端的服务器也不需要更改任何配置。
缺点:性能损失,请求和响应都需要调度器做地址转换,影响性能,
3.2.2.nat模式数据逻辑
1.客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP)访问目标端口 (9000port)
2.VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口 3.RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口 (9000port)
4.VS服务器接收到响应数据包,改变包中的数据来源(RIP1-->VIP),响应目标端口(9000-->80)
5.VS服务器把修改过报文的响应数据包回传给客户端
6.lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞
客户请求到达vip后进入PREROUTING,在没有ipvs的时候因该进入本机INPUT,当IPVS存在后访问请求在通 过PREROUTING后被ipvs结果并作nat转发
因为ipvs的作用点是在PREROUTING和INPUT链之间,所以如果在prerouting中设定规则干扰ipvs的工 作。所以在做lvs时要把iptables的火墙策略全清理掉
特点:
rs应该和dip应该使用私网地址,且rs的网关要指向dip;
请求和响应报文都要经路由director转发,极高负载的场景中,director可能称为系统瓶颈,因为需要在这里对目标ip进行装换.
支持端口映射.
rs可以使用任意的操作系统
rs的rip和director的dip必须同一ip网络
缺陷:对Director Server压力会比较大,请求和响应都需经过director server,director往往会成为系统的性能瓶颈
3.2.3DR模式
DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行 转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源 IP/PORT,以及目标IP/PORT均保持不变
DR实现过程:
1.当客户端用户发送请求给 www.baidu.com 网站时,首先经过 DNS 解析到 IP 后并向百度服务器发送请求,数据包经过网络到百度 LVS 负载均衡服务器。
这时到达 LVS 网卡时的数据包包括:源 IP 地址(客户端地址)、目的 IP 地址(百度对外服务器 IP 地址,也就是 VIP)、源 MAC 地址(CMAC / LVS 连接路由器的 MAC 地址)、目标 MAC 地址(VMAC / VIP 对应的 MAC 地址)。
2.数据包到达网卡后,经过链路层到达 PREROUTING 链,进行查找路由,发现目的 IP 是 LVS 的 VIP,这时就会发送至 INPUT 链中并且数据包的 IP 地址、MAC 地址、Port 都未经过修改。
3.数据包到达 INPUT 链中,LVS 会根据目的 IP 和 Port(端口)确认是否为 LVS 定义的服务。
如是定义过的 VIP 服务,会根据配置的服务信息,从 RealServer 中选择一个后端服务器 RS1,然后 RS1 作为目标出方向的路由,确定下一跳信息及数据包通过具体的哪个网卡发出,最好将数据包通过 INET_HOOK 到 OUTPUT 链中。
4.数据包通过 POSTROUTING 链后,目的 MAC 地址将会修改为 RealServer 服务器 MAC 地址(RMAC)源 MAC 地址修改为 LVS 与 RS 同网段的 IP 地址的 MAC 地址(DMAC)此时,数据包将会发至 RealServer 服务器。
5.数据包到达 RealServer 服务器后,发现请求报文的 MAC 地址是自己的网卡 MAC 地址,将会接受此报文,待处理完成之后,将响应报文通过 lo 接口传送给 eth0 网卡然后向外发出。
此时的源 IP 地址为 VIP,目标 IP 为 CIP,源 MAC 地址为 RS1 的 RMAC,目的 MAC 地址为下一跳路由器的 MAC 地址(CMAC),最终数据包通过 RS 相连的路由器转发给客户端。
特点:
1.Director和各RS都配置有VIP
2.确保前端路由器将目标IP为VIP的请求报文发往Director
3.在前端网关做静态绑定.在rs上使用arptables/( arptables,linux命令,用于过滤arp包。
4.RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;
5.RIP的网关不能指向DIP,以确保响应报文不会经由Director
6.RS和Director要在同一个物理网络
7.请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client 8.不支持端口映射
缺点:rs和ds必须同一机房中,因为它是由二层协议进行转发的,根据mac地址来进行匹配寻址
3.2.4TUN模式
IP 隧道:IP Tunnel,简称:TUN 模式,采用开放式的网络结构,负载调度器作为客户机的访问入口,各节点通过各自的 Internet 连接直接回应给客户机,而不经过负载调度器,服务器节点分散在互联网中的不同位置,有独立的公网 IP 地址,通过专用 IP 隧道与负载调度器相互通信。
实现原理:在原有的ip报文外在封装多一层的ip首部,内部ip首部(原地址为cip,目标ip为vip),外层ip首部原地址为dip,.目标地址为rip
1.客户端发送数据包经过网络后到 LVS 网卡,数据包源 IP 为 CIP,目的 IP 为 VIP。
2.进入 PREROUTING 链后,会根据目的 IP 去查找路由,确定是否为本机 IP,数据包将转发至 INPUT 链中,到 LVS,源 IP 和 目的 IP 不变。
3.到 LVS 后,通过目的 IP 和目的 PORT 查找是否为 IPVS 服务,如是 IPVS 服务,将会选择一个 RS 后端服务器, 源 IP 为 DIP,目标 IP 为 RIP,数据包将会转发至 OUTPUT 链中。
4.数据包根据路由信息到达 LVS 网卡,发送至路由器网关,最终到达后端服务器。
5.后端服务器收到数据包后,会拆掉最外层的 IP 地址后,会发现还有一层 IP 首部,源 IP 为 CIP,目的 IP 为 VIP,TUNL0 上配置 VIP,查找路由后判断为本机 IP 地址,将会发给用户空间层的应用程序响应后 VIP 为源 IP,CIP 为目的 IP 数据包发送至网卡,最终返回至客户端用户。
特点:
1.DIP, VIP, RIP都应该是公网地址
2.RS的网关一般不能指向DIP
3.请求报文要经由Director,但响应不能经由Director
4.不支持端口映射
5.RS的OS须支持隧道功能
3.2.5.LVS模式总结
NAT模式 | DR模式 | TUN模式 | |
RS操作系统 | 不限 | 支持隧道 | 禁止arp |
调度器和服务器网络 | 可跨网络 | 可跨网络 | 不可跨网络 |
调度服务器数量 | 少 | 多 | 多 |
RS服务器网关 | 指向到调度器DIP | 指向到路由 | 指向到路由 |
lvs-nat与lvs-fullnat:请求和响应报文都经由Director
lvs-nat:RIP的网关要指向DIP
lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信
lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信
3.3.LVS的调度算法
3.3.1.LVS的调度算法类型
ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态被分为两种:静态方法和动态方法
静态方法:仅根据算法本身进行调度,不考虑RS的负载情况
动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
3.3.2.lvs静态调度算法
RR:roundrobin 轮询 RS分别被调度,当RS配置有差别时不推荐
WRR:Weighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往 第一次挑中的RS,从而实现会话绑定
DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请 求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡
3.3.3.lvs动态调度算法
主要根据RS当前的负载状态及调度算法进行调度Overhead=value较小的RS会被调度
LC:least connections(最少链接发) 适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活 动链接数)
WLC:Weighted LC(权重最少链接) 默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
SED:Shortest Expection Delay, 初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight 但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接
NQ:Never Queue,第一轮均匀分配,后续SED
LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制 到负载轻的RS
四.lvs部署命令介绍
4.1.lvs软件相关信息
程序包:ipvsadm Unit File: ipvsadm.service
主程序:/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save
规则重载工具:/usr/sbin/ipvsadm-restore
配置文件:/etc/sysconfig/ipvsadm-config
ipvs调度规则文件:/etc/sysconfig/ipvsadm
4.2.ipvsadm命令
命令 | 说明 |
-C | 清空 |
-R | 重载 |
-S | 保存 |
-D | 删除 |
-A | 添加 |
-E | 更改 |
-r | realserver地址 |
-L | 查看配置 |
ipvsadm -A -t|u IP地址:端口号 -s [算法]
#添加虚拟服务器,协议为tcp(-t)或者udp(-u)
ipvsadm -E -t|u IP地址:端口号 -s [算法]
#修改虚拟服务器,协议为tcp或udp
ipvsadm -D -t|u IP地址:端口号
#删除虚拟服务器,协议为tcp或udp
ipvsadm -a -t|u IP地址:端口号 -r IP地址 [-g|i|m] [-w 权重]
#添加真实服务器,-g(DR模式)、-i(隧道模式)、-m(NAT模式)
ipvsadm -e -t|u IP地址:端口号 -r IP地址 [-g|i|m] [-w 权重]
#修改真实服务器
ipvsadm -d -t|u IP地址:端口号 -r IP地址
#删除真实服务器
ipvsadm -Ln #查看LVS规则表
4.3.lvs集群中的增删改
1.管理集群服务中的增删改
命令 | 说明 |
-A | 添加 |
-E | 修改 |
-t | tcp服务 |
-u | udp服务 |
-s | 指定调度算法,默认为WLC |
-p | 设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver |
-f | firewall mask 火墙标记,是一个数字 |
2.管理集群中RealServer的增删改
命令 | 说明 |
-a | 添加realserver |
-e | 更改realserver |
-t | tcp协议 |
-u | udp协议 |
-f | 火墙 标签 |
-r | realserver地址 |
-g | 直连路由模式 |
-i | ip隧道模式 |
-m | nat模式 |
-w | 设定权重 |
-Z | 清空计数器 |
-C | 清空lvs策略 |
-L | 查看lvs策略 |
-n | 不做解析 |
-rate | 输出速率信息 |
五.实验模拟
5.1部署NAT模式集群案例
1.Director 服务器采用双网卡,一个是桥接网卡连接外网,一个是仅主机网卡与后端Web服务器相连
2.Web服务器采用仅主机网卡与director相连
3.Web服务器网关指向192.168.0.100
4.后端web服务器不需要连接外网
5.1.1实验环境
主机 | ip | vip |
lvs | 192.168.0.100 | 172.25.254.100 |
webserver1 | 192.168.0.10 | null |
webserver2 | 192.68.0.20 | null |
lvs:
webserver1:
webserver2:
在webserver1和webserver2上下载httpd服务
dnf install httpd -y
在lvs中打开内核路由
启动httpd
[root@webserver1 ~]# echo webserver1 - 192.168.0.10 > /var/www/html/index.html
[root@webserver1 ~]# systemctl enable --now httpd
[root@webserver2 ~]# echo webserver2 - 192.168.0.20 > /var/www/html/index.html
[root@webserver2 ~]# systemctl enable --now httpd
测试环境是否能用
在lvs中安装ipvsadm
[root@lvs ~]# dnf install ipvsadm -y
指令编写
[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@lvs ~]# 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
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@lvs ~]# 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
-> 192.168.0.10:80 Masq 1 0 0
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
[root@lvs ~]# 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
-> 192.168.0.10:80 Masq 1 0 2
-> 192.168.0.20:80 Masq 1 0 0
测试:
5.2.DR模式集群案例
5.2.1实验环境
主机 | ip | vip |
client | NAT172.25.254.200 | null |
router | NAT172.25.254.100 主机192.168.0.100 | null |
lvs | 192.168.0.50 | 192.168.0.200 |
webserver1 | 192.168.0.10 | 192.168.0.100 |
webserver2 | 192.168.0.20 | 192.168.0.100 |
lvs:
router:
client:
禁用webserver1和webserver2的arp:
webserver1:
webserver2:
ipvsadm策略:
测试:
5.3.防火墙标签解决轮询错误
以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题。
环境:
[root@webserver1 ~]# yum install mod_ssl -y
安装mod_ssl,然后重启httpd服务(webserver1,webserver2)
ipvsadm策略:
测试:
说明请求不合理
在lvs中为端口做标记
ipvsadm策略:
测试:
5.4.lvs持久链接
在我们客户上网过程中有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单 纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用sh算法,但是sh算法比较简单 粗暴,可能会导致调度失衡
解决方案 :在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把 这个源的主机调度到了那个RS上 如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到 同一台RS上。 如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度到其他的RS上
ipvsadm策略:
测试:
想看到效果需删除-p
[root@lvs ~]# ipvsadm -E -f 66 -s rr
因为在client主机中存在arp绑定问题