技术博客

Proxmox + Ceph 超融合生产实战:OSD 规划、网络隔离、性能调优

深入讲解 Proxmox VE + Ceph 超融合基础设施的生产级部署:OSD 设备规划与 BlueStore 配置、集群网络与公共网络分离、CRUSH Map 数据分布策略、Pool 与 RBD 性能调优、常见故障恢复(OSD 宕机/PG 不健康/磁盘故障替换),覆盖 3 节点到 5 节点的真实企业场景。

ProxmoxCeph超融合存储HCIOSDCRUSH生产运维

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% 的存储故障。