奋斗
努力

Ubuntu Server在高并发、高可用场景下的运维实践和常见问题有哪些?

云计算

在 Ubuntu Server 上构建高并发、高可用(HA)生产环境是常见需求(如 Web 服务、API 网关、微服务后端、实时数据处理等),但其默认配置远不足以直接承载此类负载。以下是结合实战经验的系统性运维实践与典型问题总结,兼顾稳定性、可观测性、自动化与安全:


一、核心运维实践(分层架构视角)

1. 系统层优化

  • 内核调优(/etc/sysctl.conf

    # 提升连接容量与复用
    net.core.somaxconn = 65535
    net.core.netdev_max_backlog = 5000
    net.ipv4.tcp_max_syn_backlog = 65535
    net.ipv4.ip_local_port_range = 1024 65535
    net.ipv4.tcp_tw_reuse = 1          # TIME_WAIT 复用(需确保对端支持)
    net.ipv4.tcp_fin_timeout = 30
    net.ipv4.tcp_slow_start_after_idle = 0  # 避免空闲后降速(Linux 4.1+)
    # 内存与OOM
    vm.swappiness = 1                   # 减少swap使用(SSD/NVMe环境)
    vm.overcommit_memory = 1            # 允许过量分配(配合应用内存管理)

    ▶️ 注意:通过 sysctl -p 加载后,用 ss -snetstat -s 验证连接状态;避免盲目调大 tcp_tw_reuse(NAT 环境下可能引发 RST)。

  • 文件系统与I/O

    • 使用 XFS(优于 ext4 的大文件/高并发元数据性能),挂载参数:
      defaults,noatime,nodiratime,logbufs=8,logbsize=256k
    • SSD/NVMe 启用 io_scheduler=none(现代NVMe无需调度器)或 mq-deadline(SATA SSD)。
    • ulimit -n 调整至 65535(需在 /etc/security/limits.conf + systemd LimitNOFILE= 双重设置)。

2. 服务高可用设计

  • 负载均衡层(L4/L7)

    • 推荐方案HAProxy(稳定、可编程) + Keepalived(VRRP 实现 VIP 故障转移)
    • HAProxy 启用 http-check 健康检查、balance leastconntimeout http-request 5s
    • Keepalived 配置 nopreempt + priority 避免脑裂,绑定 track_script 监控 HAProxy 进程
    • 替代方案nginx(L7)+ consul-template(动态配置) 或 Traefik(云原生集成)
  • 应用服务层

    • 无状态化:Session 存入 Redis(启用 redis-sentinelredis-cluster
    • 进程管理systemd 替代 supervisord(原生支持依赖、重启策略、cgroup 限制)
      [Service]
      Restart=on-failure
      RestartSec=5
      MemoryMax=2G
      CPUQuota=80%
      LimitNOFILE=65535
  • 数据层高可用

    • PostgreSQL: pg_auto_failover(官方推荐)或 Patroni + etcd/ZooKeeper
    • MySQL: MHA(已停更)→ 推荐 Orchestrator + GTID + Semi-sync Replication
    • Redis: Sentinel(中小规模)或 Redis Cluster(大规模分片)

3. 可观测性体系(必备!)

组件 工具链建议 关键作用
指标监控 Prometheus + Node Exporter + cAdvisor 主机/容器资源、服务SLI(HTTP延迟、错误率)
日志聚合 Loki + Promtail(轻量) 或 ELK(重型) 结构化日志、错误追踪、审计
链路追踪 Jaeger / OpenTelemetry Collector 分布式事务性能瓶颈定位
告警 Alertmanager(Prometheus 生态) 基于 SLO 的分级告警(P1/P2)

▶️ 关键实践

  • 所有服务暴露 /metrics(Prometheus 格式)
  • 日志统一 JSON 格式,包含 trace_id, service_name, level 字段
  • 告警阈值基于 SLO(如 “99% 请求 P95 < 200ms”)而非静态阈值

4. 自动化与CI/CD

  • 配置管理:Ansible(适合 Ubuntu) + GitOps(配置即代码,ansible-pull 拉取最新playbook)
  • 部署流水线:GitLab CI/CD 或 GitHub Actions
    • 构建 → 容器镜像(docker buildx 多平台)→ 镜像扫描(Trivy)→ Kubernetes/Helm 部署 或 rsync + systemctl reload
  • 蓝绿/金丝雀发布:HAProxy 权重控制流量切分,配合健康检查自动回滚

5. 安全加固(高并发≠牺牲安全)

  • 最小化安装:ubuntu-server-minimal,禁用 snapd(若非必需,因占用资源且更新不可控)
  • SSH 强制密钥认证 + Fail2ban(bantime = 1h,避免误封)
  • 自动化证书:certbot + systemd timer(每周续期,避免 Let’s Encrypt 中断)
  • 内核防护:启用 grsecurity 补丁(Ubuntu 22.04+ 可选)或 Kernel Self Protection Project (KSPP) 配置

二、高频问题与解决方案(来自真实故障库)

问题现象 根本原因 快速诊断命令/方法 解决方案
大量 TIME_WAIT 占满端口 短连接激增 + tcp_tw_reuse=0 ss -tan state time-wait | wc -l 开启 tcp_tw_reuse + 调大 net.ipv4.ip_local_port_range
HAProxy 后端节点频繁抖动 健康检查超时/路径不可达/SSL握手失败 haproxy -d 抓包 + curl -v http://backend/health 检查后端服务健康检查端点响应时间、TLS 版本兼容性
PostgreSQL 主从延迟飙升 大事务、WAL 生成过快、网络抖动 SELECT pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) FROM pg_stat_replication; 优化大事务拆分、增加 max_standby_streaming_delay、升级网络带宽
系统负载突增但 CPU 使用率低 I/O Wait(磁盘/网络瓶颈)或锁竞争 iostat -x 1(看 %util, await)、pidstat -u -r -d 1 升级 NVMe、调整 I/O 调度器、应用层加缓存(Redis)
Kubernetes Node NotReady kubelet OOM、CNI 插件崩溃、磁盘满 journalctl -u kubelet -n 100 --no-pagerdf -h /var/lib/kubelet 设置 kubelet --system-reserved、定期清理 imagegc、监控 /var/log/pods
Ubuntu 自动更新导致服务中断 unattended-upgrades 重启服务 grep "unattended-upgrade" /var/log/unattended-upgrades/* 编辑 /etc/apt/apt.conf.d/50unattended-upgrades,禁用 Unattended-Upgrade::Automatic-Reboot,或设置维护窗口

三、避坑指南(血泪经验)

  1. 慎用 snapd
    Ubuntu 22.04+ 默认启用 snap(如 core22, snapd 自身),它会常驻 100MB+ 内存并触发后台更新。生产环境建议:

    sudo snap remove --purge core22 core20 && sudo systemctl disable snapd
    # 若必须用 snap(如 microk8s),则限制其资源:`sudo systemctl set-property snapd.service MemoryMax=512M`
  2. 不要信任默认 ufw 规则
    ufw 在 HA 场景下易配置错误(如未放行 VRRP 协议 proto vrrp),导致 Keepalived VIP 不生效。建议:

    • iptables-nft 直接管理,或
    • ufw 中显式添加:ufw allow proto vrrp from 192.168.1.0/24
  3. systemd-resolved DNS 陷阱
    Ubuntu 18.04+ 默认启用 systemd-resolved,其 stub listener (127.0.0.53) 可能与 Consul/etcd DNS 冲突。解决:

    sudo systemctl disable systemd-resolved
    echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
  4. 时间同步必须严格
    NTP 偏差 > 100ms 可导致 Kafka/Elasticsearch 分区选举失败、TLS 证书校验失败。强制使用 chrony

    sudo apt install chrony && sudo systemctl enable chrony && sudo chronyc tracking  # 验证偏移

四、推荐工具栈(2024 生产验证)

场景 推荐方案 优势
基础设施编排 Terraform + Ansible 基础设施即代码 + 配置精细化控制
容器运行时 containerd(非 Docker Engine) 更轻量、K8s 原生、CVE 响应更快
服务网格 Cilium(eBPF 提速) + Hubble 零信任网络、L7 可观测性、无 sidecar 性能损耗
备份恢复 BorgBackup(去重加密) + rclone 同步到 S3 增量备份、跨云容灾、压缩率 > 90%

总结:高可用的本质是“可控的失败”

不是追求 100% 不宕机,而是确保:

  • 故障 30 秒内被检测(监控)
  • 60 秒内自动隔离(健康检查)
  • 5 分钟内服务恢复(自动切换 + 缓存兜底)
  • 1 小时内根因定位(日志+链路+指标联动)

最后建议

  • 所有变更必须经过 混沌工程测试(如 chaos-mesh 注入网络延迟、Pod Kill)
  • 每季度执行 故障演练(Game Day),模拟主库宕机、VIP 漂移失败等场景
  • SRE Handbook(Google)和 Site Reliability Engineering(O’Reilly)作为团队必读书目

如需某环节(如 PostgreSQL Patroni 部署细节、HAProxy 动态权重 API、Prometheus 告警规则模板)的深度展开,可随时告知,我可提供完整 YAML/Shell 示例。

未经允许不得转载:云服务器 » Ubuntu Server在高并发、高可用场景下的运维实践和常见问题有哪些?