LVS负载均衡集群和LVS负载均衡—DR模式

一.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模式

5.1.DR模式的特点

(1)Director Server(调度器) 和 Real Server(节点服务器) 必须在同一个物理网络中。

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

(3)Director Server作为群集的访问入口,但不作为网关使用。

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

(5) Real Server 的网关不允许指向Director Server IP, 即Real Server发送的数据包不允许经过Director Server。(RS的网关地址只能指定真实的路由器网关)

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

5.2.数据包流向分析

(1)客户端发送请求到 Director Server(负载均衡器),请求的数据报文(源 IP 是 CIP,目标 IP 是 VIP)到达内核空间。
(2)Director Server 和 Real Server 在同一个网络中,数据通过二层数据链路层来传输。
(3)内核空间判断数据包的目标IP是本机VIP,此时IPVS(IP虚拟服务器)比对数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源 MAC 地址为 Director Server 的 MAC地址,修改目标 MAC 地址为 Real Server 的 MAC 地址,源 IP 地址与目标 IP 地址没有改变,然后将数据包发送给 Real Server。
(4)到达 Real Server 的请求报文的 MAC 地址是自身的 MAC 地址,就接收此报文。数据包重新封装报文(源 IP 地址为 VIP,目标 IP 为 CIP),将响应报文通过 lo 接口传送给物理网卡然后向外发出。
(5)Real Server 直接将响应报文传送到客户端。

5.3.LVS-DR中的ARP问题

问题一:VIP地址相同导致响应冲突

原因:

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

当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播,应该只有前端的负载均衡器进行响应,其他节点服务器不应该响应ARP广播。


解决办法:

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

  • 使用虚接口lo:0承载VIP地址
  • 设置内核参数arp_ignore=1:代表系统只响应目的IP为本地IP的ARP请求

问题二:返回报文时源地址使用VIP,导致网关设备的ARP缓存表紊乱

原因:

RealServer返回报文(源IP是VIP)经路由器转发,重新封装报文时,需要先获取路由器的MAC地址,发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包中的源IP地址,此时路由器的路由表进行更新,VIP的MAC地址由原先的均衡器变为节点服务器,路由器根据ARP表项,会将新来的请求报文转发给节点服务器,导致均衡器的VIP失效,又会造成VIP的紊乱。

解决办法:

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

5.4.Linux部署NAT模式的应对方案

vim /etc/sysctl.conf     //添加以下四行参数
 net.ipv4.conf.lo.arp_ignore = 1  
 net.ipv4.conf.lo.arp_announce = 2
 net.ipv4.conf.all.arp_ignore = 1
 net.ipv4.conf.all.arp_announce = 2
 ​
 sysctl -p  //刷新配置,读取修改后的配置
 ​
 #arp_ignore=1 :使本机系统只响应目的IP为本地物理网卡IP的ARP请求。
 #arp_announce=2:使本机系统不使用即将返回的IP数据包的源地址来作为ARP请求报文的源地址,而采用发送接口(物理网卡)的IP作为ARP请求报文源地址。
 

5.5.实操练习

实验准备:

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,显示结果就可以

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值