目标:在香港按流量计费(按GB计)的服务器上实现精确计量、峰值带宽控制与告警,避免意外超流量或峰值罚款。
小分段:1) 理解两类需求:累计流量计费(按月/按日)与瞬时带宽峰值控制(避免瞬时突增)。2) 本指南针对Linux服务器,结合vnStat(累计)、tc(流量控制)、Prometheus/Alertmanager或脚本化告警。
步骤:1) 确认系统为CentOS/Ubuntu/Debian并有root权限。2) 确认网卡名称(ip addr 或 ifconfig)。3) 确认提供商是否在路由侧也有限制(询问ISP)。
小分段:列出命令:a) ip a; b) uname -a; c) df -h(确保存储日志)。
实操:1) 安装:Ubuntu/Debian: apt update && apt install vnstat -y;CentOS: yum install epel-release -y && yum install vnstat -y。2) 初始化数据库:vnstat -u -i eth0(将eth0替换为实际网卡),然后 systemctl enable --now vnstat。3) 验证:vnstat -i eth0 -m(每月统计),vnstat -i eth0 -d(每日统计)。
小分段:配置轮换与保留:编辑 /etc/vnstat.conf 可调整数据库路径与数据保留周期;导出CSV用于对账:vnstat --dumpdb > /root/vnstat_db_$(date +%F).txt。
步骤示例(限制上行峰值为10Mbps):1) 清理旧配置:tc qdisc del dev eth0 root || true。2) 添加根HTB并设置速率:tc qdisc add dev eth0 root handle 1: htb default 20;tc class add dev eth0 parent 1: classid 1:1 htb rate 1000mbit;tc class add dev eth0 parent 1:1 classid 1:20 htb rate 10mbit ceil 10mbit。3) 测试并调整:使用iperf或scp模拟上行,观察是否被限制。
小分段:如需按时段自动开启/关闭峰值限制,使用cron或systemd-timer执行带有tc命令的脚本(见下一节)。
实现方法:1) 编写脚本 /usr/local/bin/bw_peak_on.sh 与 bw_peak_off.sh,分别执行上文tc添加与删除命令。2) 给脚本加执行权限:chmod +x。3) 使用crontab -e添加定时:例如每天09:00开启峰值限制(防止早高峰超流量)23:00关闭:0 9 * * * /usr/local/bin/bw_peak_on.sh;0 23 * * * /usr/local/bin/bw_peak_off.sh。
小分段:建议在脚本内记录日志(echo "$(date): 开启峰值" >> /var/log/bw_control.log)并加入状态检测(判断tc是否已存在)。
快速部署:1) 安装node_exporter:下载二进制并以systemd运行,暴露 /metrics。2) 在Prometheus中配置targets指向服务器IP:9100。3) 使用PromQL例如 rate(node_network_receive_bytes_total{device="eth0"}[5m]) * 8 得到bps,或 sum over interfaces 计算总带宽。
小分段:创建Grafana仪表盘展示实时Mbps与每日累计GB(累计可使用vnStat导出并通过脚本推送到Prometheus pushgateway)。
步骤:1) 在Prometheus配置alerts.yml,示例规则:- alert: HighOutboundMbps expr: rate(node_network_transmit_bytes_total{device="eth0"}[2m])*8 > 20000000 for: 2m labels: severity: warning annotations: summary: "出口带宽高于20Mbps"。2) 配置Alertmanager的通知(邮件、Slack、Webhook、钉钉)。3) 测试:使用tc调高发送流量触发告警并验证接收。
小分段:为避免误报,设置for时长以及多个时间窗(5m/15m)组合。
实现方法:1) 通过vnstat读取昨日/当日流量:vnstat --oneline b | awk -F\; '{print $...}' 或使用 vnstat -tr 测试实时。2) 写脚本每小时计算当月已用流量并与阈值比较,超过阈值触发curl调用企业微信/钉钉/Slack webhook或sendmail发送邮件。3) 将脚本加入crontab或systemd timer。
小分段:示例伪代码:used=$(vnstat --dumpdb | grep "^m;" | awk ... ); if [ $used -gt $threshold ]; then curl -X POST -d '{"msg":"达到80%"}' $WEBHOOK; fi。
测试项:1) 验证vnStat累计与运营商账单差异,导出CSV逐日对账。2) 验证tc限制在高并发下仍有效(iperf3多线程)。3) 模拟断网/重启场景,确保vnStat与node_exporter服务自启。
小分段:建议每月对账流程:导出vnstat月报、与ISP账单对比差异并保留日志(/var/log/vnstat/ 与 /var/log/bw_control.log)。
要点:1) vnStat因重启或网卡改名导致计数中断,使用udev规则固定网卡命名并迁移数据库。2) tc配置不生效时检查是否在物理/虚拟化场景下被上层交换机覆盖(需要与ISP沟通)。3) 告警噪音:调整for时长与抑制策略(Alertmanager group_by & inhibit)。
小分段:记录故障单并保留触发时间段的pcap或netstat快照便于ISP核查。
答:对齐步骤:1) 确认计费周期(UTC或本地时区)并统一vnStat输出时间:编辑/var/lib/vnstat/db文件或在导出时按账单周期切片。2) 导出账期内每天的流量(vnstat -i eth0 -d --years),汇总成GB并与账单同区间比较。3) 如有差异,保留系统与网络设备日志,与ISP协商疑点时间段并提供pcap或流量快照作为证据。
答:会有可能影响:tc限制会在超出速率时触发排队/丢包,从而增加延迟或丢包率。建议使用HTB + fq_codel 或者合理设置ceil与burst值,优先为关键业务开通更高class或使用DSCP做队列优先级,先在测试环境验证QOS策略再上线生产。
答:可采用脚本+Webhook结合冗余通道:1) 多点检测(vnStat对比、ifstat/ss命令实时校验)。2) 告警同时发到邮件与企业微信/短信(通过第三方API),并在脚本内记录触发日志以便人工二次确认。3) 定期演练告警流程,确保联系人、回调与抑制规则正确。