Skip to content

HCI 架构与原理

分布式存储原理

HCI 的核心是分布式存储,H3C HCI 基于 Ceph 构建:

数据分布机制(CRUSH)

CRUSH(Controlled Replication Under Scalable Hashing)算法:

输入:对象名称(Object ID)
输出:存储该对象的 OSD 列表

计算过程:
  1. 对象名 → Hash → PG(Placement Group)编号
  2. PG 编号 + CRUSH Map → OSD 列表(3 个)
  3. 数据写入这 3 个 OSD

CRUSH Map 示例(3 节点 HCI):
  机架1
  └── 节点1(OSD 0, 1, 2, 3, 4, 5)
  机架2
  └── 节点2(OSD 6, 7, 8, 9, 10, 11)
  机架3
  └── 节点3(OSD 12, 13, 14, 15, 16, 17)

副本分布规则:
  3 副本分布在 3 个不同节点
  确保任意一个节点故障,数据不丢失

写入流程

客户端写入数据:

1. 客户端计算 PG → 找到主 OSD(Primary OSD)
2. 客户端将数据发送给主 OSD
3. 主 OSD 并行写入本地 + 转发给副本 OSD
4. 所有副本写入完成后,主 OSD 返回成功
5. 客户端收到确认

写入延迟 = max(主OSD写入延迟, 副本OSD写入延迟) + 网络延迟

读取流程

客户端读取数据:

1. 客户端计算 PG → 找到主 OSD
2. 客户端从主 OSD 读取数据(默认)
3. 主 OSD 返回数据

优化:可配置从最近的 OSD 读取(降低延迟)

存储性能分层

HCI 通常采用 NVMe SSD + HDD 混合存储,通过分层提升性能:

存储分层架构:

热数据(频繁访问)→ NVMe SSD 层(高 IOPS,低延迟)
冷数据(不常访问)→ HDD 层(大容量,低成本)

自动分层策略:
  数据访问频率 > 阈值 → 提升到 SSD 层
  数据访问频率 < 阈值,持续 N 天 → 降级到 HDD 层

Ceph 分层配置:
  # 创建 SSD 缓存池
  ceph osd pool create ssd-cache 64
  ceph osd pool set ssd-cache size 2  # SSD 层 2 副本即可
  
  # 设置缓存层
  ceph osd tier add hdd-pool ssd-cache
  ceph osd tier cache-mode ssd-cache writeback
  ceph osd tier set-overlay hdd-pool ssd-cache
  
  # 配置缓存参数
  ceph osd pool set ssd-cache hit_set_type bloom
  ceph osd pool set ssd-cache hit_set_count 12
  ceph osd pool set ssd-cache hit_set_period 14400  # 4 小时
  ceph osd pool set ssd-cache target_max_bytes 1099511627776  # 1TB

网络架构

网络分离

HCI 建议将业务网络和存储网络分离:

网络规划:

业务网络(VM 流量):
  ├── 25GbE × 2(Bond,主备或 LACP)
  └── 连接到业务交换机

存储网络(Ceph 复制流量):
  ├── 25GbE × 2(Bond)
  └── 连接到存储交换机(独立)

管理网络(HDM/OS 管理):
  └── 1GbE × 1

原因:
  Ceph 数据复制会产生大量网络流量
  与业务流量混用会相互影响
  分离后各自独立,互不干扰

网络带宽估算

存储网络带宽需求:

写入带宽 = 业务写入带宽 × 副本数
示例:
  业务写入:5 GB/s
  3 副本:5 × 3 = 15 GB/s 存储网络带宽
  
  每节点存储网络:15 / 3 = 5 GB/s
  需要:25GbE × 2(50Gbps = 6.25 GB/s)✓

重建带宽(节点故障时):
  1 个节点故障,需要重建该节点的所有数据
  重建速度取决于存储网络带宽
  100TB 数据 / 5 GB/s = 约 5.5 小时重建完成

故障处理

单 OSD 故障

OSD 故障处理流程:

1. Ceph 检测到 OSD 故障(心跳超时,默认 20 秒)
2. 标记 OSD 为 down
3. 等待 300 秒(mon_osd_down_out_interval)
4. 如果 OSD 仍未恢复,标记为 out
5. 开始数据重建(Backfill)
   - 将故障 OSD 上的数据副本重建到其他 OSD
   - 重建期间集群状态:HEALTH_WARN(degraded)
6. 重建完成,集群恢复 HEALTH_OK

监控命令:
  watch -n 5 ceph status
  ceph osd tree  # 查看 OSD 状态
  ceph pg stat   # 查看 PG 状态

单节点故障

节点故障(包含多个 OSD):

影响:
  该节点上的所有 OSD 同时故障
  部分 PG 变为 degraded(降级,只有 2 副本)
  
处理:
  1. 如果节点能快速恢复(< 5 分钟):等待自动恢复
  2. 如果节点需要长时间维修:
     - 手动将节点 OSD 标记为 out
     - 触发数据重建
     - 重建完成后,集群恢复 3 副本

注意:
  3 节点 HCI 中,1 个节点故障时:
  - 数据仍然可访问(2 副本)
  - 但此时不能再有第二个节点故障(否则数据丢失)
  - 应尽快修复故障节点

性能基准

H3C HCI 典型性能(3 节点,全 NVMe SSD):

随机读(4K,QD=32):
  单节点:~500,000 IOPS
  3 节点聚合:~1,500,000 IOPS

随机写(4K,QD=32):
  单节点:~150,000 IOPS(3 副本写放大)
  3 节点聚合:~450,000 IOPS

顺序读(1MB):
  3 节点聚合:~15 GB/s

顺序写(1MB):
  3 节点聚合:~5 GB/s

延迟(4K 随机读):
  P50:~200μs
  P99:~500μs
  P99.9:~1ms

褚成志的云与计算笔记