网络:存储集群的第二块硬盘
分布式存储把网络放进了 I/O 路径,网络抖动会直接变成写延迟。
学完这节你能做到
- 估算给定带宽下集群副本写入的理论上限
- 解释 public network 与 cluster network 分离的收益
- 认识 MTU、bonding、RDMA/RoCE 在存储场景的取舍
分布式存储把网络放进了 I/O 路径
单机存储的写入路径不出机箱。分布式存储不一样:写一个 4KB 的块,要等副本通过网络落到另外两台机器上才能返回。网络的每一次抖动,都会原样变成业务侧的写延迟。
所以在分布式存储里,网络不是"周边设施",它就是一块硬盘——而且是路径上最容易出问题的那块。
先把带宽的账算清楚
网络带宽用 bit 计,存储吞吐用 Byte 计,差 8 倍。这个换算每天都要用:
25 Gbps ÷ 8 = 3.125 GB/s (理论线速)
实际可用约 90% ≈ 2.8 GB/s
100 Gbps ÷ 8 = 12.5 GB/s ≈ 11.2 GB/s 实际
现在把副本算进去。
两个词先垫一下(完整定义见 CPU 与内存 一节和 L2 Ceph 架构): OSD 是管一块数据盘的进程,一盘一个;MON 是维护集群状态的进程,通常 3 个,不在数据路径上。 客户端写数据时,会先落到持有这份数据的主 OSD(primary),再由它转发给其它副本所在的 OSD。
3 副本写入时,主 OSD 收到 1 份数据,要向外发出 2 份:
客户端 → 主 OSD: 1× 数据量(走 public network)
主 OSD → 两个副本: 2× 数据量(走 cluster network)
所以一套 3 副本集群,如果客户端写入 1 GB/s,cluster network 上要跑 2 GB/s。规划时 cluster network 的带宽需求是 public network 的 (N-1) 倍。
8 节点集群,每节点 2 × 25GbE,前后端分离(各 25Gbps)。3 副本下集群的写带宽上限是多少?
- 每节点 cluster 网可用 ≈ 2.8 GB/s,8 节点合计 22.4 GB/s
- 每写 1 份数据要在 cluster 网上产生 2 份流量 → 22.4 ÷ 2 = 11.2 GB/s
- 再看 public 网:8 × 2.8 = 22.4 GB/s,不是瓶颈
- 再看盘:假设每节点 12 块 NVMe,写带宽远超 2.8 GB/s,也不是瓶颈
结论:这套配置的写入瓶颈在 cluster 网络,约 11 GB/s。想再高就得上 100GbE,而不是加盘。
public 与 cluster 网分离
Ceph 支持把两类流量分到不同网络:
| 网络 | 承载什么 | 特点 |
|---|---|---|
| public network | 客户端 ↔ OSD/MON 的请求 | 流量 = 业务量 |
| cluster network | OSD ↔ OSD 的副本、恢复、再平衡 | 流量 = 业务量 ×(N-1),恢复时会暴涨 |
分离的收益不只是带宽翻倍,更重要的是隔离恢复流量。一块盘坏了触发重建时,cluster 网上会突然出现大量流量;如果和客户端流量共享一条网,业务延迟会立刻恶化。
# cephadm 引导时指定
cephadm bootstrap --mon-ip 100.68.20.1 --cluster-network 10.68.20.0/20
# 事后修改
ceph config set mon public_network "100.68.20.0/20"
ceph config set global cluster_network "10.68.20.0/20"
如果物理上只有一条网络,不要把 public 和 cluster 配成同一个网段来"假装分离"——这不会带来任何收益,反而让排查时多一层困惑。Rook 的配置文档里也明确写着:只有一条网络就直接移除 network 段。
MTU、bonding 与常见坑
MTU 9000(巨帧)
默认 MTU 1500 意味着 1MB 的数据要拆成约 700 个包,每个包都有协议头和中断开销。改成 9000 后包数降到约 1/6,CPU 软中断压力显著下降。
ip link set ens1f0 mtu 9000
ip link show ens1f0 | grep mtu
路径上任何一跳(服务器、交换机、路由)MTU 不一致,都会导致大包被丢弃或分片。症状很有迷惑性:小包能通、ping 能通、大文件传输却卡死。验证方法是发不允许分片的大包:
# -M do 禁止分片,-s 8972 = 9000 - 28 字节头部
ping -M do -s 8972 100.68.20.2通了才说明整条路径的巨帧是通的。这条命令请记住,它能省下你半天时间。
bonding
存储节点做双网卡绑定,常用两种模式:
| 模式 | 说明 | 适用 |
|---|---|---|
mode=1(active-backup) | 主备,只用一张卡 | 只要冗余,不要带宽叠加 |
mode=4(802.3ad / LACP) | 链路聚合,需要交换机配合 | 要冗余也要带宽 |
注意 LACP 的哈希策略:默认按 MAC 哈希,如果存储集群里节点数少、连接数少,可能出现流量全压在一条物理链路上。改成 xmit_hash_policy=layer3+4(按 IP + 端口哈希)能分散得更好。
排障:看重传,别只看带宽
网络质量的直接指标是重传率,不是带宽利用率。
# TCP 重传统计
sar -n ETCP 1 5
active/s passive/s iseg/s oseg/s atmptf/s estres/s retrans/s
1.00 0.00 88234.00 91002.00 0.00 0.00 412.00
↑ 重传
重传率 = retrans / oseg。持续超过 0.1% 就要查了,超过 1% 业务一定有感知。
# 网卡层面的丢包与错误
ip -s link show ens1f0
ethtool -S ens1f0 | grep -iE 'drop|err|discard'
# 看是不是接收缓冲区太小
ethtool -g ens1f0
# 连接状态与队列积压
ss -tin | head -20
RDMA 绕过内核协议栈直接读写对端内存,能把延迟从几十微秒降到几微秒,CPU 开销也大幅下降。GPFS ECE、Weka 这类高性能方案普遍依赖它。
代价是它要求无损网络:交换机要配 PFC、ECN,配错了会出现死锁式的全网卡顿,排查难度远高于普通 TCP。经验判断:如果团队没有能独立调 PFC/ECN 的网络工程师,先用 100GbE TCP 把业务跑起来,比上 RoCE 更稳妥。
一套 3 副本 Ceph 集群,客户端持续写入 2 GB/s。cluster network 上大约会有多少流量?
改了 MTU 9000 之后,ping 正常、小文件传输正常,但大文件传输卡死。最可能的原因?
下面哪些是判断网络质量的有效手段?(多选)
这节课的落点
- Gbps ÷ 8 = GB/s,副本写入让 cluster 网流量 = 业务量 ×(N−1)
- 估算集群写带宽要同时看盘、public 网、cluster 网,取最小值
- 前后端分离的核心价值是隔离恢复流量,只有一条网就别假装分离
- MTU 9000 收益明显,但必须端到端一致,用
ping -M do验证 - 网络质量看重传率和丢包,0.1% 是警戒线
- RoCE 性能好但要求团队有能力调无损网络,否则先上 TCP
延伸资料
- ·Systems Performance, 2nd Edition — Brendan Gregg
- ·k8s-in-action
network/