公司有几个独立的工厂,一般每个工厂都会有自己本地的机房,用来部署本地的生产系统。这些系统都是独立运行,有自己的数据库、中间件、上层服务等,为了防止机房故障,会每天把重要数据备份下来,然后存到异地(比如公有云)。
备份任务跑了很久了,没出现问题,但是最近有人反馈每天凌晨,工厂网络会卡,检查了一下网络监控,是因为异地备份的时候,把公网带宽打满了,需要对备份任务进行限速。
备份软件限速 如果没有底层操作系统、交换机的权限,可以尝试使用备份软件自己的限速,我们使用的是百度公有云BOS,使用bcecmd命令进行备份,虽然bcecmd提供限速指令,但仅适用于云端bucket之间,并不提供本地到云端的限速,此路不通。
https://cloud.baidu.com/doc/BOS/s/kmcn3zrup
--traffic-limit:对于上传下载,单位为KB/s,没有范围限制;对于BOS到BOS之间的数据拷贝,限速值的取值范围为819200~838860800,单位为bit/s,即100KB/s~100MB/s。
防火墙限速
如果有底层设备的权限,可以操作工厂防火墙,指定对某个IP进行限速。
操作系统限速 当然方便的还是操作系统层面进行限速,限制某个网卡的出口速度,使用tc命令即可;限制某个网卡到某个IP的最大带宽。
#!/bin/bash
# Purpose: Limit outgoing traffic to a specific IP using tc HTB
IFACE=$(ip route | awk '/default/ {print $5}')
TARGET_IP="XX.XX.XX.XX"
RATE="100mbit"
CEIL="100mbit"
BURST="2m"
GATEWAY=$(ip route | awk '/default/ {print $3}') # 等待网关可达
until ping -c1 "$GATEWAY" &>/dev/null; do
echo "Waiting for gateway $GATEWAY..."
sleep 5
done
# 1️⃣ 删除已有根队列(如果存在)
sudo tc qdisc del dev $IFACE root 2>/dev/null || true
# 2️⃣ 添加根队列
sudo tc qdisc add dev $IFACE root handle 1: htb default 30
# 3️⃣ 添加限速子类
sudo tc class add dev $IFACE parent 1: classid 1:10 htb rate $RATE ceil $CEIL burst $BURST
# 4️⃣ 添加默认子类,保证其他流量不受影响
sudo tc class add dev $IFACE parent 1: classid 1:30 htb rate 1gbit ceil 1gbit
# 5️⃣ 添加过滤器,将发往目标 IP 的流量匹配到限速子类
sudo tc filter add dev $IFACE protocol ip parent 1:0 prio 1 u32 match ip dst $TARGET_IP/32 flowid 1:10
echo "Bandwidth limiting applied: $IFACE $TARGET_IP → $RATE"
上面的脚本,可自动获取默认网卡,然后只限制到某个IP的最大宽带为100Mb/s,不限制其他IP地址。