ngxtop高可用集群:基于Keepalived的监控服务冗余
【免费下载链接】ngxtop Real-time metrics for nginx server 项目地址: https://gitcode.com/gh_mirrors/ng/ngxtop
1. 引言:Nginx监控的单点故障痛点
你是否曾遭遇过这样的场景:生产环境中Nginx服务器突发流量峰值,而用于实时监控的ngxtop服务却因意外崩溃,导致运维团队完全失去对服务器状态的可见性?在高并发业务场景下,这种监控服务的单点故障可能引发严重后果。
ngxtop作为一款强大的Nginx实时监控工具,能够解析Nginx访问日志并输出类top命令的监控指标,帮助运维人员实时掌握服务器状态。然而,默认情况下部署的ngxtop服务存在单点故障风险,一旦监控服务本身出现问题,将导致整个监控体系瘫痪。
读完本文,你将能够:
- 理解ngxtop服务高可用的重要性及实现原理
- 掌握基于Keepalived构建ngxtop双机热备集群的完整步骤
- 学会配置Nginx日志收集与Prometheus监控告警
- 实现监控服务故障的自动检测与无缝切换
- 部署一套稳定可靠的Nginx监控冗余架构
2. ngxtop与高可用架构概述
2.1 ngxtop核心功能解析
ngxtop是一个功能强大的Nginx实时监控工具,它通过解析Nginx访问日志,提供类似top命令的实时监控界面。根据README.rst文件描述,ngxtop能够输出请求计数、平均字节发送量、状态码分布等关键指标,并支持按不同维度(如请求路径、客户端IP等)进行聚合分析。
$ ngxtop
running for 411 seconds, 64332 records processed: 156.60 req/sec
Summary:
| count | avg_bytes_sent | 2xx | 3xx | 4xx | 5xx |
|---------+------------------+-------+-------+-------+-------|
| 64332 | 2775.251 | 61262 | 2994 | 71 | 5 |
Detailed:
| request_path | count | avg_bytes_sent | 2xx | 3xx | 4xx | 5xx |
|------------------------------------------+---------+------------------+-------+-------+-------+-------|
| /abc/xyz/xxxx | 20946 | 434.693 | 20935 | 0 | 11 | 0 |
| /xxxxx.json | 5633 | 1483.723 | 5633 | 0 | 0 | 0 |
ngxtop支持丰富的命令行参数,可通过ngxtop/ngxtop.py查看完整选项。主要功能包括:
- 实时监控Nginx请求指标
- 自定义查询与过滤功能
- 支持多种日志格式解析
- 可与Prometheus等监控系统集成
2.2 高可用集群架构设计
为解决ngxtop单点故障问题,我们设计基于Keepalived的双机热备架构,实现监控服务的高可用。架构图如下:
该架构的核心组件包括:
- 双节点ngxtop服务:主节点(MASTER)和备节点(BACKUP)同时运行ngxtop服务
- Keepalived:实现VRRP协议,监控节点状态并管理虚拟IP(VIP)
- 共享存储:确保双节点可访问相同的Nginx日志文件
- Prometheus+Grafana:实现监控数据的持久化存储与可视化展示
2.3 故障自动切换原理
基于VRRP(Virtual Router Redundancy Protocol)协议,Keepalived能够实现如下故障切换机制:
- 主节点持续发送VRRP心跳包,告知备节点自身状态
- 当备节点在指定时间内未收到心跳包,判定主节点故障
- 备节点自动接管虚拟IP地址,成为新的主节点
- 客户端通过固定虚拟IP访问监控服务,感知不到后端节点切换
3. 环境准备与基础配置
3.1 硬件与系统要求
部署ngxtop高可用集群需要至少两台服务器,推荐配置如下:
| 配置项 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | 1核 | 2核及以上 |
| 内存 | 1GB | 2GB及以上 |
| 硬盘 | 20GB | 40GB SSD |
| 操作系统 | Linux (CentOS/Ubuntu) | CentOS 7/8 或 Ubuntu 20.04 LTS |
| 网络 | 双网卡(可选) | 双网卡冗余 |
3.2 软件依赖安装
在两台服务器上分别执行以下命令安装必要依赖:
# CentOS系统
yum update -y
yum install -y python3 python3-pip nginx keepalived
pip3 install ngxtop
# Ubuntu系统
apt update -y
apt install -y python3 python3-pip nginx keepalived
pip3 install ngxtop
3.3 Nginx日志配置
确保Nginx配置正确的日志格式,以便ngxtop解析。编辑Nginx配置文件nginx/conf.d/default.conf:
http {
log_format combined '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log combined;
# 其他配置...
}
重启Nginx服务使配置生效:
systemctl restart nginx
systemctl enable nginx
4. ngxtop集群部署
4.1 配置文件准备
根据项目docker-compose.yml中的配置,我们可以构建适合生产环境的ngxtop启动脚本。在两台服务器上创建/etc/ngxtop/conf.yml:
access_log: /var/log/nginx/access.log
log_format: combined
interval: 2.0
group_by: request_path
order_by: count
limit: 10
verbose: false
debug: false
4.2 系统服务配置
创建systemd服务文件/etc/systemd/system/ngxtop.service:
[Unit]
Description=ngxtop - real-time metrics for nginx server
After=network.target nginx.service
[Service]
User=root
Group=root
ExecStart=/usr/local/bin/ngxtop --config /etc/ngxtop/conf.yml
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
启动并设置开机自启:
systemctl daemon-reload
systemctl start ngxtop
systemctl enable ngxtop
4.3 验证ngxtop功能
使用以下命令验证ngxtop是否正常工作:
# 查看默认监控界面
ngxtop
# 查看访问量最高的客户端IP
ngxtop top remote_addr
# 查看404状态的请求
ngxtop -i 'status == 404' print request status
5. Keepalived配置与高可用实现
5.1 主节点(Master)配置
编辑Keepalived配置文件/etc/keepalived/keepalived.conf:
! Configuration File for keepalived
global_defs {
router_id NGXTOP_MASTER
}
vrrp_script check_ngxtop {
script "/etc/keepalived/check_ngxtop.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
check_ngxtop
}
notify_master /etc/keepalived/notify_master.sh
notify_backup /etc/keepalived/notify_backup.sh
notify_fault /etc/keepalived/notify_fault.sh
}
5.2 备节点(Backup)配置
备节点配置与主节点类似,但需修改state和priority:
! Configuration File for keepalived
global_defs {
router_id NGXTOP_BACKUP
}
vrrp_script check_ngxtop {
script "/etc/keepalived/check_ngxtop.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
check_ngxtop
}
notify_master /etc/keepalived/notify_master.sh
notify_backup /etc/keepalived/notify_backup.sh
notify_fault /etc/keepalived/notify_fault.sh
}
5.3 健康检查脚本
创建ngxtop健康检查脚本/etc/keepalived/check_ngxtop.sh:
#!/bin/bash
# 检查ngxtop进程是否存在
if pgrep -x "ngxtop" > /dev/null; then
exit 0
else
# 尝试重启ngxtop服务
systemctl restart ngxtop
# 等待2秒后再次检查
sleep 2
if pgrep -x "ngxtop" > /dev/null; then
exit 0
else
exit 1
fi
fi
添加执行权限:
chmod +x /etc/keepalived/check_ngxtop.sh
5.4 状态通知脚本
创建状态变化通知脚本/etc/keepalived/notify_master.sh:
#!/bin/bash
echo "[$(date)] 切换为主节点" >> /var/log/keepalived/notify.log
# 可以添加发送邮件或其他告警通知的命令
同样创建notify_backup.sh和notify_fault.sh脚本,并确保所有通知脚本有执行权限。
5.5 启动Keepalived服务
在两台服务器上分别启动Keepalived服务:
systemctl start keepalived
systemctl enable keepalived
6. 监控与告警系统集成
6.1 Prometheus配置
根据prometheus/prometheus.yml文件,配置Prometheus监控ngxtop服务:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'ngxtop'
static_configs:
- targets: ['192.168.1.100:8080'] # 指向虚拟IP
- job_name: 'keepalived'
static_configs:
- targets: ['192.168.1.101:9165', '192.168.1.102:9165'] # 两台节点的keepalived exporter
6.2 部署Prometheus与Grafana
使用docker-compose部署Prometheus和Grafana:
docker-compose up -d
访问Grafana界面(http://192.168.1.100:3000),添加Prometheus数据源,并导入Nginx监控面板。
6.3 设置告警规则
在Prometheus中配置告警规则,当ngxtop服务异常时触发告警:
groups:
- name: ngxtop_alerts
rules:
- alert: NgxtopDown
expr: up{job="ngxtop"} == 0
for: 30s
labels:
severity: critical
annotations:
summary: "ngxtop服务不可用"
description: "ngxtop服务已宕机超过30秒"
- alert: KeepalivedStateChange
expr: keepalived_vrrp_state{state="backup"} == 1
for: 1m
labels:
severity: warning
annotations:
summary: "Keepalived状态变化"
description: "节点{{ $labels.instance }}已切换为备节点"
7. 高可用集群测试与验证
7.1 功能验证测试
执行以下命令验证ngxtop集群功能:
# 通过虚拟IP访问ngxtop服务
curl http://192.168.1.100:8080/metrics
# 查看当前主节点
ip addr show | grep 192.168.1.100 # 在哪个节点能看到虚拟IP,哪个就是主节点
7.2 故障切换测试
模拟主节点故障,测试自动切换功能:
# 在主节点执行以下命令停止ngxtop服务
systemctl stop ngxtop
# 观察备节点是否接管虚拟IP
# 在备节点执行
ip addr show eth0 | grep 192.168.1.100
# 检查日志确认切换过程
tail -f /var/log/keepalived/notify.log
7.3 性能压力测试
使用ab工具进行压力测试,验证高负载下的监控效果:
ab -n 10000 -c 100 http://192.168.1.100/
同时观察ngxtop监控界面,确认各项指标正常显示。
8. 运维最佳实践与注意事项
8.1 日常维护任务
| 任务 | 频率 | 操作命令 |
|---|---|---|
| 检查服务状态 | 每日 | systemctl status ngxtop keepalived |
| 查看日志 | 每周 | tail -n 1000 /var/log/ngxtop.log /var/log/keepalived.log |
| 备份配置文件 | 每月 | tar -czf ngxtop_backup.tar.gz /etc/ngxtop /etc/keepalived |
| 更新软件版本 | 季度 | pip3 install --upgrade ngxtop |
8.2 常见问题排查
-
虚拟IP无法访问
- 检查Keepalived服务状态
- 确认VRRP协议是否被防火墙阻止
- 检查健康检查脚本是否正常工作
-
切换后服务不可用
- 检查备节点ngxtop服务是否正常运行
- 确认Nginx日志文件路径在两台节点是否一致
- 检查权限问题
-
监控数据不完整
- 确认Nginx日志格式是否正确
- 检查ngxtop配置参数是否正确
- 验证时间同步情况
8.3 性能优化建议
- 日志处理优化:对于高流量服务器,考虑使用日志轮转和采样
- 资源分配:根据服务器负载调整ngxtop的CPU和内存分配
- 网络优化:确保心跳检测网络独立且稳定
- 监控频率:根据实际需求调整Prometheus的抓取间隔
9. 总结与展望
9.1 架构优势总结
本文介绍的基于Keepalived的ngxtop高可用集群方案具有以下优势:
- 高可用性:通过双机热备实现监控服务无间断运行
- 自动故障转移:故障检测与切换完全自动化,无需人工干预
- 可扩展性:可轻松扩展为多节点集群
- 完善的监控:与Prometheus+Grafana无缝集成,实现全方位监控
9.2 未来改进方向
- 多节点集群:扩展为多节点集群,进一步提高可用性
- 容器化部署:使用Kubernetes替代Keepalived,实现更灵活的编排
- 日志集中管理:引入ELK栈实现日志集中收集与分析
- AI异常检测:利用机器学习算法实现监控指标的异常检测
9.3 结束语
通过本文介绍的方案,你已经掌握了构建ngxtop高可用集群的完整流程。在实际生产环境中,还需根据具体业务需求进行适当调整和优化。记住,一个可靠的监控系统是保障业务稳定运行的关键,而高可用架构则是监控系统本身不可或缺的基石。
如果你觉得本文对你有帮助,请点赞、收藏并关注,以便获取更多关于Nginx和监控系统的实用教程。
下期预告:《基于ngxtop的流量分析与安全监控实践》
【免费下载链接】ngxtop Real-time metrics for nginx server 项目地址: https://gitcode.com/gh_mirrors/ng/ngxtop
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



