Nginx 使用 Keepalived 搭建 nginx 高可用

一、环境准备

两台装有 nginx 的 CentOS 虚拟机。

bash 复制代码
[root@nginx1 ~]# echo "192.168.40.81 say Hello" > /usr/local/nginx/html/index.html
[root@nginx2 ~]# echo "192.168.40.82 say Hello" > /usr/local/nginx/html/index.html

二、原理

Keepalived 为我们后端服务器组虚拟出一组 VIP,该 VIP 只能由优先级最高的一台服务器持有。客户端访问,就只访问 VIP。

当主服务器挂掉之后,Keepalived 自动帮我们把 VIP 漂移到 BACKUP 服务器。以此来保证服务的高可用。

Keepalived 通过检测服务器上的 Keepalived 进程的存活状态,来判断服务器是否存活。

三、安装

1)安装 keepalived

bash 复制代码
# 在 nginx1 安装 keepalived
[root@nginx1 ~]# yum install -y keepalived
# 在 nginx2 安装 keepalived
[root@nginx2 ~]# yum install -y keepalived

2)配置

使用 yum 安装后配置文件在 /etc/keepalived/keepalived.conf

bash 复制代码
# 备份 nginx1 keepalived 配置文件
[root@nginx1 keepalived]# cp keepalived.conf keepalived.conf.bak
# 备份 nginx2 keepalived 配置文件
[root@nginx2 keepalived]# cp keepalived.conf keepalived.conf.bak
  • nginx1 上 keepalived.conf:
javascript 复制代码
! Configuration File for keepalived

global_defs {
   router_id lb1
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.40.80
    }
}
  • global_defs:全局配置标识。
  • router_id:路由器标识,一般不用改,也可以写成每个主机自己的主机名。
  • vrrp_instance:一个 vrrp_instance 就是定义一个虚拟路由器的,VI_1 是实例名称。
  • state:指定 keepalived 的角色,MASTER 表示此主机是主服务器,BACKUP 表示此主机是备服务器。
  • interface:指定检测网络的网卡接口。就比如下图的 ens33。
  • virtual_router_id:虚拟路由标识,数字形式,同一个 VRRP 实例使用唯一的标识,即在同一个 vrrp_instance下,master 和 backup 必须一致。
  • priority:节点优先级,数字越大表示节点的优先级越高,在一个 VRRP 实例下,MASTER 的优先级必须要比 BACKUP 高,不然就会切换角色。
  • advert_int:用于设定 MASTER 与 BACKUP 之间同步检查的时间间隔,单位为秒。
  • auth_type:预共享密钥认证,同一个虚拟路由器的 keepalived 节点必须一样。
  • auth_pass:设置密钥。
  • virtual_ipaddress:设置虚拟IP地址,可以设置多种形式:
  • 10.0.0.100 不指定网卡,默认为 eth0,注意:不指定/prefix,默认为/32;
  • 10.0.0.101/24 dev eth1 指定 VIP 的网卡;
  • 10.0.0.102/24 dev eth2 label eth2:1 指定 VIP 的网卡 label。
  • nginx2 上 keepalived.conf:
javascript 复制代码
! Configuration File for keepalived

global_defs {
   router_id lb2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.40.80
    }
}

3)启动

bash 复制代码
# 启动 MASTER 服务器 keepalived 并设置为开机自启动
[root@nginx1 keepalived]# systemctl enable keepalived --now
[root@nginx1 keepalived]# systemctl status keepalived
[root@nginx1 keepalived]# ip a

会发现 MASTER 服务器多出了 192.168.40.80 这个IP。

bash 复制代码
# 启动 BACKUP 服务器 keepalived 并设置为开机自启动
[root@nginx2 keepalived]# systemctl enable keepalived --now
[root@nginx2 keepalived]# systemctl status keepalived
[root@nginx2 keepalived]# ip a

备份服务器并不持有 VIP。

4)访问

此时访问 VIP,请求都是被打到 MASTER 上的 nginx。

5)故障测试

bash 复制代码
# 停掉 MASTER
[root@nginx1 ~]# init 0

此时 VIP 飘移到 BACKUP。

6)重启 MASTER

此时 VIP 又漂移回来了。

四、定制脚本

Keepalived 通过检测服务器上的 Keepalived 进程的存活状态,来判断服务器是否存活。

但如果此时,我们的服务器没有挂,但是我们希望 Keepalived 保活的服务(比如 nginx)挂了,由于 Keepalived 进程没有挂,这个时候,Keepalived 是不会帮我们主备切换的。

bash 复制代码
# 停掉 MASTER
[root@nginx1 ~]# systemctl stop nginx

这个时候 VIP 并没有迁移走。这个时候,我们就得自己写一个脚本,去检测 nginx 存活状态,如果 nginx 挂了,人为杀死 keepalived 进程,让 keepalived 帮我们主备切换。

先重新启动 nginx

bash 复制代码
[root@nginx1 ~]# systemctl start nginx

1)修改 keepalived.conf

  • nginx1 上 keepalived.onf:
bash 复制代码
! Configuration File for keepalived

global_defs {
   router_id lb1
}

vrrp_script check_nginx {
    script "pgrep nginx"
    interval 2
    weight 50  # 当检查失败时,优先级会减去这个值
    fall 2
    rise 2
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.40.80
    }
    track_script {
        check_nginx
    } 
}
  • nginx2 上 keepalived.conf:
bash 复制代码
! Configuration File for keepalived

global_defs {
   router_id lb2
}

vrrp_script check_nginx {
    script "pgrep nginx"
    interval 2
    weight 50  # 当检查失败时,优先级会减去这个值
    fall 2
    rise 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.40.80
    }
    track_script {
        check_nginx
    } 
}

2)重启 keepalived

bash 复制代码
[root@nginx1 keepalived]# sudo systemctl restart keepalived

[root@nginx2 keepalived]# sudo systemctl restart keepalived

3)停掉 MASTER

bash 复制代码
# 停掉 MASTER
[root@nginx1 ~]# systemctl stop nginx

VIP 这次终于被迁移到 BACKUP。

五、应用场景

Keepalived + Nginx 的组合有很多应用场景:

  • 搭建 Nacos 高可用集群
  • 搭建 K8S Ingress 入口
相关推荐
Fcy64840 分钟前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满42 分钟前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠1 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey9031 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技2 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀3 小时前
Linux环境变量
linux·运维·服务器
zzzsde3 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
聆风吟º4 小时前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann
NPE~4 小时前
自动化工具Drissonpage 保姆级教程(含xpath语法)
运维·后端·爬虫·自动化·网络爬虫·xpath·浏览器自动化
神梦流5 小时前
GE 引擎的内存优化终局:静态生命周期分析指导下的内存分配与复用策略
linux·运维·服务器