Keepalived 工作原理
在讲述keepalived工作原理之前,大家先来了解一个协议VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)。它是实现路由高可用的一种通信协议,在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个master(主)角色和N(N>=1)个backup(备用)角色。工作时 master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的master。
而keepalived就是采用这种VRRP协议实现的高可用。keepalived要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析; check模块负责健康检查;vrrp模块用来实现VRRP协议。
节点规划
VRRP协议有1个master角色和至少1个backup角色,所以做本实验需要准备至少两台Linux机器。
生产环境中,诸多企业把Nginx作为负载均衡器来用,它的重要性很高,一旦宕机会导致整个站点不能访问,所以有必要再准备一台备用Nginx,keepalived用在这种场景下非常合适。在配置 之前,先把两台机器的IP、角色罗列一下,这样理解起来应该会容易一些。
master | 192.168.63.34 |
backup | 192.168.63.35 |
VIP:192.168.63.100
VIP的英文名字是“Virtual IP”,即“虚拟IP”,也有人把它叫作“浮动IP”。因为这个IP是由keepalived给服务器配置上的,服务器靠这个VIP对外提供服务,当master机器宕机,VIP被分配到backup上。
案例实施
一、基础配置
将两台机机器分别改名为master、backup,并关闭两个节点的防火墙。
[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# bash
[root@master ~]# setenforce 0
[root@master ~]# systemctl stop firewalld
[root@localhost ~]# hostnamectl set-hostname backup
[root@localhost ~]# bash
[root@backup ~]# setenforce 0
[root@backup ~]# systemctl stop firewalld
两个节点都安装keepalived,Nginx服务。我这边是使用yum直接安装的.
yum install -y keepalived
yum insatll -y nginx
二、配置文件
编辑master的keepalived配置文件
[root@master ~]# vi /etc/keepalived/keepalived.conf
global_defs { #全局配置标识,表明这个区域{}是全局配置
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc #表示发送通知邮件时邮件源地址是谁
}
notification_email_from Alexandre.Cassen@firewall.loc #表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,邮件地址可以多个,每行一个
smtp_server 192.168.200.1 #表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现
smtp_connect_timeout 30 #连接smtp连接超时时间
router_id LVS_DEVEL #机器标识
}vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh" #检查服务是否正常,通过写脚本实现,脚本检查服务健康状态
interval 3 #检查时间间断是3秒
}vrrp_instance VI_1 { #VRRP配置标识 VI_1是实例名称
state MASTER #定义master相关
interface ens33 #通过vrrp协议去通信、去发广播。此为网卡名
virtual_router_id 51 #定义路由器ID ,配置的时候和从机器一致
priority 100 #权重,主角色和从角色的权重是不同的,一般主比从大
advert_int 1 #设定MASTER与BACKUP主机质检同步检查的时间间隔,单位为秒
authentication { #认证相关信息
auth_type PASS #认证类型
auth_pass 1111 #密码的形式是一个字符串
}
virtual_ipaddress { #设置虚拟IP地址 (VIP),又叫做漂移IP地址
192.168.63.100
}
track_script { #加载脚本
chk_nginx
}
}
keepalived要实现高可用,监控Nginx服务是必不可少的,它本身没有这个功能,所以我们要添加一个脚本来监控Nginx,注意脚本的位置需要与keepalived配置文件中保持一致。
[root@master ~]# vi /usr/local/sbin/check_ng.sh
#!/bin/bash
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果进程为0,则启动nginx,并且再次检测nginx进程数量
if [ $n -eq "0" ]; then
systemctl satrt nginx
n2=`ps -C nginx --no-heading|wc -l`
#如果还为0,说明nginx无法启动,此时需要关闭keepalived
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
编辑完成监控Nginx的脚本,需要给他x权限,否则无法被keepalived调用。
[root@master ~]# chmod a+x /usr/local/sbin/check_ng.sh
完成以上操作,就可以启动master上的keepalived了
[root@master ~]# systemctl start keepalived
[root@master ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:85:b1:68 brd ff:ff:ff:ff:ff:ff
inet 192.168.63.34/24 brd 192.168.63.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.63.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::d305:99ac:5a8a:599/64 scope link noprefixroute
valid_lft forever preferred_lft forever
可以看到master上已经自动配置了192.168.63.100这个ip。如果没有启动Nginx服务,它会帮我们自动拉起来,查看一下:
[root@master ~]# ps aux |grep nginx
root 9572 0.0 0.0 46340 972 ? Ss 13:46 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 9573 0.0 0.1 46748 1936 ? S 13:46 0:00 nginx: worker process
root 9652 0.0 0.0 112724 988 pts/0 S+ 13:46 0:00 grep --color=auto nginx
master上配置完成接下来配置backup,和master一样首先配置文件。
[root@backup ~]# vi /etc/keepalived/keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh"
interval 3
}vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111>g
}
virtual_ipaddress {
192.168.63.100
}
track_script {
chk_nginx
}
}
编辑监控脚本。
[root@backup ~]# vi /usr/local/sbin/check_ng.sh
d=`date --date today +%Y%m%d_%H:%M:%S`
n=`ps -C nginx --no-heading|wc -l`
if [ $n -eq "0" ]; then
systemctl start nginx
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
同样给他x权限:
[root@backup ~]# chmod a+x /usr/local/sbin/check_ng.sh
启动keepalived服务:
[root@backup ~]# systemctl start keepalived
验证
首先修改两个节点的index.html文件以便区分
[root@master ~]# vi /usr/share/nginx/html/index.html
打开浏览器搜索vip
看到显示的是master节点,我们吧master节点Nginx关掉,假装服务宕机,但是需要注意把脚本改一下,只需在启动nginx那段代码前边加一个注释号就可以,不然脚本会自动启动nginx。
在启动master节点nginx服务,keepalived服务。
此时VIP又回到了master上,至此 Keepalived+Nginx实现Web高可用部署完毕。