ngxtop高可用集群:基于Keepalived的监控服务冗余

ngxtop高可用集群:基于Keepalived的监控服务冗余

【免费下载链接】ngxtop Real-time metrics for nginx server 【免费下载链接】ngxtop 项目地址: 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的双机热备架构,实现监控服务的高可用。架构图如下:

mermaid

该架构的核心组件包括:

  • 双节点ngxtop服务:主节点(MASTER)和备节点(BACKUP)同时运行ngxtop服务
  • Keepalived:实现VRRP协议,监控节点状态并管理虚拟IP(VIP)
  • 共享存储:确保双节点可访问相同的Nginx日志文件
  • Prometheus+Grafana:实现监控数据的持久化存储与可视化展示

2.3 故障自动切换原理

基于VRRP(Virtual Router Redundancy Protocol)协议,Keepalived能够实现如下故障切换机制:

  1. 主节点持续发送VRRP心跳包,告知备节点自身状态
  2. 当备节点在指定时间内未收到心跳包,判定主节点故障
  3. 备节点自动接管虚拟IP地址,成为新的主节点
  4. 客户端通过固定虚拟IP访问监控服务,感知不到后端节点切换

3. 环境准备与基础配置

3.1 硬件与系统要求

部署ngxtop高可用集群需要至少两台服务器,推荐配置如下:

配置项最低要求推荐配置
CPU1核2核及以上
内存1GB2GB及以上
硬盘20GB40GB 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)配置

备节点配置与主节点类似,但需修改statepriority

! 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 常见问题排查

  1. 虚拟IP无法访问

    • 检查Keepalived服务状态
    • 确认VRRP协议是否被防火墙阻止
    • 检查健康检查脚本是否正常工作
  2. 切换后服务不可用

    • 检查备节点ngxtop服务是否正常运行
    • 确认Nginx日志文件路径在两台节点是否一致
    • 检查权限问题
  3. 监控数据不完整

    • 确认Nginx日志格式是否正确
    • 检查ngxtop配置参数是否正确
    • 验证时间同步情况

8.3 性能优化建议

  • 日志处理优化:对于高流量服务器,考虑使用日志轮转和采样
  • 资源分配:根据服务器负载调整ngxtop的CPU和内存分配
  • 网络优化:确保心跳检测网络独立且稳定
  • 监控频率:根据实际需求调整Prometheus的抓取间隔

9. 总结与展望

9.1 架构优势总结

本文介绍的基于Keepalived的ngxtop高可用集群方案具有以下优势:

  • 高可用性:通过双机热备实现监控服务无间断运行
  • 自动故障转移:故障检测与切换完全自动化,无需人工干预
  • 可扩展性:可轻松扩展为多节点集群
  • 完善的监控:与Prometheus+Grafana无缝集成,实现全方位监控

9.2 未来改进方向

  1. 多节点集群:扩展为多节点集群,进一步提高可用性
  2. 容器化部署:使用Kubernetes替代Keepalived,实现更灵活的编排
  3. 日志集中管理:引入ELK栈实现日志集中收集与分析
  4. AI异常检测:利用机器学习算法实现监控指标的异常检测

9.3 结束语

通过本文介绍的方案,你已经掌握了构建ngxtop高可用集群的完整流程。在实际生产环境中,还需根据具体业务需求进行适当调整和优化。记住,一个可靠的监控系统是保障业务稳定运行的关键,而高可用架构则是监控系统本身不可或缺的基石。

如果你觉得本文对你有帮助,请点赞、收藏并关注,以便获取更多关于Nginx和监控系统的实用教程。

下期预告:《基于ngxtop的流量分析与安全监控实践》

【免费下载链接】ngxtop Real-time metrics for nginx server 【免费下载链接】ngxtop 项目地址: https://gitcode.com/gh_mirrors/ng/ngxtop

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值