Bootstrap

LVS+Keepalived 实现高可用负载均衡

一、Keepalived介绍

keepalived是在Linux系统下的一个轻量级的高可用解决方案,是使用C语言编写的,在 Keepalived 中实现了一组检查器,可以根据服务集群中服务器的健康状态,自动的进行动态主备切换、管理。

VRRP(Virtual Router Redundancy Protocol)虚拟路由器冗余协议,是一种容错的主备模式的协议,保证当主机的下一跳路由出现故障时,由另一台路由器来代替出现故障的路由器进行工作,通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信。

Keepalived软件主要是通过VRRP协议实现高可用功能,在安装keepalived的服务器主机上会在配置文件中设置一个虚拟IP,当该keepalived节点为主节点且正常运行时,设置的虚拟Ip就会在该节点生效且绑定在该主机的网卡上,而其他备用主机设置的虚拟IP就不会生效。当测到主keepalived节点出现故障时,备用keepalived节点检会进行抢占提供服务,抢占成功的keepalived节点就会将配置的虚拟IP绑定在自己的网卡上,这样对外部用户来说虚拟IP提供的服务是一直可用的,当故障服务器被修复后可以正常工作时Keepalived会自动的将该服务器加入到服务器群中。在整个过程中,故障检测、故障服务器剔除以及修复后的服务器重新上线这些操作都是由keepalived自动完成,运维人员只需要关注故障服务器的修复。

通过keepalived配置nginx高可用

如图:有两台服务器Server1(192.168.56.101)和Server2(192.168.56.102)。每台服务器上都运行一个nginx实例和一个keepalived实例,其中Server1的keepalived实例是Master节点,Server2的keepalived实例是备用节点,两个keepalived实例配置的虚拟IP为192.168.56.100

1)nginx配置:

nginx保持默认配置即可,通过真实ip访问两台nginx服务如下

2)keepalived配置:

keepalived配置文件一般在/etc/keepalived/keepalived.conf下,    keepalive-master配置如下

! Configuration File for keepalived
global_defs {
   #路由id,全局唯一,表示当前keepalived节点的唯一性
   router_id keep_101
}

vrrp_instance VI_1 {
    #设置当前实例状态为MASTER。MASTER代表是主实例,BACKUP代表是备用实例
    state MASTER
    #当前实例绑定的网卡
    interface enp0s8
    #当前实例的虚拟路由id,一组主备的实例的路由id是相同的
    virtual_router_id 51
    #当前实例的优先级
    priority 100
    #主备之间同步检查时间间隔
    advert_int 1
    #一组主备实例的认证密码,方式非法节点进入路由组
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #设置当前实例的虚拟IP
    virtual_ipaddress {
        192.168.56.100
    }
}

keepalive-slve配置如下

! Configuration File for keepalived
global_defs {
   #由于是全局唯一Id,所有需要与master保持不同
   router_id keep_102
}

vrrp_instance VI_1 {
    #备用实例状态应设置为BACKUP
    state BACKUP
    interface enp0s8
    virtual_router_id 51
    #设置备用实例的优先级低于主实例,这样可保证在主实例故障修复后可以再次将主节点抢占回来
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.56.100
    }
}

启动keepalived,通过虚拟ip访问nginx服务,然后kill掉Server1上的keepalived验证是否保证虚拟ip正常访问,验证图示如下

二、LVS

LVS(Linux Virtual Server)Linux虚拟服务器,是一个虚拟的服务器集群系统。LVS在Linux内核中实现了基于IP的内容请求分发的负载均衡调度解决方案,属于四层负载均衡

LVS将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。在使用LVS负载均衡时,用户的请求都会被LVS调度器转发到真实服务器,真实服务器在处理完请求后将数据发送给用户时会有多种方式(三种)可以选择,整个服务器集群的结构对客户是透明的。

1、三种工作模式:

1)NAT模式:
NAT(Network Address Translation)网络地址转换,通过修改数据报头,使得内网中的IP可以和外部网络进行通信。LVS负载调度器使用两块不同的网卡配置不同的IP地址,网卡一设置为公网IP负责与外部通信,网卡二设置内网IP负责与内网服务通信。

外部用户通过访问LVS调度器的公网IP发送服务请求,LVS调度器接受请求后,将请求数据进行转换,通过内网IP的网卡设备,根据调度策略将数据转发给内部服务,内部服务处理完成将响应数据再返回给LVS调度器,LVS调度器再将数据转换通过公网IP的网卡设备将响应结果返回给请求用户。

以上描述的就是一个基于NAT工作模式的LVS调度,这种模式的瓶颈在于LVS调度器,因为所有的请求数据和响应数据都需要经过LVS来进行转换处理,当大流量到来时,LVS调度器就成了一个短板,限制整个集群服务性能的上限。

2)TUN模式:
TUN模式与NAT的不同在于,TUN模式下LVS调度器只负责接受请求,而真实服务器进行响应请给用户。LVS调度器与真实服务器建立IP隧道,IP隧道它可以将原始数据包封装并将新的源地址及端口、目标地址及端口添加新的包头中,将封装后的数据通过隧道转发给后端的真实服务器,真实服务器在收到请求数据包后直接给外部用户响应数据,这种模式下要求真实服务器具有直接外部用户通信的能力。

外部用户访问LVS调度器发送服务请求,LVS调度器接收请求后,将请求数据转换,根据调度策略将数据转发给服务集群真实服务器,真实服务器在处理完成后,就直接与外部请求用户通信,直接将响应结果返回给请求用户。

以上描述就是一个基于TUN工作模式的LVS调度,这种模式下LVS调度器就只负责请求的负载均衡转发,而处理数据的响应则全部由真实服务器来直接和用户通信了。在实际环境中,请求的数据量往往是小于响应的数据量,所以仅仅将请求数据让LVS来转发,好处就是LVS调度器的压力减少很多,可以承载更大的流量,同时真实服务器的性能也能得到充分利用,缺点就是真实服务器需要与外部网络用户直接通信,在安全上会存在一定风险。

3)DR模式:
DR模式是在TUN模式的基础上又进行了改造,在DR模式下LVS调度器与真实服务器共享一个虚拟IP,且调度器的虚拟IP对外暴露,而真实服务器的虚拟IP地址将配置在Non-ARP的网络设备上,这种网络设备不会向外广播自己的MAC及对应的IP地址,这样即保证了真实服务器可以接受虚拟IP的网络请求也让真实服务器所绑定的虚拟IP对外部网络部是不可见的。

外部用户通过访问虚拟IP将请求数据包发送到调度器,调度器根据调度策略确定转发的真实服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为选出的真实服务器的MAC地址,通过交换机将该数据帧发给真实服务器,之后真实服务器在处理完后进行数据响应时,会将虚拟IP封装在数据包中,再经过路由将数据返回给外部用户,在这整个过程中,真实服务器对外部用户不可见,外部用户只能看到虚拟IP的地址

在DR模式下因为真实服务器给外部用户回应的数据包设置的源IP是虚拟IP地址,又因为真实服务器的虚拟IP不对外暴露,这样外部用户在通过虚拟IP访问时,就访问到了调度器的虚拟IP地址,就实现了整个集群对外部用户透明。

2、负载均衡算法:

轮询、加权轮询等。。。

3、使用LVS对集群进行DR模式的负载均衡

我们演示的DR模式的LVS负载均衡,所以真实服务器的虚拟IP将和LVS调度器的虚拟IP一样,且真实服务器的虚拟IP不能对外暴露,所以我们会将虚拟IP绑定在lo回环接口上。

参考:https://zhuanlan.zhihu.com/p/156858630

https://zhuanlan.zhihu.com/p/157303195

三、LVS+Keepalived 实现高可用负载均衡

上面我们了解了lvs和keepalived,将二者结合起来使用可以达到一个完美的高可用负载均衡。

回顾

LVS 是一种预装在 Linux 系统中,基于四层、具有强大性能的反向代理服务器。ipvsadm 是 LVS 的命令行管理工具。

LVS 特点是:

  1. 首先它是基于 4 层的网络协议的,抗负载能力强,对于服务器的硬件要求除了网卡外,其他没有太多要求;
  2. 配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,大大减少了人为出错的几率;
  3. 应用范围比较广,不仅仅对 web 服务做负载均衡,还可以对其他应用(mysql)做负载均衡;
  4. LVS 架构中存在一个虚拟 IP 的概念,需要向 IDC 多申请一个 IP 来做虚拟 IP。

Keepalived 是一个基于 VRRP 协议来实现的服务高可用方案,可以利用其来避免 IP 单点故障,一般与其它负载均衡技术(如 LVS 、HAProxy 、Nginx)一起工作来达到集群的高可用。Keepalived 是 LVS 的扩展项目, 因此它们之间具备良好的兼容性,可直接通过 Keepalived 的配置文件来配置 LVS。

相关术语:

  • LB (Load Balancer 负载均衡)
  • HA (High Available 高可用)
  • Failover (失败切换)
  • Cluster (集群)
  • LVS (Linux Virtual Server Linux 虚拟服务器)
  • DS (Director Server),指的是前端负载均衡器节点
  • RS (Real Server),后端真实的工作服务器
  • VIP (Virtual IP),虚拟的 IP 地址,向外部直接面向用户请求,作为用户请求的目标的 IP 地址
  • DIP (Director IP),主要用于和内部主机通讯的 IP 地址
  • RIP (Real Server IP),后端服务器的 IP 地址
  • CIP (Client IP),访问客户端的 IP 地址

环境:

软件环境:CentOS7、Keepalived1.3.5、ipvsadm1.27

  • DS1(MASTER):172.17.13.120
  • DS1(BACKUP):172.17.13.123
  • RS1:172.17.13.142:80 Nginx
  • RS1:172.17.13.173:80 Nginx
  • VIP:172.17.13.252

集群的架构图如上图所示。DS1、DS2 为两个 LB 节点,RS1、RS2 为两个真实的服务节点,通过一个虚拟的 IP 地址对外提供服务。最终我们要达到的目标为:

  1. Client 通过 VIP 访问服务能够将请求根据配置的规则进行分发(LB)
  2. 当 MATSER 的 LB 节点故障时,自动切换到 BACKUP 的 LB 节点上,保证服务正常访问;MASTER 恢复后,再次作为主 LB 负载节点
  3. 当某个 RS 节点故障时,自动剔除该节点;恢复后,再次加入集群

参考:https://www.cnblogs.com/Sinte-Beuve/p/13392747.html

;