Proxmox + Ceph 超融合生产实战:OSD 规划、网络隔离、性能调优
深入讲解 Proxmox VE + Ceph 超融合基础设施的生产级部署:OSD 设备规划与 BlueStore 配置、集群网络与公共网络分离、CRUSH Map 数据分布策略、Pool 与 RBD 性能调优、常见故障恢复(OSD 宕机/PG 不健康/磁盘故障替换),覆盖 3 节点到 5 节点的真实企业场景。
Proxmox VE 内置 Ceph 集成是目前最主流的开源超融合方案:计算(KVM)和存储(Ceph RBD)在同一批服务器上运行,没有独立存储阵列。本文讲解从规划到生产落地的完整过程,重点解决真实环境中遇到的问题。
超融合架构设计
3 节点超融合(最小生产配置):
┌──────────────────────────────────────────────────────────┐
│ 每个节点:2U 服务器 │
│ CPU:2x Intel Xeon Silver 4314(16C32T) │
│ 内存:256GB DDR4 ECC │
│ 系统盘:2x 240GB SATA SSD(RAID-1,系统 + Ceph MON) │
│ Ceph OSD:4x 3.84TB NVMe SSD │
│ 网卡:2x 25GbE(公共网络 + 集群网络) │
└──────────────────────────────────────────────────────────┘
网络规划:
Bond0 (25GbE+25GbE):
VLAN 10 (1GbE 管理):Proxmox Web UI、SSH
VLAN 20 (25GbE 业务):VM 网络
VLAN 30 (25GbE Ceph公共):VM 读写 Ceph 的流量
VLAN 40 (25GbE Ceph集群):OSD 间数据复制流量(关键!)
Ceph 配置:
3x Monitor + 3x Manager(一节点一个)
12x OSD(每节点 4 个 NVMe OSD)
副本数:3(数据写 3 份)
可用容量:12 * 3.84TB / 3副本 = ~15TB
一、Ceph 安装与初始化
# 在所有节点安装 Ceph(通过 Proxmox UI 或命令行)
# Web UI:Datacenter → Ceph → Install
# 命令行方式(在每个节点执行)
pveceph install --version reef # Ceph Reef 18.x(2023 LTS)
# 初始化集群(只在第一个节点执行)
pveceph init \
--network 10.0.40.0/24 \ # Ceph 集群内部网络(OSD 复制)
--cluster-network 10.0.40.0/24 # 集群内部网络
# 或者分别指定两个网络
pveceph init \
--network 10.0.30.0/24 # Ceph 公共网络(客户端访问)
# 然后在配置文件中追加集群网络
echo "cluster_network = 10.0.40.0/24" >> /etc/ceph/ceph.conf
systemctl restart ceph-mon@$(hostname)
创建 Monitor
# 在每个节点创建 Monitor(通过 Web UI 或命令行)
# Web UI:Datacenter → Ceph → Monitor → Create
# 命令行(在对应节点上执行)
pveceph createmon # 在当前节点创建 Mon
# 验证
ceph mon stat
# e1: 3 mons at {pve1=[v2:10.0.30.101:3300/0],pve2=...,pve3=...}, election epoch 10
ceph quorum_status --format json-pretty | python3 -c "import json,sys; d=json.load(sys.stdin); print('Quorum:', d['quorum_names'])"
二、OSD 规划与创建
BlueStore 设备规划
BlueStore(Ceph Octopus+ 默认引擎)每个 OSD 由三部分组成:
DB(元数据):建议放 NVMe SSD(加快元数据查询)
WAL(Write-Ahead Log):建议放 NVMe SSD(保证写入顺序)
DATA(数据本身):可以是 SATA SSD 或 HDD
推荐配置(高性能):
DATA + DB + WAL 都在同一块 NVMe → 最简单,性能最好
混合配置(成本优化):
DATA 在 SATA SSD,DB+WAL 在 NVMe → DB 比例建议数据盘的 4%
DATA 在 HDD,DB+WAL 在 SATA SSD → 机械盘场景
# 查看可用磁盘
lsblk -d -o NAME,SIZE,ROTA,MODEL
# sdb 3.84T 0 Samsung MZ1L23T8HBLA ← NVMe SSD (ROTA=0)
# sdc 3.84T 0 Samsung MZ1L23T8HBLA
# sdd 3.84T 0 Samsung MZ1L23T8HBLA
# sde 3.84T 0 Samsung MZ1L23T8HBLA
# 创建 OSD(NVMe 全闪,data+db+wal 在同一盘)
# Web UI:Datacenter → Ceph → OSD → Create
# 命令行创建 OSD
pveceph createosd /dev/sdb # OSD 磁盘全部用于数据+元数据
# 分离 WAL 和 DB 到专用设备(高端场景)
pveceph createosd /dev/sdb \
--db-dev /dev/nvme0n1p1 \ # DB 放 NVMe 的特定分区
--wal-dev /dev/nvme0n1p2 # WAL 放 NVMe 的另一个分区
# 查看 OSD 状态
ceph osd tree
# ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT
# -1 36.97498 root default
# -3 12.32499 host pve1
# 0 ssd 3.08125 osd.0 up 1.00000
# 1 ssd 3.08125 osd.1 up 1.00000
# 2 ssd 3.08125 osd.2 up 1.00000
# 3 ssd 3.08125 osd.3 up 1.00000
ceph osd stat
# 12 osds: 12 up (since 5m), 12 in (since 5m)
三、Pool 创建与配置
# 创建 VM 存储池(RBD Pool)
pveceph createpool vm \
--size 3 \ # 副本数(3=三副本)
--min_size 2 \ # 最少存活副本数(容忍 1 个 OSD 故障)
--pg_autoscale_mode on \ # 自动调整 PG 数量
--application rbd \ # 用途:RBD(块设备)
--crush_rule replicated_rule # CRUSH 规则
# 创建 Pool 后在 Proxmox 中添加为存储
pvesh create /storage \
--storage ceph-vm \
--type rbd \
--pool vm \
--content images,rootdir \
--monhost "pve1,pve2,pve3"
# 查看 Pool 状态
ceph df
# POOLS:
# NAME ID PGS STORED OBJECTS USED %USED MAX AVAIL
# vm 1 128 25.4 GiB 6420 76.2GiB 16.8% 13.1 TiB
# 设置 Pool 配额(防止单个 Pool 耗尽集群存储)
ceph osd pool set-quota vm max_bytes $((10 * 1024**4)) # 最大 10TB
CRUSH Map 调优(影响数据分布)
# 查看当前 CRUSH 规则
ceph osd crush rule list
ceph osd crush rule dump replicated_rule
# 创建自定义 CRUSH 规则(控制副本分布到不同主机)
# 默认规则已经保证副本在不同主机,这里展示如何保证副本在不同机架
# 查看当前 CRUSH 树
ceph osd crush tree
# 添加机架(rack)层级
ceph osd crush add-bucket rack01 rack
ceph osd crush add-bucket rack02 rack
ceph osd crush add-bucket rack03 rack
# 移动主机到对应机架
ceph osd crush move pve1 rack=rack01
ceph osd crush move pve2 rack=rack02
ceph osd crush move pve3 rack=rack03
# 创建机架级别的复制规则
ceph osd crush rule create-replicated replicated_rack default rack
# 将 Pool 改为使用机架级别分布
ceph osd pool set vm crush_rule replicated_rack
四、性能调优
OSD 调优
# 查看当前 OSD 配置
ceph config show osd.0
# OSD 内存使用(重要!超融合场景要控制 Ceph 内存用量)
# 默认 Ceph 会自动使用大量内存,需要限制
ceph config set osd osd_memory_target 4294967296 # 4GB per OSD
# 全闪场景可以适当增加:
ceph config set osd osd_memory_target 8589934592 # 8GB per OSD
# BlueStore 缓存
ceph config set osd bluestore_cache_size_ssd 4294967296 # SSD OSD 的缓存 4GB
ceph config set osd bluestore_cache_size_hdd 1073741824 # HDD OSD 的缓存 1GB
# 并发 IO 线程
ceph config set osd osd_op_num_threads_per_shard_ssd 2 # SSD OSD 使用 2 个线程
RBD 客户端调优
# 对 Proxmox 的 RBD 存储进行调优
# /etc/ceph/ceph.conf 添加客户端配置:
cat >> /etc/ceph/ceph.conf << 'EOF'
[client]
# 缓存相关
rbd_cache = true # 启用 RBD 缓存
rbd_cache_size = 268435456 # 缓存大小 256MB
rbd_cache_max_dirty = 134217728 # 最大脏数据 128MB
rbd_cache_target_dirty = 67108864 # 目标脏数据 64MB
rbd_cache_max_dirty_age = 5 # 脏数据最大存留时间 5s
rbd_cache_writethrough_until_flush = true # 写完第一次 flush 前用直写
# 并发
rbd_concurrent_management_ops = 20 # 并发管理操作
EOF
# Ceph 异步 IO(提升顺序读写性能)
ceph config set global rbd_readahead_trigger_requests 10
ceph config set global rbd_readahead_max_bytes 524288 # 预读 512KB
五、常见故障处理
OSD Down 处理
# 查看集群健康状态
ceph status
# health: HEALTH_WARN
# 1 osds down
# 1 host (1 osds) down
# 查看哪个 OSD 宕机
ceph osd tree | grep -v up
# OSD 宕机后 Ceph 会等待 10 分钟才开始数据恢复
# (防止因短暂故障触发大规模数据迁移)
# 修改等待时间
ceph config set osd osd_recovery_delay_start 0 # 立即开始(磁盘确认坏了)
# 手动标记 OSD 宕机(确认磁盘故障后)
ceph osd out osd.5 # 标记 OSD 5 退出(数据开始迁移到其他 OSD)
ceph osd down osd.5 # 标记 OSD 5 为 down
# 查看恢复进度
ceph -w
# health: HEALTH_WARN
# recovery: 1.234 TiB/5.678 TiB objects degraded (21.7%)
# recovery io: 500 MiB/s, 120 objects/s
# 数据恢复完成后,移除故障 OSD
ceph osd purge osd.5 --yes-i-really-mean-it
# 物理替换磁盘后,重新添加 OSD
pveceph createosd /dev/sdb # 新磁盘
PG 不健康处理
# 查看 PG 状态
ceph pg stat
# 128 pgs: 1 active+degraded, 127 active+clean
# 查看不健康的 PG 详情
ceph pg dump_stuck
# PG STATE UP ACTING REPORTED
# 1.5 active+degraded [0,1,2] [0,1,2] 0'0
# 强制 PG 修复(last resort,会有数据风险)
ceph pg repair 1.5
ceph pg scrub 1.5 # 对比数据完整性
# PG 卡在 peering 状态
ceph osd force-create-pg 1.5 # 最后手段
# 查看 PG 详细状态
ceph pg 1.5 query | python3 -m json.tool | head -50
六、监控与容量规划
# Ceph Dashboard(Proxmox 内置)
# Web UI → Datacenter → Ceph → Dashboard
# 命令行监控
watch -n 5 'ceph status'
# 容量监控(告警阈值)
ceph df
# 当 USED% 超过 80% 时需要扩容:
# - 添加新 OSD(新磁盘)
# - 添加新节点
# OSD 利用率均衡检查(各 OSD 利用率应该相近)
ceph osd df tree
# 如果某个 OSD 利用率远高于平均,调整 reweight
ceph osd reweight-by-utilization
# Prometheus 监控(安装 ceph-mgr-prometheus)
ceph mgr module enable prometheus
# metrics 地址:http://<mgr-ip>:9283/metrics
# 配置 Prometheus 抓取:
# - scrape_configs:
# - job_name: ceph
# static_configs:
# - targets: ['pve1:9283', 'pve2:9283', 'pve3:9283']
# 关键告警指标:
# ceph_health_status != 0 → 集群不健康
# ceph_osd_in == 0 → OSD 退出(磁盘故障)
# ceph_pool_percent_used > 0.8 → Pool 使用率 > 80%
# ceph_pg_degraded > 0 → PG 降级(数据不足副本数)
生产运维 Checklist
# 定期检查(每日)
ceph status # 集群整体状态
ceph df # 存储容量使用
ceph osd stat # OSD 状态
ceph pg stat # PG 状态
# 定期检查(每周)
ceph osd df tree # OSD 利用率均衡
ceph osd perf # OSD 延迟统计
ceph report | grep -E "health|osd|pg" # 详细报告
# 升级前检查
ceph versions # 各组件版本
ceph health detail # 详细健康状态
# 确认所有 PG 处于 active+clean 才能升级
小结
Proxmox + Ceph 超融合部署的关键要点:网络是基础 — Ceph 集群网络(OSD 复制)和公共网络(客户端访问)必须分离,集群网络建议 25GbE 以上;OSD 规划 — 全闪场景 DATA/DB/WAL 放同一 NVMe 最简单,混合场景把 DB/WAL 放 SSD 加速元数据;内存控制 — 超融合场景 Ceph 和虚拟机争内存,通过 osd_memory_target 限制 Ceph 内存用量;副本数 3 + min_size 2 — 允许 1 个 OSD 宕机不影响读写。生产中最常见的问题是 OSD 磁盘故障,掌握 ceph osd out → 等待恢复 → ceph osd purge → 替换磁盘 → 重新添加 OSD 的流程就能处理 90% 的存储故障。
