必知必会----LVS高可用负载均衡技术

一、LVS 概述

1. 概念

        LVS(Linux Virtual Server)是一种基于Linux内核实现的高可用性、高性能的负载均衡技术。它可以将来自客户端的请求分发到多台服务器上再将结果汇总给用户,实现多台服务器的负载均衡,减少用户等待时间,提高整个系统的性能和可用性。就算任意/多个设备宕机不会影响业务。

2. LVS技术主要组件

  • IPVS(IP Virtual Server):工作于内核中,通过拦截并重定向传入的网络连接,将连接请求分发到后端的真实服务器。IPVS实现了负载均衡算法和网络连接管理,以确保请求在后端服务器之间均衡分发。
  • IPVSADM:工作于用户空间,是一个命令行工具,用于管理和配置IPVS。它提供了一组命令,用于添加、修改和删除虚拟服务器、后端服务器和负载均衡规则。通过IPVSADM,管理员可以在用户空间灵活地配置和管理IPVS的各个组件,以定义集群服务和后端真实服务器。
  • Keepalived:LVS的高可用组件,用于监控LVS调度器的状态并在发生故障时自动切换到备用调度器,以保证服务的高可用性。
  • VS(Virtual Server):虚拟服务器,即负载均衡器或分发器,用于接收客户端的请求并根据一定的策略将请求分发给后端服务器。
  • RS(Real Server):后端请求处理服务器,即真实服务器,负责处理来自负载均衡器的请求并返回响应。
  • CIP(Client IP):客户端IP地址,即访问集群服务的用户的IP地址。
  • VIP(Virtual IP):VS外网的IP,负载均衡器虚拟IP地址,作为用户请求的目标IP地址,对外提供服务。
  • DIP(Director IP):VS内网IP,负载均衡器本身的IP地址,主要用于和内部主机通讯。
  • RIP(Real Server IP):后端服务器的IP地址,真实服务器的IP地址。

访问流程:CIP <--> VIP == DIP <--> RIP,具体的在后面的四种工作模式里讲。

二、集群和分布式简介

1.系统性能扩展方式

Scale UP :向上扩展 , 增强
Scale Out :向外扩展 , 增加设备,调度分配问题, Cluster

2.集群Cluster

Cluster: 集群是为了解决某个特定问题将堕胎计算机组合起来形成的单个系统
Cluster 常见的三种类型:
  • LBLoadBalancing(负载均衡)由多个主机组成,每个主机只承担一部分访问
  • HA:High Availiablity(高可用)SPOFsingle Point Of failure)                                      MTBF:Mean Time Between Failure 平均无故障时间,正常时间;  MTTR:Mean Time To Restoration( repair)平均恢复前时间,故障时间  A=MTBF/(MTBF+MTTR (0,1)99%, 99.5%, 99.9%, 99.99%, 99.999% ; SLAService level agreement(服务等级协议)是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定。通常这个开销是驱动提供服务质量的主要因素。在常规的领域中,总是设定所谓的三个9,四个9来进行表示,当没有达到这种水平的时候,就会有一系列的惩罚措施,而运维,最主要的目标就是达成这种服务水平;停机时间又分为两种,一种是计划内停机时间,一种是计划外停机时间,而运维则主要关注计划外停机时间。
  • HPCHigh-performance computing(高性能计算,国家战略资源,不在课程范围内)

3.分布式

分布式存储: Ceph GlusterFs FastDFS MogileFs;
分布式计算: hadoop Spark;
分布式常见应用:
  • 分布式应用-服务按照功能拆分,使用微服务
  • 分布式静态资源--静态资源放在不同的存储集群上
  • 分布式数据和存储--使用key-value缓存系统
  • 分布式计算--对特殊业务使用分布式计算,比如Hadoop集群
2.4. 集群和分布式
  • 集群:同一个业务系统,部署在多台服务器上,集群中,每一台服务器实现的功能没有差别,数据和代码都是一样的;
  • 分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式 中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务;
  • 分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率;

对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器 完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决 定由给哪一台去完成响应,并且台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点, 都完成不同的业务,如果一个节点垮了,那这个业务可能就会失败;         

三、lvsLinux virtual server)运行原理

1. lvs简介

LVS:Linux Virtual Server ,负载调度器,内核集成,章文嵩,阿里的四层 SLB(Server LoadBalance) 是基于LVS+keepalived 实现
LVS 官网 : http://www.linuxvirtualserver.org/
LVS 相关术语
  • VS: Virtual Server,负责调度
  • RS:RealServer,负责真正提供服务

2. lvs集群体系结构

工作原理:
VS 根据请求报文的目标 IP 和目标协议及端口将其调度转发至某 RS ,根据调度算法来挑选 RS。

3. lvs集群的四种类型

  • lvs-nat:网络地址转换
  • lvs-dr 直连路由
  • lvs-tun: IP隧道
  • lvs-fullnat 完整nat
3.1 lvs-nat模式

原理:通过修改请求的DIR,通过Director分发客户端请求给服务器,服务器返回也要通过Director返回客户。

①要点

  • Ivs-nat: 本质是多目标IPDNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RSRIPPORT实现转发;
  • RIPDIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP;
  • 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈;
  • 支持端口映射,可修改请求报文的目标PORT;
  • VS必须是Linux系统,RS可以是任意OS系统;

②nat模式数据逻辑

NAT 模式下,网络数据报的进出都要经过 LVS 的处理。

LVS 需要作为 RS(真实服务器)的网关。当包到达 LVS 时,LVS 做目标地址转换(DNAT),将目标 IP 改为 RS 的 IP。RS 接收到包以后,仿佛是客户端直接发给它的一样。RS 处理完,返回响应时,源 IP 是 RS IP,目标 IP 是客户端的 IP。

这时 RS 的包通过网关(LVS)中转,LVS 会做源地址转换(SNAT),将包的源地址改为 VIP,这样,这个包对客户端看起来就仿佛是 LVS 直接返回给它的。

数据流向:

  优点:

                1、服务器支持任何TCP/IP操作系统

                2、只需一个IP放在调度器RealServer可以用私有IP

                3、RealServer使用的是内网IP,安全性高

 缺点:

                1、扩展性不好。任何请求和应答都要通过调度器。调度器容易成为瓶颈。

                2、LVS和RS必须在同一个VLAN下,否则LVS无法作为RS的网关。

3.2 DR模式
DR Direct Routing ,直接路由, LVS 默认模式 , 应用最广泛 , 通过为请求报文重新封装一个 MAC 首部进行 转发,源MAC DIP 所在的接口的 MAC ,目标 MAC 是某挑选出的 RS RIP 所在接口的 MAC 地址;源 IP/PORT,以及目标 IP/PORT 均保持不变。
①要点
  • Director和各RS都配置有VIP
  • 确保前端路由器将目标IPVIP的请求报文发往Director
  • 在前端网关做静态绑定VIPDirectorMAC地址:RS上使用arptables工具 RS上修改内核参数以限制arp通告及应答级别
  • RSRIP可以使用私网地址,也可以是公网地址;RIPDIP在同一IP网络;
  • RIP的网关不能指向DIP,以确保响应报文不会经由Director
  • RSDirector要在同一个物理网络
  • 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
  • 不支持端口映射(端口不能修败)

②DR模式数据逻辑

1、首先用户用CIP请求VIP。2、根据上图可以看到,不管是lvs还是RS上都需要配置相同的VIP,那么当用户请求到达我们的集群网络的前端路由器的时候,请求数据包的源地址为CIP目标地址为VIP,此时路由器会发广播问谁是VIP,那么我们集群中所有的节点都配置有VIP,此时谁先响应路由器那么路由器就会将用户请求发给谁,这样一来我们的集群系统是不是没有意义了,那我们可以在网关路由器上配置静态路由指定VIP就是lvs,或者使用一种机制不让RS 接收来自网络中的ARP地址解析请求,这样一来用户的请求数据包都会经过lvs。3、当用户请求到达lvs,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP。4、PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。5、IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标6、MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址7、由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至RS。8、RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP9、响应报文最终送达至客户端。

数据流向:

 优点:

             1、同VS/TUN方法一样,提高了LVS集群系统的伸缩性。

        

 缺点:

             1、需要在同一个Vlan下,维护不方便

             2、要求负载均衡器的网卡必须与物理网卡在一个物理段上

             3、安全性低,节点使用共有IP

3.3 TUN模式(了解)
转发方式:不修改请求报文的 IP 首部(源 IP CIP ,目标 IP VIP ),而在原 IP 报文之外再封装一个 IP 首部(源IP DIP ,目标 IP RIP ),将报文发往挑选出的目标 RS RS 直接响应给客户端(源 IP VIP ,目标 IP是CIP )。
①要点
  • DIP, VIP, RIP都应该是公网地址;
  • RS的网关一般不能指向DIP;
  • 请求报文要经由Director,但响应不能经由Director;
  • 不支持端口映射;
  • RSOS须支持隧道功能;
TUN 模式数据传输过程

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

数据流向:

 优点:

            1、调度器只负责分发请求,物理服务器负责把应答直接发给客户。解决了瓶颈问题。提高了可伸缩性。

            2、不需要再一个Vlan中,提高了维护的灵活性。
 缺点:

            1、需要服务器支持IPTinneling协议。

            2、节点IP暴漏在公网,安全性不高

3.4 fullnet模式(了解)
fullnat :通过同时修改请求报文的源 IP 地址和目标 IP 地址进行转发
CIP --> DIP
VIP --> RIP
1.VIP 是公网地址, RIP DIP 是私网地址,且通常不在同一 IP 网络;因此, RIP 的网关一般不会指向 DIP
2.RS 收到的请求报文源地址是 DIP ,因此,只需响应给 DIP ;但 Director 还要将其发往 Client
3. 请求和响应报文都经由 Director
4. 支持端口映射

改进:

      1、Full-NAT相比NAT的主要改进是,在SNAT/DNAT的基础上,加上另一种转换,转换过程如下:在包从DIR转到 RS 的过程中,源地址从客户端IP被替换成了LVS 的内网IP。内网IP之间可以通过多个交换机跨VLAN通信。当RS处理完接受到的包,返回时,会将这个包返回给DIR的内网IP,这一步也不受限于 VLAN。

优点:

        1、便于运维。不用局限于一个VLAN里。便于通信。

4. LVS工作模式总结

NAT模式TUN模式DR模式
RS操作系统不限支持隧道禁用arp
调度器和服务器网络可跨网络可跨网络不可跨网络
调度器数量服务器数量
RS服务器网关指向到调度器DIP指向到路由指向到路由
  • lvs-natlvs-fullnat:请求和响应报文都经由Director
  • lvs-natRIP的网关要指向DIP
  • lvs-fullnatRIPDIP未必在同一IP网络,但要能通信
  • lvs-drlvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
  • lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
  • lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信

5. lvs的调度算法

5.1 lvs调度算法类型
  • ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态被分为两种:静态方法和动态方法
  • 静态方法:仅根据算法本身进行调度,不考虑RS的负载情况
  • 动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
5.2 lvs静态调度算法
  • RRroundrobin 轮询 RS分别被调度,当RS配置有差别时不推荐
  • WRRWeighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
  • SHSource Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
  • DHDestination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请 求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
5.3 lvs动态调度算法
主要根据 RS 当前的负载状态及调度算法进行调度 Overhead=value 较小的 RS 会被调度
1、LC least connections (最少链接发)
        适用于长连接应用Overhead (负载值) =activeconns (活动链接数) x 256+inactiveconns (非活动链接数)
2 WLC Weighted LC (权重最少链接)
        默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
3 SED Shortest Expection Delay,
        初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight
        但是,当node1 的权重为 1 node2 的权重为 10 ,经过运算前几次的调度都会被 node2 承接
4 NQ Never Queue ,第一轮均匀分配,后续 SED
5 LBLC Locality-Based LC ,动态的 DH 算法,使用场景:根据负载状态实现正向代理
6 LBLCR LBLC with Replication ,带复制功能的 LBLC ,解决 LBLC 负载不均衡问题,从负载重的复制到负载轻的RS
5.4  4.15 版本内核以后新增调度算法
1、FO(Weighted Fai Over) 调度算法:常用作灰度发布
        在此FO 算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载 ( 未设置 IP_VS_DEST_F OVERLOAD标志 ) 的且权重最高的真实服务器,进行调度。
        当服务器承接大量链接,我们可以对此服务器进行过载标记(IP_VS_DEST_F OVERLOAD ),那么 vs 调度 器就不会把链接调度到有过载标记的主机中。
2、OVF(Overflow-connection) 调度算法 基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动 连接数量超过权重值,之后调度到下一个权重值最高的真实服务器, 在此 OVF 算法中,遍历虚拟服务相关 联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条件:
  • 未过载(未设置IP_VS_DEST_F OVERLOAD标志)
  • 真实服务器当前的活动连接数量小于其权重值
  • 其权重值不为零

四、lvs部署命令介绍

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

2.ipvsadm命令

核心功能 :
  • 集群服务管理:增、删、改
  • 集群服务的RS管理:增、删、改
  • 查看
命令参数
管理集群服务
ipvsadm -A|E -t(tcp)|u(udp)|f(防护墙标签) \
service-address(集群地址) \
[-s scheduler(调度算法)] \
[-p [timeout]] \
[-M netmask] \
[--pepersistence_engine] \
[-b sched-flags]

ipvsadm -D -t|u|f service-address     #删除
ipvsadm –C        #清空
ipvsadm –R        #重载
ipvsadm -S [-n]   #保存

管理集群中的real server
ipvsadm -a|e -t|u|f service-address -r server-address [-g | -i| -m](工作模式) [-w
weight](权重)
ipvsadm -d -t|u|f service-address -r server-address     #删除RS
ipvsadm -L|l [options]      #查看rs
ipvsadm -Z [-t|u|f service-address]     #清楚计数器

3. lvs集群中的增删改

3.1 管理集群服务中的增删改
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-A         #添加
-E         #修改
-t          #tcp服务
-u         #udp服务
-s         #指定调度算法,默认为 WLC
-p         #设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一 Realserver
-f          #firewall mask 火墙标记,是一个数字
#增加
[root@DR-server ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@DR-server ~]# ipvsadm -A -f 66 -p 3000

#修改
[root@DR-server ~]# ipvsadm -E -t 172.25.254.100:80 -s wrr -p 3000

#删除
[root@DR-server ~]# ipvsadm -D -t 172.25.254.100:80
[root@DR-server ~]# ipvsadm -D -f 66
3.2 管理集群中RealServer的曾增删改
ipvsadm -a|e -t|u|f service-address -r realserver-address [-g|i|m] [-w weight]
-a     #添加realserver
-e     #更改realserver
-t     #tcp协议
-u     #udp协议
-f     #火墙 标签
-r     #realserver地址
-g     #直连路由模式
-i     #ipip隧道模式
-m     #nat模式
-w     #设定权重
-Z     #清空计数器
-C     #清空lvs策略
-L     #查看lvs策略
-n     #不做解析
--rate :输出速率信息

#添加
[root@DR-server ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.30 -m
[root@DR-server ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.40 -m -w 2

#更改
[root@DR-server ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.30 -m -w 1
[root@DR-server ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.30 -i -w 1

#删除
[root@DR-server ~]# ipvsadm -d -t 172.25.254.100:80 -r 192.168.0.30


[root@DR-server ~]# ipvsadm -Ln
[root@DR-server ~]# ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 172.25.254.100:80 0 0 0 0 0
-> 192.168.0.30:80 0 0 0 0 0
-> 192.168.0.40:80 0 0 0 0 0
[root@DR-server ~]# ipvsadm -C
[root@DR-server ~]# ipvsadm -Z -t 172.25.254.20:80
[root@DR-server ~]# ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 172.25.254.20:80 0 0 0 0 0
-> 192.168.0.30:80 0 0 0 0 0
-> 192.168.0.40:80 0 0 0 0 0
pvs 规则: /proc/net/ip_vs
ipvs 连接: /proc/net/ip_vs_conn

五、LVS实战案例

1部署NAT模式集群案例

  1. Director 服务器采用双网卡,一个是nat网卡连接外网,一个是仅主机网卡与后端Web服务器相连
  2. Web服务器采用仅主机网卡与director相连
  3. Web服务器网关指向192.168.0.100
  4. 后端web服务器不需要连接外网
1.1 配置NAT实验环境
主机名
IPVIP角色
lvs
192.168.0.100(eth0,仅主机)
172.25.254.100 (eth1,nat)
调度器(VS
webserver1
192.168.0.101
GW 192.168.0.100
null
真实服务器( RS1
webserver2
192.168.0.102
GW 192.168.0.100
null
真实服务器( RS2
client
172.25.254.100
测试机

①client上设置nat网卡模式

[root@client ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0

[ipv4]
address1=172.25.254.10/24,172.25.254.100
method=manual
dns=114.114.114.114;

②lvs上设置双网卡仅主机和nat,并且开启内核路由功能

#eth0上nat
[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnetion 
[connection]
id=eth0
type=ethernet
interface-name=eth0


[ipv4]
address1=172.254.0.100/24,172.25.254.2
method=manual


#eth1上仅主机
[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnetion 
[connection]
id=eth1
type=ethernet
interface-name=eth1

[ipv4]
address1=192.168.0.100/24,192.168.0.2
method=manual

#开启内核路由功能
[root@lvs ~]# sysctl -a | grep ip_forward

[root@lvs ~]# vim /etc/sysctl.conf
加
net.ipv4.ip_forward=1

[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@lvs ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0

对于RS1(webserver1)的设定网卡为仅主机模式

[root@webserver1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth1
type=ethernet
interface-name=eth1

[ipv4]
address1=192.168.0.101/24,192.168.0.100
method=manual
[root@webserver1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.100   0.0.0.0         UG    100    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0

注意网关为lvs的仅主机IP;

对于RS2(webserver2)的设定网卡为仅主机模式

[root@webserver2 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth1
type=ethernet
interface-name=eth1

[ipv4]
address1=192.168.0.102/24,192.168.0.100
method=manual

[root@webserver2 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.100   0.0.0.0         UG    100    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
1.2 给lvs安装ipvsadm
[root@lvs ~]# yum install -y ipvsadm
1.3在lvs中添加调度策略
[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.101:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.102: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.101:80             Masq    1      0          0         
  -> 192.168.0.102:80             Masq    1      0          0         
1.4测试

2. 部署DR模式集群案例

实验环境:
主机名IPVIP角色
client

 172.25.254.10 vmware NAT

null测试主机
router
NAT-eth0:172.25.254.100
仅主机 - eth1:192.168.0.10
null路由器
lvs
192.168.0.200
GW 192.168.0.10 仅主机
lo:192.168.0.100/32
调度器
RS1

192.168.0.101

GW 192.168.0.10 仅主机
lo:192.168.0.100/32
web服务器1
RS2

192.168.0.102,

GW 192.168.0.10 仅主机
lo:192.168.0.100/32

web服务器2

2.1配置DR实验环境
①client上设置网卡为nat;
[root@client ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
[root@client ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0

[ipv4]
address1=172.25.254.10/24,172.25.254.100
method=manual
dns=114.114.114.114;
[root@client ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.25.254.100  0.0.0.0         UG    100    0        0 eth0
172.25.254.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0
[root@client ~]#

在路由主机中设定双网卡(不够的添加就可以),eth0nat网卡,eth1为仅主机网卡;

#对于eth0的设定
[root@router ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[root@router ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0

[ipv4]
address1=172.25.254.100/24,172.25.254.2
method=manual
dns=114.114.114.114;


#对于eth1的设定
[root@router ~]# vim /etc/NetworkManager/system-connections/eth1.nmconnection
[root@router ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1

[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual

#对于lvs(dr调度器)设定网卡为仅主机模式

[root@lvs ~]# vim /etc/NetworkManager/system-connections/eth1.nmconnetion
[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnetion
[connection]
id=eth1
type=ethernet
interface-name=eth1

[ipv4]
address1=192.168.0.200/24,192.168.0.10
method=manual

[root@lvs ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.10    0.0.0.0         UG    100    0        0 eth1
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth1
[root@lvs ~]#

对于RS1(webserver1)的设定网卡为仅主机模式

[root@webserver1 ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[root@webserver1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0

[ipv4]
address1=192.168.0.101/24,192.168.0.10
method=manual
dns=114.114.114.114;
[root@webserver1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.10    0.0.0.0         UG    100    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
[root@webserver1 ~]#


对于RS2(webserver2)中的网络设定

同RS1的只需要将IP改为192.168.0.102

注意,环境配置好后,确保每台主机ping都可以互相通信;
2.2 解决vip响应问题配置
DR 模型中各主机上均需要配置 VIP ,解决地址冲突的方式有三种:
(1) 在前端网关做静态绑定
(2) 在各 RS 使用 arptables
(3) 在各 RS 修改内核参数,来限制 arp 响应和通告的级别
限制响应级别 :arp_ignore
0: 默认值,表示可使用本地任意接口上配置的任意地址进行响应
1: 仅在请求的目标 IP 配置在本地主机的接收到请求报文的接口上时,才给予响应
限制通告级别 :arp_announce
0: 默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1: 尽量避免将接口信息向非直接连接网络进行通告
2: 必须避免将接口信息向非本网络进行通告
配置要点:
1.Director 服务器采用双 IP 桥接网络,一个是 VPP ,一个 DIP
2.Web 服务器采用和 DIP 相同的网段和 Director 连接
3. 每个 Web 服务器配置 VIP
4. 每个 web 服务器可以出外网
lvs rs 中设定VIP
[root@lvs ~]# ip a a dev lo 192.168.0.100/32

[root@webserver1 ~]# ip a a dev lo 192.168.0.100/32

[root@webserver2 ~]# ip a a dev lo 192.168.0.100/32

RS1RS2中解决响应问题

#RS1上
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
                       #对所有网络接口忽略非本机的ARP请求
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
                       #对回环接口(lo)忽略ARP请求。
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
                       #对回环接口使用最佳本地地址进行ARP通告
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
                       #对所有网络接口使用最佳本地地址进行ARP通告

[root@webserver1 ~]# echo "I am webServer1 192.168.0.101" > /var/www/html/index.html
                      #将字符串 "I am webServer1 192.168.0.101" 写入(覆盖)到http默认静态发布文件中,方便我们测试观察结果


#RS2上
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

[root@webserver1 ~]# echo "I am webServer2 192.168.0.102" > /var/www/html/index.html
 #将字符串 "I am webServer2 192.168.0.102" 写入(覆盖)到http默认静态发布文件中,方便我们测试观察结果

3.lvs中配置策略

[root@lvs ~]# yum install -y ipvsadm    #安装ipvsadm工具
[root@lvs ~]# ipvsadm -A -t 192.168.0.100:80 -s wrr
          # 创建一个新的虚拟服务,监听在IP地址192.168.0.100的80端口上,
使用WRR(加权轮询)算法进行负载均衡           
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.101:80 -g
                    #向虚拟服务添加一个真实服务器,使用直接路由(DR)模式 
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.102:80 -g        
[root@lvs ~]# ipvsadm -Ln    #列出当前IPVS表中的所有条目,虚拟服务和真实服务器的配置  

测试:

六、防火墙标签解决轮询错误

1.轮询规则中可能会遇到的错误

http https 为例,当我们在 RS 中同时开放 80 443 端口,那么默认控制是分开轮询的,这样我们就出 现了一个轮询错乱的问题
当我第一次访问 80 被轮询到 RS1 后下次访问 443 仍然可能会被轮询到 RS1
问题呈现
在RS1和RS2中安装mod_ssl并重启apache
]# yum install mod_ssl -y
]# systemctl restart httpd
在lvs中设置调度,因为我们要调度80和443两个端口所以我们需要设定两组策略
]# ipvsadm -C
[root@lvs ~]# ipvsadm -A -t 192.168.0.100:80 -s rr
[root@lvs ~]# ipvsadm -A -t 192.168.0.100:443 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.101:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.102:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:443 -r 192.168.0.102:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:443 -r 192.168.0.101:80 -g
[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 192.168.0.100:80 rr
-> 192.168.0.101:80 Route 1 0 0
-> 192.168.0.102:80 Route 1 0 0
TCP 192.168.0.100:443 rr
-> 192.168.0.101:443 Route 1 0 0
-> 192.168.0.102:443 Route 1 0 0
测试问题
[root@node10 ~]# curl http://192.168.0.100;curl -k https://192.168.0.100
RS1 server - 192.168.0.101
RS1 server - 192.168.0.101
当访问vip时两次调度都到了

2.防火墙标记解决轮询调度问题

FWM:FireWall Mark
MARK target 可用于给特定的报文打标记 ,
--set-mark value
其中 :value 可为 0xffff 格式,表示十六进制数字借助于防火墙标记来分类报文,而后基于标记定义集群服
: 可将多个不同的应用使用同一个集群服务进行 调度
实现方法 :
Director 主机打标记 :
iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports
$portl,$port2,..-i MARK --set-mark NUMBER
Director 主机基于标记定义集群服务:
ipvsadm -A -f NUMBER [options]
示例如下:
在vs调度器中设定端口标签,人为80和443是一个整体
]# iptables -t mangle -A PREROUTING -d 192.168.0.100 -p tcp -m multiport --dports
80,443 -j MARK --set-mark 6666
设定调度规则
[root@lvs ~]# ipvsadm -A -f 6666 -s rr
[root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.101 -g
[root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.102 -g
测试结果
[root@node10 ~]# curl -k https://192.168.0.100
RS2 server - 192.168.0.102
[root@node10 ~]# curl -k https://192.168.0.100;curl 192.168.0.100
RS1 server - 192.168.0.101
RS2 server - 192.168.0.102

3.lvs持久链接

在我们客户上网过程中有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用sh 算法,但是 sh 算法比较简单 粗暴,可能会导致调度失衡
解决方案
在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把 这个源的主机调度到了那个RS
如果在短期(默认 360S )内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到同一台RS 上。
如果过了比较长的时间(默认最长时间 360s )同源访问再次来访,那么就会被调度到其他的 RS
ipvsadm -AlE -tlulf service-address [-s scheduler] [-p [timeout]]默认360秒
在lvs调度器中设定
[root@lvs ~]# ipvsadm -E -f 6666 -s rr -p [3000]
[root@lvs ~]# ipvsadm -LnC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值