Keepalived 简要介绍 Keepalived 是一种高性能的服务器高可用或热备解决方案, Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现 web 前端服务的高可用。 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 选举状态。
一、部署Web,这里使用openresty
cd /usr/local/src/openresty
yum -y install pcre-devel openssl openssl-devel
yum install -y gcc gcc-c++ zlib-devel pcre-devel openssl-devel readline-devel
wget https://openresty.org/download/openresty-1.9.7.5.tar.gz
tar xzvf openresty-1.9.7.5.tar.gz
cd openresty-1.9.7.5
./configure --prefix=/opt/openresty --with-pcre --with-http_ssl_module --with-openssl --with-luajit
./configure --prefix=/data/openresty --with-luajit --with-http_iconv_module --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module
gmake && gmake install
二、配置nginx代理后端应用 省略 三、配置keepalived yum install -y keepalived 配置keepalived 3.1、主nginx配置 more /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost #定义邮箱报警的邮箱地址
}
notification_email_from root@localhost #定义发送报警信息的地址
smtp_server 127.0.0.1 #定义发送邮件的邮件服务器地址
smtp_connect_timeout 30 #定义发送邮件的超时时间
router_id ha_nginx #全局标识
}
vrrp_script chk_nginx { #定义检查nginx服务的脚本
script "/etc/keepalived/chk_nginx.sh" #脚本重启nginx,如果进程还是无法检测到,则强制停止keepalived
interval 2 #检查的间隔时间
weight -2 #检查失败的话权重减2
fall 2 #检查失败2次才认为是真正的检查失败
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100 #备用机器的keepalived的权重要小于这个权重,并且当nginx服务挂掉后100-2要小于备用机器的权重。
advert_int 1
smtp_alert #比较重要 定义使用邮件发送,不然上面的邮件定义都是没有用的,使用了这个当状态发生改变就会发送邮件报警
authentication {
auth_type PASS
auth_pass 1111
}
track_script { #定义使用哪个脚本来检查。
chk_nginx
}
virtual_ipaddress {
10.0.0.100/16
}
}
3.2、从nginx配置
more /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost #定义邮箱报警的邮箱地址
}
notification_email_from root@localhost #定义发送报警信息的地址
smtp_server 127.0.0.1 #定义发送邮件的邮件服务器地址
smtp_connect_timeout 30 #定义发送邮件的超时时间
router_id ha_nginx #全局标识
}
vrrp_script chk_nginx { #定义检查nginx服务的脚本
script "/etc/keepalived/chk_nginx.sh" #脚本重启nginx,如果进程还是无法检测到,则强制停止keepalived
interval 2 #检查的间隔时间
weight -2 #检查失败的话权重减2
fall 2 #检查失败2次才认为是真正的检查失败
}
vrrp_instance VI_1 {
state BACKUP
interface eno16777736
virtual_router_id 51
priority 99 #备用机器的keepalived的权重要小于这个权重,并且当nginx服务挂掉后100-2要小于备用机器的权重。
advert_int 1
smtp_alert #比较重要 定义使用邮件发送,不然上面的邮件定义都是没有用的,使用了这个当状态发生改变就会发送邮件报警
authentication {
auth_type PASS
auth_pass 1111
}
track_script { #定义使用哪个脚本来检查。
chk_nginx
}
virtual_ipaddress {
10.0.0.100/16
}
}
需要授权644;不然会报错 chmod 644 /etc/keepalived/keepalived.conf 解决nginx进程和keepalived不同时存在问题 keepalived是通过检测keepalived进程是否存在判断服务器是否宕机,如果keepalived进程在但是nginx进程不在了那么keepalived是不会做主备切换,所以我们需要写个脚本来监控nginx进程是否存在,如果nginx不存在就将keepalived进程杀掉。 四、配置检测nginx进程脚本 more /etc/keepalived/chk_nginx.sh
#!/bin/bash
# 如果进程中没有nginx则将keepalived进程kill掉
A=`ps -C nginx --no-header |wc -l` ## 查看是否有 nginx进程 把值赋给变量A
if [ $A -eq 0 ];then ## 如果没有进程值得为 零
systemctl stop keepalived.service ## 则结束 keepalived 进程
fi
或者使用这个脚本(因为上面那个脚本不完善;没有自动启动nginx)
#!/bin/bash
A=`ps -C nginx --no-heading | wc -l`
if [ $A -eq 0 ];then
/home/www/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-heading | wc -l` -eq 0 ];then
killall keepalived
fi
fi
添加执行权限 chmod +x /etc/keepalived/nginx_check.sh 说明: check_nginx.sh 要在/etc/keepalived目录下 脚本测试: 将nginx停止,将keepalived启动,执行脚本:sh /etc/keepalived/check_nginx.sh 会自动杀掉keepalived进程 一旦主节点恢复,则VIP会直接漂回去,因为我们配置的抢占模式 验证web for i in {1..10};do curl -I http://10.0.0.100/index.html;done 五、配置supervisor守护keepalived
more /etc/supervisor/conf.d/keepalived.conf
[program:keepalived]
command=keepalived -n
stderr_logfile=/data/keepalived/log/keepalived.error.log
stdout_logfile=/data/keepalived/log/keepalived.log
user=root
stopsignal=INT
autostart=true
autorestart=true
startsecs=5
生效配置文件
supervisorctl update
supervisorctl restart keepalived