# 检查网络接口状态 check_interface_status() { for interface in $(ip link show | grep -E "^[0-9]+:" | cut -d: -f2 | tr -d ' '); do if [ "$interface" != "lo" ]; then status=$(cat /sys/class/net/$interface/operstate) if [ "$status" != "up" ]; then log_message "WARNING: Interface $interface is $status" fi fi done }
# 检查带宽使用率 check_bandwidth_usage() { for interface in $(ip link show | grep -E "^[0-9]+:" | cut -d: -f2 | tr -d ' '); do if [ "$interface" != "lo" ]; then # 获取接口统计信息 rx_bytes=$(cat /sys/class/net/$interface/statistics/rx_bytes) tx_bytes=$(cat /sys/class/net/$interface/statistics/tx_bytes) # 计算带宽使用率(简化计算) total_bytes=$((rx_bytes + tx_bytes)) if [ $total_bytes -gt 0 ]; then log_message "Interface $interface: RX=${rx_bytes}bytes, TX=${tx_bytes}bytes" fi fi done }
# 检查连接数 check_connection_count() { tcp_connections=$(ss -t | wc -l) udp_connections=$(ss -u | wc -l) total_connections=$((tcp_connections + udp_connections)) if [ $total_connections -gt $ALERT_CONNECTION_THRESHOLD ]; then log_message "WARNING: High connection count: $total_connections" fi log_message "Connection count: TCP=$tcp_connections, UDP=$udp_connections, Total=$total_connections" }
# 检查网络错误 check_network_errors() { for interface in $(ip link show | grep -E "^[0-9]+:" | cut -d: -f2 | tr -d ' '); do if [ "$interface" != "lo" ]; then rx_errors=$(cat /sys/class/net/$interface/statistics/rx_errors) tx_errors=$(cat /sys/class/net/$interface/statistics/tx_errors) rx_dropped=$(cat /sys/class/net/$interface/statistics/rx_dropped) tx_dropped=$(cat /sys/class/net/$interface/statistics/tx_dropped) if [ $rx_errors -gt 0 ] || [ $tx_errors -gt 0 ] || [ $rx_dropped -gt 0 ] || [ $tx_dropped -gt 0 ]; then log_message "WARNING: Interface $interface errors - RX_ERR:$rx_errors, TX_ERR:$tx_errors, RX_DROP:$rx_dropped, TX_DROP:$tx_dropped" fi fi done }
# 检查网络延迟 check_network_latency() { # 检查到网关的延迟 gateway=$(ip route | grep default | awk '{print $3}' | head -1) if [ -n "$gateway" ]; then latency=$(ping -c 3 -W 1 $gateway 2>/dev/null | grep "avg" | awk -F'/''{print $5}') if [ -n "$latency" ]; then if (( $(echo "$latency > 100" | bc -l) )); then log_message "WARNING: High latency to gateway: ${latency}ms" else log_message "Latency to gateway: ${latency}ms" fi fi fi }
log_bandwidth() { local timestamp=$(date'+%Y-%m-%d %H:%M:%S') local rx_bytes=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes) local tx_bytes=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes) echo"$timestamp,$rx_bytes,$tx_bytes" >> $LOG_FILE }
# 添加根类别 tc class add dev $INTERFACE parent 1: classid 1:1 htb rate 1000mbit
# 添加子类别 tc class add dev $INTERFACE parent 1:1 classid 1:10 htb rate 800mbit ceil 1000mbit tc class add dev $INTERFACE parent 1:1 classid 1:20 htb rate 150mbit ceil 200mbit tc class add dev $INTERFACE parent 1:1 classid 1:30 htb rate 50mbit ceil 100mbit
# 添加过滤器 tc filter add dev $INTERFACE parent 1: protocol ip prio 1 u32 match ip dport 80 0xffff flowid 1:10 tc filter add dev $INTERFACE parent 1: protocol ip prio 2 u32 match ip dport 443 0xffff flowid 1:10 tc filter add dev $INTERFACE parent 1: protocol ip prio 3 u32 match ip dport 22 0xffff flowid 1:20
echo"Traffic control rules configured successfully"
# 物理层监控 monitor_physical_layer() { echo"1. Physical Layer Monitoring:" for interface in $(ip link show | grep -E "^[0-9]+:" | cut -d: -f2 | tr -d ' '); do if [ "$interface" != "lo" ]; then status=$(cat /sys/class/net/$interface/operstate) speed=$(cat /sys/class/net/$interface/speed 2>/dev/null || echo"Unknown") duplex=$(cat /sys/class/net/$interface/duplex 2>/dev/null || echo"Unknown") echo"Interface: $interface, Status: $status, Speed: $speed, Duplex: $duplex" if [ "$status" != "up" ]; then echo"WARNING: Interface $interface is $status" fi fi done }
# 数据链路层监控 monitor_data_link_layer() { echo -e "\n2. Data Link Layer Monitoring:" for interface in $(ip link show | grep -E "^[0-9]+:" | cut -d: -f2 | tr -d ' '); do if [ "$interface" != "lo" ]; then mac_address=$(cat /sys/class/net/$interface/address) mtu=$(cat /sys/class/net/$interface/mtu) echo"Interface: $interface, MAC: $mac_address, MTU: $mtu" fi done }
# 网络层监控 monitor_network_layer() { echo -e "\n3. Network Layer Monitoring:" echo"Routing table:" ip route show echo -e "\nIP addresses:" ip addr show echo -e "\nARP table:" ip neigh show }
# 传输层监控 monitor_transport_layer() { echo -e "\n4. Transport Layer Monitoring:" echo"TCP connections:" ss -t -s echo -e "\nUDP connections:" ss -u -s echo -e "\nConnection states:" ss -t -a | awk 'NR>1 {print $1}' | sort | uniq -c | sort -nr }
# 应用层监控 monitor_application_layer() { echo -e "\n5. Application Layer Monitoring:" echo"Listening ports:" ss -tlnp | head -20 echo -e "\nTop connections by port:" ss -tln | awk 'NR>1 {print $4}' | cut -d: -f2 | sort | uniq -c | sort -nr | head -10 }
# 检查网络接口状态 check_interface_status() { for interface in $(ip link show | grep -E "^[0-9]+:" | cut -d: -f2 | tr -d ' '); do if [ "$interface" != "lo" ]; then status=$(cat /sys/class/net/$interface/operstate) if [ "$status" != "up" ]; then local alert_msg="CRITICAL: Interface $interface is $status" send_email_alert "Network Interface Down""$alert_msg" send_slack_alert "$alert_msg" fi fi done }
# 检查带宽使用率 check_bandwidth_usage() { for interface in $(ip link show | grep -E "^[0-9]+:" | cut -d: -f2 | tr -d ' '); do if [ "$interface" != "lo" ]; then # 获取接口速度 speed=$(cat /sys/class/net/$interface/speed 2>/dev/null) if [ -n "$speed" ] && [ "$speed" != "Unknown" ]; then # 计算使用率(简化计算) rx_bytes=$(cat /sys/class/net/$interface/statistics/rx_bytes) tx_bytes=$(cat /sys/class/net/$interface/statistics/tx_bytes) # 这里需要更复杂的计算来获取实际使用率 # 简化示例 if [ $rx_bytes -gt 1000000000 ]; then local alert_msg="WARNING: High bandwidth usage on interface $interface" send_email_alert "High Bandwidth Usage""$alert_msg" send_slack_alert "$alert_msg" fi fi fi done }
# 检查连接数 check_connection_count() { total_connections=$(ss -t | wc -l) if [ $total_connections -gt 1000 ]; then local alert_msg="WARNING: High connection count: $total_connections" send_email_alert "High Connection Count""$alert_msg" send_slack_alert "$alert_msg" fi }
# 检查网络延迟 check_network_latency() { gateway=$(ip route | grep default | awk '{print $3}' | head -1) if [ -n "$gateway" ]; then latency=$(ping -c 3 -W 1 $gateway 2>/dev/null | grep "avg" | awk -F'/''{print $5}') if [ -n "$latency" ]; then if (( $(echo "$latency > 100" | bc -l) )); then local alert_msg="WARNING: High latency to gateway: ${latency}ms" send_email_alert "High Network Latency""$alert_msg" send_slack_alert "$alert_msg" fi fi fi }
# 检查网络错误 check_network_errors() { for interface in $(ip link show | grep -E "^[0-9]+:" | cut -d: -f2 | tr -d ' '); do if [ "$interface" != "lo" ]; then rx_errors=$(cat /sys/class/net/$interface/statistics/rx_errors) tx_errors=$(cat /sys/class/net/$interface/statistics/tx_errors) if [ $rx_errors -gt 0 ] || [ $tx_errors -gt 0 ]; then local alert_msg="WARNING: Network errors on interface $interface - RX:$rx_errors, TX:$tx_errors" send_email_alert "Network Errors""$alert_msg" send_slack_alert "$alert_msg" fi fi done }
# 重启网络接口 restart_interface() { local interface="$1" local retry_count=0 while [ $retry_count -lt $MAX_RETRIES ]; do log_recovery "Attempting to restart interface $interface (attempt $((retry_count + 1)))" # 关闭接口 ip linkset$interface down sleep 5 # 启动接口 ip linkset$interface up sleep 10 # 检查接口状态 status=$(cat /sys/class/net/$interface/operstate) if [ "$status" = "up" ]; then log_recovery "Interface $interface restarted successfully" return 0 fi retry_count=$((retry_count + 1)) sleep$RETRY_INTERVAL done log_recovery "Failed to restart interface $interface after $MAX_RETRIES attempts" return 1 }
# 重启网络服务 restart_network_service() { log_recovery "Restarting network service" systemctl restart network sleep 30 # 检查网络服务状态 if systemctl is-active --quiet network; then log_recovery "Network service restarted successfully" return 0 else log_recovery "Failed to restart network service" return 1 fi }
# 检查网络连通性 check_connectivity() { local target="$1" if [ -z "$target" ]; then target="8.8.8.8" fi ping -c 3 -W 1 $target > /dev/null 2>&1 return $? }
# 主恢复逻辑 main() { log_recovery "Network auto-recovery started" # 检查网络连通性 if ! check_connectivity; then log_recovery "Network connectivity check failed" # 检查接口状态 for interface in $(ip link show | grep -E "^[0-9]+:" | cut -d: -f2 | tr -d ' '); do if [ "$interface" != "lo" ]; then status=$(cat /sys/class/net/$interface/operstate) if [ "$status" != "up" ]; then log_recovery "Interface $interface is $status, attempting restart" restart_interface "$interface" fi fi done # 再次检查连通性 if ! check_connectivity; then log_recovery "Still no connectivity, restarting network service" restart_network_service fi else log_recovery "Network connectivity is normal" fi log_recovery "Network auto-recovery completed" }
generate_metrics() { cat > $METRICS_FILE << EOF # HELP network_interface_up Interface up status # TYPE network_interface_up gauge EOF
for interface in $(ip link show | grep -E "^[0-9]+:" | cut -d: -f2 | tr -d ' '); do if [ "$interface" != "lo" ]; then status=$(cat /sys/class/net/$interface/operstate) up_value=0 if [ "$status" = "up" ]; then up_value=1 fi echo"network_interface_up{interface=\"$interface\"} $up_value" >> $METRICS_FILE fi done
cat >> $METRICS_FILE << EOF # HELP network_interface_rx_bytes_total Total bytes received # TYPE network_interface_rx_bytes_total counter EOF
for interface in $(ip link show | grep -E "^[0-9]+:" | cut -d: -f2 | tr -d ' '); do if [ "$interface" != "lo" ]; then rx_bytes=$(cat /sys/class/net/$interface/statistics/rx_bytes) echo"network_interface_rx_bytes_total{interface=\"$interface\"} $rx_bytes" >> $METRICS_FILE fi done
cat >> $METRICS_FILE << EOF # HELP network_interface_tx_bytes_total Total bytes transmitted # TYPE network_interface_tx_bytes_total counter EOF
for interface in $(ip link show | grep -E "^[0-9]+:" | cut -d: -f2 | tr -d ' '); do if [ "$interface" != "lo" ]; then tx_bytes=$(cat /sys/class/net/$interface/statistics/tx_bytes) echo"network_interface_tx_bytes_total{interface=\"$interface\"} $tx_bytes" >> $METRICS_FILE fi done
cat >> $METRICS_FILE << EOF # HELP network_tcp_connections_total Total TCP connections # TYPE network_tcp_connections_total gauge EOF
#!/bin/bash # mysql_network_monitor.sh echo"=== MySQL Network Monitoring ==="
# 检查MySQL进程 mysql_pids=$(pgrep mysqld) if [ -z "$mysql_pids" ]; then echo"ERROR: MySQL is not running!" exit 1 fi
echo"MySQL PIDs: $mysql_pids"
# 检查监听端口 echo -e "\nListening Ports:" ss -tlnp | grep mysql
# 检查连接统计 echo -e "\nConnection Statistics:" mysql -e "SHOW STATUS LIKE 'Connections';" 2>/dev/null mysql -e "SHOW STATUS LIKE 'Threads_connected';" 2>/dev/null mysql -e "SHOW STATUS LIKE 'Threads_running';" 2>/dev/null
# 检查网络错误 echo -e "\nNetwork Errors:" mysql -e "SHOW STATUS LIKE 'Aborted_connects';" 2>/dev/null mysql -e "SHOW STATUS LIKE 'Aborted_clients';" 2>/dev/null
# 检查网络统计 echo -e "\nNetwork Statistics:" mysql -e "SHOW STATUS LIKE 'Bytes_received';" 2>/dev/null mysql -e "SHOW STATUS LIKE 'Bytes_sent';" 2>/dev/null
# 检查后端服务器状态 echo -e "\nBackend Server Status:" if [ -f /var/run/haproxy/admin.sock ]; then echo"show stat" | socat stdio /var/run/haproxy/admin.sock | head -20 fi
# 检查负载均衡统计 echo -e "\nLoad Balancing Statistics:" if [ -f /var/run/haproxy/admin.sock ]; then echo"show stat" | socat stdio /var/run/haproxy/admin.sock | grep -E "(srv|backend)" fi