Keepalived一个基于VRRP 协议来实现的高可用方案。两台nginx服务器都会运行keepalived,一台服务器为主,一台服务器为辅,对外提供一个虚拟的ip地址。主服务器会向副服务器发送心跳信息,但副服务器没有接收到心跳信息了。此时备份服务器会自动变成主服务器接受来自虚拟ip地址的信息,保证了高可用性。

keepalived 不是一个网段_服务器

VRRP:虚拟路由冗余协议。是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master 和多个 backup,master 上面有一个对外提供服务的 VIP(Virtual IP Address)(该路由器所在局域网内其他机器的默认路由为该 vip),master 会发组播,当 backup 收不到 vrrp 包时就认为 master 宕掉了,这时就需要根据 VRRP 的优先级来选举一个 backup 当 master。这样的话就可以保证路由器的高可用了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RjH8Xg8l-1625399160380)(C:\Users\93017\AppData\Roaming\Typora\typora-user-images\image-20210701203748609.png)]

环境搭建

1.下载keepalived          https://keepalived.org/
2.上传服务器并进行解压	
3.配置  ./configure --sysconf=/etc --prefix=/usr/local     sysconf指定配置文件的路径   prefix指定安装的路径
5.编译及其安装   make && make install

安装完成后,有两个文件需要我们认识下,一个是 /etc/keepalived/keepalived.conf(keepalived的系统配置文件,我们主要操作的就是该文件),一个是/usr/local/sbin目录下的keepalived,是系统配置脚本,用来启动和关闭keepalived

keepalived配置文件

keepalived.conf配置文件分为三部分。第一部分是global全局配置、第二部分是vrrp相关配置、第三部分是LVS相关配置。

global全局部分:
global_defs {
   #通知邮件,当keepalived发送切换时需要发email给具体的邮箱地址
  # notification_email {
   #  tom@itcast.cn
 #    jerry@itcast.cn
  # }
   #设置发件人的邮箱信息
   #notification_email_from zhaomin@itcast.cn
   #指定smpt服务地址
   #smtp_server 192.168.200.1
   #指定smpt服务连接超时时间
   #smtp_connect_timeout 30
   #运行keepalived服务器的一个标识,可以用作发送邮件的主题信息
   router_id LVS_DEVEL
   
   #默认是不跳过检查。检查收到的VRRP通告中的所有地址可能会比较耗时,设置此命令的意思是,如果通告与接收的上一个通告来自相同的master路由器,则不执行检查(跳过检查)
   vrrp_skip_check_adv_addr
   #严格遵守VRRP协议。
   vrrp_strict
   #在一个接口发送的两个免费ARP之间的延迟。可以精确到毫秒级。默认是0
   vrrp_garp_interval 0
   #在一个网卡上每组na消息之间的延迟时间,默认为0
   vrrp_gna_interval 0
}
VRRP部分,该部分可以包含以下四个子模块
1. vrrp_script
2. vrrp_sync_group
3. garp_group
4. vrrp_instance
我们会用到第一个和第四个,
#设置keepalived实例的相关信息,VI_1为VRRP实例名称
vrrp_instance VI_1 {
    state MASTER  		#有两个值可选MASTER主 BACKUP备
    interface ens33		#vrrp实例绑定的接口,用于发送VRRP包[当前服务器使用的网卡名称]
    virtual_router_id 51#指定VRRP实例ID,范围是0-255       这个要相同
    priority 100		#指定优先级,优先级高的将成为MASTER
    advert_int 1		#指定发送VRRP通告的间隔,单位是秒
    authentication {	#vrrp之间通信的认证信息
        auth_type PASS	#指定认证方式。PASS简单密码认证(推荐)
        auth_pass 1111	#指定认证使用的密码,最多8位
    }
    virtual_ipaddress { #虚拟IP地址设置虚拟IP地址,供用户访问使用,可设置多个,一行一个
        192.168.200.222
    }
}

服务器1

global_defs {
#   notification_email {
 #       tom@itcast.cn
 #       jerry@itcast.cn
 #  }
  # notification_email_from zhaomin@itcast.cn
  # smtp_server 192.168.200.1
  # smtp_connect_timeout 30
   router_id keepalived1
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.88.199
    }
}

服务器2

! Configuration File for keepalived

global_defs {
   notification_email {
        tom@itcast.cn
        jerry@itcast.cn
   }
   notification_email_from zhaomin@itcast.cn
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id keepalived2
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.88.199
    }
}

关于虚拟ip不能够进行访问

如果虚拟机采用的是NAT的设置方式,则虚拟ip的网段只能设置在该网段之内。我的网段为192.168.88 ,这里需要根据个人的网段进行适当的设置

keepalived vrrp_script脚本

1.编写脚本

#!/bin/bash
num=`ps -C nginx --no-header | wc -l`
if [ $num -eq 0 ];then
 /usr/local/nginx/sbin/nginx
 sleep 2
 if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
  killall keepalived
 fi
fi

注意:第一行是必须写的

2.为脚本设置权限

chmod 755 ck_nginx.sh

3.将脚本添加到keepalived.conf

vrrp_script ck_nginx {
   script "/etc/keepalived/ck_nginx.sh" #执行脚本的位置
   interval 2		#执行脚本的周期,秒为单位
   weight -20		#权重的计算方式
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 10
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.111
    }
    track_script {
      ck_nginx
    }
}

关于脚本没法运行的:

1.没有给脚本设置权限

2.没有对应好相应的名称

keepalived 不是一个网段_keepalived 不是一个网段_02

3.关闭selinux

  • /usr/sbin/sestatus -v 查看selinux的开启状态
  • setenforce 0 对selinux进行临时性关闭
  • 修改/etc/selinux/config 文件 将SELINUX=enforcing改为SELINUX=disabled 重启即可进行完全性关闭

4.最后可以通过tail -f /var/log/messages查看对应的日志信息判断错误