Keepalived一个基于VRRP 协议来实现的高可用方案。两台nginx服务器都会运行keepalived,一台服务器为主,一台服务器为辅,对外提供一个虚拟的ip地址。主服务器会向副服务器发送心跳信息,但副服务器没有接收到心跳信息了。此时备份服务器会自动变成主服务器接受来自虚拟ip地址的信息,保证了高可用性。
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.没有对应好相应的名称
3.关闭selinux
- /usr/sbin/sestatus -v 查看selinux的开启状态
- setenforce 0 对selinux进行临时性关闭
- 修改/etc/selinux/config 文件 将SELINUX=enforcing改为SELINUX=disabled 重启即可进行完全性关闭
4.最后可以通过tail -f /var/log/messages查看对应的日志信息判断错误