Ceph 分布式存储:核心架构与集群部署

Ceph 分布式存储:核心架构与集群部署详解

引言

在云计算与大数据时代,存储系统面临着海量数据、高并发访问和高可靠性的挑战。Ceph 作为一款开源的分布式存储系统,凭借其高扩展性、高可用性和统一的存储接口(对象、块、文件),已成为云原生环境中不可或缺的存储基础设施。本文将深入剖析 Ceph 的核心架构,并详细讲解基于 Cephadm 的集群部署全过程,涵盖从环境准备到日常运维的每一个细节。


一、Ceph 分布式存储核心概念与架构

1.1 存储环境中的用户角色

在一个典型的云存储环境中,不同职责的人员承担着不同的角色,这些角色共同保障存储集群的稳定运行。

存储管理员

存储管理员是核心角色,主要负责:

  • 安装、配置和维护 Ceph 存储集群。
  • 对基础架构架构师进行 Ceph 功能和特性的培训。
  • 告知用户有关 Ceph 数据表示和方法的信息,作为数据应用的选择。
  • 提供弹性和恢复方案,例如副本、备份和灾难恢复方法。
  • 通过基础设施即代码实现自动化和集成。
  • 提供对数据分析和高级海量数据挖掘的访问。
存储操作员

存储操作员协助日常运维,通常经验不如存储管理员丰富。他们主要:

  • 使用 Ceph Dashboard GUI 查看和响应集群警报与统计信息。
  • 执行日常存储管理任务,例如更换故障存储设备。
其他存储相关的角色
  • 云操作员:管理组织中的云资源(如 OpenStack、OpenShift),与存储管理员密切合作维护 Ceph 集群。
  • 自动化工程师:为常见的重复任务创建剧本。
  • 应用程序开发人员(DevOps 开发人员):负责应用程序的正确部署和行为,与存储管理员协调确保存储资源可用、设置配额并保护应用存储。
  • 服务管理员:管理最终用户服务,类似于项目经理但针对现有生产服务。
  • 部署工程师(DevOps 工程师):在大型环境中专职与存储管理员和应用开发人员一起执行、管理和调整应用部署。
  • 应用架构师:在 Ceph 基础架构布局与资源可用性、扩展和延迟之间建立关联,帮助存储管理员设计复杂的应用部署。
  • 基础架构架构师:掌握存储集群的架构布局,管理资源位置、容量和延迟,是存储管理员的主要信息来源。
  • 数据中心操作员:负责底层数据供应,通常受雇于公共云服务提供商或私有数据中心。

在组织中,角色实施因人员配备、技能、安全性和规模而异,一个人可能承担多个角色。例如:

  • 在电信和云服务提供商中,常见角色是云操作员、存储操作员、基础架构架构师和云服务开发人员,通常只消费存储而不维护。
  • 在银行、金融等需要安全私有基础架构的组织中,所有角色由内部人员配备。
  • 在大学和较小实施中,技术支持人员可以承担所有角色。

1.2 Ceph 简介与技术优势

Ceph 是一款开源、分布式、软件定义存储(SDS)系统,具备极高的可用性、扩展性和易用性,用于存储海量数据。它可部署在通用服务器上,支持 x86 和 ARM 架构,甚至可以在同一集群内混合使用。

技术优势:

  • 采用 RADOS(Reliable Autonomic Distributed Object Store,可靠的自主分布式对象存储)系统,将所有数据作为对象存储在存储池中。
  • 去中心化:客户端可根据 CRUSH 算法自行计算出对象存储位置,然后直接进行数据读写。
  • 集群可自动进行扩展、数据再平衡和数据恢复。

使用场景:Ceph 适用于多种场景,包括大规模数据存储、云存储服务、备份和归档、大数据分析、多媒体内容存储与分发、容器存储、灾难恢复、混合云存储、科学计算与高性能计算(HPC)、物联网数据存储等。

发展历史:

  • 2003 年,Sage Weil 在加州大学圣克鲁兹分校开发,作为其博士项目的一部分。初始原型约 40000 行 C++ 代码的 Ceph 文件系统,于 2006 年遵循 LGPL 协议开源。
  • 2003-2007 年为研究开发时期,核心组件逐步形成。
  • 2007 年末,Ceph 开始等待孵化。
  • 2012 年 4 月,Sage Weil 在 DreamHost 资助下成立 Inktank 公司,提供 Ceph 专业服务。
  • 2014 年 4 月,Inktank 被红帽收购,Inktank Ceph Enterprise 变为红帽 Ceph 存储。
  • Ceph 也与 Linux 内核、SUSE、OpenStack、CloudStack 等整合。

上游版本:Ceph 版本以字母顺序命名,从 Argonaut (0.48.x) 到最新的 Squid (19.2.x)。自 Infernalis 起,稳定版主版本号递增。版本格式 x.y.z 中,x 表示发布周期,y 表示发布类型(0 为开发版,1 为候选版,2 为稳定版),z 为发布号。从 Nautilus 开始,每年 3 月 1 日发布一个稳定版本,生命周期约 2 年。

企业版 Ceph 存储:红帽 Ceph 存储是企业级软件定义存储,提供统一存储(对象、块、文件),支持数千客户端和 EB 级容量。它与 Ceph 项目的关系类似 RHEL 与 Fedora,红帽提供 36 个月支持,比上游长 1 年。

1.3 Ceph 架构详解

Ceph 采用模块化分布式架构,核心是 RADOS,并提供多种访问方式。

1.3.1 访问方式

Ceph 提供四种访问方法:

  1. Ceph 原生 API (librados)
    • 基础库,C 语言实现,也有 C++、Java、Python、Ruby、Erlang、PHP 等绑定。
    • 应用可直接与 RADOS 协作访问对象,性能最佳。
    • 为简化访问,可使用更高级接口。
  2. Ceph 块设备 (RBD, librbd)
    • 通过 RBD 镜像提供块存储,对象分散在不同 OSD,访问自动并行。
    • 功能:虚拟磁盘存储、Linux 内核挂载、QEMU/KVM 和 OpenStack Cinder 启动支持。
  3. Ceph 对象网关 (RADOSGW, librgw)
    • 使用 librados 构建的对象存储接口,通过 RESTful API 提供网关。
    • 支持 Amazon S3 和 OpenStack Swift 两种接口。
    • 用例:镜像存储、备份服务、文件存储和共享。
  4. Ceph 文件系统 (CephFS, libcephfs)
    • 并行文件系统,提供可扩展、单层级结构共享磁盘。
    • 需要 MDS 管理元数据(文件访问、更改、修改时间戳等)。
    • 支持快照。

存储访问方式选择:为最大化性能,可直接使用 librados;简化访问可使用其他三种。

1.3.2 后端存储组件
  • MON(监视器)
    • 维护集群状态映射,帮助其他守护进程协调。
    • 必须就集群状态达成共识,配置奇数个以确保法定人数。
    • 要使集群正常运行,必须有超过一半的 MON 正常工作。
    • 每个集群事件都会更新映射并复制到每个 MON。
  • OSD(对象存储设备)
    • 将存储设备连接到集群,单个服务器可运行多个 OSD。
    • 使用 CRUSH 算法计算对象位置,而非中央查找表。
    • CRUSH 映射:将对象分配给 PG(放置组),PG 映射到多个 OSD。PG 是对象和 OSD 之间的抽象层。故障时,PG 重新映射到不同 OSD 并同步内容。
    • 主次 OSD:与对象关联的多个 OSD 中,一个是主 OSD,客户端总是联系主 OSD 进行读写。其他为次要 OSD,在主 OSD 控制下行动,可升级为主 OSD。
    • OSD 日志:每个 OSD 有独立日志,用于提升写性能。客户端写请求先顺序写入日志,再应用到后端文件系统。日志建议配置在快速磁盘(如 SSD)上。
    • 典型部署:每个物理磁盘创建一个 OSD 守护进程,使用 XFS 文件系统(默认启用扩展属性)。
  • MGR(管理器)
    • 负责集群大部分数据统计。
    • 没有 MGR 不影响客户端 I/O,但无法查询统计信息。建议至少部署两个。
    • 提供集中访问集群数据,并给出 Web 仪表板。可将状态导出到外部监控服务器(如 Zabbix)。
  • MDS(元数据服务器)
    • 管理 CephFS 元数据,提供 POSIX 兼容的共享文件系统元数据管理。
    • 使用 RADOS 存储元数据,将文件 inode 映射到对象。
    • 客户端访问 CephFS 时先向 MDS 发送请求,获取文件内容所需信息,再从正确 OSD 获取内容。
1.3.3 集群映射

集群映射由 MON 维护,客户端和 OSD 通过它确定数据存储位置。包含以下映射:

  • Monitor Map :集群 fsid、每个 MON 的位置/名称/地址/端口、映射时间戳。使用 ceph mon dump 查看。
  • OSD Map :集群 fsid、池列表、副本大小、PG 编号、OSD 列表及状态、映射时间戳。使用 ceph osd dump 查看。
  • PG Map :PG 版本、使用百分比、每个 PG 详细信息(PG ID、Up Set、Acting Set、状态、数据使用统计)、映射时间戳。使用 ceph pg dump 查看。
  • CRUSH Map :存储设备列表、故障域层次结构(设备、主机、机架、行、房间)、遍历规则。使用 ceph osd crush dump 查看。
  • MDS Map :存储元数据的池、MDS 列表、状态、映射时间戳。使用 ceph fs dump 查看。
  • Manager Map :Manager 服务器列表、状态、映射时间戳。使用 ceph mgr dump 查看。
  • Service Map :RGW 信息(若安装)。使用 ceph service dump 查看。

二、Ceph 集群部署实战

2.1 部署方式与硬件要求

官方推荐部署方式:

  • Cephadm:基于容器,支持 Octopus 及以后版本,部署后可通过命令行和图形界面管理。
  • Rook:基于 Kubernetes,支持 Nautilus 及以后版本,可通过 Kubernetes 管理组件 Pod。

其他方式:

  • ceph-ansible(通过 Ansible 部署)
  • ceph-deploy(已不再维护)
  • DeepSea(通过 Salt 部署)
  • 手动部署

最小硬件规格(生产环境):

  • 每增加一个 OSD 需增加相应资源。
  • OSD 的 CPU 最少 1 核,根据带宽和 IOPS 调整(每 200-500MB/s 或 1000-3000 IOPS 增加一核)。
  • OSD 内存 2-4GB 可实现基本功能,但可能卡顿。

服务端口:

服务 端口 描述
MON 6789, 3300 集群内部通信
OSD 6800-7300 每个 OSD 占用四个端口,用于与客户端/MON 通信、与其他 OSD 数据通信、心跳交换(两个)
MDS 6800-7300 与元数据服务器通信
MGR 8443 SSL 登录图形化页面
RESTful 管理模块 8003 SSL 与 RESTful 管理模块通信
Prometheus 管理模块 9283 与 Prometheus 插件通信
Prometheus 告警管理 9093 与 Prometheus 告警管理服务通信
Prometheus 节点导出器 9100 与 Prometheus 节点导出器通信
Grafana 服务器 3000 与 Grafana 服务通信
RGW 80 RADOSGW 通信
Ceph iSCSI 网关 9287 与 iSCSI 网关通信

所有端口均为 TCP。实验环境中可关闭 firewalld 和 SELinux。

2.2 Cephadm 简介

Cephadm 是 Ceph 的全生命周期管理工具,通过"引导"创建包含一个 MON 和一个 MGR 的单节点集群,后续可通过编排接口扩容、添加主机、部署服务。它使用容器部署 Ceph,降低了复杂性和包依赖性。cephadm 安装在集群第一个节点(引导节点),是部署新集群时启动的第一个守护程序,同时也是 MGR 中的一个模块。

Cephadm 与其他服务交互:

  • 登录容器镜像仓库拉取 Ceph 镜像并在节点上部署服务。
  • 使用 SSH 连接向集群添加新主机、添加存储或监控主机。

管理接口:

  • Ceph CLI :cephadm shell 启动容器化 shell,容器中安装了所有 Ceph 包。该命令应只在引导节点运行(其他节点也可执行)。也可直接运行命令:cephadm shell -- ceph status。为方便,可在物理主机安装 ceph-common 后直接执行 ceph 命令。
  • Ceph Dashboard GUI:基于 Web 的应用程序,用于监视和管理集群。默认部署在引导节点,使用端口 8443。功能包括用户和角色管理、单点登录、审计、安全(SSL/TLS),以及集群管理和监控功能(查看 CRUSH 地图、管理 OSD、检查健康状况等)。

2.3 环境准备与集群初始化

环境说明:

  • 部署方法:cephadm
  • 操作系统:CentOS Stream 8(最小化安装)
  • 硬件配置:2 CPU、8G 内存、1 系统盘 + 3 块 20G 数据盘
  • 使用 7 台虚拟机:客户端 client,主集群 ceph1/ceph2/ceph3,备集群 ceph4/ceph5/ceph6
主机名 IP 地址 角色
client.xianyu.cloud 192.168.108.10 客户端节点
ceph1.xianyu.cloud 192.168.108.11 主集群-ceph 节点
ceph2.xianyu.cloud 192.168.108.12 主集群-ceph 节点
ceph3.xianyu.cloud 192.168.108.13 主集群-ceph 节点
ceph4.xianyu.cloud 192.168.108.14 备集群-ceph 节点
ceph5.xianyu.cloud 192.168.108.15 备集群-ceph 节点
ceph6.xianyu.cloud 192.168.108.16 备集群-ceph 节点

准备虚拟机模板:

  1. 克隆模板 ceph-template,调整硬件配置(内存 8GB,处理器 4,添加 3 块 20G SCSI 硬盘)。

  2. 配置主机名解析:

    bash 复制代码
    cat >> /etc/hosts << EOF
    
    ###### ceph ######
    192.168.108.10 client.xianyu.cloud client
    192.168.108.11 ceph1.xianyu.cloud ceph1
    192.168.108.12 ceph2.xianyu.cloud ceph2
    192.168.108.13 ceph3.xianyu.cloud ceph3
    192.168.108.14 ceph4.xianyu.cloud ceph4
    192.168.108.15 ceph5.xianyu.cloud ceph5
    192.168.108.16 ceph6.xianyu.cloud ceph6
    EOF
  3. 关闭 SELinux:sed -ri 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

  4. 关闭防火墙:systemctl disable firewalld --now

  5. 配置 YUM 仓库:

    bash 复制代码
    cat << 'EOF' > /etc/yum.repos.d/ceph.repo
    [Ceph]
    name=Ceph
    baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/storage/x86_64/ceph-pacific
    enabled=1
    gpgcheck=0
    EOF
  6. 安装基础软件包:dnf install -y bash-completion vim lrzsz unzip rsync sshpass tar

  7. 配置时间同步:dnf install -y chrony; systemctl enable chronyd --now

  8. 安装 cephadm:dnf install -y cephadm(自动安装 podman)

  9. 提前下载镜像:

    bash 复制代码
    podman pull quay.io/ceph/ceph:v16
    podman pull quay.io/ceph/ceph-grafana:8.3.5
    podman pull quay.io/prometheus/node-exporter:v1.3.1
    podman pull quay.io/prometheus/alertmanager:v0.23.0
    podman pull quay.io/prometheus/prometheus:v2.33.4
  10. 创建配置主机脚本 /usr/local/bin/sethost:

    bash 复制代码
    #!/bin/bash
    hostnamectl set-hostname ceph$1.xianyu.cloud
    nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.108.1$1/24 ipv4.gateway 192.168.108.2 ipv4.dns 192.168.108.2
    init 0

    赋予执行权限:chmod +x /usr/local/bin/sethost

  11. 关机并打快照。

准备集群节点 :克隆虚拟机,分别执行 sethost 1 到 sethost 6,client 单独配置主机名和 IP。

集群初始化:

bash

bash 复制代码
cephadm bootstrap --mon-ip 192.168.108.11 --skip-pull \
  --allow-fqdn-hostname \
  --initial-dashboard-user admin \
  --initial-dashboard-password xianyu@123 \
  --dashboard-password-noupdate

选项说明:

  • --mon-ip:指定 monitor IP。
  • --allow-fqdn-hostname:允许使用长名称。
  • --initial-dashboard-user:Web UI 管理员账户。
  • --initial-dashboard-password:管理员密码。
  • --dashboard-password-noupdate:不更新 Web UI 登录密码。

输出包含 Dashboard 地址、用户、密码,以及 CLI 访问方式。同时会提示启用遥测(ceph telemetry on)。

访问 Dashboard :修改 hosts 文件后,浏览器访问 https://ceph1.xianyu.cloud:8443/,使用 admin/xianyu@123 登录。

2.4 添加节点与部署服务

添加节点:

  1. 获取集群公钥:

    bash 复制代码
    ceph cephadm get-pub-key > ~/ceph.pub
  2. 推送公钥到其他节点:

    bash 复制代码
    ssh-copy-id -f -i ~/ceph.pub root@ceph2.xianyu.cloud
    ssh-copy-id -f -i ~/ceph.pub root@ceph3.xianyu.cloud
  3. 添加节点:

    bash 复制代码
    ceph orch host add ceph2.xianyu.cloud
    ceph orch host add ceph3.xianyu.cloud
  4. 查看节点:ceph orch host ls

添加后,Ceph 会自动部署服务到新节点。使用 ceph orch ls 查看服务状态。

部署 MON 和 MGR:

  1. 禁用自动扩展:

    bash 复制代码
    ceph orch apply mon --unmanaged=true
    ceph orch apply mgr --unmanaged=true
  2. 为主机添加 _admin 标签:

    bash 复制代码
    ceph orch host label add ceph2.xianyu.cloud _admin
    ceph orch host label add ceph3.xianyu.cloud _admin
  3. 按标签部署:

    bash 复制代码
    ceph orch apply mon --placement="label:_admin"
    ceph orch apply mgr --placement="label:_admin"
  4. 观察:ceph orch ls | egrep 'mon|mgr'

部署 OSD:

bash 复制代码
ceph orch apply osd --all-available-devices

验证:

  • 查看服务:ceph orch ls
  • 查看集群状态:ceph -s(HEALTH_OK 表示健康)
  • 查看 OSD 结构:ceph osd tree
  • 查看集群组件:Dashboard 或 ceph orch ps

2.5 集群组件管理

ceph orch 命令:与编排器模块交互,支持 host、service type、service、daemon 等。

cephadm 特殊标签:

  • _no_schedule:不在此类标签的节点上部署或调度服务。
  • _no_autotune_memory:不对此类标签的节点进行内存调优。
  • _admin:自动将 ceph.conf 和 ceph.client.admin.keyring 发送到此类标签的节点。

禁用服务自动扩展:

bash 复制代码
ceph orch apply mon --unmanaged=true   # 禁用
ceph orch apply mon --unmanaged=false  # 启用
ceph orch apply mon --placement="label:_admin"  # 按标签部署

删除服务(以 crash 为例):

bash 复制代码
ceph orch apply crash --unmanaged=true
ceph orch ps | grep crash
ceph orch daemon rm crash.ceph1
ceph orch rm crash

部署服务:

  • apply 方式:ceph orch apply <service_type> [--placement=<placement_string>] [--unmanaged]
  • daemon add 方式:ceph orch daemon add <daemon_type> <placement>
  • 例如:ceph orch apply crash 和 ceph orch apply mon --placement="label:_admin"

删除 OSD:

  1. 确定 OSD 与设备关系:

    bash 复制代码
    ceph osd tree
    ceph -s | grep id
    ls -l /var/lib/ceph/<fsid>/osd.0/block
    lsblk | grep -B1 <device_id>
    ceph osd metadata 0

    也可使用脚本 show-osd-device:

    bash 复制代码
    #!/bin/bash
    cluster_id=$(ceph -s|grep id |awk '{print $2}')
    cd /var/lib/ceph/${cluster_id}
    for osd in osd.*
    do
      device_id=$(ls -l $osd/block | awk -F '-' '{print $NF}')
      device=/dev/$(lsblk |grep -B1 ${device_id} |grep -v ${device_id} | awk '{print $1}')
      echo $osd : $device
    done
  2. 编排删除:

    bash 复制代码
    ceph orch apply osd --all-available-devices --unmanaged=true
    ceph osd out osd.0
    ceph orch osd rm 0
    ceph orch device zap ceph1.xianyu.cloud /dev/sdb --force

    或直接:ceph orch osd rm 3 --force --zap

    添加回来:ceph orch apply osd --all-available-devices

  3. 手动删除(不推荐):

    bash 复制代码
    ceph osd out osd.0
    systemctl stop ceph-<fsid>@osd.0.service
    ceph osd crush remove osd.0
    ceph auth del osd.0
    ceph osd rm 0
    cephadm shell -- ceph-volume lvm zap /dev/sdb --destroy

    风险:漏步骤、顺序错误、磁盘残留、编排器不知情。

删除主机(以 ceph2 为例):

  1. 禁用所有服务自动扩展:

    bash 复制代码
    for service in $(ceph orch ls |grep -v -e NAME -e osd| awk '{print $1}');do ceph orch apply $service --unmanaged=true;done
    ceph orch apply osd --all-available-devices --unmanaged=true
  2. 删除主机上运行的服务:

    bash 复制代码
    for daemon in $(ceph orch ps |grep ceph2 |awk '{print $1}');do ceph orch daemon rm $daemon --force;done
    ceph osd crush rm osd.2
    ceph osd crush rm osd.4
    ceph osd crush rm osd.7
    ceph osd crush rm ceph2
    ceph osd rm 2 4 7
    ceph orch device zap ceph2.xianyu.cloud /dev/sdb --force
    ceph orch device zap ceph2.xianyu.cloud /dev/sdc --force
    ceph orch device zap ceph2.xianyu.cloud /dev/sdd --force
  3. 删除主机:ceph orch host rm ceph2

  4. 清理残留文件(在 ceph2 上):

    bash 复制代码
    rm -rf /var/lib/ceph
    rm -rf /etc/ceph /etc/systemd/system/ceph*
    rm -rf /var/log/ceph

实验完成后可还原快照恢复环境。

相关推荐
小天源2 小时前
智叟云集系统整体架构解析:多语言 API 接入、异步监控与本地化部署
架构·数据采集·数据中台·ai监测系统·geo数据监测
真上帝的左手2 小时前
10. 软件设计&架构-分布式文件存储系统
分布式·架构·应用架构
弈栈录2 小时前
大模型服务抽象:兼容 OpenAI、通义千问与本地模型
java·后端·架构
CCblandy3 小时前
一致性哈希到底省了多少搬迁?本机实测 3 轮:取模 6→7 搬 85.8%,V=128 只搬 14.3%,虚拟节点太少会被倾斜骗
后端·python·云原生·性能优化·架构
code_slave(码畜)3 小时前
微服务架构落地:OpenFeign 服务远程调用 + 线程池隔离架构实战 —— 超时控制、重试机制、线程池隔离,防雪崩
spring boot·spring cloud·微服务·云原生·架构·openfeign
小天源3 小时前
智叟云集定时采集与消息推送架构——实现可恢复的订阅通知流程
架构·sass·权限管理·多租户·服务商 api·ai采集
Shaoshing3 小时前
存储引擎与架构
java·开发语言·架构
whyutianict_vv4 小时前
AI 大模型技术架构解析:从推理链路到训练流程
人工智能·ai·架构·开发
企业解惑小助手4 小时前
企业 AI 工具泄密怎么防护整体方案设计|需求拆解与落地架构
人工智能·架构·域智盾