Keepalived+Nginx 配置 高可用
一、什么是 Keepalived
Keepalived 是一个用于实现网络高可用性和负载均衡的开源软件。它通过虚拟路由冗余协议(VRRP)实现服务的自动故障切换,确保在主服务器宕机时,备份服务器可以自动接管,从而保证服务的持续可用性。此外,Keepalived 还支持对服务进行健康检查,以确保系统稳定运行
它主要用于以下场景
-
负载均衡器的高可用性:Keepalived 最早用于维护负载均衡器的高可用性,比如 Nginx。Keepalived 可以确保负载均衡器在故障发生时,备份服务器可以自动接管
-
Web 服务的高可用性:通过 Keepalived,可以实现 Nginx、Apache 等 Web 服务的高可用性,确保当主服务器失效时,备份服务器能够自动接管虚拟 IP 地址,避免服务中断
-
数据库高可用性:在数据库系统(如 MySQL)的主从架构中,Keepalived 也可以帮助实现主从切换,一旦主数据库失效,备份数据库可以接管服务
它有以下的优点:
-
简单易用:Keepalived 的配置和管理相对简单,只需几步配置就可以实现高可用性
-
快速切换:通过 VRRP,Keepalived 能够快速检测服务器状态并执行故障切换,保证服务的高可用性
-
灵活性高:Keepalived 可以结合负载均衡器、Web 服务器、数据库等多种服务使用,适应性强
-
轻量级:Keepalived 不需要大量的系统资源,适合部署在资源受限的环境中
二、使用 Keeplived 配置 高可用
IP1 | 主机 |
---|---|
192.168.92.130 | master |
192.168.92.132 | backup |
1. 基础配置
1.1 设置主机名
$ hostnamectl set-hostname master
$ bash
$ hostnamectl
Static hostname: master
Icon name: computer-vm
Chassis: vm
Machine ID: e72e04755f264b69a75c218f22b44031
Boot ID: 0de48a7678aa43fc9e30d6a3c72be13f
Virtualization: vmware
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-1160.119.1.el7.x86_64
Architecture: x86-64
$ hostnamectl set-hostname backup
$ bash
$ hostnamectl
Static hostname: backup
Icon name: computer-vm
Chassis: vm
Machine ID: 2916c787935c4ac7a0353f024b3c2394
Boot ID: 1d996f1254314e1c964ce6d81e252e60
Virtualization: vmware
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-1160.el7.x86_64
Architecture: x86-64
1.2 在 master 上编译安装 nginx
在 master 服务器上
# 下载 nginx
$ sudo yum install -y wget
$ wget https://nginx.org/download/nginx-1.27.1.tar.gz -P /usr/local/src
# 解压 nginx
$ cd /usr/local/src
$ sudo tar -zxf nginx-1.27.1.tar.gz
$ cd nginx-1.27.1
# 安装必要环境
$ sudo yum install -y gcc pcre-devel zlib-devel make openssl-devel
# 开始编译
# 由于我们这里只需要一个 "编译的" nginx,所以我们这里只配置它的目录
$ sudo ./configure --prefix=/usr/local/nginx
$ sudo make && make install
把编译后的 nginx 添加到环境变量
$ sudo vi ~/.bashrc # 在最下面加上这个 export PATH=$PATH:/usr/local/nginx/sbin # 保存后刷新环境变量应用 $ sudo source ~/.bashrc
1.3 安装 Keepalived 和 backup 上的 nginx
在两台机器上安装 Keepalived
$ sudo yum install -y keepalived
在 backup 服务器上,使用 yum 安装 nginx
$ sudo yum install -y nginx
2. 编辑配置文件
在 master 服务器中,编辑配置文件 (/etc/keepalived/keepalived.conf
) 为以下内容(可直接替换)
*注意:要对应 interface
字段的网卡与实际本机网卡一致,以及 virtual_ipaddress
字段的 IP 为 interface
字段网卡的网段
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.92.100
}
track_script {
chk_nginx
}
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_ng.sh"
interval 2
weight -2
}
在 backup 服务器中,编辑配置文件 (/etc/keepalived/keepalived.conf
) 为以下内容(可直接替换)
*注意:要对应 interface
字段的网卡与实际本机网卡一致,以及 virtual_ipaddress
字段的 IP 为 interface
字段网卡的网段
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.92.100
}
track_script {
chk_nginx
}
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_ng.sh"
interval 2
weight -2
}
3. 编辑监控脚本
在两台机器上都创建监控脚本文件 check_ng.sh
$ sudo vi /etc/keepalived/check_ng.sh
# 直接填入以下内容
#!/bin/bash
A=$(ps -C nginx --no-header | wc -l)
if [ $A -eq 0 ]; then
/usr/local/nginx/sbin/nginx
sleep 2
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
killall keepalived
fi
fi
然后在两台机器上给这个文件权限
$ sudo chmod 755 /etc/keepalived/check_ng.sh
4. 启动服务
在 master 服务器上
# 启动 nginx 服务
$ sudo nginx
# 启动 keepalived 服务
$ sudo systemctl start keepalived
# 检查 keepalived 服务是否正常运行
# 本质上是检查我们刚才配置的VIP(虚拟IP)是否生效
$ ip a | grep 192.168.92.100
inet 192.168.92.100/32 scope global ens33
在 backup 服务器上
# 启动 nginx 服务
$ sudo systemctl start nginx
# # 启动 keepalived 服务
$ sudo systemctl start keepalived
三、测试高可用
-
先确定好两台机器上 nginx 的差异
master 上
$ curl -I http://localhost HTTP/1.1 200 OK Server: nginx/1.27.1 Date: Wed, 18 Sep 2024 08:29:20 GMT Content-Type: text/html Content-Length: 615 Last-Modified: Wed, 18 Sep 2024 07:41:51 GMT Connection: keep-alive ETag: "66ea843f-267" Accept-Ranges: bytes
backup 上
$ curl -I http://localhost HTTP/1.1 200 OK Server: nginx/1.20.1 Date: Wed, 18 Sep 2024 08:29:46 GMT Content-Type: text/html Content-Length: 4833 Last-Modified: Fri, 16 May 2014 15:12:48 GMT Connection: keep-alive ETag: "53762af0-12e1" Accept-Ranges: bytes
可以看出 master 服务器上的 nginx 版本号为 1.27.1,而 backup 服务器上的 nginx 版本号为 1.20.1
-
关闭 master 上的 nginx 服务
$ sudo nginx -s stop
可能的结果:
-
监控脚本会检测到 Nginx 服务已停止,首先尝试重启 Nginx,重启成功,继续运行
-
如果 master 的 nginx 重启失败,backup 检测到 master 节点的 VRRP 心跳包停止,会接管VIP(虚拟IP),并成为新的 master
在 backup 节点上
$ ip a 1: lo:
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: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:b1:f9:70 brd ff:ff:ff:ff:ff:ff inet 192.168.92.132/24 brd 192.168.92.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 192.168.92.100/32 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::c5a3:58ae:caf6:20b1/64 scope link noprefixroute valid_lft forever preferred_lft forever # 更省略的看 $ ip a | grep 192.168.92.100 inet 192.168.92.100/32 scope global ens33 -
-
在 master 上增加
iptables
规则在 master 上禁止 VRRP 数据包的发送
$ iptables -I OUTPUT -p vrrp -j DROP
结果:由于
iptables
阻止了 VRRP 数据包的发送,backup 节点会认为 master 节点不可用,即使 nginx 仍在运行,然后 backup 节点会接管 VIP,成为新的 master -
关闭 master 上的 keepalived 服务
$ sudo systemctl stop keepalived
结果:
Keepalived
服务停止,master 节点将不再发送 VRRP 心跳包,backup 节点检测到没有 VRRP 心跳包后,接管 VIP,成为新的 master -
重新启动 master 上的 keepalived 服务
$ sudo systemctl start keepalived
结果:
Keepalived
服务恢复后,master 节点重新开始发送 VRRP 心跳包。由于 master 的优先级更高,虚拟 IP 会切回到 master 节点在 master 上
$ ip a 1: lo:
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: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:7a:2e:6f brd ff:ff:ff:ff:ff:ff inet 192.168.92.130/24 brd 192.168.92.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 192.168.92.100/32 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::8f04:3f1b:8eb1:5544/64 scope link noprefixroute valid_lft forever preferred_lft forever
如果想要有完整的观看体验,请点击这里
Comments NOTHING