Ceph分布式存储系统全解析

目录

[Ceph 简介是什么](#Ceph 简介是什么)

Ceph优点

Ceph缺点

Ceph功能介绍

[Ceph 逻辑架构与数据写入流程](#Ceph 逻辑架构与数据写入流程)

一、逻辑架构三层模型

二、数据写入的六个步骤

[三、补充:对象到 PG 的哈希计算示例](#三、补充:对象到 PG 的哈希计算示例)

[四、RUSH 算法](#四、RUSH 算法)

部署

准备工作

[Ceph 部署对 Python 版本的要求](#Ceph 部署对 Python 版本的要求)

数据分类存储:

数据分类存储建议

时间同步

防火墙和SELinux管理

主机名和解析

[ssh key的验证 打通免密登录。](#ssh key的验证 打通免密登录。)

部署MON

[部署 Mgr 节点](#部署 Mgr 节点)

[部署 OSD 存储节点](#部署 OSD 存储节点)

配置OSD存储节点

[创建 OSD](#创建 OSD)

验证结果

[批量添加 OSD 节点](#批量添加 OSD 节点)

[实现 Mon 节点高可用](#实现 Mon 节点高可用)

[实现 Mgr 节点高可用](#实现 Mgr 节点高可用)


Ceph 简介是什么

Ceph 是一个开源的分布式存储系统,简单说就是软件定义的大硬盘

它把多个服务器的硬盘整合在一起,像用一块超大硬盘一样访问数据,不用关心数据具体存在哪台机器上。

x.0.z - 开发版 x.1.z - 候选版 x.2.z - 稳定、修正版

Ceph优点
  1. 统一存储 --- 一套系统同时提供块、文件、对象三种接口

  2. 高可用 --- 数据多副本,自动故障恢复,节点挂了不影响服务

  3. 高扩展 --- 加硬盘、加机器就行,容量和性能线性增长

  4. 开源免费 --- 不用花钱,生态成熟

  5. 自平衡 --- 数据自动分布到各节点,不用手动管理

Ceph缺点
  1. 复杂度高 --- 部署和运维有一定门槛,新手劝退

  2. 小文件性能一般 --- 海量小文件场景不如专用方案

  3. 硬件要求 --- 对网络和磁盘IO要求较高

  4. 调试费劲 --- 出问题排查需要一定经验

Ceph功能介绍
  • Monitor(ceph-mon) ceph 监视器:MON 是集群的注册中心和配置中心。它不存你的数据,只存"谁在哪、状态如何"的元信息。MON 一旦挂了,集群就瘫痪,连不上。它本身只吃少量资源,但对网络延迟很敏感。 一个主机上运行的一个守护进程,用于维护集群状态映射(maintains maps of thecluster state),比如 ceph 集群中有多少存储池、每个存储池有多少 PG 以及存储池和 PG的 映 射 关 系 等 , monitor map, manager map, the OSD map, the MDS map, and the*CRUSH map,这些映射是 Ceph 守护程序相互协调所需的关键 群集状态,此外监视器还负责管理守护程序和客户端之间的身份验证(认证使用 cephX 协议)。通常至少需要三个监视器才能实现冗余和高可用性

  • Managers(ceph-mgr)MGR : 是集群的运维大总管。无它,不影响存/取数据,但你会变成"瞎子",无法知道集群状态。它让 MON 专心干好自己定位导航的核心活。 作用提供丰富的实时监控数据开启 Web 管理界面负责 Prometheus、Zabbix 等监控系统的数据导出执行定时任务:如磁盘空间回收、PG 自动优化建议等。高可用性通常至少需要两个管理器

  • OSD 就是一个个货架,真正存放货物(数据)的地方。 提供存储数据,操作系统上的一个磁盘就是一个 OSD 守护程序,OSD 用于处理 ceph集群数据复制,恢复,重新平衡,并通过检查其他 Ceph OSD 守护程序的心跳来向 Ceph监视器和管理器提供一些监视信息。通常至少需要 3 个 Ceph OSD 才能实现冗余和高可用性。

  • PG 是管理单元,就像把仓库分成很多固定编号的小组,用来决定哪批货放哪个货架。 一个 pool (储存池)内部可以有多个 PG 存在,pool 和 PG 都是抽象的逻辑概念,一个 pool 中有多少个 PG 可以通过公式计算。

  • PGP = PG for Placement 数据迁移/恢复 时,同时工作的 PG 数量迁移/恢复时用到 PGP所占用多少个PGP同时运行

  • 存储池(Pool) 逻辑上的存储分区,从 OSD(物理硬盘)划分而来用来隔离不同业务或用途的数据包含:PG 数量、副本数、CRUSH 规则等配置 存储池是基于 OSD 划分的逻辑分区,用于隔离和管理不同业务的数据(虚拟机)

  • RocksDB / LevelDB 是货架上每个管理员(OSD)手里的私账本,用来记录这个货架上所有货物的元信息和存放位置。

  • MDS(Metadata Server) 是 Ceph 文件系统(CephFS)专属 的元数据服务器。它只在你用 Ceph 存文件 (像 NAS 那样共享目录)时才需要,如果用块存储(RBD)或对象存储(RGW),根本用不到 MDS

Ceph 逻辑架构与数据写入流程
一、逻辑架构三层模型

比喻:国家 → 省份 → 住户

  • Pool(存储池):好比一个国家,是最高层级的逻辑分区,大小由底层所有磁盘总容量决定。

  • PG(放置组):好比省份,一个 Pool 里有很多 PG,用来把数据进一步打散管理。PG 数量按公式预先算好。

  • OSD(对象存储设备):好比具体的住户,一块物理磁盘就是一个 OSD,数据最终保存在这里。

三者的关系:文件 → 归属于某个 Pool → 被分配到某个 PG → 落到具体的多个 OSD 上


二、数据写入的六个步骤

整个过程的核心是:一个文件经过"切块"和"两次导航",最终写到多块硬盘上

  1. 文件切对象

    • 文件按 4MB 切成对象碎片,每个碎片得到唯一 ID: oid = ino(文件号) + ono(碎片序号)
  2. 对象 → PG(哈希导航)

    • 用静态哈希算法计算:hash(oid) & mask = pgid

    • mask = PG总数 - 1,确保结果落在 PG 编号范围内。

  3. PG → OSD(CRUSH 导航)

    • 将 pgid 输入 CRUSH 算法,根据集群规则算出一组 OSD: CRUSH(pgid) → [主OSD, 从OSD1, 从OSD2]
  4. 写入主 OSD

    • 客户端直接把数据发给主 OSD,主 OSD 写入本地硬盘。
  5. 同步至从 OSD

    • 主 OSD 将数据推送给备份 OSD,并等待所有备份写入确认。
  6. 返回成功

    • 全部副本落盘后,主 OSD 通知客户端写入完成,保证高可用。

三、补充:对象到 PG 的哈希计算示例

当 Pool 有 64 个 PG 时:

  • PG 总数 64,编号 0~63,mask = 63(二进制 0111111

  • 某对象 oid 哈希值为 100(二进制 1100100

  • 与运算:1100100 & 0111111 = 0100100 → 十进制 36

    复制代码
      1100100
      0111111
     =0100100 (一样下替代)

    因此该对象被分配到编号 36 的 PG,再由 CRUSH 算出对应的 OSD 组合。

四、RUSH 算法

作用:不用查表,现场算出数据该存哪个硬盘。

两步走:对象 → PG(一致性哈希)→ OSD(CRUSH算)

优点:去中心化、扩缩容自动重分布、不用停服务

总结:CRUSH 就是一个让客户端自己算数据位置的算法,从而让 Ceph 能做到真正的分布式、无中心、可无限扩展。

部署

准备工作
Ceph 部署对 Python 版本的要求
  • 旧版 Ceph(Nautilus 之前) :依赖 Python 2,部署工具 ceph-deploy 也是 Python 2 写的。

  • 新版 Ceph(Octopus 之后) :全面转向 Python 3,ceph-deploy 已废弃,改用 cephadm

数据分类存储:

是否存在访问量不高的业务备份数据(数据库备份、配置文件备份)和访问量比较高的业务数 据(静态文件、对象存储数据)都在 ceph 集群存储的场景,如果有的话可以分开不同的磁盘 存储。 备份数据:SAS 7.2K/10K/15K 硬盘 热点数据:SSD 固态硬盘

数据分类存储建议

业务里如果有两种数据:一种是频繁访问的热门数据(像图片、视频这类),另一种是很少动的冷门数据(备份文件之类的)。热门数据放SSD固态盘,速度快;

冷门数据放普通SAS机械盘,便宜量大。这样分开管理,既省钱又不拖累性能。

虚拟网络设置:

复制代码
 eth0: NAT网络 VMnet8 设定为 10.0.0.0 网段,提供公共网络
 eth1: 仅主机 VMnet1 设定为 192.168.10.0 网段,提供ceph 集群网络

每个主机额外添加两块盘,每个根据自己的情况设定容量,这里设置为20G

时间同步

对于任何一个集群来说,时间同步是非常重要的。 ceph 要求更高, 默认各节点的时间误差不能超过50ms

复制代码
 crontab -e
 */5 * * * * /usr/sbin/chronyc -a makestep 2>/dev/null || /usr/sbin/ntpdate -u ntp.ntsc.ac.cn 210.72.145.44
防火墙和SELinux管理
复制代码
 #关闭防火墙
 ufw stop
 ufw disable
 #关闭防火墙
 systemctl disable --now firewalld
 systemctl disable --now iptables
主机名和解析
复制代码
 cat >> /etc/hosts <<EOF
 10.0.0.100 admin.wang.org admin
 10.0.0.101 mon01.wang.org mon01
 10.0.0.102 mon02.wang.org mon02
 10.0.0.103 mon03.wang.org mon03
 10.0.0.104 mgr01.wang.org mgr01
 10.0.0.105 mgr02.wang.org mgr02
 10.0.0.106 store01.wang.org store01
 10.0.0.107 store02.wang.org store02
 10.0.0.108 store03.wang.org store03
 EOF
ssh key的验证 打通免密登录。
复制代码
 #当前用户密码
 PASS=123456
 #设置网段最小和最大的地址的尾数
 BEGIN=1
 END=99
 ​
 IP=`ip a s eth0 | awk -F'[ /]+' 'NR==3{print $3}'`
 NET=${IP%.*}.
 ​
 . /etc/os-release
 ​
 color () {
     RES_COL=60
     MOVE_TO_COL="echo -en \\033[${RES_COL}G"
     SETCOLOR_SUCCESS="echo -en \\033[1;32m"
     SETCOLOR_FAILURE="echo -en \\033[1;31m"
     SETCOLOR_WARNING="echo -en \\033[1;33m"
     SETCOLOR_NORMAL="echo -en \E[0m"
     echo -n "$1" && $MOVE_TO_COL
     echo -n "["
     if [ $2 = "success" -o $2 = "0" ] ;then
         ${SETCOLOR_SUCCESS}
         echo -n $"  OK  "    
     elif [ $2 = "failure" -o $2 = "1"  ] ;then 
         ${SETCOLOR_FAILURE}
         echo -n $"FAILED"
     else
         ${SETCOLOR_WARNING}
         echo -n $"WARNING"
     fi
     ${SETCOLOR_NORMAL}
     echo -n "]"
     echo 
 }
 ​
 #安装sshpass
 install_sshpass() {
     if [[ $ID =~ centos|rocky|rhel ]];then
         rpm -q sshpass &> /dev/null || yum -y install sshpass
     else
         dpkg -l sshpass &> /dev/null || { sudo apt update;sudo apt -y install sshpass; }
     fi
     if [ $? -ne 0 ];then 
         color '安装 sshpass 失败!' 1
         exit 1
     fi
 }
 ​
 scan_host() {
     [ -e ./SCANIP.log ] && rm -f SCANIP.log
     for((i=$BEGIN;i<="$END";i++));do
         ping -c 1 -w 1  ${NET}$i &> /dev/null  && echo "${NET}$i" >> SCANIP.log &
     done
     wait
 }
 ​
 push_ssh_key() {
     #生成ssh key 
     [ -e ~/.ssh/id_rsa ] || ssh-keygen -P "" -f ~/.ssh/id_rsa
     sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no ${USER}@$IP  &>/dev/null
 ​
     ip_list=(`sort -t . -k 4 -n  SCANIP.log`)
     for ip in ${ip_list[*]};do
         sshpass -p $PASS scp -o StrictHostKeyChecking=no -r ~/.ssh ${USER}@${ip}: &>/dev/null
     done
 ​
     #把.ssh/known_hosts拷贝到所有主机,使它们第一次互相访问时不需要输入yes回车
     for ip in ${ip_list[*]};do
         scp ~/.ssh/known_hosts ${USER}@${ip}:.ssh/   &>/dev/null
         color "$ip" 0
     done
 }
 ​
 install_sshpass
 scan_host
 push_ssh_key

出于安全考虑,后续操作不直接使用 root,而是创建一个具有 sudo 权限的普通用户来管理。注意用户名不要设为 ceph,该账户在 Ceph 部署过程中会自动生成。

复制代码
 #用脚本实现批量创建用户
 cat > create_cephadm.sh <<EOF
 #!/bin/bash
 # 设定普通用户
 useradd -m -s /bin/bash  cephadm 
 echo cephadm:123456 | chpasswd
 echo "cephadm ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers .d/cephadm 
 chmod 0440 /etc/sudoers .d/cephadm
 EOF
 #批量执行
 for i in {100 ..108}; do ssh root@10.0.0 .$i bash < create_cephadm .sh ; done
 ​

所有主机通过cephadm用户实现免密码认证 让 Ceph 管理节点能无密码 SSH 到其他 Ceph 节点

复制代码
 su - cephadm
 ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
 #跨主机密码认证
 PASS=123456
 for i in {100  108};do
 sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no cephadm@10.0.0 .$i 
 done
 ​

在所有节点准备安装源配置 确保集群所有节点系统版本一致、源配置正确,后续安装 Ceph 包时能正常下载

复制代码
 #在管理节点准备脚本,注意以root身份执行
 [root@admin ~]#cat  > ceph_repo.sh <<EOF
 #!/bin/bash
 # 更新ceph的软件源信息
 echo "deb http://mirror.tuna.tsinghua.edu.cn/ceph/debian-pacific/ $(lsb_release
 -sc) main" > /etc/apt/sources .list.d/ceph .list
 wget -q -O- 'https://download.ceph.com/keys/release.asc ' | apt-key add
 apt update
 EOF
 #因为所有节点都会依赖于这些apt源信息,需要进行同步
 [root@admin ~]#for i in {100 ..108};do ssh -o StrictHostKeyChecking=no 10.0.0.$i 
 bash < ceph_repo .sh;done
 ​

admin节点主机安装ceph-deploy工具

复制代码
  #安装
  cephadm@admin:~$sudo apt-cache madison ceph-deploy  
  cephadm@admin:~$sudo apt  -y install ceph-deploy
  #验证成功和查看版本 
  cephadm@admin:~$ceph-deploy --version
  2 .0.1
部署MON

集群初始化

初始化第一个MON节点,准备创建集群

  1. 创建目录
复制代码
 mkdir ceph-cluster && cd ceph-cluster
  1. 生成初始配置
复制代码
 ceph-deploy new --public-network 10.0.0.0/24 --cluster-network 192.168.10.0/24 mon01:mon01.wang.org

参数说明:

  • --public-network:客户端访问用的前端网络。

  • --cluster-network:Ceph 节点间数据同步用的后端网络,与前端隔离更稳定。

  • mon01:mon01.wang.org:MON 节点名称。短名必须和主机名一致,写完整域名是为了防止 DNS 解析报错。

  1. 生成的文件
  • ceph.conf --- 集群配置(网络、认证、节点 IP 等)

  • ceph.mon.keyring --- MON 节点认证密钥

  • ceph-deploy-ceph.log --- 部署日志

  1. 出错重来
复制代码
 ceph-deploy forgetkeys
 ceph-deploy purge mon01
 ceph-deploy purgedata mon01
 rm ceph.*

清干净后再从第 2 步重新执行。

  1. 一次初始化多个 MON(生产推荐)
复制代码
 ceph-deploy new \
   --public-network 10.0.0.0/24 \
   --cluster-network 192.168.10.0/24 \
   mon01:mon01.wang.org \
   mon02:mon02.wang.org \
   mon03:mon03.wang.org

远程安装命令

复制代码
 ceph-deploy install --no-adjust-repos --nogpgcheck --mon mon01
  • --no-adjust-repos:不自动改软件源

  • --nogpgcheck:跳过 GPG 签名校验

  • --mon:只装 MON 相关包

本地手动安装(更推荐)

复制代码
 # Ubuntu/Debian
 apt install -y ceph-mon
 ​
 # CentOS/RHEL
 yum install -y ceph-mon
 ​

安装后自动发生的事情

  • ceph 用户自动创建getent passwd ceph 可查到,家目录 /var/lib/ceph,禁止登录(/usr/sbin/nologin),这就是为什么前面强调不要自己创建叫 ceph 的用户。

  • ceph-crash 进程自动启动:用于收集崩溃日志。

  • Python3 依赖库一并装上 :如 python3-ceph-common 等。

dpkg -l | grep ceph 包装 能看到 ceph-mon、ceph-base 等包
getent passwd ceph 用户创建了没 ceph 用户,Shell 是 nologin
`ps aux grep ceph` 进程起来了没

初始化 Mon 节点生成配置信息

复制代码
 #配置初始化MON节点,同时向所有节点同步配置
 ceph-deploy --overwrite-conf mon create-initial
 #注意:为了避免因为认证方面导致的通信失败,推荐使用--overwrite-conf 参数
 #如果是在一个现有的环境上部署业务,可以先推送基准配置文件
 ceph-deploy --overwrite-conf config push mon01 mon02 mon03
 ​
 #注意:ceph.client.admin.keyring 拥有ceph集群的所有权限,一定不能有误。
 #到mon的节点上查看mon的自动开启相应的守护进程
 [root@mon01 ~]#ps aux|grep ceph
 root       10969  0.0  0.6  21424 12212 ?       Ss   5月07   0:00

推送配置与密钥(可选)

目的 :让每个 MON 节点都能独立执行 ceph 管理命令,不用每次都回 admin 节点操作。

推送配置文件(确保所有 MON 节点配置一致):

复制代码
 ceph-deploy --overwrite-conf config push mon01 mon02 mon03

推送 admin 密钥(授予节点管理集群的权限):

复制代码
 ceph-deploy admin mon01 mon02 mon03
 ​
 ​
 #查看效果
 [root@mon01 ~]#ls /etc/ceph/
 ceph.client.admin.keyring  ceph .conf  rbdmap  tmp30edymns
 推送效果
 `/etc/ceph/` 目录下多了一个文件 `ceph.client.admin.keyring`,这是客户端与集群通信的认证密钥。

推送后的问题 : 该文件默认属主是 root,权限为 600(只有 root 能读),普通用户 cephadm 无权访问。

现象 :切换到 cephadm 用户执行 ceph -s 会直接报错:

复制代码
 auth: unable to find a keyring ... (2) No such file or directory

原因 :不是文件不存在,是根本没有读权限,程序直接当成找不到文件。

解决方法

复制代码
 # 安装 ACL 工具
 apt install acl -y
 ​
 # 给 cephadm 用户授予读取权限
 setfacl -m u:cephadm:r /etc/ceph/ceph.client.admin.keyring

修复后效果

复制代码
 su - cephadm
 ceph -s        # 正常输出集群状态
 ceph health    # 查看健康详情

配置 admin 节点实现远程管理

背景 :当前只能在 MON 节点上执行 ceph 命令,admin 节点还没法远程管理。

步骤

bash

复制代码
 # 1. 安装 Ceph 客户端工具
 sudo apt install -y ceph-common
 ​
 # 2. 推送配置文件和 admin 密钥到本机
 ceph-deploy admin admin
 ​
 # 3. 安装 ACL 工具并给 cephadm 用户授权
 sudo apt install -y acl
 sudo setfacl -m u:cephadm:rw /etc/ceph/ceph.client.admin.keyring
 ​
 # 4. 验证
 ceph -s

执行完效果:admin 节点也能远程查看和管理整个集群了。


消除告警:mon is allowing insecure global_id reclaim

复制代码
 ephadm@admin:~/ceph-cluster$ ceph -s 
 cluster:
 id:     a223b6ee-d350-4cbb-b930-f6ccd8237905
 health: HEALTH_WARN
 mon is allowing insecure global_id reclaim
 services:
 mon: 1 daemons, quorum mon01 (age 2h)
 mgr: no daemons active
 osd: 0 osds: 0 up, 0 in
 data:
 pools:   0 pools, 0 pgs
 objects: 0 objects, 0 B
 usage:   0 B used, 0 B / 0 B avail

现象ceph -s 显示 HEALTH_WARN,提示 mon 允许不安全的全局 ID 回收。

修复

复制代码
 ceph config set mon auth_allow_insecure_global_id_reclaim false
 ​
 ceph -s    # 显示 HEALTH_OK,告警消失
部署 Mgr 节点

MGR 是 Ceph 12.2 版本后主推的管理组件,工作模式是事件驱动型------等待事件、处理事件、返回结果,继续等待。

核心作用:把集群的运行指标(状态、性能、容量等)暴露给外部系统,如 Prometheus、Dashboard 等。

部署原则

  • 生产环境:至少 2 个节点,Active/Standby 模式,主挂备自动接管

  • 测试环境:1 个节点即可先用,后续再加

安装 Mgr 相关软件

复制代码
 #在管理节点远程安装mgr软件到mgr节点
 cephadm@admin:~/ceph-cluster$ ceph-deploy install --mgr mgr01
 #方法2:在mgr01节点手动安装软件
 [root@mgr01 ~]#apt -y install ceph-mgr
 安装后验证:
 [root@mgr01 ~]#dpkg -l | grep ceph
 [root@mgr01 ~]#ls /etc/ceph/
  rbdmap

配置Mgr节点启动ceph-mgr进程

复制代码
 #创建mgr节点并生成相关配置
 cephadm@admin:~/ceph-cluster$ ceph-deploy mgr create mgr01
 ​
 自动完成三件事:
 在 mgr01 上生成配置文件到 /etc/ceph/
 自动创建 ceph 系统用户(如已存在则跳过)
 启动 ceph-mgr 进程
 ​
 [root@mgr01 ~]#ls /etc/ceph/
 ceph .conf  rbdmap  tmpoilgb4u0
 ​
 [root@mgr01 ~]#getent passwd ceph
 ceph:x:64045:64045:Ceph storage service:/var/lib/ceph:/usr/sbin/nologin
部署 OSD 存储节点

要设置OSD环境,一般执行下面步骤:

  1. 要知道对应的主机上有哪些磁盘可以提供给主机来进行正常的使用。

  2. 格式化磁盘(非必须)

  3. ceph擦除磁盘上的数据

  4. 添加osd

硬盘准备

复制代码
  #所有的存储节点主机都准备了两块额外的磁盘,
 [root@store01 ~]#lsblk
 NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
 sda                         8:0    0  200G  0 disk
 ├─sda1                      8 :1    0    1M  0 part
 ├─sda2                      8 :2    0    1G  0 part /boot
 └─sda3                      8:3    0  199G  0 part
 sdb                         8:16   0   20G  0 disk
 sdc                         8 :32   0   20G  0 disk
 #如果不想查看大量无效设备的话,可以执行下面清理操作
 apt autoremove --purge snapd -y

安装 OSD 存储节点相关软件

复制代码
 #确认仓库配置
 [root@store01 ~]#cat /etc/apt/sources .list.d/ceph .list 
 deb http://mirrors.aliyun.com/ceph/debian-pacific/ focal main
 #安装OSD相关软件
 #方法1: 在管理节点远程安装
 cephadm@admin:~/ceph-cluster$ ceph-deploy  install --release pacific --osd store01
 #方法2: 在OSD主机手动安装(推荐)
 [root@store01 ~]#apt -y install ceph-osd
 ​

安装后自动完成

  • 创建 ceph 系统用户(/usr/sbin/nologin,不可登录)

  • 生成 /etc/ceph/ 目录(目前只有 rbdmap

  • 启动 ceph-crash 崩溃日志收集进程

验证

复制代码
 dpkg -l | grep ceph      # 能看到 ceph-osd 包
 ls /etc/ceph/            # 配置文件目录已生成
 ps aux | grep ceph       # ceph-crash 进程已运行

查看所有可用的osd磁盘

复制代码
 远程查看 store01 节点上有哪些磁盘,为后面创建 OSD 做准备。
 ceph-deploy disk list store01  

常见报错与修复

复制代码
 TypeError: startswith first arg must be bytes or a tuple of bytes, not str
 原因:ceph-deploy 用 Python 3 执行时,字符串和字节类型不匹配。fdisk -l 的输出是字节类型(bytes),但代码里用字符串(str)去处理,类型冲突。
 ​
 修复方法:
 sudo vim +375 /usr/lib/python3/dist-packages/ceph_deploy/osd.py
 把第 375 行:
 if line.startswith('Disk /'):
 改成:
 if line.startswith(b'Disk /'):
 只在 'Disk /' 前面加一个字母 b,表示这是字节字符串,类型就匹配了。

清除 OSD磁盘数据(可选) 在管理节点上使用ceph-deploy命令擦除计划专用于OSD磁盘上的所有分区表和数据以便用于OSD 注意: 如果硬盘是无数据的新硬盘此步骤可以不做

清除磁盘命令

复制代码
 ceph-deploy disk zap [-h] [--debug] [HOST] DISK [DISK ...]
 #说明此操操作本质上就是执行dd if=/dev/zero of=disk bs=1M count=10
 例:
 cephadm@admin:~/ceph-cluster$for i in {1 ..3};do ceph-deploy disk zap store0$i
 /dev/sdb /dev/sdc;done
配置OSD存储节点

对于OSD的相关操作,可以通过 ceph-deploy osd 命令来进行,帮助信息如下

OSD 存储机制

Ceph 支持两种存储后端,通过 ceph-deploy osd --help 可查看参数:

数据分三类存放:

参数 用途 说明
--data 对象数据 实际存文件的地方
--block-db 元数据数据库 存数据索引信息
--block-wal 数据库预写日志 类似数据库的 WAL,保证一致性

生产环境建议 data 和 wal/db 分开存放,提升性能。

Filestore(老版本,已废弃)

数据分两类:--data(文件数据)和 --journal(文件系统日志),写放大严重,新版本不再使用。

OSD 子命令

  • list:列出 OSD 信息

  • create:创建 OSD

创建 OSD

命令格式:

复制代码
 ceph-deploy osd create {host} --data {磁盘}

(单盘全部数据放一起):

复制代码
 # 创建第一个 OSD
 ceph-deploy --overwrite-conf osd create store01 --data /dev/sdb
 ​
 # 创建第二个 OSD
 ceph-deploy --overwrite-conf osd create store01 --data /dev/sdc
 ​

分开存放

复制代码
 ceph-deploy osd create store01 --data /dev/sdb --block-wal /dev/nvme0n1
验证结果

1. 进程检查

bash

复制代码
 ps aux | grep ceph

每个磁盘对应一个 ceph-osd 进程(--id 0--id 1),属主为 ceph 用户。

2. LVM 检查

每个 OSD 磁盘,Ceph 都会自动创建一套独立的 PV → VG → LV,命名带 UUID 是为了保证集群里唯一不冲突。

复制代码
 pvs   # 每块盘被标记为 LVM PV
 vgs   # 每块盘独立的 VG
 lvs   # 每个 VG 下有一个 LV
 lsblk # 显示磁盘 → LVM 的层级关系
 blkid # LV 类型标记为 ceph_bluestore

3. 服务检查

复制代码
 systemctl status ceph-osd@0    # OSD 0 服务 running
 systemctl status ceph-osd@1    # OSD 1 服务 running

4. 集群状态

复制代码
 ceph -s
 osd: 2 osds: 2 up, 2 in
 usage: 40 GiB / 40 GiB avail
批量添加 OSD 节点

1.安装软件(二选一)

复制代码
 # 方法1:admin 节点远程批量安装
 ceph-deploy install --release pacific --osd store02 store03
 ​
 # 方法2:各节点手动安装
 apt install -y ceph-osd
  1. 批量创建 OSD
复制代码
 for i in {2..3}; do
   ceph-deploy --overwrite-conf osd create store0$i --data /dev/sdb
   ceph-deploy --overwrite-conf osd create store0$i --data /dev/sdc
 done

结果

复制代码
 ceph -s
 health: HEALTH_OK                     # 告警消失
 osd: 6 osds: 6 up, 6 in              # 3节点 × 2块盘 = 6个OSD
 usage: 120 GiB / 120 GiB avail       # 6 × 20G = 120G
 pgs: 1 active+clean                   # 归置组正常

查看 OSD 详情

复制代码
 # 列出所有 OSD 节点磁盘
 ceph-deploy osd list store01 store02 store03
 ​
 # 查看每个 OSD 状态
 ceph osd status
 ​
 ID  所在节点    已用  可用  状态
 0   store01 5.6M    19.9G   exists,up
 1   store01 5.5M    19.9G   exists,up
实现 Mon 节点高可用

当前只有一个Mon节点主机,存在SPOF,添加新的mon节点实现高可用

注意:如果 n个 mon节点,至少需要保证有 > n/2 个以上的健康mon节点, ceph 集群才能正常使用

1. 安装软件

复制代码
 # 远程安装
 ceph-deploy install --mon mon02
 ​
 # 或本地手动安装
 apt install -y ceph-mon

2. 添加 MON 节点

复制代码
 ceph-deploy mon add mon02
 ceph-deploy install --mon mon03
 ceph-deploy mon add mon03

3. 更新配置文件

复制代码
 vim ceph.conf
 # 修改 mon_host 为所有 MON 节点 IP
 mon_host = 10.0.0.101,10.0.0.102,10.0.0.103

4. 同步配置到所有节点

复制代码
 ceph-deploy --overwrite-conf config push admin mon01 mon02 mon03 mgr01 store01 store02 store03

验证结果

复制代码
 ​
 ceph -s
 mon: 3 daemons, quorum mon01,mon02,mon03
 health: HEALTH_OK
实现 Mgr 节点高可用

为什么需要多个 MGR? MGR 以 Active/Standby 模式运行,单节点故障会导致监控面板、Prometheus 指标等对外服务中断。部署多个 MGR,主节点挂掉后备节点自动接管,服务不中断。

复制代码
 cephadm@admin:~/ceph-cluster$ ceph-deploy install --mgr mgr02
 #方法2:在mgr02节点手动安装软件
 [root@mgr02 ~]#apt -y install ceph-mgr
 #添加第二个Mgr节点
 cephadm@admin:~/ceph-cluster$ ceph-deploy mgr create mgr02
 #查看效果
 cephadm@admin:~/ceph-cluster$ ceph -s 
 mgr: mgr01(active, since 2h), standbys: mgr02
 #结果显示:mgr01节点就是主角色节点,mgr02是从角色节点。

验证高可用

复制代码
 测试 MGR 故障切换:关掉 mgr01,mgr02 自动接管。
 mgr: mgr02(active, since 3m)    # 已自动切换
 ​
 测试 MON 故障切换:关掉 mon01,集群仍正常工作。
 mon: 3 daemons, quorum mon02,mon03, out of quorum: mon01
 health: HEALTH_WARN               # 有告警但集群可用
相关推荐
一个行走的民13 天前
分布式系统中 Map 增量(Delta)是否需要持久化
ceph
一个行走的民15 天前
BlueStore 核心原理与关键机制
ceph
奋斗的小青年I17 天前
Proxmox VE Ceph 超融合集群落地实战
windows·ceph·vmware·pve·超融合·proxmox
一个行走的民17 天前
深度剖析 Ceph PG 分裂机制:原理、底层、实操、影响、线上避坑(最全完整版)
ceph·算法
一个行走的民17 天前
Ceph 核心概念精讲:彻底搞懂 PG、PGP、pg_num、pgp_num
ceph
Mr.王8351 个月前
Kubernetes宿主机本地盘池化管理
ceph·云原生·容器·kubernetes
一个行走的民1 个月前
CEPH OSD心跳机制
ceph
一个行走的民1 个月前
Ceph PG 状态详解与线上故障处理
网络·ceph
一个行走的民1 个月前
Ceph MDS 状态机与 Monitor 中的状态流转分析
ceph