一、Keepalived
Keepalived 起初是为 LVS 设计的,专门用来监控集群系统中各个服务节点的状态,如果某个服务节点出现故障,Keepalived 将检测到,并将其从集群系统中剔除,而在故障节点恢复正常后,Keepalived 又可以自动将此服务节点重新加入服务器集群中。
Keepalived 后来又加入了 VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)的功能,VRRP 出现的目的是解决静态路由出现的单点故障问题,通过 VRRP 可以实现网络不间断稳定的运行。
VRRP 协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器 IP,而在路由器组内部,实际拥有这个对外 IP 的路由器如果工作正常的话就是 MASTER,MASTER 实现针对虚拟路由器 IP 的各种网络功能,如 ARP 请求,ICMP,数据转发等;其他设备不拥有该 IP,状态是 BACKUP,除了接收 MASTER 的 VRRP 状态通告信息外,不执行对外的网络功能。当 MASTER 主机失效时,BACKUP 将绑定该虚拟 IP 并接管原先 MASTER 的网络功能。
官网:https://www.keepalived.org/
二、双机热备架构
使用两台服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟 IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟 IP,提供负载均衡服务。
这种架构有一个问题,就是热备服务器在主机器不出现故障的时候,永远处于浪费状态。
1. 准备两台 Nginx 服务器
主服务器:192.168.2.20
备服务器:192.168.2.21
在两个服务器中配置完成 Nginx 服务,Nginx 配置需完全一致;然后检查安装 keepalived 服务,为了方便测试建议关闭 SELinux 和防火墙:
# 查看是否已安装 keepalived
rpm -q keepalived
# 安装 keepalived
yum install -y keepalived
# 关闭 SELinux
# 永久关闭修改 /etc/selinux/config 文件
setenforce 0
# 关闭防火墙
systemctl stop firewalld
2. Master 主服务器(20)keepalived 配置
$ vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
# keepalived 节点标志符,全局唯一
router_id liwy_nginx_20
}
# 检测 nginx 是否运行
vrrp_script chk_nginx {
# 心跳脚本,用于监听 nginx 状态
script "/etc/keepalived/nginx_check.sh"
# 检测脚本执行的间隔,单位是秒
interval 3
# 脚本结果导致的优先级变更,检测失败则优先级 -20
weight -20
# 检测连续 2 次失败才算确定是真失败
fall 2
# 检测 1 次成功就算成功
rise 1
}
vrrp_instance VI_1 {
# 设置主从状态,MASTER/BACKUP
state MASTER
# 绑定虚拟 IP 的网路接口
interface enp0s3
# 虚拟路由的 ID
# 同一个 keepalived 集群的该值相同
virtual_router_id 51
# 节点权重,master 要大于 slave
priority 100
# 主备通讯时间间隔
advert_int 1
# 设置验证类型和密码,
# MASTER 和 BACKUP 须使用相同的密码通信
authentication {
auth_type PASS
auth_pass 1111
}
# 配置上方定义的 chk_nginx
track_script {
chk_nginx
}
# 虚拟ip地址
# 一个尚未占用的 IP,可以多个
virtual_ipaddress {
192.168.2.66
}
}
3. Backup 备服务器(21)keepalived 配置
$ vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
# 修改,全局唯一
router_id liwy_nginx_21
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 3
weight -20
fall 2
rise 1
}
vrrp_instance VI_1 {
# 修改,BACKUP
state BACKUP
interface enp0s3
# 必须与 MASTER 一致
virtual_router_id 51
# 修改,比 MASTER 小
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.2.66
}
}
4. 编写 nginx_check.sh 脚本
$ vim /etc/keepalived/nginx_check.sh
#!/bin/bash
nginx_pid=`ps -C nginx --no-header | wc -l`
if [ $nginx_pid -eq 0 ];then
systemctl restart nginx
sleep 2
nginx_pid=`ps -C nginx --no-header | wc -l`
if [ $nginx_pid -eq 0 ];then
killall keepalived
fi
fi
$ chmod +x /etc/keepalived/nginx_check.sh
如果没有 killall 命令:
yum install psmisc -y
5. 启动 Nginx 与 Keepalived
systemctl start nginx
systemctl start keepalived
我们可以观察下主服务器的 ip 信息,应多出一个 192.168.2.66 的 VIP,而备服务没有。如果停止主服务器,则备服务器将绑定该 VIP。
后续我们就可以通过 192.168.2.66 这个 VIP 来访问 Nginx 服务器了。
三、互为主备架构
使用两台服务器,互为主备,且都处于活动状态,同时各自绑定一个公网虚拟 IP,提供负载均衡服务;当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟 IP(这时由非故障机器一台负担所有的请求);这种方案有效的解决了前面双机热备架构的资源浪费问题。
1. 服务器(20)keepalived 配置
$ vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id liwy_nginx_20
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 3
weight -20
fall 2
rise 1
}
# 51 虚拟路由的主节点
vrrp_instance VI_1 {
state MASTER
interface enp0s3
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.2.66
}
}
# 52 虚拟路由的备用节点
vrrp_instance VI_2 {
state BACKUP
interface enp0s3
# 与 nginx 的 ID 不能相同
virtual_router_id 52
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
# 与 51 虚拟路由的 VIP 不能相同
192.168.2.88
}
}
2. 服务器(21)keepalived 配置
$ vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id liwy_nginx_21
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 3
weight -20
fall 2
rise 1
}
# 51 虚拟路由的备用节点
vrrp_instance VI_1 {
state BACKUP
interface enp0s3
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.2.66
}
}
# 52 虚拟路由的主节点
vrrp_instance VI_2 {
state MASTER
interface enp0s3
# 与 VI_1 的 ID 不能相同
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
# 与 51 虚拟路由的 VIP 不能相同
192.168.2.88
}
}
其他配置不变,重启服务后,我们就可以通过 VIP 192.168.2.66 和 192.168.2.88 进行访问了。
本文暂时没有评论,来添加一个吧(●'◡'●)