1. 凌晨一场“高负载”事故,把云服务器四层架构拉到台前
凌晨2点17分,我收到告警:某业务线的三台云服务器同时CPU跑满,磁盘IO延迟飙到几百毫秒,业务大面积超时。照理说,第一反应是登录机器看进程,可折腾了半小时,应用层没发现任何异常,load average却始终降不下来。
后来我登进宿主机层的监控面板才发现,那三台实例所在物理机的整体CPU使用率已经超过90%,而罪魁祸首,是同机一台正在做数据恢复的“邻居”云主机。它在备份恢复过程中把宿主机内存带宽和磁盘队列全部吃掉了。
这就是云服务器最让人头疼的地方:你买到的是一个黑盒,看到的只有Guest OS里的指标。但真正影响你业务稳定性的,往往是在下层那些“看不见的组件”。从那以后,我把云服务器的技术架构拆成了一套四层架构体系来理解,再遇到类似问题,先判断发生在哪一层,再往下查核心组件协同关系,效率就高很多。
1.1 查了半天,问题出在宿主机上的“邻居”
那次事故里,页面端看到的现象是CPU使用率100%,磁盘IO等待很高。但我在实例内部执行top、iotop、ss,都没有发现可疑进程,MySQL慢查询也没有明显爆发。如果你只站在“一台服务器”的角度想,就会走进死胡同。
云服务器和物理服务器的本质区别在于:同一台物理机上,可能同时跑着几十台云主机。任何一个用户的行为如果没被隔离好,都可能成为你的“噪声邻居”。那天的问题根本不在这几台云主机内部,而在我划分的第一层——基础设施层的物理资源竞争,以及第二层虚拟化层的CPU、内存、IO访问路径上。
理解这一点后,你会明白:云服务器的架构不能只当“一台远程电脑”来维护,而必须把它放进一整条协作链里去看。
1.2 我理清云服务器架构用的四层划分
不同云厂商的实现细节差异很大,但技术骨架基本一致。我习惯按四层去理解一套云服务器的运转逻辑:
| 层级 | 这一层负责什么 | 代表性组件 | 故障影响范围 |
|---|---|---|---|
| 基础设施层 | 物理服务器、CPU/内存、硬盘、网卡、交换机、电源、散热等硬件底座 | x86/ARM服务器、BMC/IPMI、TOR交换机、分布式存储物理节点 | 硬件故障会诱发云主机迁移或重建 |
| 虚拟化资源池层 | 把物理资源切分成可动态漂移的虚拟资源,包括计算、存储、网络三条虚拟化链路 | KVM/QEMU、Ceph/RBD云硬盘、OVS/VXLAN/DPDK | CPU超卖、存储抖动、隧道丢包都在这一层暴露 |
| 平台控制与管理层 | 负责实例的创建、删除、迁移、规格变更、鉴权、计费、调度等管理动作 | 控制台API、调度器、消息队列、数据库、镜像服务 | 控制面故障影响操作能力,但未必中断存量业务 |
| 租户运行协同层 | Guest OS内部的virtio驱动、cloud-init、监控Agent、安全Agent等 | virtio-net/virtio-blk、cloud-init、云监控插件 | Agent失联导致平台无法感知,驱动缺失导致性能崩盘 |
这套分层的价值在于:绝大多数问题都能先划到某一层的边界内,再去查具体组件。如果一开始就从应用层跳到虚拟化层,很容易漏掉“控制面做过什么”“Guest驱动是否正常”这些隐藏因素。
1.3 这套架构认知适合谁
给云上应用做过架构评审,或正在做云平台运维的工程师,会很快用上这套模型;
