1、Keepalived是一个类似于工作在layer3, 4 & 7交换机制的软件,Keepalived软件有两种功能,分别是监控检查、VRRP冗余协议。

1)Core,是keepalived的核心,负责主进程的启动和维护,全局配置文件的加载解析等 。
2)Check,负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析;
3)Vrrp,VRRPD子进程,VRRPD子进程就是来实现VRRP协议;
4)Libipfwc,iptables(ipchains)库,配置LVS会用到;
5)Libipvs,虚拟服务集群,配置LVS会使用。
Keepalived的作用是检测web服务器的状态,如果有一台web服务器、Mysql服务器宕机,或工作出现故障,Keepalived将检测到后,会将有故障的web服务器或者Mysql服务器从系统中剔除,当服务器工作正常后Keepalived自动将web、Mysql服务器加入到服务器群中。

Layer3,4&7工作在IP/TCP协议栈的IP层、传输层及应用层,实现原理分别如下:

1)Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(如果发现某台服务的IP地址无法ping通,Keepalived便报告这台服务器失效,并将它从服务器集群中剔除。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。)
2)Layer4: Layer4主要以TCP端口的状态来决定服务器工作正常与否。如WEB server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。
3)Layer7:Layer7工作在应用层,Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。

生产环境使用Keepalived正常运行,共启动3个进程,一个是父进程,负责监控其子进程,一个是VRRP子进程,另外一个是Checkers子进程。

2、keepalived VRRP基本原理

通过VRRP技术可以将两台物理主机当成路由器,两台物理机主机组成一个虚拟路由集群,Master高的主机产生VIP,该VIP负责转发用户发起的IP包或者负责处理用户的请求,Nginx+Keepalived组合,用户的请求直接访问keepalived VIP地址,然后访问Master相应服务和端口。

在VRRP虚拟路由器集群中,由多台物理的路由器组成,但是这多台的物理路由器并不能同时工作,而是由一台称为MASTER路由器负责路由工作,其它的都是BACKUP,MASTER并非一成不变,VRRP会让每个VRRP路由器参与竞选,最终获胜的就是MASTER。

MASTER拥有一些特权,例如拥有虚拟路由器的IP地址或者成为VIP,拥有特权的MASTER要负责转发发送给网关地址的包和响应ARP请求。

VRRP通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过IP组播(multicast)包(组播地址 224.0.0.18)形式发送的。虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址。所以在一组虚拟路由器集群中,不管谁是MASTER,对外都是相同的MAC和VIP。客户端主机并不需要因为MASTER的改变而修改自己的路由配置。

3、Nginx+keepalived

1)环境准备

Nginx版本:nginx v1.12.2
Keepalived版本:keepalived v1.2.1
Nginx-1192.168.0.111  (Master)
Nginx-2192.168.0.112 (Backup)

2)nginx安装

tar -xzf nginx-1.12.2.tar.gz
cd nginx-1.12.2 
sed  -e 's/1.12.2//g' -e 's/nginx\//ddd/g' -e 's/"NGINX"/"ddd"/g' src/core/nginx.h 
./configure --prefix=/usr/local/nginx --user=www --group=www  --with-http_stub_status_module --with-http_ssl_module
make
make install

3)keepalived 配置

tar  -xzvf  keepalived-1.2.1.tar.gz
cd keepalived-1.2.1 
./configure
make
make install 
DIR=/usr/local/
\cp $DIR/etc/rc.d/init.d/keepalived  /etc/rc.d/init.d/
\cp $DIR/etc/sysconfig/keepalived   /etc/sysconfig/ 
mkdir  -p  /etc/keepalived
\cp   $DIR/sbin/keepalived         /usr/sbin/

4)配置Keepalived,两台服务器keepalived.conf内容都为如下,state均设置为backup,Backup服务器需要修改优先级为90。

! Configuration File for keepalived 
 global_defs { 
  notification_email { 
      support@jfedu.net
 } 
    notification_email_from 183363009@163.com 
    smtp_server 127.0.0.1 
    smtp_connect_timeout 30 
    router_id LVS_DEVEL 
 } 

 vrrp_script chk_nginx { 
    script  "/data/sh/check_nginx.sh"
    interval 2 
    weight 2 
 } 
 # VIP1 
 vrrp_instance VI_1 { 
     state BACKUP 
     interface ens33 
     lvs_sync_daemon_inteface ens33 
     virtual_router_id 151 
     priority 100 
     advert_int 5 
     nopreempt 
     authentication { 
         auth_typePASS 
         auth_pass  1111 

     } 
     virtual_ipaddress { 
         192.168.0.188 
     } 
     track_script { 
     chk_nginx 
    } 
 }

如上配置还需要建立check_nginx脚本,用于检查本地Nginx是否存活,如果不存活,则kill keepalived实现切换。其中check_nginx.sh脚本内容如下:

#!/bin/bash
#2019年4月27日11:38:48
###########
NUM=`ps -ef|grep nginx|grep -v grep|grep -vc check`
if [[ $NUM -eq 0 ]];then
        service keepalived  stop
fi

4、Nginx+Keepalived 双主架构

1)Master1上keepalived.conf配置

! Configuration File for keepalived 
 global_defs { 
  notification_email { 
      952886823@163.com 
 } 
    notification_email_from 952886823@163.com 
    smtp_server 127.0.0.1 
    smtp_connect_timeout 30 
    router_id LVS_DEVEL 
 }
 vrrp_script chk_nginx {
    script "/data/sh/check_nginx.sh"
    interval 2 
    weight 2 
 } 
 # VIP1 
 vrrp_instance VI_1 { 
     state MASTER 
     interface ens33
     lvs_sync_daemon_inteface ens33
     virtual_router_id 151 
     priority 100 
     advert_int 5 
     nopreempt 
     authentication { 
         auth_type  PASS 
         auth_pass  1111 
     } 
     virtual_ipaddress { 
         192.168.0.188
     } 
     track_script { 
     chk_nginx 
    } 
 }
# VIP2
 vrrp_instance VI_2 { 
     state BACKUP 
     interface ens33
     lvs_sync_daemon_inteface ens33
     virtual_router_id 152 
     priority  90 
     advert_int 5 
     nopreempt 
     authentication { 
         auth_type  PASS 
         auth_pass  2222 
     } 
     virtual_ipaddress { 
         192.168.0.199 
     } 
     track_script { 
     chk_nginx 
    } 
 }

2) Master2上keepalived.conf配置文件内容

! Configuration File for keepalived 
 global_defs { 
  notification_email { 
      952886823@163.com 
 } 
    notification_email_from 952886823@163.com 
    smtp_server 127.0.0.1 
    smtp_connect_timeout 30 
    router_id LVS_DEVEL 
 }
 vrrp_script chk_nginx {
    script "/data/sh/check_nginx.sh"
    interval 2 
    weight 2 
 } 
 # VIP1 
 vrrp_instance VI_1 { 
     state BACKUP 
     interface ens33 
     lvs_sync_daemon_inteface ens33 
     virtual_router_id 151 
     priority 90 
     advert_int 5 
     nopreempt 
     authentication { 
         auth_type  PASS 
         auth_pass  1111 
     } 
     virtual_ipaddress { 
         192.168.0.188
     } 
     track_script { 
     chk_nginx 
    } 
 }
# VIP2
 vrrp_instance VI_2 { 
     state MASTER 
     interface ens33
     lvs_sync_daemon_inteface ens33 
     virtual_router_id 152 
     priority  100
     advert_int 5 
     nopreempt 
     authentication { 
         auth_type  PASS 
         auth_pass  2222 
     } 
     virtual_ipaddress { 
         192.168.0.199 
     } 
     track_script { 
     chk_nginx 
    } 
 }

3)两台服务器分别配置脚本

4)查看vip地址

5)日常维护管理方面如下几点

1、Keepalived主配置文件必须设置不同的VRRP名称,同时优先级和VIP设置也各不相同;
2、Nginx网站总访问量为两台Nginx服务器之和,可以写脚本自动统计访问量;
3、两台Nginx为Master,存在两个VIP地址,用户从外网访问VIP,需配置域名映射到两个VIP上方可。
4、通过外网DNS映射不同VIP的方法也称为DNS负载均衡模式;
5、可以通过Zabbix实时监控VIP访问状态是否正常。