Keepalived+Nginx 配置 高可用集群
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 设置主机名
1 |
|
1 |
|
1.2 在 master 上编译安装 nginx
在 master 服务器上
1 |
|
把编译后的 nginx 添加到环境变量
1
2
3
4
5
6
$ sudo vi ~/.bashrc
# 在最下面加上这个
export PATH=$PATH:/usr/local/nginx/sbin
# 保存后刷新环境变量应用
$ sudo source ~/.bashrc
1.3 安装 Keepalived 和 backup 上的 nginx
在两台机器上安装 Keepalived
1 |
|
在 backup 服务器上,使用 yum 安装 nginx
1 |
|
2. 编辑配置文件
在 master 服务器中,编辑配置文件 (/etc/keepalived/keepalived.conf
) 为以下内容(可直接替换)
*注意:要对应 interface
字段的网卡与实际本机网卡一致,以及 virtual_ipaddress
字段的 IP 为 interface
字段网卡的网段
1 |
|
在 backup 服务器中,编辑配置文件 (/etc/keepalived/keepalived.conf
) 为以下内容(可直接替换)
*注意:要对应 interface
字段的网卡与实际本机网卡一致,以及 virtual_ipaddress
字段的 IP 为 interface
字段网卡的网段
1 |
|
3. 编辑监控脚本
在两台机器上都创建监控脚本文件 check_ng.sh
1 |
|
解释:
#!/bin/bash
:必须放在第一行,表示使用/bin/bash
作为解释器来执行这个脚本A=$(ps -C nginx --no-header | wc -l)
:ps -C nginx --no-header
:这条命令通过ps
检查当前系统中是否有nginx
进程在运行,-C nginx
表示查找名为nginx
的进程,--no-header
用来不显示表头wc -l
:用wc
命令对结果进行计数,-l
参数表示计数输出的行数 如果 nginx 正在运行,那么结果
A
会是一个大于 0 的数字;如果没有运行,A
就会是 0
if [ $A -eq 0 ]; then
:这个是一个条件判断语句【如果变量A
的值 等于(eq,equal) 0(也就是 nginx 没有在运行),那么执行下面的语句/usr/local/nginx/sbin/nginx
:启动 master 服务器自行编译的 nginx 的命令sleep 2
:睡眠 2 秒,给 nginx 启动留下充足的时间if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
:这个是第二个判断语句,内容如上,目的是检查 nginx 是否成功启动
如果 nginx 还是没有启动 (即进程数量还是0),则执行后续操作systemctl stop keepalived
:关闭keepalived
服务 如果 nginx 未能成功启动,脚本将停止 Keepalived 服务。这是为了防止将 nginx 停止的节点继续作为主服务器参与高可用集群
然后在两台机器上给这个文件权限
1 |
|
4. 启动服务
在 master 服务器上
1 |
|
在 backup 服务器上
1 |
|
三、测试高可用
先确定好两台机器上 nginx 的差异
master 上
1
2
3
4
5
6
7
8
9
10$ 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: bytesbackup 上
1
2
3
4
5
6
7
8
9
10$ 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 服务
1
$ sudo nginx -s stop
可能的结果:
监控脚本会检测到 Nginx 服务已停止,首先尝试重启 Nginx,重启成功,继续运行
如果 master 的 nginx 重启失败,backup 检测到 master 节点的 VRRP 心跳包停止,会接管VIP(虚拟IP),并成为新的 master
在 backup 节点上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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 数据包的发送
1
$ iptables -I OUTPUT -p vrrp -j DROP
结果:由于
iptables
阻止了 VRRP 数据包的发送,backup 节点会认为 master 节点不可用,即使 nginx 仍在运行,然后 backup 节点会接管 VIP,成为新的 master关闭 master 上的 keepalived 服务
1
$ sudo systemctl stop keepalived
结果:
Keepalived
服务停止,master 节点将不再发送 VRRP 心跳包,backup 节点检测到没有 VRRP 心跳包后,接管 VIP,成为新的 master重新启动 master 上的 keepalived 服务
1
$ sudo systemctl start keepalived
结果:
Keepalived
服务恢复后,master 节点重新开始发送 VRRP 心跳包。由于 master 的优先级更高,虚拟 IP 会切回到 master 节点在 master 上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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
四、日志/错误日志
1. nginx
检查:使用
nginx -t
检查配置的 nginx 配置文件是否有语法错误,如果没有则会提示 OK 和 successful日志:
master 服务器:在
/usr/local/nginx/conf/nginx.conf
配置文件里1
2
3
4$ sudo vi /usr/local/nginx/conf/nginx.conf
# 把以下几行前面的'#'给去掉
error_log logs/error.log; # 第 5 行
access_log logs/access.log; # 第 25 行,然后去掉后面的 main然后保存并退出之后
1
2
3
4
5
6
7
8# 测试配置文件语法是否正确
$ sudo nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
# 重启 nginx 服务
$ sudo nginx -s stop
$ sudo nginx此时配置的日志位置为:
- 错误日志:
/usr/local/nginx/logs/error.log
- 访问日志:
/usr/local/nginx/logs/access.log
- 错误日志:
backup 服务器:
- 错误日志:
/var/log/nginx/error.log
- 访问日志:
/var/log/nginx/access.log
- 错误日志:
2. keepalived
由于我们是通过 yum 安装的 keepalived
服务,所以我们可以查看系统日志文件 /var/log/messages
来查看日志,或者我们也可以通过查看服务日志 journalctl
来查看 keepalived
日志
查看系统日志
1
$ sudo tail -f /var/log/messages | grep keepalived
查看服务日志
1
$ journalctl -u keepalived
这里将会显示 Keepalived 服务的相关日志,包括启动、关闭、状态变更等信息
如果你希望 keepalived
输出更详细的日志信息,可以在 keepalived.conf
配置文件添加上 global_defs
部分添加或调整日志级别
1 |
|
log_level
设置为7
表示将日志详细级别设为 debug,输出更多调试信息错误日志等级:
- 0 (emerg):紧急信息,系统不可用
- 1 (alert):必须立即处理的问题
- 2 (crit):关键问题,表示严重的错误状态
- 3 (err):错误,常见的错误日志
- 4 (warning):警告,可能存在问题,但不影响正常运行
- 5 (notice):正常但重要的事件
- 6 (info):信息性消息,常用于状态报告
- 7 (debug):调试信息,提供非常详细的调试和诊断数据
在完成配置后,重启 keepalived
以应用新的日志设置
1 |
|