什么是Keepalived?

Keepalived是一个用c语言编写的路由软件,这个项目的主要目标是为Linux系统和基于Linux的基础设施提供简单而健壮的负载平衡和高可用性的设施。loadbalance框架依赖于著名且广泛使用的Linux Virtual Server (IPVS)内核模块提供的第4层loadbalance。Keepalived实现了一组检查器,根据负载平衡服务器池的运行状况动态地、自适应地维护和管理负载平衡服务器池。另一方面,通过VRRP协议实现了高可用性。VRRP是路由器故障转移的基础。此外,Keepalived实现了一组到VRRP有限状态机的钩子,提供了低级别和高速的协议交互。为了提供最快的网络故障检测,Keepalived实现了BFD协议。VRRP状态转换可以考虑BFD提示来驱动快速状态转换。保留的框架可以单独使用,也可以一起使用,以提供弹性的基础设施。 官网上面的一段英文翻译

具体意思就是:(VIP 虚拟IP技术来实现IP的不同跳转)
Keepalived 以 VRRP 协议为实现基础,用 VRRP 协议来实现高可用性(HA)。 VRRP(Virtual RouterRedundancy Protocol)协议是用于实现路由器冗余的协议, VRRP 协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器 IP(一个或多个),而在路由器组内部,如果实际拥有这个对外 IP 的路由器如果工作正常的话就是 MASTER,或者是通过算法选举产生, MASTER 实现针对虚拟路由器 IP 的各种网络功能,如 ARP 请求, ICMP,以及数据的转发等;其他设备不拥有该虚拟 IP,状态是 BACKUP,除了接收 MASTER 的VRRP 状态通告信息外,不执行对外的网络功能。当主机失效时, BACKUP 将接管原先 MASTER 的网络功能。VRRP 协议使用多播数据来传输 VRRP 数据, VRRP 数据使用特殊的虚拟源 MAC 地址发送数据而不是自身网卡的 MAC 地址, VRRP 运行时只有 MASTER 路由器定时发送 VRRP 通告信息,表示 MASTER 工作正常以及虚拟路由器 IP(组), BACKUP 只接收 VRRP 数据,不发送数据,如果一定时间内没有接收到 MASTER 的通告信息,各 BACKUP 将宣告自己成为 MASTER,发送通告信息,重新进行 MASTER 选举状态

方案:

VIP 虚拟IP IP port Keepalived角色
192.168.8.16 (虚拟机搭建前三位网段最好是跟主机一样,不然可能外网不能访问测试的) 192.168.8.161 80 MASTER
192.168.8.16 192.168.8.160 80 BACKUP

在Centos7系统
keepalived-2.1.5.tar.gz
nginx 1.9.1

安装nginx就在前面说明了

安装keepalived

1、上次keepalived解压包到opt目录下面并解压安装

  1. cd /opt
  2. tar -zxvf keepalived-2.1.5.tar.gz
  3. cd keepalived-2.1.5
  4. #--prefix=/usr/local/keepalived 编译到 /usr/local/keepalived
  5. ./configure --prefix=/usr/local/keepalived
  6. make && make install

2、负责keepalived文件并设置keepalived为Linux系统服务

mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

#设置为Linxu系统服务
#进入解压后的文件 是在opt目录下的文件
cd keepalived 
#拷贝文件
cp etc/init.d/keepalived /etc/init.d/
cp etc/sysconfig/keepalived /etc/sysconfig/
#刷新配置
systemctl daemon-reload

3、配置Keepalived节点的MASTER节点

cd /etc/keepalived
vi keepalived.conf

#一
global_defs {
    #表示该节点挂了邮件通知配置 在我们现阶段没有配置可以删除
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   #  router_id LVS_DEVEL 保留 该配置节点表示 可以随便起 如 router_id k_1
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

#推荐删除配置文件添加下面配置
global_defs {
            #节点标识
            router_id k_1
       }
       vrrp_instance VI_1 {
           state MASTER  #节点角色 俩个角色 MASTER 和 BACKUP 
           interface ens33  #网卡名 通过 ip addr 可以查看网卡名
          virtual_router_id 51  #虚拟路由id号,俩节点必须一样
          priority 100  #节点优先级
          advert_int 1 #节点间的心跳检查
          #设置验证信息,俩节点必须一样
          authentication {
              auth_type PASS
              auth_pass 1111
          }
          #虚拟IP
          virtual_ipaddress {
              192.168.8.16
          }
}

4、配置BACKUP节点配置(安装方式俩个节点都是一样的)

cd /etc/keepalived
vi keepalived.conf


#推荐删除配置文件添加下面配置 rm -rf keepalived.conf
添加文件  vi  keepalived.conf
global_defs {
            #节点标识
            router_id k_2
       }
       vrrp_instance VI_1 {
           state BACKUP  #节点角色 俩个角色 MASTER 和 BACKUP  不同
           interface ens33  #网卡名 通过 ip addr 可以查看网卡名
          virtual_router_id 51  #虚拟路由id号,俩节点必须一样
          priority 90  #节点优先级 不同
          advert_int 1 #节点间的心跳检查
          #设置验证信息,俩节点必须一样
          authentication {
              auth_type PASS
              auth_pass 1111
          }
          #虚拟IP
          virtual_ipaddress {
              192.168.8.16
          }
}
保存配置退出
配置了Keepalived是系统配置,
启动
systemclt start keepalived 俩个节点执行

主节点可以看到 有虚拟IP 从节点需要等主节点挂了从节点就会显示虚拟IP
image.png
backup节点的网卡信息
image.png

当手动停了主节点

systemctl stop keepalived (没有停止,查看进程 ps -ef |grep keepalived 把进程id给down了 kill -9 进程id)

会发现主节点的IP信息
image.png
备用节点信息
image.png
虚拟IP就换到备用节点了
当MASTER节点起来了虚拟IP就会回到MASTER节点中

虚拟节点访问nginx的主页成功
image.png
image.png

简单的Keepalive实现Nginx的高可用就实现了 (可以外网,访问只是我习惯了内网访问,安装好可以外网测试的)

如果nginx挂机了怎么办呢?所以上面的只能解决keepalived的挂机虚拟IP的切换但是如果虚拟IP在的主机的nginx挂了,nginx是否也不能启动了所以我们编写脚本来监听nginx的状态

编写Nginx的脚本检测

vi /etc/keepalived/nginx_check_xiaohu.sh


#!/bin/bash
# 脚本变量
A=`ps -C nginx –no-header |wc -l`
# 判断nginx是否宕机,如果宕机了,尝试重启
if [ $A -eq 0 ];then
#nginx的启动命令文件所在路径
/usr/local/nginx/sbin/nginx
# 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
    killall keepalived
fi
fi

增加运行权限:
chmod +x /etc/keepalived/nginx_check_xiaohu.sh

配置Keepalived 监听nginx脚本 (MASTER与BACKUP的节点都配置如下)

vrrp_script nginx_check_xiaohu {
    script "/etc/keepalived/nginx_check_xiaohu.sh"
    interval 2 # 每隔两秒运行上一行脚本
    weight +1 #如果脚本运行成功,则升级权重+1
}

在vrrp_instance 中新增监控脚本

track_script {
         nginx_check_xiaohu
}

所以更改完后MASTER 的配置

global_defs {
            #节点标识
            router_id k_1
       }
       #监听脚本配置
       vrrp_script nginx_check_xiaohu {
          script "/etc/keepalived/nginx_check_xiaohu.sh"
          interval 2 # 每隔两秒运行上一行脚本
          weight +1 #如果脚本运行成功,则升级权重+1
                }

       vrrp_instance VI_1 {
           state MASTER  #节点角色 俩个角色 MASTER 和 BACKUP 
           interface ens33  #网卡名 通过 ip addr 可以查看网卡名
          virtual_router_id 51  #虚拟路由id号,俩节点必须一样
          priority 100  #节点优先级
          advert_int 1 #节点间的心跳检查
          #设置验证信息,俩节点必须一样
          authentication {
              auth_type PASS
              auth_pass 1111
          }
          #追踪脚本运行
          track_script {
                         nginx_check_xiaohu
                    }

          #虚拟IP
          virtual_ipaddress {
              192.168.8.16
          }
}

然后测试停止了nginx也还是可以访问,因为脚本又帮你把nginx起来了