Ceph 生产环境搭建 | 第 13 天:Ceph 网络架构:集群网络与公共网络分离

第 13/20 天

为什么网络分离是 Ceph 生产环境的「生命线」

在前十二天的连载中,我们从架构选型一路走到 CephFS 文件系统部署,已经搭建起一个功能完整的 Ceph 集群。但如果你把这套集群直接搬进生产机房,大概率会在业务高峰期遭遇诡异的现象:客户端读写延迟飙升、OSD 之间心跳超时、PG 状态长时间 degraded——而这一切的元凶,往往不是磁盘不够快,而是网络没有做分离。

Ceph 作为分布式存储系统,其核心数据通路有两条:一条是客户端访问集群的「公共网络」(Public Network),承载 RBD iSCSI、RGW S3、CephFS 挂载、MON/MGR 管理流量;另一条是 OSD 之间复制、恢复、回填的「集群网络」(Cluster Network),承担着多副本写入、CRUSH 重平衡、故障恢复等内部流量。这两条流量在默认配置下共用一张网卡、一个子网,会互相争抢带宽,一旦恢复任务启动,业务读写立刻被拖垮。

本篇聚焦 Squid v19 在 Ubuntu 24.04 LTS 上的双网络分离实战,从拓扑设计、网卡绑定、ceph.conf 配置、cephadm spec 编排到验证调优,完整覆盖生产级网络架构的落地。

架构与原理:双网络数据流向与拓扑设计

双网络拓扑总览

在标准的 Ceph 生产部署中,每个存储节点配备两块独立的物理网卡(或双口万兆卡),分别接入两个隔离的二层网络:

网络类型 接口 子网(示例) 用途 典型带宽
Public Network bond0 / eth0 192.168.10.0/24 客户端、MON、MGR、RGW、MDS、RBD 流量 10–25 Gbps
Cluster Network bond1 / eth1 192.168.20.0/24 OSD 复制、Recovery、Backfill、OSD 心跳 10–25 Gbps

写入数据流向(以三副本为例)

当客户端向 RBD 镜像写入一个 4MB 对象时,数据流向如下:

  1. 客户端通过 CRUSH 计算出主 OSD(acting primary),经公共网络把对象写入主 OSD。
  2. 主 OSD 通过集群网络将数据同步复制到两个副本 OSD。
  3. 三个 OSD 都落盘后,主 OSD 经公共网络向客户端返回 ACK。

这意味着一次客户端写操作,在集群内部会产生 2 倍 的集群网络流量。如果三副本写入 1GB 数据,集群网络要承载 2GB 复制流量——这就是为什么集群网络带宽往往需要≥公共网络带宽。

恢复与回填流量

当 OSD 故障或扩容时,CRUSH 会触发 PG 迁移,数据通过集群网络在 OSD 间大规模搬移。恢复流量可达数十 GB 级别,若不与公共网络隔离,会瞬间淹没客户端 I/O。这正是网络分离最核心的价值所在。

设计考量

  • 带宽规划:三副本集群的 cluster 网络带宽 ≈ 2× public 网络写入带宽;纠删码场景视条带数计算。
  • MTU 与巨型帧:两端交换机、网卡均需配置一致 MTU 9000,避免分片。
  • 隔离级别:物理隔离(独立交换机)> VLAN 隔离 > 同网段,生产环境优先物理隔离。
  • 心跳容错:OSD 间心跳走 cluster 网络,若该网络抖动会导致 OSD 被误判 down,需合理设置 grace period。

部署实战:双网络分离配置全流程

环境准备:网卡与 IP 规划

以 4 节点集群为例(node1–node4,其中 node1 为部署节点兼 MON/MGR),每节点双网卡:

💻 代码示例

# 查看节点网卡与链路状态

ip -br link show

# 预期输出示例:

# eth0 UP 192.168.10.11/24

# eth1 UP 192.168.20.11/24

 

# 确认两块网卡分属不同子网且互通性测试

ping -c 3 -I eth0 192.168.10.12 # 公共网络互通

ping -c 3 -I eth1 192.168.20.12 # 集群网络互通

 

# 关闭网卡 LRO/GRO 减少 CPU 软中断(万兆卡建议)

ethtool -K eth0 gro off lro off

ethtool -K eth1 gro off lro off

 

# 设置巨型帧(MTU 9000),两端交换机端口需同步配置

ip link set dev eth0 mtu 9000

ip link set dev eth1 mtu 9000

ip link show eth0 | grep mtu

持久化网络配置(Netplan)

Ubuntu 24.04 使用 Netplan 管理网络,需将双网卡配置写入 /etc/netplan/01-ceph-net.yaml:

💻 代码示例

# /etc/netplan/01-ceph-net.yaml

network:

version: 2

renderer: networkd

ethernets:

eth0:

addresses:

– 192.168.10.11/24

routes:

– to: default

via: 192.168.10.1

mtu: 9000

eth1:

addresses:

– 192.168.20.11/24

mtu: 9000

应用配置并验证:

💻 代码示例

sudo netplan apply

ip -br addr show eth0 eth1

# 持久化 ethtool 优化参数(systemd 单元)

sudo tee /etc/systemd/system/tune-ceph-net.service > /dev/null <<'EOF'

[Unit]

Description=Disable LRO/GRO on Ceph NICs

After=network.target

[Service]

Type=oneshot

ExecStart=/sbin/ethtool -K eth0 gro off lro off

ExecStart=/sbin/ethtool -K eth1 gro off lro off

RemainAfterExit=yes

[Install]

WantedBy=multi-user.target

EOF

sudo systemctl enable –now tune-ceph-net.service

核心配置:ceph.conf 网络声明

在 cephadm 管理的集群中,通过 ceph.conf 的 global 段声明两个网络。先在部署节点生成配置:

💻 代码示例

# /tmp/ceph.conf 片段(部署前基础配置)

[global]

public network = 192.168.10.0/24

cluster network = 192.168.20.0/24

public addr = 192.168.10.11 # 部署节点(MON)公共地址

cluster addr = 192.168.20.11 # 部署节点集群地址

 

# 心跳与网络参数

osd heartbeat grace = 20 # 心跳宽限秒,避免抖动误判

osd heartbeat interval = 5 # 心跳间隔

ms type = async # Messenger 类型,async 性能更优

ms bind msgr2 = true # 启用 msgr2 协议

通过 cephadm 注入配置并部署守护进程

将配置写入集群配置库,并用 placement spec 指定守护进程绑定网络:

💻 代码示例

# 把基础配置注入 cluster config store(cephadm 集群推荐方式)

ceph config set global public_network 192.168.10.0/24

ceph config set global cluster_network 192.168.20.0/24

ceph config set global osd_heartbeat_grace 20

ceph config set global ms_type async

 

# 查看 mon / mgr 当前监听地址

ceph mon dump | grep -E "addr|public"

ceph mgr dump | grep -E "addr"

 

# 编写 placement spec,让 OSD 明确绑定 cluster 地址

cat > /tmp/osd-spec.yml <<'YAML'

service_type: osd

service_id: default_drive_group

placement:

host_pattern: 'node*'

spec:

data_devices:

all: true

# 指定 cluster 网络优先用于副本流量(Squid 自动识别 cluster_network)

YAML

ceph orch apply -i /tmp/osd-spec.yml

验证网络分离生效

部署完成后,逐项验证双网络是否真正承载各自流量:

💻 代码示例

# 1) 查看所有 OSD 的 public_addr 与 cluster_addr 是否分属不同子网

ceph osd dump | jq '.osds[] | {id, public_addr, cluster_addr}'

 

# 2) 查看 MON/MGR 监听地址

ceph mon dump

ceph mgr dump | jq '.active_address'

 

# 3) 实时抓包确认:在 node1 的 eth1 上应看到大量 OSD 间复制流量

sudo tcpdump -i eth1 -n -c 50 port 6800 or port 6801 or port 6802

# 在 eth0 上应主要是客户端到 OSD 的请求

sudo tcpdump -i eth0 -n -c 50 port 6800

 

# 4) 触发一次恢复流量验证 cluster 网络承载(谨慎,生产慎用)

ceph osd out 3 # 仅测试环境演示

ceph -s # 观察恢复状态

iftop -i eth1 # 另一终端观察 cluster 网络带宽飙升

ceph osd in 3 # 恢复

关键参数说明

💻 代码示例

# 查看当前生效的网络相关配置

ceph config dump | grep -E "network|public|cluster|heartbeat|ms_"

 

# 动态调整(无需重启 OSD,热生效)

ceph config set osd osd_heartbeat_grace 20

ceph config set osd osd_op_threads 32

ceph config set global ms_type async

ceph config set global ms_bind_msgr2 true

 

# 验证单个 OSD 实际生效值

ceph config dump | grep osd.0

ceph daemon osd.0 config show | grep -E "cluster_addr|public_addr"

生产环境注意事项与踩坑提示

网卡绑定不要用 balance-rr:很多团队为追求带宽把两块万兆卡做成 mode 0(balance-rr)bond,但 Ceph 的连接是长连接,同一条 OSD peer 流量会固定走一块卡,无法负载均衡。生产建议 mode 4 (802.3ad LACP) 配合交换机侧 LACP,或干脆物理隔离不 bond。

MTU 不一致是隐形杀手:网卡设了 9000,但交换机端口默认 1500,会导致大包被丢弃,表现为”小 IO 正常、大对象写入超时”。务必用 ping -M do -s 8972 <peer> 在两端互测巨型帧可达性。

cluster 网络抖动引发雪崩:OSD 心跳走 cluster 网络,若该网络交换机拥塞,会导致 OSD 互判 down,触发大规模 PG 重建,进一步加剧 cluster 网络压力形成雪崩。务必给 osd heartbeat grace 留足缓冲(生产建议 20–30 秒),并监控 cluster 网络延迟。

不要把 MON 放在 cluster 网络:MON 必须监听 public 网络,客户端才能发现集群。若误把 mon 的 public_addr 配到 cluster 子网,客户端将无法连接,且 ceph -s 会报 quorum 异常。

安全考量:cluster 网络承载未加密的副本流量,一旦被嗅探可还原数据。金融/政企场景应在 cluster 网络启用 msgr2 加密(ms_encrypt = true),代价是约 5–10% CPU 开销,需评估。

常见问题

Q1:现有集群已经混用单网络,能否平滑迁移到双网络?
可以但风险较高。需先在所有节点配置好第二网卡,通过 ceph config set global cluster_network <new_subnet> 生效后,逐个 ceph osd restart 让 OSD 重新绑定 cluster_addr。迁移期间会触发短暂的 PG peering,建议在低峰期分批进行,并提前调大 osd heartbeat grace。

Q2:cluster 网络带宽到底该规划多大?
三副本场景下,cluster 网络写入流量 ≈ 2× 客户端写入带宽;纠删码(4+2)场景 ≈ 1.5×。生产建议 cluster 网络带宽 ≥ public 网络带宽,并预留 30% 余量应对 recovery 突发流量。

Q3:ceph -s 显示 MON quorum 正常,但客户端 RBD 挂载超时,怎么排查?
优先检查 public 网络的 MTU 一致性与路由。用 ceph daemon mon.node1 mon status 查看各 MON 的 addr 是否都在 public 子网;再用 rbd perf image iotop 观察是否有 OSD 的 public_addr 异常。

总结

本篇完成了 Ceph 双网络分离架构的落地:从网卡规划、Netplan 持久化、ceph.conf 声明、cephadm spec 编排到抓包验证,构建起公共网络与集群网络物理隔离的生产级拓扑。双网络分离不是”可选优化”,而是 Ceph 生产环境保障业务 I/O 与内部恢复互不干扰的基础设施级要求。

K8s Logo

下期预告

明天第 14 天,我们将深入 Ceph 认证体系 cephx 与用户权限管理,讲解 cephx 协议握手原理、caps 权限模型、生产环境最小权限用户设计,以及如何为 RBD/RGW/CephFS 客户端签发专用密钥。

系列目录

  1. 第 1 天:架构概述与生产环境选型指南 ✅ 已发布
  2. 第 2 天:Ubuntu 系统准备:内核调优与磁盘规划 ✅ 已发布
  3. 第 3 天:Cephadm 部署工具详解与集群引导初始化 ✅ 已发布
  4. 第 4 天:Monitor 节点部署与高可用配置 ✅ 已发布
  5. 第 5 天:Manager 节点部署与模块启用 ✅ 已发布
  6. 第 6 天:OSD 存储节点部署:BlueStore 配置与磁盘管理 ✅ 已发布
  7. 第 7 天:CRUSH Map 架构解析与故障域规划 ✅ 已发布
  8. 第 8 天:存储池(Pool)创建与 PG 数量规划 ✅ 已发布
  9. 第 9 天:副本与纠删码存储池策略对比实战 ✅ 已发布
  10. 第 10 天:Ceph 块存储 RBD 配置与生产实践 ✅ 已发布
  11. 第 11 天:Ceph 对象存储 RGW 网关部署与 S3 兼容 ✅ 已发布
  12. 第 12 天:CephFS 分布式文件系统部署与挂载 ✅ 已发布
  13. 第 13 天:Ceph 网络架构:集群网络与公共网络分离 📍 本文
  14. 第 14 天:Ceph 认证体系 cephx 与用户权限管理 🔜 即将发布
  15. 第 15 天:Ceph 集群监控:Prometheus + Grafana + 内置仪表盘
  16. 第 16 天:Ceph 性能调优:OSD 参数与缓存分层
  17. 第 17 天:Ceph 集群扩容实战:OSD 动态添加与 CRUSH 重平衡
  18. 第 18 天:Ceph 高可用与容灾设计:多副本、跨机房与异地灾备
  19. 第 19 天:Ceph 故障排查与数据恢复实战
  20. 第 20 天:Ceph 生产环境升级维护与版本迭代策略
微信公众号二维码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像 - 恒星
欢迎您留下宝贵的见解!
提交
头像 - 恒星

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容