LVS负载均衡集群

一.LVS集群基本介绍

1.1.群集的含义

Cluster,集群、群集

由多台主机构成,但对外只表现为一个整体,只提供一个访问入口(域名或IP地址),相当于一台大型计算机。

1.2.群集的作用

对于企业服务的的性能提升一般会有两种方式:

纵向扩展 : 对服务器的CPU 内存 硬盘 等硬件进行升级或者扩容来实现的 性能上限会有瓶颈,成本昂贵,收效比不高等问题

横向扩展 : 通过增加服务器主机数量来应该高并发的场景

1.3.群集的目的

  • 提高性能:计算密集应用。如天气预报,核试验模拟。
  • 降低成本:相对百万美元的超级计算机,价格便宜。
  • 提高可扩展性:只要增加集群节点即可。
  • 增强可靠性:多个节点完成相同功能,避免单点失败。

1.4.集群的类型

1) 负载均衡群集(Load Balance Cluster)

提高应用系统的响应能力、尽可能处理更多的访问请求、减少延迟为目标,获得高并发、高负载(LB)的整体性能

LB的负载分配依赖于主节点的分流算法,将来自客户机的访问请求分担给多个服务器节点,从而缓解整个系统的负载压力。例如,"DNS轮询""反向代理"等

2) 高可用群集(High Availiablity Cluster)

提高应用系统的可靠性、尽可能地减少中断时间为目标,确保服务的连续性,达到高可用(HA)的容错效果

HA的工作方式包括双工和主从两种模式,双工即所有节点同时在线;主从则只有主节点在线,但当出现故障时从节点能自动切换为主节点。例如,"故障切换" "双机热备" 等

3) 高性能运算群集(High Performance Computing Cluster)

提高应用系统的CPU运算速度、扩展硬件资源和分析能力为目标,获得相当于大型、超级计算机的高性能运算(HPC)能力

高性能依赖于"分布式运算"、"并行计算",通过专用硬件和软件将多个服务器的CPU、内存等资源整合在一起,实现只有大型、超级计算机才具备的计算能力。例如"云计算"、"网格计算"。

1.5.集群设计原则

  • 可扩展性---集群的横向扩展能力

  • 可用性---无故障时间 (SLA service level agreement)

  • 性能---访问响应时间

  • 容量---单位时间内的最大并发吞吐量(C10K 并发问题)

1.6.负载均衡集群的结构

第一层,负载调度器(Load Balancer或Director)

访问整个群集系统的唯一入口,对外使用所有服务器共有的VIP地址,也称为群集IP地址。通常会配置主、备两台调度器实现热备份,当主调度器失效以后能够平滑替换至备用调度器,确保高可用性。

第二层,服务器池(Server Pool)

群集所提供的应用服务、由服务器池承担,其中每个节点具有独立的RIP地址(真实IP),只处理调度器分发过来的客户机请求。当某个节点暂时失效时,负载调度器的容错机制会将其隔离,等待错误排除以后再重新纳入服务器池。

第三层,共享存储(Share Storage)

为服务器池中的所有节点提供稳定、一致的文件存取服务,确保整个群集的统一性。共享存储可以使用NAS设备,或者提供NFS共享服务的专用服务器。

1.7.LVS负载均衡集群的三种工作模式

1)NAT地址转换模式

都走LVS,调度器有瓶颈

Network Address Translation,简称NAT模式;

类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,即作为客户机的访问入口,也是各节点回应客户机的访问出口;

服务器节点使用私有IP地址,与负载调度器位于同一个物理网络,安全性要优于其他两种方式。

**缺点:**调度器作为所有节点服务器的网关,既作客户端的访问入口,也作节点服务器响应的访问出口,也就意味着调度器将成为整个集群系统的瓶颈。

**优点:**由于再转发过程中做了地址转发,对于节点服务器的安全性比其它模式较好。调度器至少要有2个网卡,一个承载VIP用于接收客户端的请求,另一个用于使用私有IP在同一个局域网中与节点服务器相互通信。

工作原理:

(1)用户通过互联网DNS服务器解析到公司负载均衡设备上面的外网地址,相对于真实服务器而言,LVS外网IP又称VIP(Virtual IP Address),用户通过访问VIP,即可连接后端的真实服务器(Real Server),而这一切对用户而言都是透明的,用户以为自己访问的就是真实服务器,但他并不知道自己访问的VIP仅仅是一个调度器,也不清楚后端的真实服务器到底在哪里、有多少真实服务器。

(2)用户将请求发送至LVS负载均衡调度的器(同时也是网关服务器)的外网网卡上,此时LVS将根据预设的算法选择后端的一台真实服务器(内网中真实处理数据的web服务器),将数据请求包转发给真实服务器,并且在转发之前LVS会修改数据包中的目标地址以及目标端口,目标地址与目标端口将被修改为选出的真实服务器IP地址以及相应的端口。

(3)真实的服务器将响应数据包返回给LVS调度器,调度器在得到响应的数据包后会将源地址和源端口修改为VIP及调度器相应的端口,修改完成后,由调度器将响应数据包发送回终端用户,另外,由于LVS调度器有一个连接Hash表,该表中会记录连接请求及转发信息,当同一个连接的下一个数据包发送给调度器时,从该Hash表中可以直接找到之前的连接记录,并根据记录信息选出相同的真实服务器及端口信息。

2)DR直接路由模式

最常用!所有主机共享vip地址,不原路返回LVS调度器。web服务器在同一网段

Direct Routing,简称DR模式

采用半开放式的网络结构,与TUN模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络

负载调度器与各节点服务器通过本地网络连接,不需要建立专用的IP隧道

特点: 调度器只负责接收客户端的请求,并根据调度算法转发给节点服务器;节点服务器在处理完请求后是直接响应返回给客户端,响应的数据包不经过调度器。DR模式要求调度器与后端服务器必须在同一个局域网内,VIP地址需要在调度器与后端所有的服务器间共享 。 性能比NAT模式高

调度器和节点服务器使用私有IP在同一个局域网中与节点服务器相互通信

工作原理:

(1)用户发送请求到Director Server(负载均衡器),请求的数据报文(源IP是CIP,目标IP是VIP)到达内核空间。

(2)由于Director Server和 Real Server 在同一个网络中,所以是通过二层数据链路层来传输。

内核空间判断数据包的目标IP是本机IP,此时IPVS比对数据包请求的服务是否为集群服务,若是,重新封装数据包,修改源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址,源IP地址与目标IP地址没有改变,然后将数据包发送给Real Server.

(3)Real Server发现请求报文的MAC地址是自己的MAC地址,就接收此报文,重新封装报文(源IP地址为VIP,目标IP为CIP),将响应报文通过lo接口传送给物理网卡然后向外发出。

Real Server直接将响应报文传送到客户端。

3)TUNNEL隧道模式

需要买公网地址

IP Tunnel,简称TUN模式

采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的Internet连接直接回应客户机,而不再经过负载调度器;

服务器节点分散在互联网中的不同位置,具有独立的公网IP地址,通过专用IP隧道与负载调度器相互通信。

架构与DR相类似,但是节点服务器分散在互联网各个位置,都具有独立的公网IP,通过专用IP隧道与调度器相互通信

采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的Internet连接直接回应客户机,而不再经过负载调度器。承载的压力比NAT小。

服务器节点分散在互联网中的不同位置,具有独立的公网IP地址,通过专用IP隧道与负载调度器相互通信。

缺点:成本很高。

这种模式一般应用于特殊场景,比如将节点服务器分布在全国各地,防止被物理攻击(如地震、战争等),做灾备。
工作原理:

(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

(6)响应报文到达客户端

工作模式总结和比较:

1.8.LVS虚拟服务器

1)LVS概述

Linux Virtual Server是针对Linux内核开发的负载均衡解决方案,由我国博士章文嵩在1998年创建,LVS实际上相当于基于IP地址的虚拟化应用,为基于IP地址和内容请求分发的负载均衡提出的一种高效的解决方法

LVS现在已成为Linux内核的一部分,默认编译为ip_vs模块,必要时能够自动调用。在CentOS7系统中,以下操作可以手动加载ip_vs模块,并查看当前系统中ip_vs模块的版本信息。

[root@localhost ~]# modprobe ip_vs
#手动加载
[root@localhost ~]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn 
  #确认内核对LVS的支持
[root@localhost ~]# cd /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs/
[root@localhost ipvs]# ls
ip_vs_dh.ko.xz   ip_vs.ko.xz       ip_vs_lblcr.ko.xz  ip_vs_nq.ko.xz      ip_vs_rr.ko.xz   ip_vs_sh.ko.xz   ip_vs_wrr.ko.xz
ip_vs_ftp.ko.xz  ip_vs_lblc.ko.xz  ip_vs_lc.ko.xz     ip_vs_pe_sip.ko.xz  ip_vs_sed.ko.xz  ip_vs_wlc.ko.xz
[root@localhost ipvs]# ls |grep -o "^[^.]*"
ip_vs_dh
ip_vs_ftp
ip_vs
ip_vs_lblc
ip_vs_lblcr
ip_vs_lc
ip_vs_nq
ip_vs_pe_sip
ip_vs_rr
ip_vs_sed
ip_vs_sh
ip_vs_wlc
ip_vs_wrr[root@localhost ipvs]# for i in $(ls |grep -o "^[^.]*")
> do
> echo $i
> modprobe $i
#使用for循环,一次性加载

LVS集群(Linux Virtual server)负载调度器,内核集成,章文嵩(花名正明), 阿里的四层SLB(Server Load Balance)是基于LVS+keepalived实现。

LVS 官网:http://www.linuxvirtualserver.org/
阿里SLB和LVS:https://yq.aliyun.com/articles/1803、https://github.com/alibaba/LVS

整个SLB系统由3部分构成:四层负载均衡,七层负载均衡和控制系统

四层负载均衡 ,采用开源软件LVS (linux virtual server),并根据云计算需求对其进行了定制化;该技术已经在阿里巴巴内部业务全面上线应用2年;

七层负载均衡,采用开源软件Tengine;该技术已经在阿里巴巴内部业务全面上线应用3年多;·控制系统,用于配置和监控负载均衡系统;

工作原理:

VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS。LVS是内核级功能,工作在INPUT链的位置,将发往INPUT的流量进行"处理"

VS:Virtual Server,Director Server(DS), Dispatcher(调度器),Load Balancer(lvs服务器)

RS:Real Server(lvs), upstream server(nginx), backend server(haproxy)(真实服务器)

CIP:Client IP(客户机IP)

VIP:Virtual serve IP VS外网的IP

DIP:Director IP VS内网的IP

RIP:Real server IP (真实IP)

2)LVS的基本原理

1.当用户向负载均衡器(Director Server)发起请求,调度器将请求发送至内核空间。

2.Prerouting链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发送到INPUT链。

3.IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已经定义好的集群服务进行对比,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发送到POSTROUTING链。

4.POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送到后端的服务器。

1.9.LVS的负载调度算法

固定调度算法

rr:轮询(Round Robin)

将收到的访问请求安装顺序轮流分配给群集指定各节点(真实服务器),均等地对待每一台服务器,而不管服务器实际的连接数和系统负载。

wrr:加权轮询(Weighted Round Robin)

依据不同RS的权值分配任务。权重值较高的RS将优先获得任务,并且分配到的连接数将比权值低的RS更多。相同权值的RS得到相同数目的连接数。

保证性能强的服务器承担更多的访问流量。

dh:目的地址哈希调度(destination hashing)

以目的地址为关键字查找一个静态hash表来获得所需RS。

sh:源地址哈希调度(source hashing)

以源地址为关键字查找--个静态hash表来获得需要的RS。

lc:最小连接数调度( Least Connections)

ipvs表存储了所有活动的连接。LB会比较将连接请求发送到当前连接最少的RS。

根据真实服务器已建立的连接数进行分配,将收到的访问请求优先分配给连接数最少的节点。

动态调度算法

wlc:加权最小连接数调度(Weighted Least Connections)

假设各台RS的权值依次为Wi,当前tcp连接数依次为Ti,依次取Ti/Wi为最小的RS作为下一个分配的RS。

lblc:基于地址的最小连接数调度(locality-based least-connection)

将来自同一个目的地址的请求分配给同一台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑。

1.10.LVS的功能及组织架构

负载均衡的应用场景为高访问量的业务,提高应用程序的可用性和可靠性。

1)应用于高访问量的业务

如果您的应用访问量很高,可以通过配置监听规则将流量分发到不同的云服务器 ECS(Elastic Compute Service 弹性计算服务)实例上。此外,可以使用会话保持功能将同一客户端的请求转发到同一台后端ECS

2)扩展应用程序

可以根据业务发展的需要,随时添加和移除ECS实例来扩展应用系统的服务能力,适用于各种Web服务器和App服务器。

3)消除单点故障

可以在负载均衡实例下添加多台ECS实例。当其中一部分ECS实例发生故障后,负载均衡会自动屏蔽故障的ECS实例,将请求分发给正常运行的ECS实例,保证应用系统仍能正常工作

4)同城容灾 (多可用区容灾)

为了提供更加稳定可靠的负载均衡服务,阿里云负载均衡已在各地域部署了多可用区以实现同地域容灾。当主可用区出现机房故障或不可用时,负载均衡仍然有能力在非常短的时间内(如:大约30s中断)切换到另外一个备可用区恢复服务能力;当主可用区恢复时,负载均衡同样会自动切换到主可用区提供服务。

使用负载均衡时,您可以将负载均衡实例部署在支持多可用区的地域以实现同城容灾。此外,建议您结合自身的应用需要,综合考虑后端服务器的部署。如果您的每个可用区均至少添加了一台ECS实例,那么此种部署模式下的负载均衡服务的效率是最高的。

1.11.ipvsadm 管理工具

创建虚拟服务器

添加、删除服务器节点

查看群集及节点情况

保存负载分配策略

ipvsadm 是在负载调度器上使用的 LVS 群集管理工具,通过调用 ip_vs 模块来添加、删除服务器节点 ,以及查看集群运行状态,在CentOS 7系统中,需安装软件包

[root@localhost ~]# yum -y install ipvsadm 
[root@localhost ~]# ipvsadm -v 
ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)

LVS 群集的管理工作主要包括创建虚拟服务器、添加服务器节点、查看群集节点状态、 删除服务器节点和保存负载分配策略。

ipvsadm 工具选项说明:

|----------------|---------------------------------------------|
| ipvsadm的选项 | 作用 |
| -A | 添加虚拟服务器 |
| -D | 删除整个虚拟服务器 |
| -s | 指定负载调度算法(轮询:rr、加权轮询:wrr、最少连接:lc、加权最少连接:wlc) |
| -a | 表示添加真实服务器(节点服务器) |
| -d | 删除某一个节点 |
| -t | 指定 VIP地址及 TCP端口 |
| -r | 指定 RIP地址及 TCP端口 |
| -m | 表示使用 NAT群集模式 |
| -g | 表示使用 DR模式 |
| -i | 表示使用 TUN模式 |
| -w | 设置权重(权重为 0 时表示暂停节点) |
| -p 60 | 表示保持长连接60秒(默认关闭连接保持) |
| -l | 列表查看 LVS 虚拟服务器(默认为查看所有) |
| -n | 以数字形式显示地址、端口等信息,常与"-l"选项组合使用。ipvsadm -ln |

1.12.ip_vs通用模块

ls /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs

LVS现在已成为 Linux 内核的一部分,默认编译为 ip_vs 模块,必要时能够自动调动。

在CentOS 7 系统中,手动加载 ip_vs 模块的命令如下:

 modprobe ip_vs     //手动加载 ip_vs 模块
 ​
 cat /proc/net/ip_vs    //查看当前系统中ip_vs模块的版本信息

加载所有LVS调度算法的for循环方式:

for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done

二.集群与分布式

2.1.分布式系统

分布式存储: 将数据分散存储在多台独立的设备上 。Ceph,GlusterFS,FastDFS,MogileFS

分布式计算: 将该应用分解成许多小的部分,分配给多台计算机进行处理。 hadoop,Spark

分布式常见应用

  • 分布式应用-服务按照功能拆分,使用微服务(单一应用程序划分成一组小的服务,服务之间 互相协调、互相配合,为用户提供最终价值服务)
  • 分布式静态资源--静态资源放在不同的存储集群上
  • 分布式数据和存储--使用key-value缓存系统
  • 分布式计算--对特殊业务使用分布式计算,比如Hadoop集群

2.2.集群与分布式介绍

集群:同一个业务系统,部署在多台服务器上。集群中,每一台服务器实现的功能没有差别,数据和代码都是一样的。

分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务。

PS: 对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器完成同一业务。

如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决定由给哪 一台去完成响应,并且一台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点,都完成不同的业务,如果一个节点垮了,那这个业务可能就会失败

三.实验:LVS负载均衡群集部署------NAT模式

实验环境:

负载调度器:内网关 lvs,ens33:192.168.47.105(做LVS调度器),外网关 ens36:12.0.0.1

Web服务器1:192.168.47.103(做nginx)

Web服务器2:192.168.47.104(做nginx)

NFS服务器:192.168.47.102(做nfs共享存储 )

Windows客户端:12.0.0.12

1)部署共享存储(NFS服务器:192.168.47.102):

1. #关闭防火墙
systemctl stop firewalld
setenforce 0
 
2. #安装nfs服务
yum install nfs-utils rpcbind -y
 
3. #新建目录,并创建站点文件
cd /opt/
mkdir zhang rui
echo "this is zhang" > zhang/index.html
echo "this is rui" > rui/index.html
 
4. #开启服务
systemctl start rpcbind
systemctl start nfs
 
5. #授权
chmod 777 zhang/ rui/
 
6. #设置共享策略
vim /etc/exports
#添加要发布的共享目录
/opt/zhang 192.168.47.0/24(rw,sync)
/opt/rui 192.168.47.0/24(rw,sync)
 
7. #发布服务
exportfs -rv

2)部署web服务器1(web服务器1:192.168.47.103):

1. #关闭防火墙
systemctl stop firewalld
setenforce 0
 
2. #安装httpd、nfs-utils和rpcbind程序
yum install -y httpd
yum install nfs-utils rpcbind -y
 
3. #查看nfs服务
showmount -e 192.168.47.102
 
4. #挂载站点
#法一:临时挂载
df
cat /var/www/html/index.html
mount 192.168.47.102:/opt/zhang /var/www/html/
#法二:永久挂载
vim /etc/fstab
192.168.47.102:/opt/zhang/  /var/www/html/        nfs     defaults,_netdev 0 0 
mount -a
 
5. #开启httpd服务并设置开机自启动
systemctl start httpd
systemctl enable httpd
 
6. #指定网关
vim /etc/sysconfig/network-scripts/ifcfg-ens33 
GATEWAY=192.168.47.105
#DNS1=8.8.8.8
 
7. #重启网络服务
systemctl restart network

3)部署web服务器2(web服务器2:192.168.47.104):

1. #关闭防火墙
systemctl stop firewalld
setenforce 0
 
2. #安装httpd、nfs-utils和rpcbind程序
yum install -y httpd
yum install nfs-utils rpcbind -y
 
3. #查看nfs服务
showmount -e 192.168.47.102
 
4. #挂载站点
#法一:临时挂载
df
cat /var/www/html/index.html
mount 192.168.47.102:/opt/rui /var/www/html/
#法二:永久挂载
vim /etc/fstab
192.168.47.102:/opt/rui/  /var/www/html/        nfs     defaults,_netdev 0 0 
mount -a
 
5. #开启httpd服务并设置开机自启动
systemctl start httpd
systemctl enable httpd
 
6. #指定网关
vim /etc/sysconfig/network-scripts/ifcfg-ens33 
GATEWAY=192.168.47.105
#DNS1=8.8.8.8
 
7. #重启网络服务
systemctl restart network

4)部署负载调度服务器(ens33:192.168.47.105,ens36:12.0.0.1):

1. #关闭防火墙
systemctl stop firewalld
setenforce 0
 
2. #安装ipvsadm
yum install ipvsadm.x86_64 -y
 
3. #打开路由转发功能
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 
sysctl -p
 
4. #防火墙做策略
#清空策略
iptables -F
#添加策略
iptables -t nat -A POSTROUTING -s 192.168.47.0/24 -o ens36 -j SNAT --to 12.0.0.1
#查看策略
iptables -nL -t nat
 
5. #加载LVS内核模块
modprobe ip_vs
cat /proc/net/ip_vs
 
6. #开启ipvsadm服务
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm.service
 
7. #清空策略
ipvsadm -C
 
8. #制定策略
#指定IP地址 外网的入口  -s rr  轮询
ipvsadm -A -t 12.0.0.1:80 -s rr
#先指定虚拟服务器再添加真实服务器地址,-r:真实服务器地址 -m指定nat模式
ipvsadm -a -t 12.0.0.1:80 -r 192.168.47.103:80 -m
ipvsadm -a -t 12.0.0.1:80 -r 192.168.47.104:80 -m
#开启服务
ipvsadm
 
9. 查看策略
ipvsadm -ln

5)Windows客户机验证(Windows客户端:12.0.0.12)

浏览器中进行测试(不断刷新浏览器测试负载均衡效果,刷新间隔需长点)

三.LVS-DR 集群工作原理

LVS-DR(Linux Virtual Server Director Server)工作模式,是生产环境中最常用的一 种工作模式。

LVS-DR 模式,Director Server 作为群集的访问入口,不作为网关使用

节点 Director Server 与 Real Server 需要在同一个网络中,返回给客户端的数据不需要经过 Director Server。

为了响应对整个群集的访问,Director Server 与 Real Server 都需要配置 VIP 地址。

  • 客户机发起请求,经过调度服务器(lvs),经过算法调度,去访问真实服务器(RS)
  • 由于不原路返回,客户机不知道,真实主机的ip地址,
  • 所以只能通过调度服务器的外网ip(vip)去反回报文信息。

实例解释:

第一次访问完整(不考虑实际问题)

客户端---->外网地址12.0.0.100 12.0.0.100---->客户端

#12.0.0.18-----客户端 客户端会直接丢弃

对每台真实服务器配置外网地址 12.0.0.100

12.0.0.100------>客户端

问题:IP地址冲突

在LVS-DR负载均衡集群中,负载均衡器与节点服务器都要配置相同的VIP地址,在局域网中具有相同的IP地 址。势必会造成各服务器ARP通信的紊乱

当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播

只有前端的负载均衡器进行响应,其他节点服务器不应该响应ARP广播

解决方法:

对节点服务器进行处理,使其不响应针对VIP的ARP请求

用虚接口lo:0承载VIP地址

设置内核参数arp_ ignore=1: 系统只响应目的IP为本地IP的ARP请求

路由器发送ARP请求(广播)

ARP---->广播去找ip地址解析成mac地址

默认使用调度服务器上的外网地址(vip地址)响应,

需要在真实服务器上修改内核参数

使真实服务器只对自己服务器上的真实IP地址响应ARP解析。

第二次再有访问请求

RealServer返回报文(源IP是VIP)经路由器转发,重新封装报文时,需要先获取路由器的MAC地址,发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包中的源IP地址,而不使用发送接口的IP地址,路由器收到ARP请求后,将更新ARP表项,原有的VIP对应Director的MAC地址会被更新为VIP对应RealServer的MAC地址。路由器根据ARP表项,会将新来的请求报文转发给RealServer,导致Director的VIP失效

解决方法:

对节点服务器进行处理,设置内核参数arp_announce=2:系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址

路由器上绑定了 真实服务器1的mac信息,

#请求到达真实服务器

在真实服务器上修改内核参数

只对所有服务器真实网卡上的地址进行反馈,解析

四.LVS-DR 模式的特点

Director Server 和 Real Server 必须在同一个物理网络中。

Real Server 可以使用私有地址,也可以使用公网地址。如果使用公网地址,可以通过 互联网对 RIP 进行直接访问。

所有的请求报文经由 Director Server,但回复响应报文不能经过 Director Server。

Real Server 的网关不允许指向 Director Server IP,即不允许数据包经过 Director S erver。

Real Server 上的 lo 接口配置 VIP 的 IP 地址。

五.实验:LVS负载均衡群集部署------DR模式

实验准备:

Web 服务器1:192.168.47.102

Web 服务器2:192.168.47.103

DR 负载调度服务器:192.168.47.104

vip(虚拟回环):192.168.47.101

客户端:192.168.47.105

1)部署DR负载调度服务器(DR 负载调度服务器:192.168. 47.104**):**

1. #关闭防火墙
systemctl stop firewalld.service
setenforce 0
 
2. #安装ipvsadm工具
yum install ipvsadm.x86_64 -y
 
3. #配置虚拟IP地址(VIP:192.168.47.101)
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
#删除UUID,dns与网关,注意子网
NAME=ens33:0
DEVICE=ens33:0
IPADDR=192.168.47.101
NETMASK=255.255.255.255
 
4. #重启网络服务、启动网卡
systemctl restart network
ifup ifcfg-ens33:0
 
5. #调整/proc响应参数   
   #对于 DR 群集模式来说,由于 LVS 负载调度器和各节点需要共用 VIP 地址,应该关闭 Linux 内核的重定向参数响应服务器不是一台路由器,那么它不会发送重定向,所以可以关闭该功能
vi /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
 
6. #刷新配置
sysctl -p
 
7. #加载模块
modprobe ip_vs
cat /proc/net/ip_vs
 
8. #配置负载分配策略,并启动服务
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm.service
 
9. #清空ipvsadm,并做策略
##添加真实服务器-a  指定VIP地址及TCP端口-t   指定RIP地址及TCP端口 -r 指定DR模式-g
ipvsadm -C
ipvsadm -A -t 192.168.47.101:80 -s rr
ipvsadm -a -t 192.168.47.101:80 -r 192.168.47.102:80 -g
ipvsadm -a -t 192.168.47.101:80 -r 192.168.47.103:80 -g
 
10. #保存设置
ipvsadm
ipvsadm -ln
ipvsadm-save > /etc/sysconfig/ipvsadm

2)部署第一台Web服务器(Web 服务器1:192.168.47.102)

1. #关闭防火墙
systemctl stop firewalld.service
setenforce 0
 
2. #安装httpd、开启服务
yum install httpd -y
systemctl start httpd
 
3. #创建一个站点文件
vim /var/www/html/index.html
this is 102web1
 
3. #添加回环网卡,修改回环网卡名,IP地址,子网掩码
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.47.101
NETMASK=255.255.255.255
NETWORK=127.0.0.0
 
systemctl restart network
 
4. #设置路由
route add -host 192.168.47.101 dev lo:0
route -n
 
5. #开机执行命令
vim /etc/rc.d/rc.local 
/usr/sbin/route add -host 192.168.47.101 dev lo:0
 
chmod +x /etc/rc.d/rc.local
 
6. #调整 proc 响应参数
#添加系统只响应目的IP为本地IP的ARP请求
#系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
vim /etc/sysctl.conf
 
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
 
7. #刷新配置 
sysctl -p

3)部署第二台Web服务器(Web 服务器2:192.168.47.103)

1. #关闭防火墙
systemctl stop firewalld.service
setenforce 0
 
2. #安装httpd、开启服务
yum install httpd -y
systemctl start httpd
 
3. #创建一个站点文件
vim /var/www/html/index.html
this is 103web2
 
3. #添加回环网卡,修改回环网卡名,IP地址,子网掩码
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.47.101
NETMASK=255.255.255.255
NETWORK=127.0.0.0
 
systemctl restart network
 
4. #设置路由
route add -host 192.168.47.101 dev lo:0
route -n
 
5. #开机执行命令
vim /etc/rc.d/rc.local 
/usr/sbin/route add -host 192.168.47.101 dev lo:0
 
chmod +x /etc/rc.d/rc.local
 
6. #调整 proc 响应参数
#添加系统只响应目的IP为本地IP的ARP请求
#系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
vim /etc/sysctl.conf
 
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
 
sysctl -p

4)在客户机上测试(客户端:192.168.47.105)

[root@xzq ~]#ping 192.168.47.102
PING 192.168.47.102(192.168.47.102)56(84) bytes of data.
web服务器1
64 bytes from 192.168.47.102: icmp_seq=lttl=64 time=0.629 ms
64 bytes from 192.168.47.102: icmp_seq=2 ttl=64 time=0.219 ms
64 bytes from 192.168.47.102: icmp_seq=3 ttl=64 time=0.296 ms
---192.168.47.102 ping statistics ---
3 packets transmitted,3 received, 0% packet loss,time 2000ms
rtt min/avg/max/mdev=0.219/0.381/0.629/0.178 ms
[root@xzq~]#ping 192.168.47.103
web服务器2
PING 192.168.47.103(192.168.47.103)56(84) bytes of data.
64 bytes from 192.168.47.103:icmp seq=l ttl=64 time=0.719 ms
64 bytes from 192.168.47.103: icmp_seq=2 ttl=64 time=0.510 ms
64 bytes from 192.168.47.103: icmp seq=3 ttl=64 time=0.356 ms
-192.168.47.103 ping statistics --.
3 packets transmitted,3 received,% packet loss,time 2002ms
rtt min/avg/max/mdev =0.356/0.528/0.719/0.149 ms
[root@xzq ~]# ping 192.168.47.104
DR负载调度服务器
PING 192.168.47.104 (192.168.47.104)56(84) bytes of data.
64 bytes from 192.168.47.104: icmp seq=l ttl=64 time=0.976 ms
64 bytes from 192.168.47.104: icmp seq=2 ttl=64 time=0.326 ms
64 bytes from 192.168.47.104: icmp seq=3 ttl=64 time=0.308 ms
---192.168.47.104 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev=0.308/0.536/0.976/0.311 ms

使用浏览器访问192.168.47.101,显示结果就可以
相关推荐
2202_754421545 分钟前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
蓝染-惣右介7 分钟前
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
java·数据库·tomcat·mybatis
小林想被监督学习8 分钟前
idea怎么打开两个窗口,运行两个项目
java·ide·intellij-idea
HoneyMoose10 分钟前
IDEA 2024.3 版本更新主要功能介绍
java·ide·intellij-idea
我只会发热12 分钟前
Java SE 与 Java EE:基础与进阶的探索之旅
java·开发语言·java-ee
是老余13 分钟前
本地可运行,jar包运行错误【解决实例】:通过IDEA的maven package打包多模块项目
java·maven·intellij-idea·jar
crazy_wsp13 分钟前
IDEA怎么定位java类所用maven依赖版本及引用位置
java·maven·intellij-idea
.Ayang16 分钟前
tomcat 后台部署 war 包 getshell
java·计算机网络·安全·web安全·网络安全·tomcat·网络攻击模型
一直学习永不止步21 分钟前
LeetCode题练习与总结:最长回文串--409
java·数据结构·算法·leetcode·字符串·贪心·哈希表
hummhumm35 分钟前
第 22 章 - Go语言 测试与基准测试
java·大数据·开发语言·前端·python·golang·log4j