JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Nginx 备忘录 10. Keepalived 实现 Nginx 高可用

wys521 2024-09-18 02:42:20 精选教程 25 ℃ 0 评论

一、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 进行访问了。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表