
ceph的图解
分布式存储概述
1.存储分类
存储分为封闭系统的存储和开放系统的存储,而对于开放系统的存储又被分为内置存储和外挂存储。
外挂存储又被细分为直连式存储(DAS)和网络存储(FAS),而网络存储又被细分网络接入存储(NAS)和存储区域网络(SAN)等。
DAS(Direct-attached Storage):
直连存储,即直接连接到主板的总线上去的,我们可以对这些设备进行格式化操作。典型代表有:IDE,SATA,SCSI,SAS,USB等。
SAN(Storage Area Network):
存储区域网络,是一个网络上的磁盘。它提供的一个块设备而非文件系统。
早期是通过SCSI协议传输数据,后来设计通过光纤通道交换机连接存储阵列和服务器主机,也称为FC SAN,当然也可以基于以太网传输,我们称之为ISCSI协议。
NAS(Network Attached Storage):
网络附加存储,是一个网络上的文件系统,我们无法进行格式化操作。典型代表有:NFS,CIFS等。
专门的存储厂商可以通过RAID技术来实现数据的高效存储,国内外很多企业都有自己的存储设备,例如EMC,NetApp,IBM,惠普,Dell,爱数等。
但是这些专业的存储设备不仅价格是非常昂贵的,而且是非常重的,大多数都是基于FC SAN,ISCSI或者NAS访问接口,所以在某种意义上将他们的存储能力和扩展能力是非常有限的,这个时候我们就需要一个能够实现横向存储的分布式存储。
2.存储系统的分类
块存储系统:
通常对应的是一个裸设备,比如一块磁盘,我们需要格式化后进行挂载方能使用。
代表产品:
lvm,cinder。
文件系统存储系统:
文件系统只是数据组织存放的接口。文件系统通常是构建在一个块存储级别之上。
文件系统被分为元数据区域和数据区域,对于用户而言,它呈现为一个树形结构(实际上提供的是一个目录)。
代表产品:
NFS,glusterfs。
对象存储系统:
对象存储并没有向文件系统那样划分为元数据区域和数据区域,而是按照不同的对象进行存储,而且每个对象内部维护着元数据和数据区域。因此每个对象都有自己独立的管理格式。
代表产品:
Fastdfs,swift。
温馨提示:
上述存储系统的分类中,大家可能不太理解的是"对象存储系统",其实我们实际工作中经常使用,比如百度网盘,QQ离线传送文件等等。
那对象存储到底是如何存储的呢?此处我们以网盘业务为例进行分析:
Q1: 为啥网盘业务通常不会选择文件系统进行存储呢?
答: 基于文件系统进行存储会造成大量的数据冗余,以Linux用户为例,oldboy用户和root用户的家目录并不相同,如果这两个用户都有10TB的"小视频"资源,则2个用户会单独占用2份存储空间,当用户的并发量到达上百万,千万甚至上亿级别就非常浪费存储空间,对公司来说是一笔不小的开销哟。
Q2: 为啥网盘业务通常会使用对象存储呢?
答: 基于对象的一个好处是对于同一个文件始终只存储一份,尽管有上千个用户上传了同一个文件,无论该文件名称是否一致,但只要内容是同一个文件,则始终会上传一个文件哟。这也是为什么我们在上传一个文件时能达到秒传的目的。如何校验不同文件名称其存储的数据相同呢?方法有很多种,比如Linux的"md5sum"命令。
Q3: 基于对象存储的原理是如何的呢?
答: 我们假设网盘有文件的哈希值数据库,有用户表,文件和用户关系表,用户的存储容量表,用户的好友表,用户的分享资源表等等。其工作原理分析如下:
(1)客户端读取本地文件并校验值并发送服务端
当我们上传文件时,客户端程序会读取本地文件内容并计算该文件的哈希值或者是MD5值,并将该值发送给服务端;
(2)服务端校验文件是否上传
1)服务端接收到该哈希值或者是MD5值后,会去查询哈希值数据库,如果数据库有记录,说明该文件已存在,直接返回给客户端数据上传完毕,也就是我们常见的秒上传效果;
2)如果服务端发现客户端发送的哈希值不存在,才会开始上传文件,这意味着是第一次上传该对象资源哟,因此等待的时间比较长。
(3)更新用户信息的元数据
如果用户上传文件后,系统会自动更新用户的存储目录的文件名称哟,也就是元数据的更新。
某影视公司实际案例分享:(我有幸在一家影视类互联网公司工作过)
以上对于对象存储分析看似过于简单,但有助于我们理解对象存储,实际生产环境中比这个要复杂,尤其是第一次上传文件时,通常会对视频数据进行验证,比如"黄","赌","毒"相关视频禁止上传,否则国家会大力整顿。
ceph集群架构及各组件说明
Ceph是一个对象(object)式存储系统,它把每一个待管理的数据流(例如一个文件)切分为一到多个固定大小的对象数据,并以其为原子单元完成数据存取。
对象数据的底层存储服务是由多个主机(host)组成的存储系统,该集群也被称之为RADOS(Reliable Automatic Distributed Object Store)存储集群,即可靠,自动化,分布式对象存储系统。
如上图所示,librados是RADOS存储集群的API,它支持C,C++,Java,Python,Ruby和PHP等编程语言。
由于直接基于librados这个API才能使用Ceph集群的话对使用者是有一定门槛的。当然,这一点Ceph官方也意识到了,于是他们还对Ceph做出了三个抽象资源,分别为RADOSGW,RBD,CEPHFS等。
RadosGw,RBD和CephFS都是RADOS存储服务的客户端,他们把RADOS的存储服务接口(librados)分别从不同的角度做了进一步抽象,因而各自适用不同的应用场景,如下所示:
RadosGw:
它是一个更抽象的能够跨互联网的云存储对象,它是基于RESTful风格提供的服务。每一个文件都是一个对象,而文件大小是各不相同的。
他和Ceph集群的内部的对象(object,它是固定大小的存储块,只能在Ceph集群内部使用,基于RPC协议工作的)并不相同。
值得注意的是,RadosGw依赖于librados哟,访问他可以基于http/https协议来进行访问。
RBD:
将ceph集群提供的存储空间模拟成一个又一个独立的块设备。每个块设备都相当于一个传统磁(硬)盘一样,你可以对它做格式化,分区,挂载等处理。
值得注意的是,RBD依赖于librados哟,访问需要Linux内核支持librdb相关模块哟。
CephFS:
很明显,这是Ceph集群的文件系统,我们可以很轻松的像NFS那样使用,但它的性能瓶颈相比NFS来说是很难遇到的。
值得注意的是,CephFS并不依赖于librados哟,它和librados是两个不同的组件。但该组件使用的热度相比RadosGw和RBD要低。
推荐阅读:
查看ceph的官方文档:
https://docs.ceph.com/en/latest/
中文社区文档:
http://docs.ceph.org.cn
温馨提示:
(1)CRUSH算法是Ceph内部数据对象存储路由的算法。它没有中心节点,即没有元数据中心服务器。
(2)无论使用librados,RadosGw,RBD,CephFS哪个客户端来存储数据,最终的数据都会被写入到Rados Cluster,值得注意的是这些客户端和Rados Cluster之间应该有多个存储池(pool),每个客户端类型都有自己的存储池资源。
Ceph架构(Architecture)的存储流程
如果我们想要将数据存储到ceph集群,那么大致步骤如下所示:
(1)Rados Cluster集群固定大小的object可能不符合我们要存储某个大文件,因此一个大文件想要存储到ceph集群,它可能会被拆分成多个data object对象进行存储;
(2)通常情况下data object请求向某个pool存储数据时,通过CRUSH算法会先对data object进行一致性哈希计算,而后将存储任务映射到到该pool中的某个PG上;
(3)紧接着,CRUSH算法(是用来完成object存储路由的一个算法)会根据pool的冗余副本数量和data object的存储类型找到足量的OSD进行存储,当然对应的PG是有active PG和standby PG角色之分的,通常副本数我们会设置为3;
相关术语如下所示:
Rados Cluster:
由多台服务器组成。
OSD:(类似于HDFS集群的datanode节点)
英文全称为"Object Storage Device",即对象存储设备,通常指的是磁盘设备,它是真正负责存储数据的设备。一台服务器上可能有多块磁盘存储设备,这属于正常现象。
通常我们需要关心以下几点:
(1)ceph OSD(object storage daemon,进程名称为"ceph-osd")存储数据、处理数据复制、恢复、重新平衡,并通过检查其他ceph OSD守护进程的心跳向ceph监控器和管理器提供一些监视信息;
(2)为了实现冗余和高可用性,通常至少需要三个Ceph osd,因为默认数据副本是3个。
mon:
全称为"monitor",即监视器,也就是我们所说的集群元数据节点(而非文件元数据)。它是用来管理整个ceph集群的运行状态(比如集群有多少台服务器,每个服务器有多少OSD及其状态信息等等)。
它是为了能够让整个集群能够正常运行而设计的角色,因此为了避免该角色存在单点故障,因此会配置高可用集群,其底层基于POSIX协议实现。
通常我们需要关注以下几点:
(1)Ceph Monitor(进程名称为"Ceph-mon")维护集群状态的映射,包括Monitor映射、manager映射、OSD映射,CRUSH映射和PG映射等;
(2)这些映射是Ceph守护进程相互协调所需的关键集群状态,例如哪些OSD是正常工作的状态,哪些PG不可用等等;
(3)监视器还负责管理守护程序和客户端之间的身份验证(基于Cephx协议实现);
(4)为了实现冗余和高可用性,通常至少需要三个监视器,这不仅仅提供了高可用性,还提供了负载均衡的能力,因为通常Monitors还扮演着"身份验证"的角色,如果配置多个监视器可以很好的进行负载均衡。
mgr:
全称为"manager",即管理者。它的作用就是用来维护查询类的操作,它将很多查询操作按照自己的方式先缓存下来,一旦有人做监控,它能做及时的响应。有点类似于zabbix agent的功能。
早期ceph的版本是没有mgr组件的,但由于mon组件每次读取数据都是实时查询的,这种代价很高昂,而监控集群又是必须的,因此在ceph的L版本引入了mgr组件。
通常我们需要关注以下几点:
(1)ceph管理器守护程序(进程名称为"ceph-mgr")负责跟踪运行时度量和ceph集群的当前状态,包括存储利用率、当前性能度量和系统负载;
(2)Ceph管理器守护进程还托管基于python的插件来管理和Rest API;
(3)高可用性通常至少需要两个管理器;
pool:
存储池,存储池的大小取决于底层的OSD的存储空间大小。一个ceph集群是可以由多个存储池构成的,而且每个存储池还可以被划分为多个不同的名称空间,而且每个名称空间可以划分成多个PG资源。
PG:
全称为"placement groups",即安置组。注意哈,Pool和PG都是抽象的概念,即实际上并不存在,它是一个虚拟的概念。我们暂时可以理解他是用来存储数据的安置组即可。
MDSs:(类似于HDFS的namenode,如果不用cephfs,该组件可以不安装)
全称为"MetaData Server",即对应cephfs文件系统的元数据服务器。如果你不需要使用cephfs可以不安装哟,如果要用的话,建议安装多个节点,以免出现单点故障的情况。
从严格意义上来讲,MDS只能算作构建于Rados存储集群之上的文件存取接口,它同RBD和RadowGW属于同一个级别,而非Ceph的基础组件。
但它却是ceph的第一个(最初也是除librados API之外的唯一一个)客户端数据存取组件。
通常我们需要关心以下几点:
(1)Ceph元数据服务器(MDS,进程名称为"ceph-mds")代表Ceph文件系统存储元数据(即,Ceph块设备和Ceph对象存储不使用MDS);
(2)Ceph元数据服务器允许POSIX文件系统用户执行基本命令(如ls、find等),而不会给Ceph存储集群带来巨大负担;
推荐阅读:
http://docs.ceph.org.cn/glossary/#term-56
http://docs.ceph.org.cn/architecture/#pg-id
http://docs.ceph.org.cn/architecture/#pg-osd
温馨提示:
(1)如果我们给定的存储路径是一块裸的物理磁盘(我们称之为"裸设备",也就是该设备没有被格式化指定的文件系统),则ceph是可以直接来进行管理的,只不过它使用的是bluestore存储引擎。
(2)通常情况下我们的ceph集群会有OSDs,Monitors,Managers和MDSs这几个基础组件,其中MDSs是可选的组件。
(3)RBD不需要通过运行守护进程来提供服务的,它基于librbd模块,它提供了相应的API来进行使用。
Ceph使用BlueStore替代了早期的FileStore
ceph是目前业内比较普遍使用的开源分布式存储系统,实现有多种类型的本地存储系统;在较早的版本当中,ceph默认使用FileStore作为后端存储,但是由于FileStore存在一些缺陷,重新设计开发了BlueStore,并在L版本之后作为默认的后端存储。
从Ceph Luminous v12.2.z 开始,默认采用了新型的BlueStore作为Ceph OSD后端,用于管理存储磁盘。
BlueStore的优势:
(1)对于大型写入操作,避免了原先FileStore的两次写入(注意,很多FileStore将journal日志存放到独立到SSD上,也能够获得类似的性能提升,不过分离journal的部署方式是绕开FileStore的短板);
(2)对于小型随机写入,BlueStore比 FileStore with journal性能还要好对于Key/value数据BlueStore性能明显提升;
(3)当集群数据接近爆满时,BlueStore避免了FileStore的性能陡降问题;
(4)在BlueStore上使用raw库的小型顺序读性能有降低,和BlueStore不采用预读(readahead)有关,但可以通过上层接口(如RBD和CephFS)来实现性能提升;
(5)BlueStore在RBD卷或CephFS文件中采用了copy-on-write提升了性能;
如下图所示,BlueStore是在底层裸块设备上建立的存储系统,内建了RocksDB key/value 数据库用于管理内部元数据。一个小型的内部接口组件称为BludFS实现了类似文件系统的接口,以便提供足够功能让RocksDB来存储它的”文件”并向BlueStroe共享相同的裸设备。
推荐阅读:
https://cloud-atlas.readthedocs.io/zh_CN/latest/ceph/bluestore.html
https://zhuanlan.zhihu.com/p/45084771
部署ceph集群的常用工具
推荐阅读:
https://docs.ceph.com/en/latest/install/#installing-ceph
ceph-deploy(ceph的原生部署工具):
(1)ceph-deploy是一种部署ceph的方法,它仅依赖于SSH访问服务器、而后借助sudo和一些Python模块就可以实现部署。
(2)它完全在工作站(管理主机)上运行,不需要任何服务、数据库或类似的东西。
(3)它不是一个通用的部署系统,它只是为Ceph设计的,并且是为那些希望在不需要安装Chef、Puppet或Juju的情况下使用合理的初始设置快速运行Ceph的用户而设计的。
(4)除了推送Ceph配置文件之外,它不会处理客户端配置,想要对安全设置、分区或目录位置进行精确控制的用户应该使用Chef或Puppet之类的工具。
ceph-ansible:
(1)我们可以使用ansible的playbook来部署Ceph;
(2)ceph的GitHub地址为: https://github.com/ceph/ceph-ansible
ceph-chef:
对应的GitHub地址: https://github.com/ceph/ceph-chef
puppet-ceph:
即使用puppet工具来部署ceph。
Cephadm:
和k8s的kubeadm一样好用,部署服务非常方便,推荐使用。
参考链接:
https://docs.ceph.com/en/latest/install/#other-methods
ceph:
https://github.com/ceph/ceph
- ceph版本说明
推荐阅读:
https://docs.ceph.com/en/latest/releases/general/#understanding-the-release-cycle
x.0.z
开发版本,一般是用于内部测试。
x.1.z
测试版本,一般是开发人员测试使用。
x.2.z
稳定版本,生产环境中推荐使用。
- ceph的发型版本说明
推荐阅读:
https://docs.ceph.com/en/latest/releases/
cephadm快速部署ceph分布式集群
推荐阅读:
https://www.cnblogs.com/yinzhengjie/p/18370686
- 1.cephadm基础配置环境准备
1.1 基于cephadm部署前提条件,官方提的要求Ubuntu 22.04 LTS出了容器运行时其他都满足
- Python 3
- Systemd
- Podman or Docker for running containers
- Time synchronization (such as Chrony or the legacy ntpd)
- LVM2 for provisioning storage devices
参考链接:
https://docs.ceph.com/en/latest/cephadm/install/#requirements
1.2 设置时区
timedatectl set-timezone Asia/Shanghai
ll /etc/localtime
1.3.安装docker环境
国内的小伙伴建议二进制安装,yum或者apt安装都需要FQ,可以考虑使用国内的软件源。
1.4.所有节点添加hosts文件解析
cat >> /etc/hosts <<EOF
10.0.0.141 ceph141
10.0.0.142 ceph142
10.0.0.143 ceph143
EOF
1.5 集群时间同步【可跳过】
参考链接:
https://www.cnblogs.com/yinzhengjie/p/14238720.html#3配置时间同步
1.6.集群环境准备
ceph141:
CPU: 1c
Memory: 2G
/dev/sdb:300GB
/dev/sdc: 500GB
/dev/sdd: 1024GB
ceph141:
CPU: 1c
Memory: 2G
/dev/sdb:300GB
/dev/sdc: 500GB
/dev/sdd: 1024GB
ceph143:
CPU: 1c
Memory: 2G
/dev/sdb:300GB
/dev/sdc: 500GB
/dev/sdd: 1024GB
[root@ceph141 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 63.9M 1 loop /snap/core20/2318
loop1 7:1 0 87M 1 loop /snap/lxd/29351
loop2 7:2 0 64M 1 loop /snap/core20/2379
loop3 7:3 0 89.4M 1 loop /snap/lxd/31333
loop4 7:4 0 40.4M 1 loop /snap/snapd/20671
loop5 7:5 0 38.8M 1 loop /snap/snapd/21759
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 2G 0 part /boot
└─sda3 8:3 0 98G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 49G 0 lvm /
sdb 8:16 0 300G 0 disk
sdc 8:32 0 500G 0 disk
sdd 8:48 0 1T 0 disk
sr0 11:0 1 1024M 0 rom
[root@ceph141 ~]#
[root@ceph142 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop1 7:1 0 87M 1 loop /snap/lxd/29351
loop2 7:2 0 38.8M 1 loop /snap/snapd/21759
loop3 7:3 0 40.4M 1 loop /snap/snapd/20671
loop4 7:4 0 64M 1 loop /snap/core20/2379
loop5 7:5 0 89.4M 1 loop /snap/lxd/31333
loop6 7:6 0 63.7M 1 loop /snap/core20/2496
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 2G 0 part /boot
└─sda3 8:3 0 98G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 49G 0 lvm /
sdb 8:16 0 300G 0 disk
sdc 8:32 0 500G 0 disk
sdd 8:48 0 1T 0 disk
sr0 11:0 1 1024M 0 rom
[root@ceph142 ~]#
[root@ceph143 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 89.4M 1 loop /snap/lxd/31333
loop1 7:1 0 64M 1 loop /snap/core20/2379
loop2 7:2 0 87M 1 loop /snap/lxd/29351
loop3 7:3 0 40.4M 1 loop /snap/snapd/20671
loop5 7:5 0 38.8M 1 loop /snap/snapd/21759
loop6 7:6 0 63.7M 1 loop /snap/core20/2496
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 2G 0 part /boot
└─sda3 8:3 0 98G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 49G 0 lvm /
sdb 8:16 0 300G 0 disk
sdc 8:32 0 500G 0 disk
sdd 8:48 0 1T 0 disk
sr0 11:0 1 1024M 0 rom
[root@ceph143 ~]#
- 2.基于cephadm部署ceph集群
2.1.下载需要安装ceph版本的cephadm
CEPH_RELEASE=19.2.1
curl --silent --remote-name --location https://download.ceph.com/rpm-${CEPH_RELEASE}/el9/noarch/cephadm
SVIP:
wget http://192.168.16.253/Resources/Ceph/softwares/cephadm-v19.2.1
2.2 将cephadm添加到PATH环境变量
[root@ceph141 ~]# mv cephadm-v19.2.1 /usr/local/bin/cephadm
[root@ceph141 ~]#
[root@ceph141 ~]# chmod +x /usr/local/bin/cephadm
[root@ceph141 ~]#
[root@ceph141 ~]# ll /usr/local/bin/cephadm
-rwxr-xr-x 1 root root 787248 Mar 31 15:26 /usr/local/bin/cephadm*
[root@ceph141 ~]#
2.3 提前导入镜像
[root@ceph141 ~]# cat > import-calico-v3.29.1.sh <<'EOF'
#!/bin/bash
URL=http://192.168.16.253/Resources/Ceph/images/cephadm/ceph-Squid-v19.2.1
IMAGES=(oldboyedu-alertmanager-v0.25.0.tar.gz oldboyedu-ceph-v19.2.1.tar.gz oldboyedu-grafana-v10.4.0.tar.gz oldboyedu-node-exporter-v1.7.0.tar.gz oldboyedu-prometheus-v2.51.0.tar.gz)
# echo ${IMAGES[*]}
for pkg in ${IMAGES[@]}
do
echo "Downdowning image ---> ${URL}/${pkg}"
wget ${URL}/${pkg}
echo "importing image ---> ${URL}/${pkg}"
docker load -i ${pkg}
done
EOF
[root@ceph141 ~]# bash import-calico-v3.29.1.sh
2.4 创建新集群
[root@ceph141 ~]# cephadm bootstrap --mon-ip 10.0.0.141 --cluster-network 10.0.0.0/24 --allow-fqdn-hostname
Creating directory /etc/ceph for ceph.conf
Verifying podman|docker is present...
Verifying lvm2 is present...
Verifying time synchronization is in place...
Unit systemd-timesyncd.service is enabled and running
Repeating the final host check...
docker (/usr/bin/docker) is present
systemctl is present
lvcreate is present
Unit systemd-timesyncd.service is enabled and running
Host looks OK
Cluster fsid: 11e66474-0e02-11f0-82d6-4dcae3d59070
Verifying IP 10.0.0.141 port 3300 ...
Verifying IP 10.0.0.141 port 6789 ...
Mon IP `10.0.0.141` is in CIDR network `10.0.0.0/24`
Mon IP `10.0.0.141` is in CIDR network `10.0.0.0/24`
Pulling container image quay.io/ceph/ceph:v19...
Ceph version: ceph version 19.2.1 (58a7fab8be0a062d730ad7da874972fd3fba59fb) squid (stable)
Extracting ceph user uid/gid from container image...
Creating initial keys...
Creating initial monmap...
Creating mon...
Waiting for mon to start...
Waiting for mon...
mon is available
Assimilating anything we can from ceph.conf...
Generating new minimal ceph.conf...
Restarting the monitor...
Setting public_network to 10.0.0.0/24 in mon config section
Setting cluster_network to 10.0.0.0/24
Wrote config to /etc/ceph/ceph.conf
Wrote keyring to /etc/ceph/ceph.client.admin.keyring
Creating mgr...
Verifying port 0.0.0.0:9283 ...
Verifying port 0.0.0.0:8765 ...
Verifying port 0.0.0.0:8443 ...
Waiting for mgr to start...
Waiting for mgr...
mgr not available, waiting (1/15)...
mgr not available, waiting (2/15)...
mgr not available, waiting (3/15)...
mgr not available, waiting (4/15)...
mgr not available, waiting (5/15)...
mgr not available, waiting (6/15)...
mgr not available, waiting (7/15)...
mgr not available, waiting (8/15)...
mgr is available
Enabling cephadm module...
Waiting for the mgr to restart...
Waiting for mgr epoch 5...
mgr epoch 5 is available
Setting orchestrator backend to cephadm...
Generating ssh key...
Wrote public SSH key to /etc/ceph/ceph.pub
Adding key to root@localhost authorized_keys...
Adding host ceph141...
Deploying mon service with default placement...
Deploying mgr service with default placement...
Deploying crash service with default placement...
Deploying ceph-exporter service with default placement...
Deploying prometheus service with default placement...
Deploying grafana service with default placement...
Deploying node-exporter service with default placement...
Deploying alertmanager service with default placement...
Enabling the dashboard module...
Waiting for the mgr to restart...
Waiting for mgr epoch 9...
mgr epoch 9 is available
Generating a dashboard self-signed certificate...
Creating initial admin user...
Fetching dashboard port number...
Ceph Dashboard is now available at:
URL: https://ceph141:8443/
User: admin
Password: uc3h9g9mk3
Enabling client.admin keyring and conf on hosts with "admin" label
Saving cluster configuration to /var/lib/ceph/11e66474-0e02-11f0-82d6-4dcae3d59070/config directory
You can access the Ceph CLI as following in case of multi-cluster or non-default config:
sudo /usr/local/bin/cephadm shell --fsid 11e66474-0e02-11f0-82d6-4dcae3d59070 -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring
Or, if you are only running a single cluster on this host:
sudo /usr/local/bin/cephadm shell
Please consider enabling telemetry to help improve Ceph:
ceph telemetry on
For more information see:
https://docs.ceph.com/en/latest/mgr/telemetry/
Bootstrap complete.
[root@ceph141 ~]#
2.5 注意观察输出信息,记录dashboard账号信息
首次登录需要修改密码,建议密码为你的名字。
安装ceph集群出错解决思路
1.错误1
[root@ceph141 ~]# cephadm bootstrap --mon-ip 10.0.0.141 --cluster-network 10.0.0.0/24 --allow-fqdn-hostname
...
....
Pulling container image quay.io/ceph/ceph:v19...
Non-zero exit code 1 from /usr/bin/docker pull quay.io/ceph/ceph:v19
/usr/bin/docker: stderr Error response from daemon: Get "https://quay.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
Error: Failed command: /usr/bin/docker pull quay.io/ceph/ceph:v19
***************
Cephadm hit an issue during cluster installation. Current cluster files will be deleted automatically.
To disable this behaviour you can pass the --no-cleanup-on-failure flag. In case of any previous
broken installation, users must use the following command to completely delete the broken cluster:
> cephadm rm-cluster --force --zap-osds --fsid <fsid>
for more information please refer to https://docs.ceph.com/en/latest/cephadm/operations/#purging-a-cluster
***************
Deleting cluster with fsid: 6187194a-0e09-11f0-ba1d-5757ce4c8b6b
Traceback (most recent call last):
File "/usr/local/bin/cephadm/__main__.py", line 2628, in _rollback
File "/usr/local/bin/cephadm/__main__.py", line 446, in _default_image
File "/usr/local/bin/cephadm/__main__.py", line 2757, in command_bootstrap
File "/usr/local/bin/cephadm/__main__.py", line 1921, in _pull_image
cephadmlib.exceptions.Error: Failed command: /usr/bin/docker pull quay.io/ceph/ceph:v19
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3.10/runpy.py", line 196, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/lib/python3.10/runpy.py", line 86, in _run_code
exec(code, run_globals)
File "/usr/local/bin/cephadm/__main__.py", line 5581, in <module>
File "/usr/local/bin/cephadm/__main__.py", line 5569, in main
File "/usr/local/bin/cephadm/__main__.py", line 2657, in _rollback
File "/usr/local/bin/cephadm/__main__.py", line 4391, in _rm_cluster
File "/usr/local/bin/cephadm/__main__.py", line 4317, in get_ceph_cluster_count
FileNotFoundError: [Errno 2] No such file or directory: '/var/lib/ceph'
解决方案:
检查docker的代理的问题,网络问题。
[root@ceph141 ~]# ping baidu.com -c 3
PING baidu.com (110.242.68.66) 56(84) bytes of data.
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=1 ttl=128 time=27.8 ms
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=2 ttl=128 time=10.6 ms
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=3 ttl=128 time=11.0 ms
--- baidu.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 10.615/16.453/27.778/8.009 ms
[root@ceph141 ~]#
[root@ceph141 ~]# systemctl cat docker
# /lib/systemd/system/docker.service
[Unit]
Description=oldboyedu linux Docke Engine
Documentation=https://docs.docker.com,https://www.oldboyedu.com
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
# 配置docker代理,如果你的代理跟我不一致,自行修改即可,或者直接注释,导入我给的镜像就可以解决问题。
Environment="HTTP_PROXY=http://10.0.0.1:7890"
Environment="HTTPS_PROXY=http://10.0.0.1:7890"
[Install]
WantedBy=multi-user.target
[root@ceph141 ~]#
2.错误2
[root@ceph141 ~]# cephadm bootstrap --mon-ip 10.0.0.141 --cluster-network 10.0.0.0/24 --allow-fqdn-hostname
...
mgr not available, waiting (15/15)...
Error: mgr not available after 15 tries
***************
Cephadm hit an issue during cluster installation. Current cluster files will be deleted automatically.
To disable this behaviour you can pass the --no-cleanup-on-failure flag. In case of any previous
broken installation, users must use the following command to completely delete the broken cluster:
> cephadm rm-cluster --force --zap-osds --fsid <fsid>
for more information please refer to https://docs.ceph.com/en/latest/cephadm/operations/#purging-a-cluster
***************
Deleting cluster with fsid: 636554ee-0e08-11f0-80da-5f13f09f1517
ERROR: mgr not available after 15 tries
出现上述问题:
建议重新还原系统,再次安装测试,建议主机名,IP地址等信息和我的保持一致。
配置ceph集群的管理节点的两种方式
- 1.方式一:在宿主机安装ceph管理命令【推荐】
1.1 添加软件源
[root@ceph141 ~]# cephadm add-repo --release squid
Installing repo GPG key from https://download.ceph.com/keys/release.gpg...
Installing repo file at /etc/apt/sources.list.d/ceph.list...
Updating package list...
Completed adding repo.
[root@ceph141 ~]#
[root@ceph141 ~]# ll /etc/apt/sources.list.d/ceph.list
-rw-r--r-- 1 root root 55 Mar 31 16:38 /etc/apt/sources.list.d/ceph.list
[root@ceph141 ~]#
[root@ceph141 ~]# ll /etc/apt/trusted.gpg.d/ceph.release.gpg
-rw-r--r-- 1 root root 1143 Mar 31 16:38 /etc/apt/trusted.gpg.d/ceph.release.gpg
[root@ceph141 ~]#
[root@ceph141 ~]# ll /etc/ceph/
total 20
drwxr-xr-x 2 root root 4096 Mar 31 15:37 ./
drwxr-xr-x 130 root root 4096 Mar 31 15:30 ../
-rw------- 1 root root 151 Mar 31 15:37 ceph.client.admin.keyring
-rw-r--r-- 1 root root 171 Mar 31 15:37 ceph.conf
-rw-r--r-- 1 root root 595 Mar 31 15:33 ceph.pub
[root@ceph141 ~]#
[root@ceph141 ~]# sed -i 's#download.ceph.com#mirrors.tuna.tsinghua.edu.cn#' /etc/apt/sources.list.d/ceph.list
[root@ceph141 ~]#
[root@ceph141 ~]# cat /etc/apt/sources.list.d/ceph.list
deb https://mirrors.tuna.tsinghua.edu.cn/debian-squid/ jammy main
[root@ceph141 ~]#
推荐阅读:
https://mirrors.tuna.tsinghua.edu.cn/help/ceph/
1.2 安装ceph通用工具包
[root@ceph141 ~]# apt -y install ceph-common
1.3 测试使用
[root@ceph141 ~]# ceph version
ceph version 19.2.1 (58a7fab8be0a062d730ad7da874972fd3fba59fb) squid (stable)
[root@ceph141 ~]#
[root@ceph141 ~]# ceph -s
cluster:
id: 11e66474-0e02-11f0-82d6-4dcae3d59070
health: HEALTH_WARN
OSD count 0 < osd_pool_default_size 3
services:
mon: 1 daemons, quorum ceph141 (age 69m)
mgr: ceph141.mbakds(active, since 65m)
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
pgs:
[root@ceph141 ~]#
[root@ceph141 ~]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0 root default
[root@ceph141 ~]#
- 2.基于容器管理ceph集群
2.1 启动shell工具
[root@ceph141 ~]# cephadm shell
Inferring fsid 11e66474-0e02-11f0-82d6-4dcae3d59070
Inferring config /var/lib/ceph/11e66474-0e02-11f0-82d6-4dcae3d59070/mon.ceph141/config
Not using image 'sha256:f2efb0401a30ec7eda97b6da76b314bd081fcb910cc5dcd826bc7c72c9dfdd7d' as it's not in list of non-dangling images with ceph=True label
root@ceph141:/#
root@ceph141:/#
root@ceph141:/# ceph -s
cluster:
id: 11e66474-0e02-11f0-82d6-4dcae3d59070
health: HEALTH_WARN
OSD count 0 < osd_pool_default_size 3
services:
mon: 1 daemons, quorum ceph141 (age 71m)
mgr: ceph141.mbakds(active, since 67m)
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
pgs:
root@ceph141:/#
2.2 本质上是启动了一个容器【当命令执行结束时,容器会自动删除!】
[root@ceph141 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c72582492e3a quay.io/ceph/ceph:v19 "bash" 4 seconds ago Up 3 seconds blissful_proskuriakova
[root@ceph141 ~]#
ceph集群添加主机实战
- 1.扩容时准备操作
建议将docker和镜像重新从ceph141节点导入到ceph142和ceph143节点
- 2.查看现有的集群主机列表
[root@ceph141 ~]# ceph orch host ls
HOST ADDR LABELS STATUS
ceph141 10.0.0.141 _admin
1 hosts in cluster
[root@ceph141 ~]#
- 3.把秘钥放到其他服务器上
[root@ceph141 ~]# ssh-copy-id -f -i /etc/ceph/ceph.pub ceph142
[root@ceph141 ~]# ssh-copy-id -f -i /etc/ceph/ceph.pub ceph143
- 4.将秘钥节点加入到集群
[root@ceph141 ~]# ceph orch host add ceph142 10.0.0.142
Added host 'ceph142' with addr '10.0.0.142'
[root@ceph141 ~]#
[root@ceph141 ~]# ceph orch host add ceph143 10.0.0.143
Added host 'ceph143' with addr '10.0.0.143'
[root@ceph141 ~]#
温馨提示:
将集群加入成功后,会自动创建"/var/lib/ceph/<Ceph_Cluster_ID>"相关数据目录。
- 5.再次查看集群的主机列表
[root@ceph141 ~]# ceph orch host ls
HOST ADDR LABELS STATUS
ceph141 10.0.0.141 _admin
ceph142 10.0.0.142
ceph143 10.0.0.143
3 hosts in cluster
[root@ceph141 ~]#
- 6.通过查看WebUI观察ceph集群有多少个主机。
https://ceph141:8443/#/hosts
ceph集群移除主机实战
- 1.驱逐已经调度到节点的服务
[root@ceph141 ~]# ceph orch host drain ceph143
Scheduled to remove the following daemons from host 'ceph143'
type id
-------------------- ---------------
node-exporter ceph143
mon ceph143
ceph-exporter ceph143
crash ceph143
[root@ceph141 ~]#
- 2.驱逐后主机将被标记为不可调度
[root@ceph141 ~]# ceph orch host ls
HOST ADDR LABELS STATUS
ceph141 10.0.0.141 _admin
ceph142 10.0.0.142
ceph143 10.0.0.143 _no_schedule,_no_conf_keyring
3 hosts in cluster
[root@ceph141 ~]#
- 3.观察已经驱逐完毕
[root@ceph141 ~]# ceph orch host drain ceph143
Scheduled to remove the following daemons from host 'ceph143'
type id
-------------------- ---------------
[root@ceph141 ~]#
- 4.移除节点
[root@ceph141 ~]# ceph orch host rm ceph143
Removed host 'ceph143'
[root@ceph141 ~]#
[root@ceph141 ~]# ceph orch host ls
HOST ADDR LABELS STATUS
ceph141 10.0.0.141 _admin
ceph142 10.0.0.142
2 hosts in cluster
[root@ceph141 ~]#
- 5.删除数据,日志等一些列ceph相关的 数据【或者直接重新安装操作系统即可,避免数据泄露。推荐操作!】
[root@ceph143 ~]# ll /var/lib/ceph/
total 12
drwxr-xr-x 3 root root 4096 Mar 31 17:02 ./
drwxr-xr-x 62 root root 4096 Mar 31 17:02 ../
drwx------ 4 167 167 4096 Mar 31 17:08 11e66474-0e02-11f0-82d6-4dcae3d59070/
[root@ceph143 ~]#
[root@ceph143 ~]#
[root@ceph143 ~]# ll /var/log/ceph/
total 112
drwxr-xr-x 3 root root 4096 Mar 31 17:05 ./
drwxrwxr-x 10 root syslog 4096 Mar 31 17:02 ../
drwxrwx--- 2 167 167 4096 Mar 31 17:06 11e66474-0e02-11f0-82d6-4dcae3d59070/
-rw-r--r-- 1 root root 96321 Mar 31 17:09 cephadm.log
[root@ceph143 ~]#
彩蛋:为了实验效果,我还是将ceph143加回来
[root@ceph141 ~]# ceph orch host add ceph143 10.0.0.143
Added host 'ceph143' with addr '10.0.0.143'
[root@ceph141 ~]#
[root@ceph141 ~]# ceph orch host ls
HOST ADDR LABELS STATUS
ceph141 10.0.0.141 _admin
ceph142 10.0.0.142
ceph143 10.0.0.143
3 hosts in cluster
[root@ceph141 ~]#
添加OSD设备到ceph集群
- 1.添加OSD之前环境查看
1.1 查看集群可用的设备【每个设备想要加入到集群,则其大小不得小于5GB】
[root@ceph141 ~]# ceph orch device ls
HOST PATH TYPE DEVICE ID SIZE AVAILABLE REFRESHED REJECT REASONS
ceph141 /dev/sdb hdd 300G Yes 28m ago
ceph141 /dev/sdc hdd 500G Yes 28m ago
ceph141 /dev/sdd hdd 1024G Yes 28m ago
ceph141 /dev/sr0 hdd VMware_Virtual_SATA_CDRW_Drive_01000000000000000001 1023M No 28m ago Failed to determine if device is BlueStore, Insufficient space (<5GB)
ceph142 /dev/sdb hdd 300G Yes 3m ago
ceph142 /dev/sdc hdd 500G Yes 3m ago
ceph142 /dev/sdd hdd 1024G Yes 3m ago
ceph142 /dev/sr0 hdd VMware_Virtual_SATA_CDRW_Drive_01000000000000000001 1023M No 3m ago Failed to determine if device is BlueStore, Insufficient space (<5GB)
ceph143 /dev/sdb hdd 300G Yes 20m ago
ceph143 /dev/sdc hdd 500G Yes 20m ago
ceph143 /dev/sdd hdd 1024G Yes 20m ago
ceph143 /dev/sr0 hdd VMware_Virtual_SATA_CDRW_Drive_01000000000000000001 1023M No 20m ago Failed to determine if device is BlueStore, Insufficient space (<5GB)
[root@ceph141 ~]#
温馨提示:
如果一个设备想要加入ceph集群,要求满足2个条件:
- 1.设备未被使用;
- 2.设备的存储大小必须大于5GB;
- 3.需要等待一段时间,快则30s,慢则3分钟,线下教学有人笔记本性能不高甚至有等了25min或者40min才等出现设备结果;
如果想要快速显示,则可以在相应节点手动导入"quay.io/ceph/ceph"镜像即可。
1.2 查看各节点的空闲设备信息
[root@ceph141 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
...
sdb 8:16 0 300G 0 disk
sdc 8:32 0 500G 0 disk
sdd 8:48 0 1T 0 disk
...
[root@ceph141 ~]#
[root@ceph142 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
...
sdb 8:16 0 300G 0 disk
sdc 8:32 0 500G 0 disk
sdd 8:48 0 1T 0 disk
...
[root@ceph142 ~]#
[root@ceph143 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
...
sdb 8:16 0 300G 0 disk
sdc 8:32 0 500G 0 disk
sdd 8:48 0 1T 0 disk
...
[root@ceph143 ~]#
1.3 查看OSD列表
[root@ceph141 ~]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0 root default
[root@ceph141 ~]#
- 2.添加OSD设备到集群
2.1 添加ceph141节点的设备到ceph集群
[root@ceph141 ~]# ceph orch daemon add osd ceph141:/dev/sdb
Created osd(s) 0 on host 'ceph141'
[root@ceph141 ~]#
[root@ceph141 ~]# ceph orch daemon add osd ceph141:/dev/sdc
Created osd(s) 1 on host 'ceph141'
[root@ceph141 ~]#
[root@ceph141 ~]# ceph orch daemon add osd ceph141:/dev/sdd
Created osd(s) 2 on host 'ceph141'
[root@ceph141 ~]#
[root@ceph141 ~]#
[root@ceph141 ~]# ceph orch daemon add osd ceph142:/dev/sdb
Created osd(s) 3 on host 'ceph142'
[root@ceph141 ~]#
[root@ceph141 ~]# ceph orch daemon add osd ceph142:/dev/sdc
Created osd(s) 4 on host 'ceph142'
[root@ceph141 ~]#
[root@ceph141 ~]# ceph orch daemon add osd ceph142:/dev/sdd
Created osd(s) 5 on host 'ceph142'
[root@ceph141 ~]#
[root@ceph141 ~]# ceph orch daemon add osd ceph143:/dev/sdb
Created osd(s) 6 on host 'ceph143'
[root@ceph141 ~]#
[root@ceph141 ~]# ceph orch daemon add osd ceph143:/dev/sdc
Created osd(s) 7 on host 'ceph143'
[root@ceph141 ~]#
[root@ceph141 ~]# ceph orch daemon add osd ceph143:/dev/sdd
Created osd(s) 8 on host 'ceph143'
[root@ceph141 ~]#
温馨提示:
- 1.此步骤会在"/var/lib/ceph/<Ceph_Cluster_ID>/osd.<OSD_ID>/fsid"文件中记录对应ceph的OSD编号对应本地的磁盘设备标识。
- 2.比如查看ceph142节点的硬盘和OSD的对应关系如下:
[root@ceph142 ~]# ll -d /var/lib/ceph/3cb12fba-5f6e-11ef-b412-9d303a22b70f/osd.*
drwx------ 2 167 167 4096 Aug 21 15:18 /var/lib/ceph/3cb12fba-5f6e-11ef-b412-9d303a22b70f/osd.2/
drwx------ 2 167 167 4096 Aug 21 15:19 /var/lib/ceph/3cb12fba-5f6e-11ef-b412-9d303a22b70f/osd.3/
drwx------ 2 167 167 4096 Aug 21 15:22 /var/lib/ceph/3cb12fba-5f6e-11ef-b412-9d303a22b70f/osd.6/
[root@ceph142 ~]#
[root@ceph142 ~]# cat /var/lib/ceph/3cb12fba-5f6e-11ef-b412-9d303a22b70f/osd.*/fsid
68ff55fb-358a-4014-ba0e-075adb18c6d9
b9096186-53af-4ca0-b233-01fd913bdaba
d4ccefb2-5812-4ca2-97ca-9642ff4539f2
[root@ceph142 ~]#
[root@ceph142 ~]# lsblk # 不难发现,ceph底层是基于lvm技术磁盘的。
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
...
sdb 8:16 0 300G 0 disk
└─ceph--bb7e7dd0--d4e2--4da2--9cfb--da1dcd70222d-osd--block--68ff55fb--358a--4014--ba0e--075adb18c6d9
253:1 0 300G 0 lvm
sdc 8:32 0 500G 0 disk
└─ceph--5b511438--e561--456f--a33e--82bfc9c4abfd-osd--block--b9096186--53af--4ca0--b233--01fd913bdaba
253:2 0 500G 0 lvm
sdd 8:48 0 1000G 0 disk
└─ceph--0d9e77e1--051d--4ba6--8274--cfd85e213ab9-osd--block--d4ccefb2--5812--4ca2--97ca--9642ff4539f2
253:3 0 1000G 0 lvm
...
[root@ceph142 ~]#
LVM学习资料:
https://www.cnblogs.com/yinzhengjie/p/18594123
- 3.当然,也可以在dashboard中查看OSD信息
https://ceph141:8443/#/osd
- 4.测试ceph集群可用性
1.创建存储池
[root@ceph141 ~]# ceph osd pool create violet
pool 'violet' created
[root@ceph141 ~]#
[root@ceph141 ~]# ceph osd pool ls
.mgr
violet
[root@ceph141 ~]#
2.往存储池上传文件
[root@ceph141 ~]# rados put sys.txt /etc/os-release -p violet
3.查看存储池上传的文件
[root@ceph141 ~]# rados ls -p violet
sys.txt
[root@ceph141 ~]#
4.查看存储池文件的状态信息
[root@ceph141 ~]# rados -p violet stat sys.txt
yinzhengjie/sys.txt mtime 2025-03-31T18:02:49.000000+0800, size 427
[root@ceph141 ~]#
5.查看PG的副本在哪些OSD上
[root@ceph141 ~]# ceph osd map violet sys.txt # 不难发现,pg到三个副本分别在5,1,8的OSD节点哟~
osdmap e66 pool 'yinzhengjie' (2) object 'sys.txt' -> pg 2.486f5322 (2.2) -> up ([5,1,8], p5) acting ([5,1,8], p5)
[root@ceph141 ~]#
6.删除文件
[root@ceph141 ~]# rados -p violet rm sys.txt
[root@ceph141 ~]#
[root@ceph141 ~]# rados -p violet ls
[root@ceph141 ~]#
[root@ceph141 ~]# ceph osd map violet sys.txt # 删除文件后不难发现映射信息还在,那如何删除这些映射信息呢?我们后面会陆续讲解到。
osdmap e66 pool 'yinzhengjie' (2) object 'sys.txt' -> pg 2.486f5322 (2.2) -> up ([5,1,8], p5) acting ([5,1,8], p5)
[root@ceph141 ~]#
7.查看系统的使用量
[root@ceph141 ~]# rados df
POOL_NAME USED OBJECTS CLONES COPIES MISSING_ON_PRIMARY UNFOUND DEGRADED RD_OPS RD WR_OPS WR USED COMPR UNDER COMPR
.mgr 3.5 MiB 2 0 6 0 0 0 96 82 KiB 113 1.3 MiB 0 B 0 B
violet 0 B 0 0 0 0 0 0 1 0 B 1 0 B 0 B 0 B
total_objects 2
total_used 247 MiB
total_avail 5.3 TiB
total_space 5.3 TiB
[root@ceph141 ~]#
8.集群关键拍快照
[root@ceph141 ~]# init 0
[root@ceph142 ~]# init 0
[root@ceph143 ~]# init 0