Keepalived
很重要的参考文章:《nginx高可用方案》
使用一台 Nginx 实现集群功能时,这台总览全局的 Nginx 也就有坏的可能性,一旦这台 Nginx 所在的服务器宕机了,那么后果就可想而知,这时可以想出的解决方案是使用一台 Nginx 备用机当这台主机发生故障的时候,替代它工作,那么这样就可以实现了 Nginx 的高可用(HA (High Availability)
)。
Keepalived 用于 解决单点故障,在上述例子中,它可以监听 Nginx 的状态,如果 Nginx 发生故障,它会切换到备用机,同时通知管理员, 它基于 VRRP
协议(Virtual Router Redundancy Protocol 虚拟路由冗余协议),从而可以实现 Nginx 高可用 HA
机制。
虚拟路由冗余协议 是解决内网单机故障的路由协议,通过这个协议可以构建多个路由器(这里可看做为一个 Nginx 节点)组成 路由器组,在路由器组里就分为 MASTER
和 BACKUP
两种,每个路由器都创建的时候都需要绑定一个 虚拟IP(VIP (Virtual IP Address)
)。
当路由器绑定了虚拟IP后,使用
ip addr
命令可以看到当前服务器有两个IP地址,一个是内网IP,一个是虚拟IP
它的原理如下图,两台处于同一内网中的 Nginx 服务器分别安装配置了 Keepalived ,并且绑定了一个共同的虚拟IP,当用户进行域名访问时,首先会通过 DNS 解析获取到一个公网IP,而这个公网IP会映射到上述 Keepalived 绑定设置的虚拟IP上,而这个虚拟IP在所有服务器正常运作的情况下,会指向主节点 MASTER
从而实现响应请求。
主节点会定时地向备用机发送 心跳,如果主节点发生故障,备用机就会认为主节点发生故障,从而接替绑定 VIP,从而为用户开启服务;当主节点恢复正常运作,就会重新向备用机发送 心跳,此时备用机就会解绑 VIP,让主节点接替为用户服务。
1 Keepalived 安装
下载网址,我这里下载的是 Version 2.0.18
。
使用 tar
命令解压:
tar -zxvf keepalived-2.0.18.tar.gz
进入解压后的 keepalived
目录,为安装 Keepalived 做配置,以下命令是配置了安装路径和核心配置文件存放的路径,配置成功后会生成出一个 Makefile
文件(安装文件)
./configure --prefix=/usr/local/keepalived --sysconf=/etc
有时候可能会报这个错误信息,此时只需要安装 libnl/libnl-3
依赖即可,输入 yum -y install libnl libnl-devel
*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
检查生成了 Makefile
文件后可以输入以下命令进行安装
make && make install
Keepalived 并不像 Nginx 一样提供关闭指令,要关闭 Keepalived,需要杀死对应进程,ps -ef|grep keepalived
查看进程ID,kill -9 进程ID
关闭 Keepalived。
这样做很麻烦,所以可以将 Keepalived 作为服务注册到 Linux 系统,具体操作:
将解压后的 keepalived-2.0.18/keepalived/etc/init.d/keepalived
文件和 keepalived-2.0.18/keepalived/etc/sysconfig
文件拷贝到当期系统中:
# 拷贝 init.d/keepalived
cp /home/software/keepalived-2.0.18/keepalived/etc/init.d/keepalived /etc/init.d/
# 拷贝 etc/sysconfig
cp /home/software/keepalived-2.0.18/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
随后重新刷新服务
systemctl daemon-reload
此时就可以使用 systemctl start keepalived.service
,systemctl stop keepalived.service
,systemctl restart keepalived.service
去管理 Keepalived 服务了。
2 配置 Keepalived
很重要的参考文章:《nginx高可用方案》
输入 vim /etc/keepalived/keepalived.conf
主配置文件中修改配置:
- 配置
Master
# 全局的配置
global_defs {
# 路由id,当前安装 keepalived 节点主机的标识符,全局唯一
router_id master_router_id
}
# 计算机节点
vrrp_instance VI_1 {
# 表示的状态,MASTER/BACKUP
state MASTER
# 当前实例绑定的网卡,需要输入 ifconfig 查看网卡名称填入
interface ens33
# 虚拟路由id,保证主备节点一致
virtual_router_id 51
# 权重,一般Master设置为100,备用机设置为50
priority 100
# 主备之间发送心跳即同步检查的时间间隔
advert_int 1
# 认证授权的密码,防止非法节点进入,主备之间要一致
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟ip设置
virtual_ipaddress {
192.168.1.161
}
}
配置完成之后,可以移动到 /usr/local/keepalived/sbin
目录下执行 ./keepalived
命令启动 Keepalived,启动之后输入 ip addr
命令可以查看到上述配置的虚拟ip 192.168.1.161
,此时访问该虚拟IP即可访问到该 MASTER
节点的 Nginx 服务。
- 配置
BACKUP
# 全局的配置
global_defs {
# 路由id,当前安装 keepalived 节点主机的标识符,全局唯一
router_id backup_router_id
}
# 计算机节点
vrrp_instance VI_1 {
# 表示的状态,MASTER/BACKUP
state BACKUP
# 当前实例绑定的网卡,需要输入 ifconfig 查看网卡名称填入
interface ens33
# 虚拟路由id,保证主备节点一致
virtual_router_id 51
# 权重,一般Master设置为100,备用机设置为50
priority 50
# 主备之间发送心跳即同步检查的时间间隔
advert_int 1
# 认证授权的密码,防止非法节点进入,主备之间要一致
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟ip设置
virtual_ipaddress {
192.168.1.161
}
}
配置完启动后,正常情况下访问 192.168.1.161
就会访问到 MASTER
主节点,当把 MASTER
主节点的 Keepalived 关闭后,再访问 192.168.1.161
就会访问到 BACKUP
备用机节点了。
2.1 Keepalived 配置 Nginx 自动重启
Keepalived 只有一整台节点宕机了才会唤醒备用节点替换主节点工作,即假如主节点只是 Nginx 挂掉了,Keepalived 并不会认为主节点发生错误,从而启动备用机。
此时就需要配置 Keepalived 监听 Nginx 状态。
编写监听脚本 vim /etc/keepalived/check_nginx_alive_or_not.sh
:
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
# 判断 nginx 是否宕机
if [ $A -eq 0 ];then
# 如果nginx宕机,尝试重启
/usr/local/nginx/sbin/nginx
# 等待3秒再检查nginx有没有重启成功
sleep 3
if [ $A -eq 0 ];then
# 如果没有启动成功,便停止keepalived,从而启动备用机
killall keepalived
fi
fi
同时配置权限:
chmod +x /etc/keepalived/check_nginx_alive_or_not.sh
Keepalived 配置 vrrp_script
和 track_script
实现监听脚本注册使用
! Configuration File for keepalived
# 全局的配置
global_defs {
# 路由id,当前安装 keepalived 节点主机的标识符,全局唯一
router_id keep_1
}
# 配置监听脚本
vrrp_script check_nginx_alive {
script "/etc/keepalived/check_nginx_alive_or_not.sh"
interval 2 # 每两秒运行一个次脚本
}
# 计算机节点
vrrp_instance VI_1 {
# 表示的状态,MASTER/BACKUP
state MASTER
# 当前实例绑定的网卡,需要输入 ifconfig 查看网卡名称填入
interface ens33
# 虚拟路由id,保证主备节点一致
virtual_router_id 51
# 权重
priority 100
# 主备之间发送心跳即同步检查的时间间隔
advert_int 1
# 认证授权的密码,防止非法节点进入,主备之间要一致
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟ip设置
virtual_ipaddress {
192.168.1.161
}
# 注册脚本使用
track_script {
check_nginx_alive # 脚本名称
}
}
最后重启 Keepalived 即可:
systemctl restart keepalived
2.2 实现双主热备
很重要的参考文章:《nginx高可用方案》
双机主备会导致资源的浪费,假如主节点服务器一直都没有发生错误,那么备用机就会一直都无需工作,这样的情况就会导致资源的浪费,此时就需要实现双主热备。
双主热备的原理就是:
创建两个虚拟IP,比如 节点1 绑定 虚拟IP1 作为主节点,则 节点2 对于 虚拟IP1 来讲就是备用机;同时 节点2 绑定 虚拟IP2 作为主节点,则此时 节点1 对于 虚拟IP2 来讲就是备用机;
这两个虚拟IP分别对应两个公网IP,在 DNS 解析中有将用户的访问的域名解析到这两个公网IP中。
这么一来,就实现了两台节点互为主备,从而不会导致资源浪费。
具体操作配置与搭建主备节点时的配置差不多,就是多配置一个 vrrp_instance
绑定不同的虚拟IP、虚拟路由ID virtual_router_id
和状态 state
。