• 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模块的版本信息。

    1. [root@localhost ~]# modprobe ip_vs
    2. #手动加载
    3. [root@localhost ~]# cat /proc/net/ip_vs
    4. IP Virtual Server version 1.2.1 (size=4096)
    5. Prot LocalAddress:Port Scheduler Flags
    6. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
    7. #确认内核对LVS的支持
    8. [root@localhost ~]# cd /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs/
    9. [root@localhost ipvs]# ls
    10. 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
    11. 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
    12. [root@localhost ipvs]# ls |grep -o "^[^.]*"
    13. ip_vs_dh
    14. ip_vs_ftp
    15. ip_vs
    16. ip_vs_lblc
    17. ip_vs_lblcr
    18. ip_vs_lc
    19. ip_vs_nq
    20. ip_vs_pe_sip
    21. ip_vs_rr
    22. ip_vs_sed
    23. ip_vs_sh
    24. ip_vs_wlc
    25. ip_vs_wrr[root@localhost ipvs]# for i in $(ls |grep -o "^[^.]*")
    26. > do
    27. > echo $i
    28. > modprobe $i
    29. #使用for循环,一次性加载

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

    1. LVS 官网:http://www.linuxvirtualserver.org/
    2. 阿里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系统中,需安装软件包

    1. [root@localhost ~]# yum -y install ipvsadm
    2. [root@localhost ~]# ipvsadm -v
    3. 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 模块的命令如下:

    1. modprobe ip_vs //手动加载 ip_vs 模块
    2. 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. 1. #关闭防火墙
    2. systemctl stop firewalld
    3. setenforce 0
    4. 2. #安装nfs服务
    5. yum install nfs-utils rpcbind -y
    6. 3. #新建目录,并创建站点文件
    7. cd /opt/
    8. mkdir zhang rui
    9. echo "this is zhang" > zhang/index.html
    10. echo "this is rui" > rui/index.html
    11. 4. #开启服务
    12. systemctl start rpcbind
    13. systemctl start nfs
    14. 5. #授权
    15. chmod 777 zhang/ rui/
    16. 6. #设置共享策略
    17. vim /etc/exports
    18. #添加要发布的共享目录
    19. /opt/zhang 192.168.47.0/24(rw,sync)
    20. /opt/rui 192.168.47.0/24(rw,sync)
    21. 7. #发布服务
    22. exportfs -rv

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

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

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

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

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

    1. 1. #关闭防火墙
    2. systemctl stop firewalld
    3. setenforce 0
    4. 2. #安装ipvsadm
    5. yum install ipvsadm.x86_64 -y
    6. 3. #打开路由转发功能
    7. vim /etc/sysctl.conf
    8. net.ipv4.ip_forward = 1
    9. sysctl -p
    10. 4. #防火墙做策略
    11. #清空策略
    12. iptables -F
    13. #添加策略
    14. iptables -t nat -A POSTROUTING -s 192.168.47.0/24 -o ens36 -j SNAT --to 12.0.0.1
    15. #查看策略
    16. iptables -nL -t nat
    17. 5. #加载LVS内核模块
    18. modprobe ip_vs
    19. cat /proc/net/ip_vs
    20. 6. #开启ipvsadm服务
    21. ipvsadm-save > /etc/sysconfig/ipvsadm
    22. systemctl start ipvsadm.service
    23. 7. #清空策略
    24. ipvsadm -C
    25. 8. #制定策略
    26. #指定IP地址 外网的入口 -s rr 轮询
    27. ipvsadm -A -t 12.0.0.1:80 -s rr
    28. #先指定虚拟服务器再添加真实服务器地址,-r:真实服务器地址 -m指定nat模式
    29. ipvsadm -a -t 12.0.0.1:80 -r 192.168.47.103:80 -m
    30. ipvsadm -a -t 12.0.0.1:80 -r 192.168.47.104:80 -m
    31. #开启服务
    32. ipvsadm
    33. 9. 查看策略
    34. 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模式的应对方案

    1. vim /etc/sysctl.conf //添加以下四行参数
    2. net.ipv4.conf.lo.arp_ignore = 1
    3. net.ipv4.conf.lo.arp_announce = 2
    4. net.ipv4.conf.all.arp_ignore = 1
    5. net.ipv4.conf.all.arp_announce = 2
    6. sysctl -p //刷新配置,读取修改后的配置
    7. #arp_ignore=1 :使本机系统只响应目的IP为本地物理网卡IP的ARP请求。
    8. #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. 1. #关闭防火墙
    2. systemctl stop firewalld.service
    3. setenforce 0
    4. 2. #安装ipvsadm工具
    5. yum install ipvsadm.x86_64 -y
    6. 3. #配置虚拟IP地址(VIP:192.168.47.101
    7. cd /etc/sysconfig/network-scripts/
    8. cp ifcfg-ens33 ifcfg-ens33:0
    9. vim ifcfg-ens33:0
    10. #删除UUID,dns与网关,注意子网
    11. NAME=ens33:0
    12. DEVICE=ens33:0
    13. IPADDR=192.168.47.101
    14. NETMASK=255.255.255.255
    15. 4. #重启网络服务、启动网卡
    16. systemctl restart network
    17. ifup ifcfg-ens33:0
    18. 5. #调整/proc响应参数
    19. #对于 DR 群集模式来说,由于 LVS 负载调度器和各节点需要共用 VIP 地址,应该关闭 Linux 内核的重定向参数响应服务器不是一台路由器,那么它不会发送重定向,所以可以关闭该功能
    20. vi /etc/sysctl.conf
    21. net.ipv4.ip_forward = 0
    22. net.ipv4.conf.all.send_redirects = 0
    23. net.ipv4.conf.default.send_redirects = 0
    24. net.ipv4.conf.ens33.send_redirects = 0
    25. 6. #刷新配置
    26. sysctl -p
    27. 7. #加载模块
    28. modprobe ip_vs
    29. cat /proc/net/ip_vs
    30. 8. #配置负载分配策略,并启动服务
    31. ipvsadm-save > /etc/sysconfig/ipvsadm
    32. systemctl start ipvsadm.service
    33. 9. #清空ipvsadm,并做策略
    34. ##添加真实服务器-a 指定VIP地址及TCP端口-t 指定RIP地址及TCP端口 -r 指定DR模式-g
    35. ipvsadm -C
    36. ipvsadm -A -t 192.168.47.101:80 -s rr
    37. ipvsadm -a -t 192.168.47.101:80 -r 192.168.47.102:80 -g
    38. ipvsadm -a -t 192.168.47.101:80 -r 192.168.47.103:80 -g
    39. 10. #保存设置
    40. ipvsadm
    41. ipvsadm -ln
    42. ipvsadm-save > /etc/sysconfig/ipvsadm

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

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

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

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

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

    1. [root@xzq ~]#ping 192.168.47.102
    2. PING 192.168.47.102(192.168.47.102)56(84) bytes of data.
    3. web服务器1
    4. 64 bytes from 192.168.47.102: icmp_seq=lttl=64 time=0.629 ms
    5. 64 bytes from 192.168.47.102: icmp_seq=2 ttl=64 time=0.219 ms
    6. 64 bytes from 192.168.47.102: icmp_seq=3 ttl=64 time=0.296 ms
    7. ---192.168.47.102 ping statistics ---
    8. 3 packets transmitted,3 received, 0% packet loss,time 2000ms
    9. rtt min/avg/max/mdev=0.219/0.381/0.629/0.178 ms
    10. [root@xzq~]#ping 192.168.47.103
    11. web服务器2
    12. PING 192.168.47.103(192.168.47.103)56(84) bytes of data.
    13. 64 bytes from 192.168.47.103:icmp seq=l ttl=64 time=0.719 ms
    14. 64 bytes from 192.168.47.103: icmp_seq=2 ttl=64 time=0.510 ms
    15. 64 bytes from 192.168.47.103: icmp seq=3 ttl=64 time=0.356 ms
    16. -192.168.47.103 ping statistics --.
    17. 3 packets transmitted,3 received,% packet loss,time 2002ms
    18. rtt min/avg/max/mdev =0.356/0.528/0.719/0.149 ms
    19. [root@xzq ~]# ping 192.168.47.104
    20. DR负载调度服务器
    21. PING 192.168.47.104 (192.168.47.104)56(84) bytes of data.
    22. 64 bytes from 192.168.47.104: icmp seq=l ttl=64 time=0.976 ms
    23. 64 bytes from 192.168.47.104: icmp seq=2 ttl=64 time=0.326 ms
    24. 64 bytes from 192.168.47.104: icmp seq=3 ttl=64 time=0.308 ms
    25. ---192.168.47.104 ping statistics ---
    26. 3 packets transmitted, 3 received, 0% packet loss, time 2001ms
    27. rtt min/avg/max/mdev=0.308/0.536/0.976/0.311 ms
    使用浏览器访问192.168.47.101,显示结果就可以

  • 相关阅读:
    docker 部署 MongoDB
    开运算闭运算
    【nerfStudio】5-nerfStudio导出3D Mesh模型
    第7 部分 HDLC 和PPP
    第二部分:对象之间的关联
    网站权重查询易语言代码
    数据中台稳定性的“四高” | StartDT Tech Lab 18
    是时候,升级你的 Windows 了「GitHub 热点速览」
    【低代码】ivx详解之系统架构
    二开版视频CMS完整运营源码/新版漂亮APP手机模板/集成员分销功能等
  • 原文地址:https://blog.csdn.net/Personal_Liberty/article/details/133603879