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 提供四种访问方法:
- Ceph 原生 API (librados)
- 基础库,C 语言实现,也有 C++、Java、Python、Ruby、Erlang、PHP 等绑定。
- 应用可直接与 RADOS 协作访问对象,性能最佳。
- 为简化访问,可使用更高级接口。
- Ceph 块设备 (RBD, librbd)
- 通过 RBD 镜像提供块存储,对象分散在不同 OSD,访问自动并行。
- 功能:虚拟磁盘存储、Linux 内核挂载、QEMU/KVM 和 OpenStack Cinder 启动支持。
- Ceph 对象网关 (RADOSGW, librgw)
- 使用 librados 构建的对象存储接口,通过 RESTful API 提供网关。
- 支持 Amazon S3 和 OpenStack Swift 两种接口。
- 用例:镜像存储、备份服务、文件存储和共享。
- 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 节点 |
准备虚拟机模板:
-
克隆模板
ceph-template,调整硬件配置(内存 8GB,处理器 4,添加 3 块 20G SCSI 硬盘)。 -
配置主机名解析:
bashcat >> /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 -
关闭 SELinux:
sed -ri 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config -
关闭防火墙:
systemctl disable firewalld --now -
配置 YUM 仓库:
bashcat << '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 -
安装基础软件包:
dnf install -y bash-completion vim lrzsz unzip rsync sshpass tar -
配置时间同步:
dnf install -y chrony; systemctl enable chronyd --now -
安装 cephadm:
dnf install -y cephadm(自动安装 podman) -
提前下载镜像:
bashpodman 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 -
创建配置主机脚本
/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 -
关机并打快照。
准备集群节点 :克隆虚拟机,分别执行 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 添加节点与部署服务
添加节点:
-
获取集群公钥:
bashceph cephadm get-pub-key > ~/ceph.pub -
推送公钥到其他节点:
bashssh-copy-id -f -i ~/ceph.pub root@ceph2.xianyu.cloud ssh-copy-id -f -i ~/ceph.pub root@ceph3.xianyu.cloud -
添加节点:
bashceph orch host add ceph2.xianyu.cloud ceph orch host add ceph3.xianyu.cloud -
查看节点:
ceph orch host ls
添加后,Ceph 会自动部署服务到新节点。使用 ceph orch ls 查看服务状态。
部署 MON 和 MGR:
-
禁用自动扩展:
bashceph orch apply mon --unmanaged=true ceph orch apply mgr --unmanaged=true -
为主机添加
_admin标签:bashceph orch host label add ceph2.xianyu.cloud _admin ceph orch host label add ceph3.xianyu.cloud _admin -
按标签部署:
bashceph orch apply mon --placement="label:_admin" ceph orch apply mgr --placement="label:_admin" -
观察:
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:
-
确定 OSD 与设备关系:
bashceph 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 -
编排删除:
bashceph 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 -
手动删除(不推荐):
bashceph 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 为例):
-
禁用所有服务自动扩展:
bashfor 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 -
删除主机上运行的服务:
bashfor 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 -
删除主机:
ceph orch host rm ceph2 -
清理残留文件(在 ceph2 上):
bashrm -rf /var/lib/ceph rm -rf /etc/ceph /etc/systemd/system/ceph* rm -rf /var/log/ceph
实验完成后可还原快照恢复环境。