深入浅出Keepalived

二. Keepalived

2.1 Keepalived简介

Keepalived是一个免费的、轻量级的高可用解决方案,是一个由C语言编写的路由软件,主要目标是为Linux系统和基于Linux系统的基础架构提供简单而强大的负载均衡和高可用性设施,其中的负载均衡框架依赖于Linux虚拟服务器(IPVS)内核模块,提供四层负载均衡。Keepalived框架可以单独使用,也可以与其他软件一起使用。

Keepalived最初是为LVS设计的,主要用来监控集群中各个服务节点的运行状态。当服务节点出现故障并被检测到时,则会被Keepalived从集群中踢除,待恢复后再重新加入集群,期间的工作自动完成,不需要人工干预,需要人工完成的部分仅限于修复出现故障的服务节点。

2.2 VRRP

虚拟路由器冗余协议(Virtual Router Redundancy Protocol,VRRP)是一种选择协议、路由备份协议,是Keepalived中最重要的一个功能,可以将多个路由器组成一个虚拟路由器(一主多备),在网络发生故障时实现透明切换。
通过VRRP协议组成的虚拟路由器,由一个或多个虚拟IP对外提供服务,内部则是多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,称为主路由器。其工作过程大致如下。
(1)启用VRRP功能后,路由器根据优先级确定自己在虚拟路由器中的角色,优先级高的为主路由器,其他为备用路由器。主路由器定期向备用路由器发送VRRP报文,通告自己的工作状态正常,备用路由器则会定时接收。

(2)VRRP根据不同的抢占方式,确定是否替换主备路由器状态。

  • 抢占方式:备用路由器收到报文后,会对比优先级,若大于通告报文中的优先级,则切换为主路由器,否则保持状态不变;
  • 非抢占方式:主路由器在没有出现故障的情况下,将与备用路由器一直保持原有的状态。

(3)若备用路由器在一定时间内没有收到主路由器发送的VRRP报文,则认为主路由器无法正常工作,此时备用路由器将会选举出优先级高的路由器作为主路由器并发送VRRP报文,替代原有主路由器继续工作。

2.3 设计架构及健康检查机制

Keepalived大致分两层:用户空间和内核空间。

其大多数核心功能均在用户空间实现,而内核空间中的两个模块——IPVS主要实现负载均衡,NETLINK主要提供高级路由及其他相关网络功能。

Keepalived提供了三个守护进程,分别负责不同的功能。

  • 父进程:负责fork子进程并对其进行监控。

  • VRRP子进程:负责VRRP框架。

  • 健康检查子进程:负责健康检查。

Keepalived依赖VRRP协议实现高可用,同时还实现基于TCP/IP协议栈的多层(3层、4层、5/7层)健康检查机制,能够提供服务节点检查及故障隔离功能。其运行机制大致如下。

  • 网络层:主要通过ICMP协议,向服务节点发送ICMP数据包(类似ping命令的方式),若无响应,则判定节点出现故障并将其从集群中移除。
  • 传输层:主要通过TCP协议,向服务节点发起一个TCP连接请求(通常会指定端口),若无响应,则判定节点出现故障并将其从集群中移除。
  • 应用层:主要根据用户的一些设定来判断节点是否正常,若不正常,则判定节点出现故障并将其从集群中移除。常使用脚本进行检测。

Keepalived一般会同时运行在两台或更多台服务器上,同时提供服务且有主从之分。实际提供服务的只有主节点,其工作原理与VRRP类似。Keepalived会根据配置文件中定义的优先级或节点的主从标记,确定哪一台服务器中运行的服务可以成为主节点并使用VIP(虚拟IP)对外提供服务,其他的则成为从节点。若Keepalived的主节点出现故障停止提供服务或所在的服务器宕机时,会将主节点移除并在从节点中选举出优先级较高的节点作为新的主节点并接管VIP继续提供服务,保证服务的不间断。待故障节点恢复后,再重新加入并重新确定是否需要切换主从关系。

2.4 安装

2.4.1 YUM安装:

sudo yum install keepalived -y

2.4.2 源码安装:

  1. 装相关依赖
sudo yum install curl gcc openssl-devel libnl3-devel net-snmp-devel libnfnetlink-devel -y
  1. 下载安装
wget https://www.keepalived.org/software/keepalived-2.2.2.tar.gz;
tar zxvf keepalived-2.2.2.tar.gz;
cd keepalived-2.2.2;
./configure --prefix=/usr/local/keepalived;
make;
sudo make install;
  1. 创建默认目录
sudo mkdir -p /etc/keepalived;
sudo cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived
  1. 拷贝配置文件(此步也可省略,直接到下一步)
    sudo cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived
    

2.4.3 修改配置文件

备份原配置文件

sudo mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

新增配置文件,两个节点都配置为BACKUP,防止抢占资源,不用节点设置不同优先级

sudo tee -a /etc/keepalived/keepalived.conf <<-'EOF'
! Configuration File for keepalived
#定义全局配置,包括发送消息的邮件地址、SMTP、主机识别字符串、VRRP多播地址等
global_defs {
   #故障时接收邮件的地址
   notification_email {
    # acassen@firewall.loc  
   }
   #邮件发送地址
   notification_email_from XXXXX
   #smtp_server mail.xxxxxx.com
   #smtp_connect_timeout 30
   #主机识别标志,一般不用改,也可定义成每个主机自己的主机名
   router_id LVS_DEVEL
   #跳过报文检查,当收到的报文与上一个报文来自同一个路由器时有效
   #vrrp_skip_check_adv_addr
   #VRRP协议严格模式
   #vrrp_strict
   #网卡上ARP消息之间的延迟
   #vrrp_garp_interval 0
   #网卡上发送的未经请求的NA消息之间的延迟
   #vrrp_gna_interval 0
}
#定义跟踪脚本,主要用于健康检查,当需要根据业务进程的运行状态决定是否需要进行主备切换时,可以通过编写脚本对业务进程进行检测监控
#DR模式,也可以不用检测脚本,配置lo:0
vrrp_script chk_nginx {
    #执行脚本路径
    script "/etc/keepalived/check_nginx.sh"
    #调用脚本两次之间的间隔
    interval 1
    #权重值,按此权重调整优先级
    weight -2
}
#定义一个虚拟IP的实例名称
vrrp_instance VI_1 {
    #定义初始状态,可以是MASTER或者BACKUP
    state BACKUP
    #发送VRRP报文的网卡
    interface ens32
    #虚拟路由ID,如果是一组虚拟路由就定义一个ID,如果是多组就要定义多个,而且这个虚拟
    #虚拟路由器标识,全局唯一且范围在0-255之间的整数数字,同一实例中,主从id一致
    virtual_router_id 51
    #优先级,值越大,优先级越高
    priority 101
    #VRRP心跳检查间隔/秒
    advert_int 1
    #防止抢占资源,只对BACKUP节点生效
    nopreempt
    #认证信息,这里是明文认证还有 一种是加密认证
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #定义VIP,可以多个,每行一个
    virtual_ipaddress {
        192.168.118.169
    }
    #追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容
    track_script {
       chk_nginx
    }

}
#定义一个虚拟服务器,也就是VIP
virtual_server 192.168.118.169 80 {
   #健康检测间隔/秒   
   delay_loop 6
   #调度算法设置为加权最少连接
   lb_algo wlc
   #转发模式为DR
   lb_kind DR
   #会话保持时间设置120秒,如果该用户在120s内无任何操作,下次操作会调度到另外节点
   persistence_timeout 120            
   #四层网络协议
   protocol TCP            

   #定义后端服务器地址(RIP)
   #指定RIP的IP地址以及端口
   real_server 192.168.118.170  80 {
       #权重,数字越大权重越高
       weight 3
       #通过tcpcheck判断真实服务器状态
       TCP_CHECK { 
        #连接超时
       connect_timeout 10
       #重试次数
       nb_get_retry 3
       #检测间隔时间为3s
       delay_before_retry 3            
       #检测端口
       connect_port 80                
       }
   }
   real_server 192.168.118.171  80 {  
       weight 3                       
       TCP_CHECK {                    
       connect_timeout 10            
       nb_get_retry 3                
       delay_before_retry 3            
       connect_port 80                
       }
    }   
    real_server 192.168.118.172  80 {  
       weight 3                       
       TCP_CHECK {                    
       connect_timeout 10            
       nb_get_retry 3                
       delay_before_retry 3            
       connect_port 80                
       }
   }
 }
EOF

nginx检测脚本

sudo vim /etc/keepalived/check_nginx.sh
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
    sudo systemctl stop keepalived
fi

注:如果keepalived和nginx没有部署在一台机器上,可以不使用脚本检测,就比如rs服务器lvs+nginx

添加权限

sudo chmod +x/etc/keepalived/check_nginx.sh

启动keepalived

sudo systemctl start keepalived;
sudo systemctl enable keepalived;

2.4.4 验证

sudo ipvsadm -ln
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.118.169:80 wlc persistent 120
  -> 192.168.118.170:80           Route   3      0          0         
  -> 192.168.118.171:80           Route   3      0          0         
  -> 192.168.118.172:80           Route   3      0          0
THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭