LVS+keepalived实现负载均衡&高可用(原来以及部署方法)

一、ARP技术概念介绍

为什么讲ARP技术,因为平常工作中有接触。还有就是LVS的dr模式是用到arp的技术和数据。

1、什么是ARP协议

ARP协议全程地址解析协议(AddressResolution Protocol,ARP)是在仅知道 主机的 IP地址时确定其 物理地址的一种协议。因IPv4和 以太网的广泛应用,其主要作用是通过已知IP地址,获取对应物理地址的一种协议。

2、什么是ARP代理(ARP proxy)

在网络中代理是非常常见的,所谓的代理就是我朝一个人要,另外一个人给。生活中一个比较实际的例子就是,房屋中介。

Arp协议要求通信的主机的双方必须是在物理的同一个网段。那如果发送主机和目标主机不是在同一个局域网里,而ARP广播包是不能够跨越网段进行传输的。所以此时就需要一个路由或ARP中继技术来转发ARP请求包。客户端获取到的MAC地址是路由器或者中继的MAC地址。那么之后这个客户端发给目的端的数据,都会先发给这个路由器或ARP中继,再进而转给目的端,这种情况就称为ARP代理。

3、arp协议工作原理

原理图:

LVS原理详解及部署之一:ARP原理准备_LVS

   当主机10.0.0.1要发送数据给10.0.0.2数据,会首先去查本地的arp缓存表,如果有此IP地址和此主机对应的MAC地址,如果有就可以直接传输数据。如果没有就主机10.0.0.1就会向局域网去广播,询问谁的IP地址是10.0.0.2.此时在本局域网中的所有主机都能够收到此广播包,但只有主机10.0.0.2才会回应这个广播包。会以单播的形式直接回复10.0.0.2说我的MAC地址为多少。此时10.0.0.1收到了此信息,那么两者之间就能够通过MAC地址进行通信了。并且将这个ARP和IP对应信息缓存到ARP缓存表里。


ARP欺骗工作原理:

ARP欺骗就是通过伪造IP地址和MAC地址对实现ARP欺骗的,它能够在网络中产生大量的ARP包,来让网络堵塞。攻击主机只要持续的发送假的ARP包,让网络中的主机缓存错误的IP-MAC对应信心,造成网络中断或中间人攻击。

        ARP攻击主要是在局域网中的,因为ARP包是不会垮网络传播的。所以划分VLAN能够减少当受到ARP攻击后,网络受影响的范围。

ARP欺骗过程图及讲解:

LVS原理详解及部署之一:ARP原理准备_LVS原理详解_02

ARP欺骗防御办法

1)进行MAC和IP地址进行绑定

2)杀毒软件开启arp防火墙

ARP病毒排查

1)使用arp –a命令查看本地arp缓存表,查看重复MAC地址或在交换机路由器上查看重复MAC地址。

2)使用ARP防御软件或检测软件(如:科莱,彩影arp防火墙分析流量,查找可以攻击源)

3)使用折半法排除网络出错范围。(如先断开一般的网络查看是否正常,如果正常就说明断开的那部分有问题。然后再接上剩下的那一半继续查看,依次类推最终找到问题点)

当然排查、预防ARP攻击的方法有很多,大家可以自己寻找。

------------------------------自我后续小结--------------------------------------

ARP协议的功能就是能够通过IP地址解析到MAC地址。而ARP欺骗的手段就是通过伪造IP-MAC信息,让网络上的主机受骗。误以为攻击主机就是他们要发送的目标主机(路由器)这样就将信息都发给了攻击者,攻击者就能获取网络其他主机的数据包。而且网络上的主机会出现网络中断等现象。如果攻击者在网络上大量的发送ARP信息,也会造成网络的堵塞。

---------------------------------------------------------------------------------

二、LVS负载均衡集群介绍
负载均衡集群的作用:提供一种廉价、有效、透明的方法,来扩展网络设备和服务器的负载带宽、增加吞吐量,加强网络数据处理能力、提高网络的灵活性和可用性。

1)把单台计算机无法承受的大规模的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间,提升用户体验。

2)单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力得到大幅度提高。

3)7*24小时的服务保证,任意一个或多个设备节点设备宕机,不能影响到业务。在负载均衡集群中,所有计算机节点都应该提供相同的服务,集群负载均衡获取所有对该服务的如站请求。


LVS介绍
LVS是linux virtual server的简写linux虚拟服务器,是一个虚拟的服务器集群系统,可以再unix/linux平台下实现负载均衡集群功能。该项目在1998年5月由章文嵩博士组织成立。


以下是LVS官网提供的4篇文章:(非常详细,我觉得有兴趣还是看官方文档比较正宗吧!!)

 http://www.linuxvirtualserver.org/zh/lvs1.html

 http://www.linuxvirtualserver.org/zh/lvs2.html

 http://www.linuxvirtualserver.org/zh/lvs3.html

 http://www.linuxvirtualserver.org/zh/lvs4.html

IPVS发展史

早在2.2内核时,IPVS就已经以内核补丁的形式出现。

从2.4.23版本开始ipvs软件就是合并到linux内核的常用版本的内核补丁的集合。

从2.4.24以后IPVS已经成为linux官方标准内核的一部分

LVS原理详解及部署之二:LVS原理详解(3种工作方式8种调度算法)_LVS调度算法_02

   从上图可以看出lpvs是工作在内核层,我们不能够直接操作ipvs,vs负载均衡调度技术是在linux内核中实现的。因此,被称之为linux虚拟服务器。我们使用该软件配置lvs的时候,不能直接配置内核中的ipvs,而需要使用ipvs的管理工具ipvsadm进行管理。通过keepalived也可以管理LVS。

LVS体系结构与工作原理简单描述
LVS集群负载均衡器接受服务的所有入展客户端的请求,然后根据调度算法决定哪个集群节点来处理回复客户端的请求。

LVS虚拟服务器的体系如下图所示,一组服务器通过高速的局域网或者地理分布的广域网相互连接,在这组服务器之前有一个负载调度器(load balance)。负载调度器负责将客户的请求调度到真实服务器上。这样这组服务器集群的结构对用户来说就是透明的。客户访问集群系统就如只是访问一台高性能,高可用的服务器一样。客户程序不受服务器集群的影响,不做任何修改。

就比如说:我们去饭店吃饭点菜,客户只要跟服务员点菜就行。并不需要知道具体他们是怎么分配工作的,所以他们内部对于我们来说是透明的。此时这个服务员就会按照一定的规则把他手上的活,分配到其他人员上去。这个服务员就是负载均衡器(LB)而后面这些真正做事的就是服务器集群。

底下是官网提供的结构图:

LVS原理详解及部署之二:LVS原理详解(3种工作方式8种调度算法)_LVS_03

LVS的基本工作过程

LVS原理详解及部署之二:LVS原理详解(3种工作方式8种调度算法)_LVS原理介绍_04

客户请发送向负载均衡服务器发送请求。负载均衡器接受客户的请求,然后先是根据LVS的调度算法(8种)来决定要将这个请求发送给哪个节点服务器。然后依据自己的工作模式(3种)来看应该如何把这些客户的请求如何发送给节点服务器,节点服务器又应该如何来把响应数据包发回给客户端。

恩,那这样我们就只要接下来搞懂LVS的3中工作模式,8种调度算法就可以了。

 

LVS的三种工作模式:


1)VS/NAT模式(Network address translation)

2)VS/TUN模式(tunneling)

3)DR模式(Direct routing)

 


1、NAT模式-网络地址转换

        Virtualserver via Network address translation(VS/NAT)

这个是通过网络地址转换的方法来实现调度的。首先调度器(LB)接收到客户的请求数据包时(请求的目的IP为VIP),根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后调度就把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP),这样真实服务器(RS)就能够接收到客户的请求数据包了。真实服务器响应完请求后,查看默认路由(NAT模式下我们需要把RS的默认路由设置为LB服务器。)把响应后的数据包发送给LB,LB再接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端。

调度过程IP包详细图:

LVS原理详解及部署之二:LVS原理详解(3种工作方式8种调度算法)_LVS调度算法_05

原理图简述:

1)客户端请求数据,目标IP为VIP

2)请求数据到达LB服务器,LB根据调度算法将目的地址修改为RIP地址及对应端口(此RIP地址是根据调度算法得出的。)并在连接HASH表中记录下这个连接。

3)数据包从LB服务器到达RS服务器webserver,然后webserver进行响应。Webserver的网关必须是LB,然后将数据返回给LB服务器。

4)收到RS的返回后的数据,根据连接HASH表修改源地址VIP&目标地址CIP,及对应端口80.然后数据就从LB出发到达客户端。

5)客户端收到的就只能看到VIP\DIP信息。


NAT模式优缺点:

1、NAT技术将请求的报文和响应的报文都需要通过LB进行地址改写,因此网站访问量比较大的时候LB负载均衡调度器有比较大的瓶颈,一般要求最多之能10-20台节点

2、只需要在LB上配置一个公网IP地址就可以了。

3、每台内部的节点服务器的网关地址必须是调度器LB的内网地址。

4、NAT模式支持对IP地址和端口进行转换。即用户请求的端口和真实服务器的端口可以不一致。

 


2、TUN模式

virtual server via ip tunneling模式:采用NAT模式时,由于请求和响应的报文必须通过调度器地址重写,当客户请求越来越多时,调度器处理能力将成为瓶颈。为了解决这个问题,调度器把请求的报文通过IP隧道转发到真实的服务器。真实的服务器将响应处理后的数据直接返回给客户端。这样调度器就只处理请求入站报文,由于一般网络服务应答数据比请求报文大很多,采用VS/TUN模式后,集群系统的最大吞吐量可以提高10倍。

VS/TUN的工作流程图如下所示,它和NAT模式不同的是,它在LB和RS之间的传输不用改写IP地址。而是把客户请求包封装在一个IP tunnel里面,然后发送给RS节点服务器,节点服务器接收到之后解开IP tunnel后,进行响应处理。并且直接把包通过自己的外网地址发送给客户不用经过LB服务器。

Tunnel原理流程图:

LVS原理详解及部署之二:LVS原理详解(3种工作方式8种调度算法)_LVS调度算法_06


原理图过程简述:

1)客户请求数据包,目标地址VIP发送到LB上。

2)LB接收到客户请求包,进行IP Tunnel封装。即在原有的包头加上IP Tunnel的包头。然后发送出去。

3)RS节点服务器根据IP Tunnel包头信息(此时就又一种逻辑上的隐形隧道,只有LB和RS之间懂)收到请求包,然后解开IP Tunnel包头信息,得到客户的请求包并进行响应处理。

4)响应处理完毕之后,RS服务器使用自己的出公网的线路,将这个响应数据包发送给客户端。源IP地址还是VIP地址。(RS节点服务器需要在本地回环接口配置VIP,后续会讲)

 

3、DR模式(直接路由模式)

Virtual server via direct routing (vs/dr)

DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。同TUN模式一样,DR模式可以极大的提高集群系统的伸缩性。而且DR模式没有IP隧道的开销,对集群中的真实服务器也没有必要必须支持IP隧道协议的要求。但是要求调度器LB与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。

DR模式是互联网使用比较多的一种模式。

DR模式原理图:

LVS原理详解及部署之二:LVS原理详解(3种工作方式8种调度算法)_LVS原理介绍_07

DR模式原理过程简述:

VS/DR模式的工作流程图如上图所示,它的连接调度和管理与NAT和TUN中的一样,它的报文转发方法和前两种不同。DR模式将报文直接路由给目标真实服务器。在DR模式中,调度器根据各个真实服务器的负载情况,连接数多少等,动态地选择一台服务器,不修改目标IP地址和目标端口,也不封装IP报文,而是将请求报文的数据帧的目标MAC地址改为真实服务器的MAC地址。然后再将修改的数据帧在服务器组的局域网上发送。因为数据帧的MAC地址是真实服务器的MAC地址,并且又在同一个局域网。那么根据局域网的通讯原理,真实复位是一定能够收到由LB发出的数据包。真实服务器接收到请求数据包的时候,解开IP包头查看到的目标IP是VIP。(此时只有自己的IP符合目标IP才会接收进来,所以我们需要在本地的回环借口上面配置VIP。另:由于网络接口都会进行ARP广播响应,但集群的其他机器都有这个VIP的lo接口,都响应就会冲突。所以我们需要把真实服务器的lo接口的ARP响应关闭掉。)然后真实服务器做成请求响应,之后根据自己的路由信息将这个响应数据包发送回给客户,并且源IP地址还是VIP。

DR模式小结:

1、通过在调度器LB上修改数据包的目的MAC地址实现转发。注意源地址仍然是CIP,目的地址仍然是VIP地址。

2、请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此并发访问量大时使用效率很高(和NAT模式比)

3、因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器LB只能在一个局域网里面

4、RS主机需要绑定VIP地址在LO接口上,并且需要配置ARP抑制。

5、RS节点的默认网关不需要配置成LB,而是直接配置为上级路由的网关,能让RS直接出网就可以。

6、由于DR模式的调度器仅做MAC地址的改写,所以调度器LB就不能改写目标端口,那么RS服务器就得使用和VIP相同的端口提供服务。

官方三种负载均衡技术比较总结表:

工作模式

VS/NAT

VS/TUN

VS/DR

Real  server

(节点服务器)

Config dr gw

Tunneling

Non-arp device/tie vip

Server Network

Private

LAN/WAN

LAN

Server number

(节点数量)

Low 10-20

High 100

High 100

Real server gateway

Load balance

Own router

Own router

优点

地址和端口转换

Wan环境加密数据

性能最高

缺点

效率低

需要隧道支持

不能跨域LAN

LVS调度算法
最好参考此文章:http://www.linuxvirtualserver.org/zh/lvs4.html

Lvs的调度算法决定了如何在集群节点之间分布工作负荷。当director调度器收到来自客户端访问VIP的上的集群服务的入站请求时,director调度器必须决定哪个集群节点应该处理请求。Director调度器用的调度方法基本分为两类:

固定调度算法:rr,wrr,dh,sh

动态调度算法:wlc,lc,lblc,lblcr

算法 说明
rr 轮询算法,它将请求依次分配给不同的rs节点,也就是RS节点中均摊分配。这种算法简单,但只适合于RS节点处理性能差不多的情况
wrr 加权轮训调度,它将依据不同RS的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值低的RS更多。相同权值的RS得到相同数目的连接数。
Wlc 加权最小连接数调度,假设各台RS的全职依次为Wi,当前tcp连接数依次为Ti,依次去Ti/Wi为最小的RS作为下一个分配的RS
Dh 目的地址哈希调度(destination hashing)以目的地址为关键字查找一个静态hash表来获得需要的RS
SH 源地址哈希调度(source hashing)以源地址为关键字查找一个静态hash表来获得需要的RS
Lc 最小连接数调度(least-connection),IPVS表存储了所有活动的连接。LB会比较将连接请求发送到当前连接最少的RS.
Lblc 基于地址的最小连接数调度(locality-based least-connection):将来自同一个目的地址的请求分配给同一台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑。

 

LVS调度算法的生产环境选型:

1、一般的网络服务,如http,mail,mysql等常用的LVS调度算法为:

a.基本轮询调度rr

b.加权最小连接调度wlc

c.加权轮询调度wrr

2、基于局部性的最小连接lblc和带复制的给予局部性最小连接lblcr主要适用于web cache和DB cache

3、源地址散列调度SH和目标地址散列调度DH可以结合使用在防火墙集群中,可以保证整个系统的出入口唯一。

实际适用中这些算法的适用范围很多,工作中最好参考内核中的连接调度算法的实现原理,然后根据具体的业务需求合理的选型。

-----------------后续自我小结--------------------------------------------------

基本上lvs的原理部分就到这里,个人还是觉得像要对LVS有一个比较全面的认识,还是需要去将官方文档认真的看过一遍。主要部分还是在于3种工作方式和8种调度算法。以及实际工作种什么样的生产环境适用哪种调度算法。

-------------------------------------------------------------------------------
三、部署LVS+keepalived

我只用了四台服务器来做测试,可以根据自己的情况做调整

角色 IP地址  备注
主LVS调度器(MASTER)  192.168.113.131 使用keepalived配置
备LVS调度器(BACKUP) 192.168.113.132 使用keepalived配置
HTTP服务器(RS1)  192.168.113.133 apache服务器(一般生产环境需要外网IP地址,这里用内网IP地址替代)
HTTP服务器(RS2)  192.168.113.134 apache服务器(一般生产环境需要外网IP地址,这里用内网IP地址替代)
虚拟IP地址(VIP)   192.168.113.12 虚拟IP地址

1、分别在两台(HTTP服务器)机器上配置lvs转发(这里我使用的脚本)

[root@localhost ~]# vim lvs.sh

#!/bin/bash
# Written by NetSeek
# description: Config realserver lo and apply noarp
WEB_VIP="192.168.113.12"        #:修改VIP,其它的地方不动,
. /etc/rc.d/init.d/functions
case "$1" in
start)
       ifconfig lo:0 $WEB_VIP netmask 255.255.255.255 broadcast $WEB_VIP
       /sbin/route add -host $WEB_VIP dev lo:0
       echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       ifconfig lo:0 down
       route del $WEB_VIP >/dev/null 2>&1
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;
status)
        # Status of LVS-DR real server.
        islothere=`/sbin/ifconfig lo:0 | grep $WEB_VIP`
        isrothere=`netstat -rn | grep "lo:0" | grep $web_VIP`
        if [ ! "$islothere" -o ! "isrothere" ]
        then
            echo "LVS-DR real server Stopped."
        else
            echo "LVS-DR Running."
        fi
        ;;
*)
        # Invalid entry.
        echo "$0: Usage: $0 {start|status|stop}"
        exit 1
        ;;
esac
exit 0

2、启动lvs配置

[root@localhost ~]# sh lvs.sh start

3、安装keepaliced并修改配置文件

  (1)、修改master节点keepaliced配置文件

[root@localhost ~]# yum -y install keepalived

[root@k8s-master01 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER                 #主从节点配置,BACKUP是从节点
    interface ens33              #定义检测的网络端口
    virtual_router_id 51         #定义虚拟路由id同一实例主从id相同
    priority 90                  #定义虚拟路由的权限,越大权限越高
    advert_int 1                 #定义检测时间间隔
    authentication {             #定义主从认证使用密码方式,主从一致
        auth_type PASS           
        auth_pass 1111
    }
    virtual_ipaddress {          #定义虚拟IP地址
        192.168.113.12
    }
}

virtual_server 192.168.113.12 80 {       #定义虚拟服务,需指定IP地址和端口,空格隔开
    delay_loop 6                         #定义RS运行情况监测时间间隔
    lb_algo rr                           #定义负载调度算法
    lb_kind DR                           #定义LVS的工作模式
    persistence_timeout 50               #定义会话保持时间,S为单位
    protocol TCP                         #指定转发协议

    real_server 192.168.113.133 80 {     #定义真实服务器IP地址和端口
        weight 1                         #定义RS的权重
        TCP_CHECK {                      #RS server健康检查部分
            connect_timeout 3            #定义超出3s连接超时
            nb_get_retry 3               #定义重试次数
            delay_before_retry 3         #定义重试时间间隔
            connect_port 80              #定义健康检查端口
        }
    }
    real_server 192.168.113.134 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
 }

  (2)、拷贝主节点配置到从节点并修改配置几个位置

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state BACKUP                #申明从节点
    interface ens33             #修改对应的网络接口
    virtual_router_id 51
    priority 80                 #修改权重
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.113.12
    }
}

virtual_server 192.168.113.12 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.113.133 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.113.134 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
 }

  (3)、启动keepalived服务

[root@localhost ~]# systemctl start keepalived.service

接下来没什么好弄的了自己去做验证

posted @ 2022-01-19 16:00  智杰  阅读(349)  评论(0编辑  收藏  举报
marquee
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生