一、环境说明

  • 节点数量:三台 —— 这是 Ceph 集群的最小规模,满足 mon 的奇数选举要求(至少 3 个 mon 节点),同时也能完整演示 OSD 数据分布与故障域隔离。
  • 服务器型号:R4900 G3 —— 新华三的通用机架式服务器,支持 12 块 3.5 寸硬盘位,PCIe 插槽充足,非常适合作为 Ceph 存储节点。
  • 操作系统:openEuler —— 华为开源的 Linux 发行版,内核针对多核 NUMA 和大页内存做了优化,与 Ceph 的异步 IO 和 RDMA 特性配合良好。
  • 单节点硬盘配置
    • 2 块 558.91GB HDD 系统盘(RAID1)—— 用于安装操作系统和 Ceph 管理组件,RAID1 提供磁盘冗余,避免单盘故障导致节点失联。
    • 2 块 1.92T SSD 缓存盘(直通盘)—— 作为 OSD 的写缓存(WAL/DB 或 Bcache),直通模式避免 RAID 卡缓存策略干扰 SSD 的低延迟特性。
    • 6 块 8T HDD 数据盘(直通盘)—— 承载实际数据,直通模式让 Ceph 直接管理磁盘,充分发挥 CRUSH 算法的数据分布能力。
    • ⚠️ 环境限制说明:在企业生产环境中,系统盘建议用 SSD 以加速系统启动和日志写入,缓存盘建议用 NVMe 以获得更高的 IOPS 和更低的延迟。
  • 内存:128G —— 每节点 128GB 内存,其中约 4GB 留给操作系统,其余分配给 OSD 的 Page Cache 和 mon/mgr 进程,确保大文件读写时缓存命中率。
  • 处理器:Intel® 2块8核16线程 —— 双路 CPU 共 16 核 32 线程,足以支撑 8 个 OSD 的 scrubbing、rebalance 和客户端 IO 并发处理。
  • 管理网单网卡速率:1000Mb/s —— 运维管理。
  • 存储网 & 业务网单网卡速率:10000Mb/s —— 10GbE 是 Ceph 生产环境的入门带宽,承载客户端读写 IO 和 OSD 间数据复制,建议与业务网 VLAN 隔离,避免流量争抢。

二、安装操作系统

⚠️ 以下操作三台节点都要执行,这里我拿第一台举例!!!

2.1 配置系统盘

  1. Press ESC to enter BIOS configuration: 系统配置界面,是一套固化在主板 ROM 中的底层管理软件(不是操作系统)。通过它你可以直接查看和修改服务器的硬件参数、工作模式、启动顺序等核心设置。
    Insert image description here
  2. Advanced ——> PMC maxView Storage Manager
    Advanced: 管理和配置服务器上所有非核心的板载设备、外插卡(网卡、RAID卡)的工作模式,以及一些底层系统行为。
    PMC maxView Storage Manager: PMC-Sierra 是 RAID 卡的芯片厂商。进入这里,就是配置这台服务器上插的那张 RAID 卡(做阵列、看硬盘状态、设热备盘等)。
    Insert image description here
  3. Scan For Controllers: 让 BIOS / RAID 卡固件去检测当前服务器上插了几块 PMC 品牌的 RAID 卡,以及每块卡上连接了哪些物理硬盘。
    Insert image description here
  4. Controller #0 PM8060-RAID: 我们之前执行了“Scan For Controllers”(扫描控制器),现在 BIOS 已经成功找到了这台服务器上的 第 0 号 RAID 卡,型号是 PM8060-RAID。
    Insert image description here
  5. Logical Device Configuration: 我们之前选择了 Controller #0 PM8060-RAID 并按回车后,就进入了这张 RAID 卡的控制界面。这里选择配置逻辑设备(也就是 RAID 阵列)。
    Insert image description here
  6. Initialize Drives (Execute this step before creating RAID): 初始化硬盘。对单块硬盘进行初始化(会清除硬盘上的 RAID 元数据,使其变成“未配置”状态,可用于组建新阵列)。
    Insert image description here
  7. 将两块 557.9GB 的系统盘选择为 [Enabled]
    在这里插入图片描述
  8. Create Array: 创建新的 RAID 阵列(装系统前最常用)。
    Insert image description here
  9. 将这两块 557.9GB 的系统盘组成 RAID 阵列 ——> [PROCEED]
    Insert image description here
  10. Array type: 选择 RAID 级别,这里我们配置成 RAID 1(镜像模式,写数据时要同时写到这两块系统盘里面,所以两块系统盘存的数据是一模一样的)如果其中一块系统盘故障,不会影响系统正常运行。也是系统盘 RAID 常见的使用模式。
    Insert image description here

2.1 配置数据盘

  1. Uninitialize Drives: 清除硬盘上的RAID配置信息,让硬盘回到"干净"的初始状态。为了让硬盘能被系统直接识别,还需要将RAID卡本身设置 expose RAW 模式,这样这些 Uninitialize 的盘就变成了我们传统意义上的直通盘。
    在这里插入图片描述
  2. 把所有数据盘都选成[Enabled] ——> [SUBMIT]
    在这里插入图片描述
  3. Controller Settings——> Controller Configuration: PMC RAID 卡的“控制器高级管理菜单”,这里面藏着我们之前要找的 Controller Mode(RAID / HBA / Mixed)切换选项。
    在这里插入图片描述
    在这里插入图片描述
  4. Controller Mode: 设置控制器工作模式
    [RAID: expose RAW] 将物理硬盘以“原始设备”(Raw Device)的形式直接暴露给操作系统,但同时 RAID 卡仍然可以管理这些硬盘(例如监控健康状态、设置热备等),只是不在硬件层面组装 RAID 阵列。
    在这里插入图片描述

2.3 选择启动引导文件

  1. 镜像挂载: 这个界面是 H3C 服务器的 HDM(硬件管理控制器)的“镜像挂载”功能页面。简单说,就是通过网络把 ISO 镜像文件虚拟成服务器的光驱(CD/DVD),用来给服务器远程安装操作系统、运行诊断工具或更新固件。
    在这里插入图片描述
  2. 系统启动项: 这是一个“一次性启动覆盖”设置,用来告诉服务器下次启动时临时从某个设备(这里是用我们的镜像 openEuder-22.03…iso)启动,不影响永久启动顺序。
    在这里插入图片描述
  3. Boot ——> Boot Option#1: 选择启动镜像 [CD/DVD],保险起见,这里再设置一次用[CD/DVD]启动。
    在这里插入图片描述
  4. Save & Exit ——> Save Changes and Reset 保存更改并重启。
    在这里插入图片描述
    ⚠️ 由于互联网连接的速度较慢,图形安装程序可能不可用,根据提示在操作系统引导界面添加“inst.xtimeout=”选项来延长服务器加载时间。在操作系统引导界面按“e”键,在配置文件中添加 inst.xtimeout=600 ,按“Ctrl+x”继续安装,等待服务器加载安装程序,加载完成后即可进入图形化界面。
    在这里插入图片描述
    在这里插入图片描述

2.4 系统盘分区规划

  1. 这是一个“总览面板”,汇总了安装系统前需要配置的所有项目。
    Installation Destination: 选择系统安装磁盘,因为还没有选择,所以这里显示红色警告。
    在这里插入图片描述
  2. 选择系统安装磁盘
    sda(前面我们做成 RAID 1的两块 557.99GiB 系统盘) ——> Custom(自定义分区)——> Done
    在这里插入图片描述
  3. Click here to create them automatically 单击此处自动创建它们
    在这里插入图片描述
  4. 创建系统分区 ——> Done
    / 剩余所有空间
    /boot/efi 1G
    /boot 1G在这里插入图片描述
  5. Reboot System 重启系统
    在这里插入图片描述
  6. F7 进入Boot Menu: 临时选一次启动设备(不改永久顺序),到这里系统已经做完了,我们选择新系统启动。
    在这里插入图片描述
  7. 选择 openEuler,这个是做好的系统,不要再用cd/dvd了
    在这里插入图片描述

三、服务器初始化配置

3.1 配置节点网络

  • Admin网络
    本文采用enp61s0f0和enp61s0f1两个千兆网口做bond0(mode4)用于管理网
  • Gateway/Public/Platform网络
    本文采用对应系统网卡名称为ens1f0、ens2f0两个万兆网口做bond1(mode4)用于存储前端网
  • Cluster网络
    本文采用对应系统网卡名称为ens1f1、ens2f1两个万兆网口做bond2(mode4)用于存储后端网

⚠️ 千万不要把同一张网卡上的两个网口绑成一个 bond。因为如果那张网卡整个坏了(比如烧了),两个口就全没了,绑定的链路也就全断了。正确的做法是交叉接线:比如把网卡A的一个口和网卡B的一个口绑在一起,这样坏掉任何一张网卡,都不会断网。给大家画了图参考。
在这里插入图片描述
⚠️ 配置IP时,务必保证配置的IP不能和现有IP冲突。
⚠️ 配置文件中不能有中文字符,包括中文的空格和换行等信息,使用cat -A /etc/sysconfig/network-scripts/ifcfg-ethxxx 可以进行确认,ifcfg-ethxxx是特定需要确认的网卡名称。

3.1.1 创建 bond 逻辑接口并配置静态 IP 和静态路由

  • bond(网卡绑定):就是把好几块物理网卡在系统里绑成一个逻辑网口。这样其中一块网卡坏了,其他网卡还能继续干活,网络不会断。
  • mode 4(LACP 聚合):这个模式下,多根网线可以同时跑数据,带宽叠加,比如两根千兆网口绑一起,理论带宽就是两千兆。不过这个模式需要交换机也配好 LACP。这是数据中心里最常用的聚合方式。

创建 bond0 逻辑接口并配置静态 IP 和静态路由,其中 mode=802.3ad 表示 LACP 聚合模式(mode 4是另一种配置形式),miimon=100 为每 100 毫秒检测链路,lacp_rate=fast 使 LACP 报文每秒发送一次,xmit_hash_policy=layer3+4 基于 IP 和端口哈希实现负载均衡;类似的命令分别创建 bond1(带默认网关)和 bond2(仅 IP),根据你们网络规划配就行。

[root@ceph01 ~]# nmcli connection add type bond ifname bond0 con-name bond0 bond.options "mode=802.3ad,miimon=100,lacp_rate=fast,xmit_hash_policy=layer3+4" ipv4.method manual ipv4.addresses "10.102.43.4/24" ipv4.routes "10.0.8.0/24 10.102.8.254" ipv6.method disabled autoconnect yes
[root@ceph01 ~]# nmcli connection add type bond ifname bond1 con-name bond1 bond.options "mode=802.3ad,miimon=100,lacp_rate=fast,xmit_hash_policy=layer3+4" ipv4.method manual ipv4.addresses "10.102.33.4/24" ipv4.gateway 10.102.33.254 ipv6.method disabled autoconnect yes
[root@ceph01 ~]# nmcli connection add type bond ifname bond2 con-name bond2 bond.options "mode=802.3ad,miimon=100,lacp_rate=fast,xmit_hash_policy=layer3+4" ipv4.method manual ipv4.addresses "10.101.6.4/24" ipv6.method disabled autoconnect yes

3.1.2 将物理网络加入 bond

将物理网口添加为对应 bond 的从属接口,确保冗余和带宽叠加。重启服务时整个系统来完全应用。

[root@ceph01 ~]# nmcli connection add type bond-slave ifname enp61s0f0 master bond0
[root@ceph01 ~]# nmcli connection add type bond-slave ifname enp61s0f1 master bond0
[root@ceph01 ~]# nmcli connection add type bond-slave ifname ens1f0 master bond1
[root@ceph01 ~]# nmcli connection add type bond-slave ifname ens2f0 master bond1
[root@ceph01 ~]# nmcli connection add type bond-slave ifname ens2f1 master bond2
[root@ceph01 ~]# nmcli connection add type bond-slave ifname ens1f1 master bond2
[root@ceph01 ~]# nmcli connection reload
[root@ceph01 ~]# systemctl restart NetworkManager

3.1.3 配置网卡 rx/tx buffer

增大每个物理网卡的接收(rx)和发送(tx)环形缓冲区大小,以减少高流量下的丢包风险(不同网卡硬件最大值可能不同,如 4096 或 4078)。

[root@ceph01 ~]# ethtool -G enp61s0f0 rx 4096 tx 1024
[root@ceph01 ~]# ethtool -G enp61s0f1 rx 4096 tx 1024
[root@ceph01 ~]# ethtool -G ens2f0 rx 4078 tx 1024
[root@ceph01 ~]# ethtool -G ens1f0 rx 4078 tx 1024
[root@ceph01 ~]# ethtool -G ens2f1 rx 4078 tx 1024
[root@ceph01 ~]# ethtool -G ens1f1 rx 4078 tx 1024

3.1.4 检查配置

  1. 检查网卡和bond聚合关系
    通过 nmcli connection show 查看所有连接配置,确认 bond 及其 slave 关系正确。
[root@ceph01 ~]# nmcli connection show
NAME                  UUID                                  TYPE      DEVICE
bond1                 3f2d0749-4b59-446c-bb3a-d95a7cf73765  bond      bond1
bond0                 166acf87-9f98-443f-b046-ba7135bebc2e  bond      bond0
bond2                 a45f9938-0efb-4fd1-9628-f64d32fcf1f7  bond      bond2
bond-slave-enp61s0f0  ddc29753-aef6-47d8-b3b3-321386341022  ethernet  enp61s0f0
bond-slave-enp61s0f1  7d1a2088-c67e-4fe9-918c-9425953632c8  ethernet  enp61s0f1
bond-slave-ens1f0     457c3bb0-229c-4e0e-bea7-d06324530d8e  ethernet  ens1f0
bond-slave-ens1f1     22e0ee77-c6bd-4ec3-98dc-a060e503a921  ethernet  ens1f1
bond-slave-ens2f0     c58b6082-1dcb-4211-b793-4cb8487cc36f  ethernet  ens2f0
bond-slave-ens2f1     390d1363-1f0d-49d3-a2e7-908006c14f2f  ethernet  ens2f1
  1. 检查 bond 速率
    使用 ethtool bond0、ethtool bond1、ethtool bond2 检查每个 bond 的聚合速率(如 2000Mb/s 或 20000Mb/s)
[root@ceph01 ~]# ethtool bond0
        Speed: 2000Mb/s
[root@ceph01 ~]# ethtool bond1
        Speed: 20000Mb/s
[root@ceph01 ~]# ethtool bond2
        Speed: 20000Mb/s
  1. 检查网络通信情况
    使用ping命令,确保配置所有IP都可以互通测试节点间的网络连通性。包括管理网、存储前端网、存储后端网络的连通性,保证各个节点的各个网络平面互相可达。并且保证存储部署完成后的网络健壮。
[root@ceph01 ~]# ping 10.102.43.9
64 bytes from 10.102.43.9: icmp_seq=1 ttl=64 time=0.140 ms
1 packets transmitted, 1 received, 0% packet loss, time 0ms
[root@ceph01 ~]# ping 10.102.33.9
1 packets transmitted, 1 received, 0% packet loss, time 0ms
64 bytes from 10.102.33.9: icmp_seq=1 ttl=64 time=0.116 ms
[root@ceph01 ~]# ping 10.101.6.9
64 bytes from 10.101.6.9: icmp_seq=1 ttl=64 time=0.117 ms
1 packets transmitted, 1 received, 0% packet loss, time 0ms
  1. 检查网卡 rx/tx buffer
    遍历所有属于 bond 的物理网口,查看它们的 rx/tx 缓冲区实际值,验证ethtool -G 设置是否生效。
[root@ceph01 ~]# for i in `ip a | grep "master bond" | awk -F":" '{print $2}'`; do ethtool -g $i ; done

3.2 配置节点主机名

集群管理工具(如 Ceph、K8s)依赖主机名来区分节点,重复或默认的 localhost 会导致选举混乱、日志无法追踪
⚠️ 所有节点的主机名需要不一致,不能为localhost、default、maintain

[root@ceph01 ~]# hostnamectl --static set-hostname ceph01

3.3 配置节点 hosts 文件

多分布式软件默认使用主机名通信,配置hosts文件后,节点间可通过主机名互相通信

[root@ceph01 ~]# cat /etc/hosts
10.102.43.4  ceph01
10.102.43.9  ceph02
10.102.43.10 ceph03
[root@ceph01 ~]# scp /etc/hosts root@ceph02:/etc
[root@ceph01 ~]# scp /etc/hosts root@ceph03:/etc

3.4 配置防火墙和 SELinux

3.4.1 配置防火墙和 iptables

分布式存储需要大量自定义端口(如 Ceph 的 3300、6789、6800-7300 等),开放所有端口远比逐条加规则简单可靠。

[root@ceph01 ~]# systemctl stop firewalld
[root@ceph01 ~]# systemctl disable firewalld
[root@ceph01 ~]# systemctl stop iptables
[root@ceph01 ~]# systemctl disable iptables
[root@ceph01 ~]# systemctl status firewalld.service
     Active: inactive (dead)
[root@ceph01 ~]# systemctl is-enabled firewalld.service
disabled
[root@ceph01 ~]# systemctl status iptables.service
     Active: inactive (dead)
[root@ceph01 ~]# systemctl is-enabled iptables.service
disabled

3.4.2 配置 SElinux

SELinux 会严格限制进程对文件、网络、设备的访问。Ceph 等存储软件涉及大量自定义路径和 socket 文件,很容易触发 SELinux 拒绝访问,导致 OSD 无法启动、mon 无法通信。SELinux 配置需要重启生效。

[root@ceph01 ~]# setenforce 0
[root@ceph01 ~]# vi /etc/selinux/config
SELINUX=disabled
[root@ceph01 ~]# reboot
[root@ceph01 ~]# getenforce
Disabled

3.5 配置节点时间同步

  • 分布式存储系统(如 Ceph)、数据库集群、容器平台等对时间一致性要求极高。如果各节点时间相差较多,会出现各种奇怪问题。
  • 在内部网络搭建一个 NTP 服务器,让其他节点同步它,可以保证整个集群内完全一致。这里我们将 ceph01 设置成NTP服务器,ceph01 用本地时间,ceph02、ceph03 同步它的时间。

3.5.1 Server 端配置

[root@ceph01 ~]# yum -y install chrony
[root@ceph01 ~]# vi /etc/chrony.conf
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
ntpdumpdir /var/lib/chrony
logdir /var/log/chrony
local stratum 10
allow 10.102.43.0/24  #管理网段
[root@ceph01 ~]# systemctl restart chronyd
[root@ceph01 ~]# systemctl enable chronyd
[root@ceph01 ~]# hwclock --systohc //同步时间到主板

3.5.2 Client 端配置

[root@ceph02 ~]# vi /etc/chrony.conf
server 10.102.43.4 iburst
[root@ceph02 ~]# systemctl restart chronyd
[root@ceph02 ~]# systemctl enable chronyd
[root@ceph01 ~]# hwclock --systohc //同步时间到主板
[root@ceph03 ~]# vi /etc/chrony.conf
server 10.102.43.4 iburst
[root@ceph03 ~]# systemctl restart chronyd
[root@ceph03 ~]# systemctl enable chronyd
[root@ceph01 ~]# hwclock --systohc //同步时间到主板

3.5.3 检查配置

^* 代表正常

[root@ceph02 ~]# chronyc sources -v
===============================================================================
^* ceph01                       10   6   377    33  +4523ns[ -960ns] +/-   31us
[root@ceph02 ~]# timedatectl
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
              NTP service: active
[root@ceph03 ~]# chronyc sources -v
===============================================================================
^* ceph01                       10   6   377    33  +4523ns[ -960ns] +/-   31us
[root@ceph03 ~]# timedatectl
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
              NTP service: active

3.6 配置 ssh 免密

该操作需要在作为“监控角色”(通常也为管理角色节点)的服务器上执行。

[root@ceph01 ~]# ssh-keygen
[root@ceph01 ~]# ssh-copy-id root@ceph01
[root@ceph01 ~]# ssh-copy-id root@ceph02
[root@ceph01 ~]# ssh-copy-id root@ceph03
[root@ceph01 ~]# ssh root@ceph01
[root@ceph01 ~]# ssh root@ceph02
[root@ceph01 ~]# ssh root@ceph03

四、RAID 卡和硬盘配置

4.1 配置数据盘为直通盘

💡 原生 Ceph 常把数据盘设成 JBOD 或 RAW,本质上是为了让每块盘以最原始、最透明的方式直接交给 Ceph 管理,避免 RAID 卡再额外做 RAID、缓存、I/O 重排和状态隐藏,这样 Ceph 才能准确感知磁盘真实状态、正确控制刷盘语义和故障恢复,也更符合 OSD/BlueStore 由上层软件自己负责数据保护与一致性的设计思路。
💡 如果不做成直通盘,而是先让 RAID 卡把数据盘做成逻辑盘再交给 Ceph,那么 RAID 卡就会把底层磁盘的很多真实信息和行为包起来,比如缓存、刷盘时机、故障状态、重建过程和 I/O 调度,这样 Ceph 看到的就不再是“真实磁盘”,而是“RAID 卡加工后的设备”,结果就是 Ceph 对磁盘健康、性能瓶颈和故障恢复的判断会变得不准确,轻则性能不可预期、排障困难,重则在掉电、盘故障或重建场景下影响一致性语义和恢复效率,所以这等于让 RAID 卡和 Ceph 同时管理同一层存储逻辑,职责重叠且容易互相干扰。

4.1.1 PMC RAID卡

[root@ceph01 ~]# for i in {8..32}; do arcconf uninit  1 0 $i; done  //{8..32} 是 Physical ID
[root@ceph01 ~]# arcconf list 1
   Physical 0,8              : Raw (Pass Through) (SATA, 512 Bytes, 7630885MB, ATA, ST8000NC0002-1XX, Hard Drive) 5000C500B03D17E2, [Enclosure 0, Slot 0(Connector 0, Connector 1)]
   Physical 0,9              : Raw (Pass Through) (SATA, 512 Bytes, 7630885MB, ATA, ST8000NC0002-1XX, Hard Drive) 5000C500B03A16F2, [Enclosure 0, Slot 1(Connector 0, Connector 1)]
   Physical 0,10             : Raw (Pass Through) (SATA, 512 Bytes, 7630885MB, ATA, ST8000NC0002-1XX, Hard Drive) 5000C500B0393AA8, [Enclosure 0, Slot 2(Connector 0, Connector 1)]
   Physical 0,11             : Raw (Pass Through) (SATA, 512 Bytes, 7630885MB, ATA, ST8000NC0002-1XX, Hard Drive) 5000C500B03A4856, [Enclosure 0, Slot 3(Connector 0, Connector 1)]
   Physical 0,12             : Raw (Pass Through) (SATA, 512 Bytes, 1831420MB, ATA, INTEL SSDSC2KB01, Solid State Drive) 00000000BB41563F, [Enclosure 0, Slot 4(Connector 0, Connector 1)]
   Physical 0,13             : Raw (Pass Through) (SATA, 512 Bytes, 1831420MB, ATA, INTEL SSDSC2KB01, Solid State Drive) 00000000BB41333F, [Enclosure 0, Slot 5(Connector 0, Connector 1)]
   Physical 0,14             : Raw (Pass Through) (SATA, 512 Bytes, 1831420MB, ATA, INTEL SSDSC2KB01, Solid State Drive) 00000000BB52483F, [Enclosure 0, Slot 6(Connector 0, Connector 1)]
   Physical 0,15             : Raw (Pass Through) (SATA, 512 Bytes, 1831420MB, ATA, INTEL SSDSC2KB01, Solid State Drive) 00000000BB41933F, [Enclosure 0, Slot 7(Connector 0, Connector 1)]
   Physical 0,16             : Raw (Pass Through) (SATA, 512 Bytes, 1831420MB, ATA, INTEL SSDSC2KB01, Solid State Drive) 00000000BB41543F, [Enclosure 0, Slot 8(Connector 0, Connector 1)]
   Physical 0,17             : Raw (Pass Through) (SATA, 512 Bytes, 1831420MB, ATA, INTEL SSDSC2KB01, Solid State Drive) 00000000BB41313F, [Enclosure 0, Slot 9(Connector 0, Connector 1)]
   Physical 0,18             : Raw (Pass Through) (SATA, 512 Bytes, 1831420MB, ATA, INTEL SSDSC2KB01, Solid State Drive) 00000000BB41373F, [Enclosure 0, Slot 10(Connector 0, Connector 1)]
   Physical 0,19             : Raw (Pass Through) (SATA, 512 Bytes, 1831420MB, ATA, INTEL SSDSC2KB01, Solid State Drive) 00000000BB412B3F, [Enclosure 0, Slot 11(Connector 0, Connector 1)]
   Physical 0,31             : Raw (Pass Through) (SATA, 512 Bytes, 7630885MB, ATA, ST8000NC0002-1XX, Hard Drive) 5000C500B028A589, [Enclosure 0, Slot 23(Connector 0, Connector 1)]
   Physical 0,32             : Raw (Pass Through) (SATA, 512 Bytes, 7630885MB, ATA, ST8000NC0002-1XX, Hard Drive) 5000C500B039D769, [Enclosure 0, Slot 24(Connector 0, Connector 1)]
   Physical 0,36             : Online (SAS, 512 Bytes, 572325MB, HGST, HUC101860CSS200, Hard Drive) 5000CCA07D4D29B3, [Enclosure 0, Slot 28(Connector 0, Connector 1)]
   Physical 0,37             : Online (SAS, 512 Bytes, 572325MB, HGST, HUC101860CSS200, Hard Drive) 5000CCA07D4D336B, [Enclosure 0, Slot 29(Connector 0, Connector 1)]
   Physical 2,0              : Ready (SES2, Not Applicable, Not Applicable, H3C-Exp, SXP 36x12G, Enclosure Services Device) 588DF9E5E650F07E, []

4.1.2 LSI RAID卡

[root@LSI ~]# for i in {0..11}; do storcli /c0/e64/s$i set jbod; done
----------------------------------------------------------------------------------
EID:Slt DID State DG       Size Intf Med SED PI SeSz Model                Sp Type
----------------------------------------------------------------------------------
64:0      2 JBOD  -    1.746 TB SATA SSD N   N  512B INTEL SSDSC2KB019T8  U  -
64:1      3 JBOD  -    1.746 TB SATA SSD N   N  512B INTEL SSDSC2KB019T8  U  -
64:2     12 JBOD  -    3.492 TB SATA SSD N   N  512B INTEL SSDSC2KB038T8  U  -
64:3     10 JBOD  -    7.277 TB SATA HDD N   N  512B ST8000NC0002-1XX112  U  -
64:4      4 JBOD  -    7.277 TB SATA HDD N   N  512B HGST HUS728T8TALE6L4 U  -
64:5     13 JBOD  -    3.492 TB SATA SSD N   N  512B INTEL SSDSC2KB038T8  U  -
64:6     16 JBOD  -    7.277 TB SATA HDD N   N  512B HGST HUS728T8TALE6L4 U  -
64:7      8 JBOD  -    3.492 TB SATA SSD N   N  512B INTEL SSDSC2KB038T8  U  -
64:8     14 JBOD  -    3.492 TB SATA SSD N   N  512B INTEL SSDSC2KB038T8  U  -
64:9      7 JBOD  -    7.277 TB SATA HDD N   N  512B ST8000NC0002-1XX112  U  -
64:10    17 JBOD  -    3.492 TB SATA SSD N   N  512B INTEL SSDSC2KB038T8  U  -
64:11    15 JBOD  -    3.492 TB SATA SSD N   N  512B INTEL SSDSC2KB038T8  U  -
64:28     1 Onln  0  446.625 GB SATA SSD N   N  512B INTEL SSDSC2KG480G8  U  -
64:29     0 Onln  0  446.625 GB SATA SSD N   N  512B INTEL SSDSC2KG480G8  U  -
----------------------------------------------------------------------------------

4.2 配置逻辑盘控制器缓存(RAID卡层面)

💡 先介绍下逻辑盘控制器缓存有哪些:

  • wt:write through
    • 主机发来的写请求,必须真正写到底层磁盘后,RAID 控制器才向操作系统返回“写完成”。也就是说,写 I/O 的完成点在磁盘上,不在控制器缓存里。这种模式最保守、最稳,掉电时风险最低,因为主机看到“写成功”时,数据通常已经真的落盘了。它的代价就是性能偏慢,尤其是 HDD 场景下,小块随机写时延会更高,所以一般用于更重视稳定性的场景,或者 SSD 系统盘这类本身介质已经够快、不需要依赖控制器写缓存提速的场景。
  • wb:write back
    • 主机发来的写请求,先写进 RAID 控制器缓存,只要进入缓存,控制器就先向操作系统返回“写完成”,后面再异步刷到底层磁盘。也就是说,写 I/O 的完成点在控制器缓存里,而不是磁盘上。这样做的好处是写性能会明显提升,特别是 HDD 场景下,小块随机写和突发写入会快很多,因为控制器可以先把零散写入收进缓存,再慢慢整理后刷盘。但它的风险也最大,如果数据还在缓存里、还没落盘时突然掉电或控制器故障,就可能丢数据,所以 wb 本质上是用更高性能换更高风险,通常不建议直接用于强调安全性的生产系统盘。
  • wbb:write back with battery/ZMM
    • 本质上还是写回缓存,但它比 wb 多了一层前提:只有在 RAID 卡的 BBU、电池、超级电容或者 ZMM 状态正常时,才允许启用写回;如果保护模块不存在、状态异常或者没 ready,控制器就会自动关闭写回,避免缓存里的数据在异常断电时丢失。它的核心思路就是“有掉电保护时才享受写回性能,没有保护时就自动回到更安全的模式”,所以它兼顾了性能和安全,是生产环境里最常见、也最推荐的 HDD 系统盘写缓存策略。
  • roff:read cache off
    • 关闭 RAID 控制器对这个逻辑盘的读缓存,也就是控制器不会专门把最近读过的数据留在自己的缓存里,后续读请求更多还是直接去底层磁盘或 SSD 取数据。这样做的好处是 I/O 路径更简单、行为更可预期,也不会占用控制器缓存资源。对于 SSD 来说,由于 SSD 本身随机读延迟已经很低,RAID 卡再加一层读缓存的收益通常不大,所以系统盘如果是 SSD,常见做法就是 roff,避免多一层意义不大的缓存逻辑。
  • ron:read cache on
    • 开启 RAID 控制器对这个逻辑盘的读缓存,控制器会把最近读过的一部分数据暂时放在自己的缓存里;如果后面又读到同一块数据,或者读到附近的热点数据,就有机会直接从缓存返回,而不必再次访问底层磁盘。它利用的是热点数据重复访问这个特性,所以对 HDD 尤其有价值,因为机械盘最慢的地方就是寻道和旋转等待,能少读一次底层盘,时延就可能明显降低。因此 ron 更适合 HDD 系统盘这类会频繁读取启动文件、目录、元数据和小文件的场景,用它的目的就是尽量减少机械盘重复读带来的开销。

口诀:逻辑盘是 SSD 时,读写缓存都关闭,逻辑盘是 HDD 读写缓存都开启。 考虑到大家环境都不一样,以下有主流 RAID 卡配置方法,供参考:

4.2.1 PMC RAID 卡

[root@PMC ~]# arcconf setcache 1 logicaldrive -h
Usage: SETCACHE <Controller#> LOGICALDRIVE <LogicalDrive#> <logical mode> [noprompt] [nologs]
Usage: SETCACHE <Controller#> DEVICE <Channel# ID#> <physical mode> [nologs]
Usage: SETCACHE <Controller#> DEVICEALL <policy> [noprompt] [nologs]
Example: SETCACHE 1 LOGICALDRIVE 0 ron
Example: SETCACHE 1 DEVICE 0 0 wt
Example: SETCACHE 1 DEVICEALL drivespecific
===================================================================================

Changes a device's cache mode.

 LOGICALDRIVE parameters
   LogicalDrive#  : Number of the logical device whose cache will be altered
   Logical Modes  : ron  - read cache enabled
                    roff - read cache disabled
                    wt   - write through
                    wb   - write back
                    wbb  - write back with battery/ZMM
                    con  - cache enabled
                    coff - cache disabled

 DEVICE parameters
   Channel# ID#   : Channel and ID of the device whose cache will be altered
   Physical Modes : wt   - write through
                    wb   - write back
 DEVICEALL parameters
   Policy         : enable           - write back for all physical drives
                    disable          - write through for all physical drives
                    drivespecific    - user can set for an individual physical drive

4.2.2 LSI RAID 卡

[root@LSI ~]# storcli /c0/v0 set -h
storcli /cx/vx set wrcache=WT|WB|AWB
storcli /cx/vx set rdcache=RA|NoRA

我这里系统盘是 HDD 的,所以我这样配置:

[root@ceph01 ~]# arcconf getconfig 1 ld  //先查一下系统盘的 Logical Device number,这里是0
Logical Device number 0
[root@ceph01 ~]# arcconf setcache 1 logicaldrive 0 ron
[root@ceph01 ~]# arcconf setcache 1 logicaldrive 0 wbb
[root@ceph01 ~]# arcconf getconfig 1 ld
Read-cache setting                       : Enabled
Write-cache setting                      : On when protected by battery/ZMM
Segment 0                                : Present (572325MB, SAS, HDD, Enclosure:0, Slot:28)             0BHBEJUH
Segment 1                                : Present (572325MB, SAS, HDD, Enclosure:0, Slot:29)             0BHBG5WH

4.3 配置 JBOD 物理盘的磁盘写缓存(RAID 卡层面)

控制器是否允许这些 JBOD 物理盘自身的 write cache 开启。

💡 在 Ceph 场景下,如果数据盘以 JBOD、HBA 或直通方式提供给操作系统使用,原则上不建议让 RAID 卡控制器缓存参与这些数据盘的读写路径。 直通盘的设计目的,就是让磁盘尽可能以原始设备形态暴露给 Ceph,由 Ceph 自身负责副本、一致性、刷盘语义、恢复和故障处理;如果 RAID 卡再额外对这些盘进行读缓存、写回缓存、I/O 重排或延迟落盘,就会在主机和磁盘之间增加一层 Ceph 无法感知和控制的缓存语义,轻则影响性能判断,重则影响故障场景下的数据一致性和恢复行为。因此,对于 Ceph 的直通数据盘,RAID 卡应尽量工作在“转发”而不是“加速”的角色上,也就是尽量不使用面向逻辑盘的 WT/WB/AWB、ron/roff 这类缓存策略;这些策略更适合系统盘所在的 RAID 逻辑盘,而不适合 OSD 数据盘。实际配置时,应优先将 Ceph 数据盘设置为 JBOD/HBA/Pass-through 模式,不给数据盘做传统 RAID,也不依赖 RAID 卡控制器缓存提升 OSD 性能;如果控制器支持针对物理盘的缓存开关,则对 HDD 数据盘通常建议关闭物理盘写缓存,避免底层盘在未真正落盘前就向上层过早确认写完成。企业级 SSD 数据盘/DB/WAL 盘:如果有完善掉电保护,可以按厂商建议决定;保守做法仍是先关,验证后再开。

4.3.1 PMC RAID 卡

这张 PMC 卡支持控制器侧统一配置物理盘写缓存策略,包括这种 Raw (Pass Through) 直通盘。

[root@ceph01 ~]# arcconf setcache 1 deviceall enable|disable noprompt 
[root@ceph01 ~]# arcconf getconfig 1 pd | grep "Write Cache"
         Write Cache                        : Disabled (write-through)

4.3.2 LSI RAID 卡

这张 LSI 卡不支持 JBOD Write cache 这个控制器级功能。

[root@LSI ~]# storcli /c0 show all | grep -i cache  
Support JBOD Write cache = No 
[root@LSI ~]# storcli /c0 set jbodwritecache=on|off //如果支持,执行这条命令控制

4.4 配置硬盘自身缓存(硬盘层面)

💡 企业级 SSD 通常具备掉电保护能力(PLP),即使开启硬盘自身写缓存,缓存中的数据在异常断电时也有较大概率被安全落盘,因此既能获得更低的写时延和更好的写性能,又不会明显增加数据风险;而机械硬盘的自身写缓存大多属于易失性缓存,通常缺少可靠的掉电保护,一旦意外断电,尚未来得及落盘的缓存数据就可能丢失,因此在对数据一致性要求较高的场景下,通常建议开启企业级 SSD 的自身缓存,而关闭 HDD 的自身缓存。

💡 需要修改的三个地方(确保设备真实状态和内核视图对齐)

  • sdparm --get/–set WCE /dev/sdX:这是设备真实状态,改的是磁盘自己的 WCE 位。它最接近“这块盘到底有没有开自身写缓存”。真正决定硬盘自己有没有开缓存的,是 WCE。
  • /sys/class/scsi_disk/…/cache_type:这是 SCSI 磁盘驱动层的接口。官方文档说明它能直接开关 drive write/read cache,write back 对应 WCE=1,write through 对应 WCE=0;写 temporary … 表示只临时生效。真正让 Linux/SCSI 层按这个模式工作的,是 cache_type。
  • /sys/block/sdX/queue/write_cache:这是 Linux block 层的视图。官方文档特别说明了,写这个文件只会改变内核对设备的看法,不会改变设备真实状态。必须和前两层保持一致。
    因为内核会根据它判断这块盘是不是 write back 设备,进而决定 flush / FUA 语义怎么处理。
    如果这里显示 write through,但设备实际 WCE=1,就会出现“盘其实有易失性缓存,但内核以为没有”的危险不一致。

4.4.1 安装 sdparm 工具

后面用它直接读写磁盘的 WCE(Write Cache Enable,写缓存开关)参数。

[root@ceph01 ~]# dnf install -y sdparm //先装工具

4.4.2 创建配置脚本

介绍一下每个参数配置的含义:

  • 第 2 行:表示如果用了未定义变量就报错退出,避免脚本里变量写错时悄悄执行下去,造成误配置;
  • 第 5 行:定义不参与配置的磁盘列表,这里通常用来排除系统盘,因为系统盘是 RAID 逻辑盘,缓存策略通常单独按 RAID 控制器配置,不建议和数据盘一起混着改;
  • 第 7-8 行:遍历所有 sdX 类型块设备,取出设备名,比如 sdb、sdc;
  • 第 10-12 行:如果当前盘在跳过列表里,就直接处理下一块,防止误操作系统盘或其他不想动的盘;
  • 第 14 行:确认这个名字对应的确实是块设备,不是的话就跳过,做一层保险,避免对异常条目继续执行;
  • 第 16 行:读取磁盘的 rotational 属性,1 表示机械盘,0 表示非机械盘,通常是 SSD,脚本就是靠这个值来区分 SSD 和 HDD,从而套用不同缓存策略;
  • 第 17-18 行:找到这块盘对应的 SCSI 设备路径,进一步定位到它的 cache_type 文件;
    • cache_type 是 Linux/SCSI 层可直接设置的缓存策略接口
    • 后面可以通过往这个文件写值,要求内核把设备看成 write through 或 write back
  • 第 20 行:如果是机械盘,进入 HDD 分支,HDD 通常建议关闭自身写缓存,优先保证落盘语义更保守;
  • 第 21 行:如果 cache_type 可写,就把它设成 temporary write through;
  • 第 22 行:如果系统里有 sdparm,就清除这块盘的 WCE 位,也就是关闭设备自身写缓存;
  • 第 23 行:如果不是机械盘,就走 SSD 分支;
  • 第 24 行:从 Linux/SCSI 这一层把设备设置成 write back;
  • 第 25 行:用 sdparm 打开这块盘的 WCE 位,也就是开启设备自身写缓存。
[root@ceph01 ~]# cat >/usr/local/sbin/set-disk-write-cache.sh <<'EOF'
 1 #!/bin/bash
 2 set -u
 3
 4 # 不想动的盘写在这里,比如系统盘:SKIP_DEVICES="sda"
 5 SKIP_DEVICES="sda"
 6
 7 for sysdev in /sys/block/sd*; do
 8     dev=$(basename "$sysdev")
 9
10     case " $SKIP_DEVICES " in
11         *" $dev "*) continue ;;
12     esac
13
14     [ -b "/dev/$dev" ] || continue
15
16     rota=$(cat "$sysdev/queue/rotational")
17     scsi=$(basename "$(readlink -f "$sysdev/device")")
18     cache_file="/sys/class/scsi_disk/$scsi/cache_type"
19
20     if [ "$rota" = "1" ]; then
21         [ -w "$cache_file" ] && echo "temporary write through" > "$cache_file" || true
22         command -v sdparm >/dev/null 2>&1 && sdparm --clear=WCE "/dev/$dev" >/dev/null 2>&1 || true
23     else
24         [ -w "$cache_file" ] && echo "temporary write back" > "$cache_file" || true
25         command -v sdparm >/dev/null 2>&1 && sdparm --set=WCE "/dev/$dev" >/dev/null 2>&1 || true
26     fi
27 done
EOF
[root@ceph01 ~]# chmod 755 /usr/local/sbin/set-disk-write-cache.sh

4.4.3 创建 systemd 服务

前面脚本里很多设置是运行时生效,机器重启后可能丢失,用 systemd 就能保证每次开机自动重新套用策略。

[root@ceph01 ~]# cat >/etc/systemd/system/disk-write-cache.service <<'EOF'
[Unit]
Description=Set disk write cache policy by media type
After=systemd-udev-settle.service
Wants=systemd-udev-settle.service

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/set-disk-write-cache.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

4.4.4 启用 systemd 服务并立即执行

[root@ceph01 ~]# systemctl daemon-reload
[root@ceph01 ~]# systemctl enable --now disk-write-cache.service
[root@ceph01 ~]# systemctl status disk-write-cache.service

4.4.5 检查配置

  1. SSD 硬盘:写缓存打开(write back)
[root@ceph01 ~]# lsblk -d -o NAME,ROTA
NAME ROTA
sde     0
[root@ceph01 ~]# cat /sys/block/sde/queue/write_cache
write back
[root@ceph01 ~]# ls -d /sys/class/scsi_disk/*/device/block/sde
/sys/class/scsi_disk/0:1:12:0/device/block/sde
[root@ceph01 ~]# cat /sys/class/scsi_disk/0:1:12:0/cache_type
write back
[root@ceph01 ~]# sdparm --get=WCE /dev/sdf  
    /dev/sdf: ATA       ST8000NC0002-1XX  CN02
WCE           0  [cha: y, def:  0, sav:  0]
  1. HDD 硬盘:写缓存关闭(write through)
[root@ceph01 ~]# lsblk -d -o NAME,ROTA
NAME ROTA
sdf     1
[root@ceph01 ~]# cat /sys/block/sdf/queue/write_cache 
write through
[root@ceph01 ~]# ls -d /sys/class/scsi_disk/*/device/block/sdf
/sys/class/scsi_disk/0:1:11:0/device/block/sdf
[root@ceph01 ~]# cat /sys/class/scsi_disk/0:1:11:0/cache_type
write through
[root@ceph01 ~]# sdparm --get=WCE /dev/sde
    /dev/sde: ATA       INTEL SSDSC2KB01  0142
WCE           1  [cha: y, def:  1, sav:  1]

好了,到这里我们就配置完成了,如果大家对 Ceph 部署感兴趣,可以去看我的另一篇博客。
二、Ceph 开局指导手册之存储集群配置篇(BuleStore data与db分离部署+Bcache)
https://blog.csdn.net/lss0516/article/details/161694126?spm=1011.2415.3001.5331

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐