lvs+keepalived实现负载均衡和高可用

目录

注:关于负载均衡如何使用命令或者脚本配置,可参考我这篇博文
LVS详解
本篇博文讲述如何使用keepalived实现配置ipvs并保证后端服务器的高可用性。

keepalived原理

高可用概念:

高可用(High Availability )
HA(High Available), 高可用性群集是通过系统的可靠性(reliability)和可
维护性(maintainability)来度量的。工程上,通常用平均无故障时间(MTTF)
来度量系统的可靠性,用平均维修时间(MTTR)来度量系统的可维护性。于
是可用性被定义为:HA=MTTF/(MTTF+MTTR)*100%
具体HA(可用性)衡量标准:
99% 一年宕机时间不超过4天
99.9% 一年宕机时间不超过10小时
99.99% 一年宕机时间不超过1小时
99.999% 一年宕机时间不超过6分钟

高可用(High Availability )
高可用工作方式:主从方式 (非对称方式)、双机双工方式(互备互
援)、集群工作方式(多服务器互备方式)
高可用的资源分类:网络高可用、服务器高可用、存储高可用、服务
高可用等
开源高可用解决方案:keepalived:通过实现vrrp协议来实现地址
漂移;heartbeat(开源社区项目),cman+rgmanager (RHCS:
redhat cluster suite),corosync+pacemaker(大型解决方案,
一个用于心跳检测,一个用于资源转移。两个结合起来使用,可以实
现对高可用架构的自动管理。)

实现高可用,有两个关键的点,其一是状态检测,以什么标准作为服务器不可用的判断,其二是资源转移,将不可用的服务器的资源转移到可用的服务器上,以达到服务不停顿的目的

keepalived架构

Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
这里写图片描述

如上图,keepalived主要是模块是VRRP Stack和Cheackers,实现HA集群
中失败切换(Failover)功能。Keepalived通过VRRP功能能再结合LVS负载均
衡软件即可部署一个高性能的负载均衡集群系统。,Cheackers主要实现可
实现对服务器运行状态检测和故障隔离。,其中ipvs和realserver健康状态检
查通过配置文件配置就可以实现,而其他服务高可用则需要通过自己编写脚
本,然后配置keepalived调用来实现。

Keepalived运行有3个守护进程。父进程主要负责读取配置文件初始化
、监控2个子进程等;然后两个子进程,一个负责VRRP,另一个负责
Cheackers健康检查。其中父进程监控模块为WacthDog,工作实现:每个
子进程打开一个接受unix域套接字,父进程连接到那些unix域套接字并向子
进程发送周期性(5s)hello包。

上图是Keepalived的功能体系结构,大致分两层:用户空间(user space)
和内核空间(kernel space)。
内核空间:主要包括IPVS(IP虚拟服务器,用于实现网络服务的负载均衡)
和NETLINK(提供高级路由及其他相关的网络功能)两个部份。

vrrp协议介绍
这里写图片描述

VRRP (Virtual Router Redundancy Protocol ,虚拟路由冗余协议)
可以认为是实现路由器高可用的协议,简单的说,当一个路由器故障时可以
由另一个备份路由器继续提供相同的服务。

VRRP 根据优先级来确定虚拟路由器中每台路由器的角色(Master 路由
器或Backup 路由器)。VRRP 优先级的取值范围为0255 ( 数值越大表明
优先级越高 ),可配置的范围是1254 ,优先级0 为系统保留给路由器放弃
Master 位置时候使用,255 则是系统保留给IP 地址拥有者使用。优先级越高
,则越有可能成为Master 路由器。当两台优先级相同的路由器同时竞争
Master 时,比较接口IP 地址大小。接口地址大者当选为Master

keepalived特性

在网络层、数据链路层,运行着4个重要的协议:互联网协议IP、互联网控制报文协议
ICMP、地址转换协议ARP以及反向地址转换协议RARP。Keepalived在网络层采用的最
常见的工作方式是通过ICMP协议向服务器集群中的那个节点发送一个ICMP数据包(类
似于ping实现的功能),如果某个节点没有返回响应数据包,那么认为此节点发生了故
障,Keepalived将报告次节点失效,并从服务器集群中剔除故障节点。

在传输层,提供了两个主要的协议:传输控制协议TCP和用户数据协议UDP。传输控制
协议TCP可以提供可靠的数据传输服务、Ip地址和端口代表TCP的一个连接端。要获得
TCP服务,需要在发送机的一个端口上和接收机的一个端口上建立连接,而Keepalived
在传输层就是利用TCP协议的端口连接和扫描技术来判断集群点是否正常的。比如,对
于常见的WEB服务默认的80端口、SSH服务默认的22端口等,Keepalived一旦在传输
层探测到这些端口没有响应数据返回,就认为这些端口发生异常,然后强制将此端口对
应得节点从服务器集群组中移除。

在应用层,可运行FTP、TELNET、HTTP、DNS等各种不同类型的高层协议,
Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived的工作
方式;例如:用户可以通过编写程序来运行keepalived。而keepalived将根据用户的设
定检测各种程序或服务是否运行正常,如果Keepalived的检测结果与用户设定不一致时
,Keepalived将把对应的服务从服务器中移除。

也就是说,keepalived所实现的功能是,其一当调度器有一台出现故障之后,能够切换到另一台备用的调度器,保证服务不受影响;其二,实时监测后端的realserver的状态,如果出现问题那么就将这台机器自动踢出,当该服务器状态

keepalived配置

网址规划

机器名称 IP配置 服务角色
lvs1 DIP:172.25.0.11 VIP:172.25.0.100 主调度器
lvs2 DIP:172.25.0.12 VIP:172.25.0.100 从调度器
web1 RIP:172.25.0.31 web服务器
web2 RIP:172.25.0.32 web服务器
web3 RIP:172.25.0.33 web服务器

调度器的配置

lvs1的配置

[root@lvs1 ~]# vim /etc/keepalived/keepalived.conf 

! Configuration File for keepalived

global_defs {#全局配置
   notification_email {#realserver故障时通知邮件的收件人地址
        root@localhost
     }
   notification_email_from root@xiaomi.com #发件人信息
   smtp_server 127.0.0.1  #发邮件服务器
   smtp_connect_timeout 30  #连接超时时间
   router_id KEEPALIVED_LVS #路由器的标识
}

vrrp_instance VI_1 { #虚拟路由实例一
    state MASTER #承担角色,MASTER|BACKUP
    interface ens34 #通告所使用的网络端口
    virtual_router_id 51  #虚拟路由的组ID,同一组主备要保持同一个ID
    priority 100     #优先级信息 ,备结点需要更低
    advert_int 1     #VRRP通告间隔
    authentication {
        auth_type PASS  #认证机制
        auth_pass centos  #密码
    }
    virtual_ipaddress {
        172.25.0.100  #VIP的地址
    }
}

virtual_server 172.25.0.100 80 {  #设置一个virtualServer
    delay_loop 2 #服务轮询的时间间隔
    lb_algo wrr  #LVS的调度算法  rr|wrr|lc|wlc|lblc|sh|dh
    lb_kind DR   #LVS的模式选择  NAT|DR|TUN
    protocol TCP  #指明健康检查使用的是TCP还是UDP
!   persistence_timeout 120  #会话保持时间,注意,若开启此功能,用户会在一定时间内,分配到同一个后端realServer
    real_server 172.25.0.31 80 {
        weight 1 #每台服务器的权重
        HTTP_GET {
            url { ##请求的路径
              path /
            }
        }
        TCP_CHECK {  #TCP健康检测
            connect_timeout 3  #连接超时时间  
            nb_get_retry 3     #重连次数
            delay_before_retry 3  #重连间隔
        }
    }
    real_server 172.25.0.32 80 {
        weight 1
        HTTP_GET {
            url {
              path /
            }
        }
        TCP_CHECK {  #TCP健康检测
            connect_timeout 3  #连接超时时间  
            nb_get_retry 3     #重连次数
            delay_before_retry 3  #重连间隔
        }
    }
    real_server 172.25.0.33 80 {
        weight 1
        HTTP_GET {
            url {
              path /
            }
        }
        TCP_CHECK {  #TCP健康检测
            connect_timeout 3  #连接超时时间  
            nb_get_retry 3     #重连次数
            delay_before_retry 3  #重连间隔
        }
    }
}


配置完毕之后,将程序设定为开机自启动,启动服务

[root@lvs1 ~]# systemctl enable keepalived.service 
[root@lvs1 ~]# systemctl start keepalived.service     

lvs2的配置
lvs2的配置与lvs1基本相同,主要需要改以下几个点

  • 角色名修改为BACKUP
    state BACKUP #承担角色,MASTER|BACKUP
  • 优先级调低
    priority 98 #优先级信息 ,备结点需要更低

    web端的配置

    降配置的步骤,写入脚本中,并设定为开机自启动。

    WEB端脚本

#!/bin/bash 
# 
# Script to start LVS DR real server. 
# chkconfig: - 90 10 
# description: LVS DR real server 
# 
.  /etc/rc.d/init.d/functions

VIP=172.25.0.100

host=`/bin/hostname`

case "$1" in
start)
       # Start LVS-DR real server on this machine. 
        /sbin/ifconfig lo down
        /sbin/ifconfig lo up
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        #响应ip地址是在lo接口上的arp请求,其余的忽略。
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
        # 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        #配置所有网卡只响应自己接口上的ip的arp请求,其余的忽略。
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        #必须避免将接口信息向非本网络进行通告

        /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        /sbin/route add -host $VIP dev lo:0

;;
stop)

        # Stop LVS-DR real server loopback device(s). 
        /sbin/ifconfig lo:0 down
        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

;;

*)
            # Invalid entry. 
            echo "$0: Usage: $0 {start||stop}" 
            exit 1
;;
esac

保存至/etc/init.d/lvs-rs,并赋予执行权限,然后添加为开机启动:

 [root@web1~]# chmod +x /etc/init.d/lvs-rs

 [root@web1 ~]# chkconfig --add lvs-rs

 [root@web1 ~]# chkconfig lvs-rs on

 [root@web1 ~]# /etc/init.d/lvs-rs start

web2和web3使用相同的配置即可

测试:

在后端的三台web服务器中设置不同的站点内容,在浏览器中访问,看是否能够得到不同的结果。注意清除浏览器的缓存以及keepalived中的会话保持选项。

猜你喜欢

转载自blog.csdn.net/gui951753/article/details/80320973