文章 59
评论 0
浏览 30511
Ceph分布式存储

Ceph分布式存储

一、分布式存储概述

1.1 存储分类

单机存储

  • SCSI/SAS/USB/PCI-E、SSD/NVME(提升性能)

网络存储(带文件系统)

  • NFS/Samba/NAS
  • SAN:SAN(Storage Area Network,存储区域网络

块设备-块级别存储

ISCSI-Internet Small Computer System Interface(小型计算机系统接口,又称为 IP-SAN,是一种基于网络的的存储技术)

FC-SAN 单机磁盘的空间问题、IO 问题、高可用问题- 商业解决方案-EMC、NetAPP、戴尔、华为、浪潮

分布式存储

Ceph,TFS,FastDFS,MogileFS,MooseFS,GlusterFS

常见分布式存储对比:https://www.cnblogs.com/yswenli/p/7234579.html

服务分为读数据和写数据,读可以在任何一个节点读,但是写只能写在特定的节点,如 Redis 的 master、zookeeper 的 leader、MySQL 的master等场景。

1.2 数据分类及存储分类

数据分为元数据和数据:

分布式存储的实现: 元数据即是文件的属性信息(文件名、权限(属主、属组)、大小、更新时间等),元数据就是有一种路由机制,即当客户端或者应用程序产生的客户端数据被写入到分布式存储系统 的时候,会有一个服务(NameNode)提供文件元数据的路由功能,即告诉应用程序去哪个服务器去请求文件内容,然后再有(DataNode)提供数据的读写请求及数据的高可用功能。

传统的分布式存储

image-20210603184926042

块存储:需要格式化,将文件直接保存到磁盘上。

文件存储:提供数据存储的接口,是由操作系统针对块存储的应用,即由操作系统提供存储接口,应用程序通过调用操作系统将文件保存到块存储进行持久化。

对象存储:也称为基于对象的存储,其中的文件被拆分成多个部分并散布在多个存储服务器, 在对象存储中,数据会被分解为称为“对象”的离散单元,并保存在单个存储库中,而不是作为文件夹中的文件或服务器上的块来保存,对象存储需要一个简单的 HTTP 应用编程接 口 (API),以供大多数客户端(各种语言)使用。

三种存储redhat官方说明:https://www.redhat.com/zh/topics/data-storage/file-block-object-storage

Ceph存储

Ceph 是一个开源的分布式存储系统,包括对象存储、块设备、文件系统

Ceph 是一个对象(object)式存储系统,它把每一个待管理的数据流(文件等数据)切分为一到多个固定大小(默认 4 兆)的对象数据,并以其为原子单元(原子是构成元素的最小单元)完成数据的读写。 对象数据的底层存储服务是由多个存储主机(host)组成的存储集群,该集群也被称之为 RADOS(reliable automatic distributed object store)存储集群,即可靠的、自动化的、分布式的 对象存储系统。

librados 是 RADOS 存储集群的 API,支持 C/C++/JAVA/python/ruby/php 等编程语言客户端。

image-20210603185713911

1.3 Ceph架构

Pool:存储池、分区,存储池的大小取决于底层的存储空间。

PG(placement group):一个 pool内部可以有多个 PG 存在,pool 和 PG 都是抽象的逻辑一个 pool 中有多少个 PG 可以通过公式计算。

OSD(Object Storage Daemon):每一块磁盘叫做 osd,多个osd组成一个主机。

存储池要先创建才能往ceph 保存数据,文件在向 ceph 保存之前要先进行一致性 hash 计算, 计算后会把文件保存在某个对应的 PG 的,某个文件一定属于某个 pool 的 PG,在通过 PG 保存在 OSD 上。

数据对象在写到主 OSD 之后再同步到从 OSD 以实现数据的高可用。

image-20210603191233062

存储文件过程

第一步:把文件对象映射给 PG

第二步: 把文件对象映射给OSD

第三步:通过 OSD 写入到硬盘

监视器 mon 维护 OSD 和 PG 的集群状态

整个业务架构

image-20210603191826955

二、Ceph集群基础

2.1 Ceph集群角色

官方文档:https://docs.ceph.com/en/latest/start/intro/

中文文档:http://docs.ceph.org.cn/start/intro/

image-20210603194347500

一个ceph集群组成部分

若干的 Ceph OSD(对象存储守护程序)
至少需要一个 Ceph Monitors 监视器(1,3,5,7...)
两个或以上的 Ceph 管理器 managers,运行 Ceph 文件系统客户端时,还需要高可用的 CephMetadata Server(文件系统元数据服务器)。
RADOS cluster:由多台 host 存储服务器组成的 ceph 集群
OSD(Object Storage Daemon):每台存储服务器的磁盘组成的存储空间
Mon(Monitor):ceph 的监视器,维护 OSD 和 PG 的集群状态,一个 ceph 集群至少要有一个mon,可以是一三五七等等这样的奇数个。
Mgr(Manager):负责跟踪运行时指标和 Ceph 集群的当前状态,包括存储利用率,当前性能指标和系统负载等。

Monitor(ceph-mon):ceph 监视器

在一个主机上运行的一个守护进程,用于维护集群状态映射(maintains maps of the cluster state),比如 ceph 集群中有多少存储池、每个存储池有多少 PG 以及存储池和 PG 的映 射关系等, monitor map, manager map, the OSD map, the MDS map, and the CRUSH map,这些映射是 Ceph 守护程序相互协调所需的关键群集状态,此外监视器还负责管理守护程序和客户端之间的身份验证(认证使用 cephX 协议)。通常至少需要三个监视器才能实现冗余和高可用性。

Managers(ceph-mgr)的功能

在一个主机上运行的一个守护进程,Ceph Manager 守护程序(ceph-mgr)负责跟踪运行时指标和 Ceph 集群的当前状态,包括存储利用率,当前性能指标和系统负载。Ceph Manager 守护程序还托管基于 python 的模块来管理和公开 Ceph 集群信息,包括基于 Web 的 Ceph 仪表板和 REST API。高可用性通常至少需要两个管理器。

Ceph OSDs(对象存储守护程序 ceph-osd)

提供存储数据,一个磁盘就是一个 OSD,因此一个服务器的 OSD 不能超过磁盘的总数, OSD 用于处理 ceph 集群数据复制,恢复,重新平衡,并通过检查其他 Ceph OSD 守护程序的心跳来向 Ceph 监视器和管理器提供一些监视信息。通常至少需要 3 个 Ceph OSD 才能实现冗余和高可用性。

MDS(ceph 元数据服务器,ceph-mds)

代表 ceph文件系统(NFS/CIFS)存储元数据,(即 Ceph块设备和 Ceph对象存储不使用 MDS)

Ceph 的管理节点

  1. ceph 的常用管理接口是一组命令行工具程序,例如 rados、ceph、rbd 等命令,ceph 管理员可以从某个特定的 ceph-mon 节点执行管理操作
  2. 推荐使用部署专用的管理节点对 ceph 进行配置管理、升级与后期维护,方便后期权限管理,管理节点的权限只对管理人员开放,可以避免一些不必要的误操作的发生。

2.2 ceph 元数据保存方式

Ceph 对象数据的元数据信息放在哪里呢? 对象数据的元数据以 key-value 的形式存在,在 RADOS 中有两种实现:xattrs 和 omap

ceph可选后端支持多种存储引擎,比如 filestore,kvstore,memstore,目前是以 kvstore的形式存储对象数据的元数据信息。

2.2.1 xattrs(扩展属性)

是将元数据保存在对象对应文件的扩展属性中并保存到系统磁盘上,这要求支持对象存储的本地文件系统(一般是 XFS)支持扩展属性。

2.2.2 omap(object map 对象映射

omap:是 object map 的简称,是将元数据保存在本地文件系统之外的独立 key-value 存储系统中,在使用 filestore 时是 leveldb,在使用 bluestore 时是 rocksdb,由于 filestore 存在功能问题(需要将磁盘格式化为 XFS 格式)及元数据高可用问题等问题,因此在目前 ceph 主要使用 bluestore。

2.2.2.1 filestore 与 leveldb

ceph 早期基于 filestore 使用 google 的 levelDB 保存对象的元数据,LevelDb 是一个持久化存储的 KV 系统,和 Redis 这种内存型的 KV 系统不同,LevelDb 不会像 Redis 一样将数据放在内存从而占用大量的内存空间,而是将大部分数据存储到磁盘上,但是需要把磁盘上的 levelDB 空间格式化为文件系统(XFS)。

FileStore 将数据保存到与 Posix 兼容的文件系统(例如 Btrfs、XFS、Ext4)。在 Ceph 后端使用传统的 Linux 文件系统尽管提供了一些好处,但也有代价,如性能、 对象属性与磁盘本地文件系统属性匹配存在限制等。

filestore 数据写入的过程

  1. 先把要写入的数据全部封装成一个事务,其整理作为一条日志,写入日志磁盘(一般把日志放在 ssd 上提高性能),这个过程叫日志的提交(journal submit)。
  2. 把数据写入对象文件的磁盘中(也就是 OSD 的磁盘中),这个过程叫日志的应用(journal apply)。这个过程不一定写入磁盘,有可能缓存在本地文件系统的 page cache 中。 当系统在日志提交的过程中出错,系统重启后,直接丢弃不完整的日志条目,该条日志对应的实际对象数据并没有修改,数据保证了一致性。当日志在应用过程中出错,由于日志已写入到磁盘中,系统重启后,重放(replay)日志,这样保证新数据重新完整的写入,保证了数据的一致性。

filestore 日志的三个阶段

  • 日志的提交(journal submit):日志写入日志磁盘。
  • 日志的应用(journal apply):日志对应的修改更新到对象的磁盘文件中。这个过程不一定写入磁盘,有可能缓存在本地文件系统的 page cache 中。
  • 日志的同步(journal sync 或者 journal commit):确定日志对应的修改操作已经刷到磁盘中。

2.2.2.2 bluestore 与 rocksdb

由于 levelDB 依然需要需要磁盘文件系统的支持,后期 facebok 对 levelDB 进行改进为RocksDB https://github.com/facebook/rocksdb,RocksDB 将对象数据的元数据保存在 RocksDB,但是 RocksDB 的数据又放在哪里呢?放在内存怕丢失,放在本地磁盘但是解决不了高可用,ceph 对象数据放在了每个 OSD 中,那么就在在当前 OSD 中划分出一部分空间,格式化为 BlueFS 文件系统用于保存 RocksDB 中的元数据信息(称为 BlueStore),并实现元数据的高可用, BlueStore 最大的特点是构建在裸磁盘设备之上,并且对诸如 SSD 等新的存储设备做了很多优化工作。

对全 SSD 及全 NVMe SSD 闪存适配
绕过本地文件系统层,直接管理裸设备,缩短 IO 路径
严格分离元数据和数据,提高索引效率
使用 KV 索引,解决文件系统目录结构遍历效率低的问题
支持多种设备类型
解决日志“双写”问题
期望带来至少 2 倍的写性能提升和同等读性能
增加数据校验及数据压缩等功能

RocksDB 通过中间层 BlueRocksDB 访问文件系统的接口。这个文件系统与传统的 Linux 文件系统(例如 Ext4 和 XFS)是不同的,它不是在 VFS 下面的通用文件系统,而是一个用户态的逻辑。BlueFS 通过函数接口(API,非 POSIX)的方式为 BlueRocksDB 提供类似文件系统的能力

image-20210603200102147

个模块的作用

Allocator:负责裸设备的空间管理。

RocksDB:rocksdb 是 facebook 基于 leveldb 开发的一款 kv 数据库,BlueStore 将元数据全部存放至 RocksDB 中,这些元数据包括存储预写式日志、数据对象元数据、Ceph 的 omap 数据信息、以及分配器的元数据 

BlueRocksEnv:这是 RocksDB 与 BlueFS 交互的接口;RocksDB 提供了文件操作的接口EnvWrapper(Env 封装器),可以通过继承实现该接口来自定义底层的读写操作,BlueRocksEnv就是继承自 EnvWrapper 实现对 BlueFS 的读写

BlueFS:BlueFS是BlueStore针对RocksDB开发的轻量级文件系统,用于存放RocksDB产生的.sst和.log 等文件

BlockDecive:BlueStore 抛弃了传统的 ext4、xfs 文件系统,使用直接管理裸盘的方式;BlueStore支持同时使用多种不同类型的设备,在逻辑上 BlueStore 将存储空间划分为三层:慢速(Slow)空间、高速(DB)空间、超高速(WAL)空间,不同的空间可以指定使用不同的设备类型,当然也可使用同一块设备。

BlueStore 的设计考虑了 FileStore 中存在的一些硬伤,抛弃了传统的文件系统直接管理裸设备,缩短了 IO 路径,同时采用 ROW 的方式,避免了日志双写的问题,在写入性能上有了极大的提高。

2.3 CRUSH 算法简介

Ceph 使用 CURSH 算法来存放和管理数据,它是 Ceph 的智能数据分发机制。Ceph 使用 CRUSH 算法来准确计算数据应该被保存到哪里,以及应该从哪里读取,和保存元数据不同的是,CRUSH 按需计算出元数据,因此它就消除了对中心式的服务器/网关的需求,它使得 Ceph 客户端能够计算出元数据,该过程也称为 CRUSH 查找,然后和 OSD 直接通信。

  1. 如果是把对象直接映射到 OSD 之上会导致对象与 OSD 的对应关系过于紧密和耦合,当 OSD 由于故障发生变更时将会对整个 ceph 集群产生影响。
  2. 于是 ceph 将一个对象映射到 RADOS 集群的时候分为两步走:
  • 首先使用一致性 hash 算法将对象名称映射到 PG
  • 然后将 PG ID 基于 CRUSH 算法映射到 OSD 即可查到对象
  1. 以上两个过程都是以”实时计算”的方式完成,而没有使用传统的查询数据与块设备的对应表的方式,这样有效避免了组件的”中心化”问题,也解决了查询性能和冗余问题。使得 ceph 集群扩展不再受查询的性能限制。
  2. 这个实时计算操作使用的就是 CRUSH 算法
  • Controllers replication under scalable hashing #可控的、可复制的、可伸缩的一致性 hash 算法。
  • CRUSH 是一种分布式算法,类似于一致性 hash 算法,用于为 RADOS 存储集群控制数据的分配。

三、部署ceph

github官方地址:https://github.com/ceph/ceph

官方地址:https://ceph.io/

中文官方地址:http://docs.ceph.org.cn/start/intro/

部署方式

ceph-ansible:https://github.com/ceph/ceph-ansible #python

ceph-salt:https://github.com/ceph/ceph-salt #python

ceph-container:https://github.com/ceph/ceph-container #shell

ceph-chef:https://github.com/ceph/ceph-chef #Ruby

ceph-deploy:https://github.com/ceph/ceph-deploy #python

ceph-deploy是一个 ceph 官方维护的基于 ceph-deploy 命令行部署 ceph 集群的工具,基于 ssh 执行可以 sudo 权限的 shell 命令以及一些 python 脚本实现 ceph 集群的部署和管理维护

Ceph-deploy 只用于部署和管理 ceph 集群,客户端需要访问 ceph,需要部署客户端工

3.1 服务环境准备

  • 三台服务器作为 ceph 集群 OSD 存储服务器,每台服务器支持两个网络,public 网络针对客户端访问,cluster网络用于集群管理及数据同步,每台三块或以上的磁盘
192.168.10.71/172.16.10.71
192.168.10.72/172.16.10.72
192.168.10.73/172.16.10.73

挂载三块磁盘

#生产环境推荐使用配置
	2个万兆网卡
	SSD硬盘
	64G或以上内存
	CPU 2* 2640 v4
  • 三台服务器作为 ceph 集群 Mon 监视服务器,每台服务器可以和 ceph 集群的 cluster 网络通信。
192.168.10.71/172.16.10.71
192.168.10.72/172.16.10.72
192.168.10.73/172.16.10.73

#我这里模拟跟OSD共用一台机器

#生产环境推荐配置
	8C 16G 磁盘200G以上 虚拟机,但是底层网卡推荐物理网卡
  • 两个 ceph-mgr 管理服务器,可以和 ceph 集群的 cluster 网络通信
192.168.10.71/172.16.10.71
192.168.10.72/172.16.10.72

#我这里模拟跟OSD共用一台机器

#生产环境推荐配置
	8C 16G 磁盘200G以上 虚拟机,但是底层网卡推荐物理网卡
  • 一个服务器用于部署 ceph 集群即安装 Ceph-deploy,也可以和 ceph-mgr 等复用
192.168.10.74/172.16.10.74

#生产环境推荐配置
	推荐安装在新的节点后期用来管理ceph集群
	配置根据自己实际情况配置

创建一个普通用户,能够通过 sudo 执行特权命令,配置主机名解析,ceph 集群依赖于主机名,关闭各服务器防火墙、selinux

拓扑图如下

image-20210603204603247

3.2 部署 RADOS集群

https://mirrors.aliyun.com/ceph/ #阿里云镜像仓库

http://mirrors.163.com/ceph/ #网易镜像仓库

https://mirrors.tuna.tsinghua.edu.cn/ceph/ #清华大学镜像源

3.2.1 仓库准备

各节点配置 ceph yum 仓库,这里配置mimic版本

[21:18:16 root@centos7 ~]#yum install https://mirror.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/noarch/ceph-release-1-1.el7.noarch.rpm
#修改yum文件,地址指向清华源
[21:28:47 root@centos7 ~]#cat /etc/yum.repos.d/ceph.repo 
[Ceph]
name=Ceph packages for $basearch
baseurl=https://mirror.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirror.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

[ceph-source]
name=Ceph source packages
baseurl=https://mirror.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

#配置epel源,如果不配置会导致后面安装无法解决依赖

3.2.2 创建 ceph 用户

推荐使用指定的普通用户部署和运行 ceph 集群,普通用户只要能以非交互方式执行 sudo 命 令执行一些特权命令即可,新版的 ceph-deploy 可以指定包含 root 的在内只要可以执行 sudo 命令的用户,不过仍然推荐使用普通用户,比如 ceph、cephuser、cephadmin 这样的用户去 管理 ceph 集群。

在包含 ceph-deploy 节点的存储节点、mon 节点和 mgr节点等创建ceph用户

#创建用户
[21:30:30 root@centos7 ~]#groupadd ceph -g 2020 && useradd -u 2020 -g 2020 ceph && echo "123456" | passwd --stdin ceph

#允许ceph用户以sudo执行特权命令
[21:34:11 root@centos7 ~]#vim /etc/sudoers
root    ALL=(ALL)   ALL
ceph    ALL=(ALL)   NOPASSWD:ALL

#配置免密登录
在ceph-deploy节点配置允许以非交互的方式登录到各 ceph node/mon/mgr 节点,即在ceph-deployment 节点生成秘钥对,然后分发公钥到各被管理节点
[21:35:19 root@ceph-deploy ~]#su - ceph 
[ceph@ceph-deploy ~]$ ssh-keygen
[ceph@ceph-deploy ~]$ ssh-copy-id ceph@192.168.10.71
[ceph@ceph-deploy ~]$ ssh-copy-id ceph@192.168.10.72
[ceph@ceph-deploy ~]$ ssh-copy-id ceph@192.168.10.73

3.2.3 配置主机名解析

所有主机配置

[21:39:30 root@ceph-deploy ~]#cat /etc/hosts
192.168.10.71 ceph-node1.zhangzhuo.org ceph-node1
192.168.10.72 ceph-node2.zhangzhuo.org ceph-node2
192.168.10.73 ceph-node3.zhangzhuo.org ceph-node3
192.168.10.74 ceph-deploy.zhangzhuo.org ceph-deploy

3.2.4 安装 ceph 部署工具

在 ceph 部署服务器安装部署工具 ceph-deploy

[ceph@ceph-deploy ~]$ sudo yum install ceph-deploy python-setuptools python2-subprocess3

3.2.4.1 ceph-deploy命令介绍

中文说明文档:http://docs.ceph.org.cn/man/8/ceph-deploy/

[ceph@ceph-deploy ~]$ ceph-deploy --help
new: 开始部署一个新的ceph存储集群,并生成CLUSTER.conf集群配置文件和keyring认证文件
install: 在远程主机上安装ceph相关的软件包,可以通过--release指定安装的版本
rgw: 管理RGW守护程序(RADOSGW,对象存储网关)
mgr: 管理MGR守护程序(ceph-mgr管理器守护程序)
mds: 管理MDS守护程序(ceph metadata Server,ceph源数据服务器)
mon: 管理mon守护程序(ceph-mon,ceph监视器)
gatherkeys: 从指定获取提供新节点的验证keys,这些keys会在添加新的MON/OSD/MD加入的时候使用
disk: 管理远程主机磁盘
osd: 在远程主机准备数据磁盘,即将指定远程主机的指定磁盘添加到ceph集群作为osd使用
repo: 远程主机仓库管理。
admin: 推送ceph集群配置文件和client.admin认证文件到远程主机
config: 将ceph.conf配置文件推送到远程主机或从远程主机拷贝
uninstall: 从远程主机删除安装包
purgedata: 从/var/lib/ceph删除ceph数据,会删除/etc/ceph下的内容
purge: 删除远端主机的安装包和所有数据
forgetkeys: 从本地主机删除所有验证keyring,包括client.admin,monitor,bootstrap等认证文件
pkg: 管理远端主机的安装包
calamari: 安装配置一个calamari web节点,calamari是一个web监控平台

3.2.5 初始化 mon 节点

在管理节点初始化 mon 节点

#创建一个目录
[ceph@ceph-deploy ~]$ mkdir ceph-cluster
[ceph@ceph-deploy ~]$ cd ceph-cluster/
#初始化mon
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy new --cluster-network 192.168.10.0/24 --public-network 172.16.10.0/24 ceph-node1.zhangzhuo.org

--cluster-network #集群同步数据的网段
--public-network  #客户端访问的网段

#验证初始化
[ceph@ceph-deploy ceph-cluster]$ ll
total 16
-rw-rw-r-- 1 ceph ceph  266 Jun  3 22:15 ceph.conf  #自动生成的配置文件
-rw-rw-r-- 1 ceph ceph 4209 Jun  3 22:15 ceph-deploy-ceph.log   #初始化日志
-rw------- 1 ceph ceph   73 Jun  3 22:15 ceph.mon.keyring  #用于ceph mon 节点内部通讯认证的秘钥环文件
[ceph@ceph-deploy ceph-cluster]$ cat ceph.conf 
[global]
fsid = 613e7f7c-57fe-4f54-af43-9d88ab1b861b
public_network = 172.16.10.0/24
cluster_network = 192.168.10.0/24
mon_initial_members = ceph-node1  #可以用逗号做分割添加多个mon节点
mon_host = 172.16.10.71
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

3.2.6 初始化 ceph 存储节点

初始化存储节点等于在存储节点安装了 ceph 及 ceph-rodsgw 安装包,但是使用默认的官方仓库会因为网络原因导致初始化超时,因此推荐修改 ceph 仓库为阿里或者清华等国内的镜像源

[ceph@ceph-deploy ceph-cluster]$ ceph-deploy install --no-adjust-repos --nogpgcheck ceph-node1 ceph-node2 ceph-node3

--no-adjust-repos  #不更新源,如果更新源还会使用默认官方源会导致超时失败
--nogpgcheck       #不验证rpm包

此过程会在每个节点并且是按照串行的方式逐个服务器安装 epel 源和 ceph 源并按安装 ceph ceph-radosgw

3.2.7 配置 mon 节点并收集密钥

通过读取当前目录下的 ceph.conf 配置文件初始化 mon 节点,mon 节点 ha 还可以后期横向扩容。

#手动在node1安装mon
[09:02:26 root@ceph-node1 ~]#yum install ceph-mon -y
#初始化
[ceph@ceph-deploy ceph-cluster]$ pwd
/home/ceph/ceph-cluster
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy mon create-initial
[ceph_deploy.gatherkeys][INFO  ] Storing ceph.client.admin.keyring
[ceph_deploy.gatherkeys][INFO  ] Storing ceph.bootstrap-mds.keyring
[ceph_deploy.gatherkeys][INFO  ] Storing ceph.bootstrap-mgr.keyring
[ceph_deploy.gatherkeys][INFO  ] keyring 'ceph.mon.keyring' already exists
[ceph_deploy.gatherkeys][INFO  ] Storing ceph.bootstrap-osd.keyring
[ceph_deploy.gatherkeys][INFO  ] Storing ceph.bootstrap-rgw.keyring
[ceph_deploy.gatherkeys][INFO  ] Destroy temp directory /tmp/tmpGNsV_Q

#验证mon节点
验证在指定节点已经自动配置并启动了 ceph-mon 服务,并且在初始化当前目录会生成一些bootstrap ceph mds/mgr/osd/rgw 的 keyring 认证文件,这些初始化文件拥有对 ceph 集群的最高权限,所以一定要保存好。
[09:02:26 root@ceph-node1 ~]#ps -ef | grep ceph-mon
ceph       29363       1  0 09:03 ?        00:00:00 /usr/bin/ceph-mon -f --cluster ceph --id ceph-node1 --setuser ceph --setgroup ceph
[ceph@ceph-deploy ceph-cluster]$ ll
total 284
-rw------- 1 ceph ceph    113 Jun  4 09:03 ceph.bootstrap-mds.keyring
-rw------- 1 ceph ceph    113 Jun  4 09:03 ceph.bootstrap-mgr.keyring
-rw------- 1 ceph ceph    113 Jun  4 09:03 ceph.bootstrap-osd.keyring
-rw------- 1 ceph ceph    113 Jun  4 09:03 ceph.bootstrap-rgw.keyring
-rw------- 1 ceph ceph    151 Jun  4 09:03 ceph.client.admin.keyring
-rw-rw-r-- 1 ceph ceph    266 Jun  3 22:15 ceph.conf
-rw-rw-r-- 1 ceph ceph 180804 Jun  4 09:03 ceph-deploy-ceph.log
-rw------- 1 ceph ceph     73 Jun  3 22:15 ceph.mon.keyring

3.2.8 分发 admin 秘钥

把配置文件和 admin 密钥拷贝至 Ceph 集群需要执行 ceph 管理命令的节点,从而不需要后期通过 ceph 命令访问与对 ceph 集群进行管理配置的时候每次都需要指定 ceph-mon 节点地址和 ceph.client.admin.keyring 文件

[ceph@ceph-deploy ceph-cluster]$ ceph-deploy admin ceph-node1 ceph-node2 ceph-node3

#ceph节点验证密钥
[09:06:04 root@ceph-node1 ~]#ll /etc/ceph/
total 12
-rw------- 1 root root 151 Jun  4 09:08 ceph.client.admin.keyring
-rw-r--r-- 1 root root 266 Jun  4 09:08 ceph.conf
-rw-r--r-- 1 root root  92 Apr 24  2020 rbdmap
-rw------- 1 root root   0 Jun  4 09:03 tmpprMTEe

#认证文件的属主和属组为了安全考虑,默认设置为了 root 用户和 root 组,如果需要ceph用户也能执行ceph命令,那么就需要对ceph用户进行授权
[09:08:54 root@ceph-node1 ~]#setfacl -m u:ceph:rw /etc/ceph/ceph.client.admin.keyring 
[09:10:37 root@ceph-node2 ~]#setfacl -m u:ceph:rw /etc/ceph/ceph.client.admin.keyring
[22:24:02 root@ceph-node3 ~]#setfacl -m u:ceph:rw /etc/ceph/ceph.client.admin.keyring

3.2.9 配置manager节点

ceph 的 Luminious 及以上版本有 manager 节点,早期的版本没有。

部署ceph-mgr

mgr 节点需要读取 ceph 的配置文件,即/etc/ceph 目录中的配置文件

[ceph@ceph-deploy ceph-cluster]$ ceph-deploy mgr --help
usage: ceph-deploy mgr [-h] {create} ...

Ceph MGR daemon management

positional arguments:
  {create}
    create    Deploy Ceph MGR on remote host(s)

optional arguments:
  -h, --help  show this help message and exit

#初始化ceph-mgr节点
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy mgr create ceph-node1 ceph-node2 ceph-node3

#验证ceph-mgr
[10:34:21 root@ceph-node1 ~]#ps -ef | grep ceph-mgr
ceph       29820       1  1 10:34 ?        00:00:01 /usr/bin/ceph-mgr -f --cluster ceph --id ceph-node1 --setuser ceph --setgroup ceph

3.2.10 ceph-deploy 管理 ceph 集群

在 ceph-deploy 节点配置一下系统环境,以方便后期可以执行 ceph 管理命令。

[ceph@ceph-deploy ceph-cluster]$ sudo yum install ceph-common
#推送正证书给自己
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy admin ceph-deploy
 #授权
 [ceph@ceph-deploy ceph-cluster]$ sudo setfacl -m u:ceph:rw /etc/ceph/ceph.client.admin.keyring

#测试ceph命令
[ceph@ceph-deploy ceph-cluster]$ ceph -s
  cluster:
    id:     613e7f7c-57fe-4f54-af43-9d88ab1b861b
    health: HEALTH_WARN
            OSD count 0 < osd_pool_default_size 3
 
  services:
    mon: 1 daemons, quorum ceph-node1
    mgr: ceph-node1(active), standbys: ceph-node2, ceph-node3
    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:   

3.2.11 准备 OSD 节点

#列出 ceph node 节点磁盘
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk list ceph-node1
[ceph-node1][INFO  ] Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
[ceph-node1][INFO  ] Disk /dev/sdb: 32.2 GB, 32212254720 bytes, 62914560 sectors
[ceph-node1][INFO  ] Disk /dev/sdd: 32.2 GB, 32212254720 bytes, 62914560 sectors
[ceph-node1][INFO  ] Disk /dev/sdc: 32.2 GB, 32212254720 bytes, 62914560 sectors

#使用擦除各 ceph node的ceph数据盘
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap ceph-node1 /dev/sdb
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap ceph-node1 /dev/sdc
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap ceph-node1 /dev/sdd

[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap ceph-node2 /dev/sdb
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap ceph-node2 /dev/sdc
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap ceph-node2 /dev/sdd

[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap ceph-node3 /dev/sdb
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap ceph-node3 /dev/sdc
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy disk zap ceph-node3 /dev/sdd

3.2.12 添加OSD

数据分类保存方式

  • Data:即 ceph 保存的对象数据
  • Block: rocks DB 数据即元数据
  • block-wal:数据库的 wal 日志
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create ceph-node1 --data /dev/sdb
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create ceph-node1 --data /dev/sdc
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create ceph-node1 --data /dev/sdd

[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create ceph-node2 --data /dev/sdb
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create ceph-node2 --data /dev/sdc
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create ceph-node2 --data /dev/sdd

[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create ceph-node3 --data /dev/sdb
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create ceph-node3 --data /dev/sdc
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy osd create ceph-node3 --data /dev/sdd


#验证,每个磁盘都会有一个osd进程每个磁盘都有一个不同的ID,每个ID对应一个磁盘
[10:53:03 root@ceph-node1 ~]#ps -ef | grep osd
ceph       30734       1  0 11:00 ?        00:00:00 /usr/bin/ceph-osd -f --cluster ceph --id 0 --setuser ceph --setgroup ceph
ceph       31276       1  0 11:01 ?        00:00:00 /usr/bin/ceph-osd -f --cluster ceph --id 1 --setuser ceph --setgroup ceph
ceph       31801       1  2 11:02 ?        00:00:00 /usr/bin/ceph-osd -f --cluster ceph --id 2 --setuser ceph --setgroup ceph

设置SOD服务自启动

[13:29:47 root@ceph-node1 ~]#systemctl enable ceph-osd@0 ceph-osd@1 ceph-osd@2
[11:07:38 root@ceph-node2 ~]#systemctl enable ceph-osd@3 ceph-osd@4 ceph-osd@5
[13:30:22 root@ceph-node2 ~]#systemctl enable ceph-osd@6 ceph-osd@7 ceph-osd@8

验证ceph集群

[ceph@ceph-deploy ceph-cluster]$ ceph -s
  cluster:
    id:     613e7f7c-57fe-4f54-af43-9d88ab1b861b   #集群ID
    health: HEALTH_OK                              #集群当前状态
 
  services:
    mon: 1 daemons, quorum ceph-node1               #mon节点
    mgr: ceph-node1(active), standbys: ceph-node2, ceph-node3  #mgr节点
    osd: 9 osds: 9 up, 9 in                         #osd节点信息
 
  data:
    pools:   0 pools, 0 pgs                    #pool信息
    objects: 0  objects, 0 B                   #objects信息一个objects默认4M
    usage:   9.0 GiB used, 261 GiB / 270 GiB avail  #总磁盘空间
    pgs:                                       

3.2.13 从 RADOS 移除OSD

Ceph 集群中的一个 OSD 是一个 node 节点的服务进程且对应于一个物理磁盘设备,是一个专用的守护进程。在某 OSD 设备出现故障,或管理员出于管理之需确实要移除特定的 OSD 设备时,需要先停止相关的守护进程,而后再进行移除操作。对于 Luminous 及其之后的版本来说,停止和移除命令的格式分别如下所示:

1. 停用设备:ceph osd out {osd-num}
2. 停止进程:sudo systemctl stop ceph-osd@{osd-num}
3. 移除设备:ceph osd purge {id} --yes-i-really-mean-it

若类似如下的 OSD 的配置信息存在于 ceph.conf 配置文件中,管理员在删除 OSD 之后手动将其删除。

不过,对于 Luminous 之前的版本来说,管理员需要依次手动执行如下步骤删除 OSD 设备

1. 于 CRUSH 运行图中移除设备:ceph osd crush remove {name}
2. 移除 OSD 的认证 key:ceph auth del osd.{osd-num}
3. 最后移除 OSD 设备:ceph osd rm {osd-num}

3.2.14 测试上传与下载数据

存取数据时,客户端必须首先连接至 RADOS 集群上某存储池,然后根据对象名称由相关的 CRUSH 规则完成数据对象寻址。于是,为了测试集群的数据存取功能,这里首先创建一个用于测试的存储池,并设定其 PG 数量为 16 个

#创建pool
[ceph@ceph-deploy ceph-cluster]$ ceph osd pool create zhang 16 16
pool 'zhang' created

#查看创建的pool
[ceph@ceph-deploy ceph-cluster]$ ceph osd pool ls
zhang


#当前的 ceph 环境还没还没有部署使用块存储和文件系统使用 ceph,也没有使用对象存储的客户端,但是 ceph 的 rados 命令可以实现访问 ceph 对象存储的功能

#上传文件
[ceph@ceph-deploy ceph-cluster]$ sudo rados put log /var/log/messages --pool=zhang
messages文件上传到 zhang 并指定对象 id 为 log

#列出文件
[ceph@ceph-deploy ceph-cluster]$ rados ls --pool=zhang
log

#文件信息查看
#ceph osd map 命令可以获取到存储池中数据对象的具体位置信息
[ceph@ceph-deploy ceph-cluster]$ ceph osd map zhang log
osdmap e41 pool 'zhang' (1) object 'log' -> pg 1.27e9d53e (1.e) -> up ([4,2,8], p4) acting ([4,2,8], p4)
表示文件放在了存储池为 1 的 27e9d53e 的 PG 上,在线的 OSD 编号 4,2,8,主 OSD 为 4,活
动的 OSD 4,2,8,表示数据放在了 3 个副本,是 ceph 的 crush 算法计算出三份数据保存在哪
些 OSD

#下载文件
[13:56:57 root@ceph-node3 ~]#sudo rados get log --pool=zhang /opt/1.txt
[13:57:06 root@ceph-node3 ~]#tail /opt/1.txt
Jun  4 11:01:01 centos7 systemd: Started Session 18 of user root.
Jun  4 12:01:01 centos7 systemd: Started Session 19 of user root.
Jun  4 13:01:01 centos7 systemd: Started Session 20 of user root.

#修改文件
[13:57:19 root@ceph-node3 ~]#sudo rados put log /etc/passwd --pool=zhang
[ceph@ceph-deploy ceph-cluster]$ sudo rados get log --pool=zhang /opt/1.txt
[ceph@ceph-deploy ceph-cluster]$ tail /opt/1.txt
polkitd:x:999:998:User for polkitd:/:/sbin/nologin

#删除文件
[ceph@ceph-deploy ceph-cluster]$ sudo rados rm log --pool=zhang
[ceph@ceph-deploy ceph-cluster]$ rados ls --pool=zhang

3.3 扩展ceph集群

3.3.1 扩展ceph-mon节点

Ceph-mon 是原生具备自选举以实现高可用机制的 ceph 服务,节点数量通常是奇数

[14:02:33 root@ceph-node2 ~]#yum install ceph-common ceph-mon
[14:03:52 root@ceph-node3 ~]#yum install ceph-common ceph-mon

[ceph@ceph-deploy ceph-cluster]$ ceph-deploy mon add ceph-node2
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy mon add ceph-node3

验证集群状态

[ceph@ceph-deploy ceph-cluster]$ ceph quorum_status 
[ceph@ceph-deploy ceph-cluster]$ ceph quorum_status --format json-pretty

{
    "election_epoch": 12,
    "quorum": [
        0,
        1,
        2
    ],
    "quorum_names": [
        "ceph-node1",
        "ceph-node2",
        "ceph-node3"
    ],
    "quorum_leader_name": "ceph-node1",
    "monmap": {
        "epoch": 3,
        "fsid": "613e7f7c-57fe-4f54-af43-9d88ab1b861b",
        "modified": "2021-06-04 14:04:15.545839",
        "created": "2021-06-04 09:03:21.201516",
        "features": {
            "persistent": [
                "kraken",
                "luminous",
                "mimic",
                "osdmap-prune"
            ],
            "optional": []
        },
        "mons": [
            {
                "rank": 0,
                "name": "ceph-node1",
                "addr": "172.16.10.71:6789/0",
                "public_addr": "172.16.10.71:6789/0"
            },
            {
                "rank": 1,
                "name": "ceph-node2",
                "addr": "172.16.10.72:6789/0",
                "public_addr": "172.16.10.72:6789/0"
            },
            {
                "rank": 2,
                "name": "ceph-node3",
                "addr": "172.16.10.73:6789/0",
                "public_addr": "172.16.10.73:6789/0"
            }
        ]
    }
}
[ceph@ceph-deploy ceph-cluster]$ ceph -s
  cluster:
    id:     613e7f7c-57fe-4f54-af43-9d88ab1b861b
    health: HEALTH_WARN
            too few PGs per OSD (5 < min 30)
 
  services:
    mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3
    mgr: ceph-node1(active), standbys: ceph-node2, ceph-node3
    osd: 9 osds: 9 up, 9 in
 
  data:
    pools:   1 pools, 16 pgs
    objects: 0  objects, 0 B
    usage:   9.0 GiB used, 261 GiB / 270 GiB avail
    pgs:     16 active+clean

3.3.2 扩展 mgr 节点

[14:09:09 root@ceph-node3 ~]#yum install ceph-mgr

[ceph@ceph-deploy ceph-cluster]$ ceph-deploy mgr create ceph-node3
#同步配置文件
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy admin ceph-node3

验证状态

#集群状态
[ceph@ceph-deploy ceph-cluster]$ ceph -s
  cluster:
    id:     613e7f7c-57fe-4f54-af43-9d88ab1b861b
    health: HEALTH_WARN
            too few PGs per OSD (5 < min 30)
 
  services:
    mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3
    mgr: ceph-node1(active), standbys: ceph-node2, ceph-node3
    osd: 9 osds: 9 up, 9 in
 
  data:
    pools:   1 pools, 16 pgs
    objects: 0  objects, 0 B
    usage:   9.0 GiB used, 261 GiB / 270 GiB avail
    pgs:     16 active+clean
#集群磁盘使用状态
[ceph@ceph-deploy ceph-cluster]$ ceph df
GLOBAL:   #全局
    SIZE        AVAIL       RAW USED     %RAW USED 
    270 GiB     261 GiB      9.1 GiB          3.36 
POOLS:   #pool
    NAME      ID     USED      %USED     MAX AVAIL     OBJECTS 
    zhang     1        0 B         0        82 GiB           0 
    rdb1      2      405 B         0        82 GiB           7 
#一般可使用的磁盘空间为所有磁盘空间加起来除以3所得的才是ceph集群可以使用的存储空间,主要一份数据需要备份俩份

四、ceph集群应用基础

4.1 块设备 RBD

RBD(RADOS Block Devices)即为块存储的一种,RBD 通过 librbd 库与 OSD 进行交互。RBD 为 KVM 等虚拟化技术和云服务(如 OpenStack 和 CloudStack)提供高性能和无限可扩展性的存储后端,这些系统依赖于 libvirt 和 QEMU 实用程序与 RBD 进行集成。客户端基于 librbd 库即可将 RADOS 存储集群用作块设备,不过,用于 rbd 的存储池需要事先启用 rbd 功能并进行初始化。例如,下面的命令创建一个名为 myrbd1 的存储池,并在启用 rbd 功能后对其进行初始化

4.1.1 创建RBD

#创建存储池,指定 pg 和 pgp 的数量,pgp 用于在 pg 故障时归档 pg 的数据,因此 pgp 通常等于 pg 的值
[ceph@ceph-deploy ceph-cluster]$ ceph osd pool create rdb1 64 64
pool 'rdb1' created

#对存储池启用RBD功能
[ceph@ceph-deploy ceph-cluster]$ ceph osd pool application enable rdb1 rbd
enabled application 'rbd' on pool 'rdb1'

#通过 RBD 命令对存储池初始化
[ceph@ceph-deploy ceph-cluster]$ rbd pool init -p rdb1

4.1.2 创建并验证img

不过,rbd 存储池并不能直接用于块设备,而是需要事先在其中按需创建映像(image), 并把映像文件作为块设备使用。rbd 命令可用于创建、查看及删除块设备相在的映像(image),以及克隆映像、创建快照、将映像回滚到快照和查看快照等管理操作。例如,下面的命令能 够创建一个名为 zhangzhuo的映像

#创建默认参数的rbd,默认开启的特性有可能导致内核版本低的系统无法挂载
[ceph@ceph-deploy ceph-cluster]$ rbd create zhangzhuo --size 5G --pool rdb1

#创建指定的特性的rbd
[ceph@ceph-deploy ceph-cluster]$ rbd create zhangzhuo1 --size 1G --pool rdb1 --image-format 2 --image-feature layering
--image-format #镜像格式
--image-feature #特性

#列出指定pool中所有的img
[ceph@ceph-deploy ceph-cluster]$ rbd ls --pool rdb1
zhangzhuo
zhangzhuo1

#查看指定 rdb 的信息
[ceph@ceph-deploy ceph-cluster]$ rbd --image zhangzhuo --pool rdb1 info
rbd image 'zhangzhuo':
	size 5 GiB in 1280 objects
	order 22 (4 MiB objects)
	id: 10ce6b8b4567
	block_name_prefix: rbd_data.10ce6b8b4567
	format: 2
	features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
	op_features: 
	flags: 
	create_timestamp: Fri Jun  4 15:19:33 2021
[ceph@ceph-deploy ceph-cluster]$ rbd --image zhangzhuo1 --pool rdb1 info
rbd image 'zhangzhuo1':
	size 1 GiB in 256 objects
	order 22 (4 MiB objects)
	id: 10d46b8b4567
	block_name_prefix: rbd_data.10d46b8b4567
	format: 2
	features: layering
	op_features: 
	flags: 
	create_timestamp: Fri Jun  4 15:23:15 2021

4.1.3 客户端使用块存储

#当前ceph状态
[ceph@ceph-deploy ceph-cluster]$ ceph df
GLOBAL:
    SIZE        AVAIL       RAW USED     %RAW USED 
    270 GiB     261 GiB      9.1 GiB          3.36 
POOLS:
    NAME      ID     USED      %USED     MAX AVAIL     OBJECTS 
    zhang     1        0 B         0        82 GiB           0 
    rdb1      2      405 B         0        82 GiB           7 

#在客户端安装ceph-common
配置 yum 源及认证文件
[15:42:52 root@ubuntu18-04 netplan]#apt install ceph-common
#从部署服务器同步认证文件
[ceph@ceph-deploy ceph-cluster]$ scp ceph.conf ceph.client.admin.keyring root@172.16.10.181:/etc/ceph
#验证
[15:45:03 root@ubuntu18-04 netplan]#ls /etc/ceph/
ceph.client.admin.keyring  ceph.conf  rbdmap

#客户端映射img
[15:47:46 root@ubuntu18-04 netplan]#rbd -p rdb1 map zhangzhuo1
/dev/rbd0
#查看映射的块设备
[14:50:31 root@ceph-node1 ~]#rbd showmapped 
id pool image      snap device  
0  rdb1 zhangzhuo1 -    /dev/rbd0 


#默认特性创建的由于内核版本低无法挂载
[15:48:13 root@ubuntu18-04 netplan]#rbd -p rdb1 map zhangzhuo
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable rdb1/zhangzhuo object-map fast-diff deep-flatten".
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (6) No such device or address

#客户端验证RBD
[15:49:24 root@ubuntu18-04 netplan]#lsblk 
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop1    7:1    0 99.2M  1 loop /snap/core/10958
loop2    7:2    0 99.2M  1 loop /snap/core/11167
sda      8:0    0   20G  0 disk 
├─sda1   8:1    0    1M  0 part 
└─sda2   8:2    0   20G  0 part /
sr0     11:0    1 1024M  0 rom  
rbd0   252:0    0    1G  0 disk 

#挂载使用
[15:49:28 root@ubuntu18-04 netplan]#mkfs.xfs /dev/rbd0
[15:49:55 root@ubuntu18-04 netplan]#mount /dev/rbd0 /opt/
[15:50:22 root@ubuntu18-04 netplan]#df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        20G  4.3G   15G  23% /
/dev/rbd0      1014M   34M  981M   4% /opt
[15:50:33 root@ubuntu18-04 netplan]#dd if=/dev/zero of=/opt/ceph-test-file bs=1M count=100
[15:51:26 root@ubuntu18-04 netplan]#file /opt/ceph-test-file 
/opt/ceph-test-file: data
[15:51:56 root@ubuntu18-04 netplan]#ll -h /opt/ceph-test-file 
-rw-r--r-- 1 root root 100M Jun  4 15:51 /opt/ceph-test-file

#ceph验证数据
[ceph@ceph-deploy ceph-cluster]$ ceph df
GLOBAL:
    SIZE        AVAIL       RAW USED     %RAW USED 
    270 GiB     261 GiB      9.4 GiB          3.48 
POOLS:
    NAME      ID     USED        %USED     MAX AVAIL     OBJECTS 
    zhang     1          0 B         0        82 GiB           0 
    rdb1      2      114 MiB      0.14        82 GiB          45 

4.2 ceph radosgw(RGW)对象存储

RGW 提供的是 REST 接口,客户端通过 http 与其进行交互,完成数据的增删改查等管理操作。 radosgw 用在需要使用 RESTful API 接口访问 ceph 数据的场合,因此在使用 RBD 即块存储的场合或者使用 cephFS 的场合可以不用启用 radosgw 功能。

4.2.1 部署radosgw服务

如果是在使用 radosgw 的场合,则以下命令将 ceph-mgr1 服务器部署为RGW主机

[ceph@ceph-deploy ceph-cluster]$ ceph-deploy --overwrite-conf rgw create ceph-node1

#验证radosgw服务
[13:31:49 root@ceph-node1 ~]#ps -ef | grep radosgw
root       32414       1 15 15:55 ?        00:00:04 /usr/bin/radosgw -f --cluster ceph --name client.rgw.ceph-node1 --setuser ceph --setgroup ceph
root       32474    1849  0 15:55 pts/0    00:00:00 grep --color=auto radosgw

网页验证

image-20210604155911134

验证ceph状态

[ceph@ceph-deploy ceph-cluster]$ ceph -s
  cluster:
    id:     613e7f7c-57fe-4f54-af43-9d88ab1b861b
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3
    mgr: ceph-node1(active), standbys: ceph-node2, ceph-node3
    osd: 9 osds: 9 up, 9 in
    rgw: 1 daemon active
 
  data:
    pools:   6 pools, 112 pgs
    objects: 232  objects, 114 MiB
    usage:   9.4 GiB used, 261 GiB / 270 GiB avail
    pgs:     112 active+clean

验证radosgw存储池

初始化完成 radosgw 之后,会初始化默认的存储池如下

[ceph@ceph-deploy ceph-cluster]$ ceph osd pool ls
zhang
rdb1
.rgw.root
default.rgw.control
default.rgw.meta
default.rgw.log

4.3 Ceph-FS 文件存储

ceph FS 即 ceph filesystem,可以实现文件系统共享功能,客户端通过 ceph 协议挂载并使用 ceph 集群作为数据存储服务器。

Ceph FS 需要运行 Meta Data Services(MDS)服务,其守护进程为 ceph-mds,ceph-mds 进程管 理与 cephFS 上存储的文件相关的元数据,并协调对 ceph 存储集群的访问。

image-20210604160252744

4.3.1 部署 MDS服务

[16:03:25 root@ceph-node2 ~]#yum install ceph-mds
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy mds create ceph-node2

验证MDS服务

MDS 服务目前还无法正常使用,需要为 MDS 创建存储池用于保存 MDS 的数据

[ceph@ceph-deploy ceph-cluster]$ ceph mds stat
, 1 up:standby #当前为备用状态,需要分配 pool 才可以使用。

4.3.2 创建 CephFS metadata和data存储池

使用 CephFS 之前需要事先于集群中创建一个文件系统,并为其分别指定元数据和数据相关的存储池。下面创建一个名为 cephfs 的文件系统用于测试,它使用 cephfs-metadata 为元数据存储池,使用 cephfs-data 为数据存储池

#保存 metadata 的pool
[ceph@ceph-deploy ceph-cluster]$ ceph osd pool create cephfs-metadata 32 32
pool 'cephfs-metadata' created
#保存数据的 pool
[ceph@ceph-deploy ceph-cluster]$ ceph osd pool create cephfs-data 64 64
pool 'cephfs-data' created

4.3.3 创建 cephFS 并验证

[ceph@ceph-deploy ceph-cluster]$ ceph fs new mycephfs cephfs-metadata cephfs-data
new fs with metadata pool 7 and data pool 8

[ceph@ceph-deploy ceph-cluster]$ ceph fs ls
name: mycephfs, metadata pool: cephfs-metadata, data pools: [cephfs-data ]

#查看指定 cephFS 状态
[ceph@ceph-deploy ceph-cluster]$ ceph fs status mycephfs
mycephfs - 0 clients
========
+------+--------+------------+---------------+-------+-------+
| Rank | State  |    MDS     |    Activity   |  dns  |  inos |
+------+--------+------------+---------------+-------+-------+
|  0   | active | ceph-node2 | Reqs:    0 /s |   10  |   13  |
+------+--------+------------+---------------+-------+-------+
+-----------------+----------+-------+-------+
|       Pool      |   type   |  used | avail |
+-----------------+----------+-------+-------+
| cephfs-metadata | metadata | 2286  | 82.2G |
|   cephfs-data   |   data   |    0  | 82.2G |
+-----------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
+-------------+
MDS version: ceph version 13.2.10 (564bdc4ae87418a232fc901524470e1a0f76d641) mimic (stable)

验证cepfFS服务状态

[ceph@ceph-deploy ceph-cluster]$ ceph mds stat
mycephfs-1/1/1 up  {0=ceph-node2=up:active}
#现在已经转变为活动状态

4.3.4 挂载 cephFS

#在客户端挂载 mon 节点的 6789 端口
[15:52:05 root@ubuntu18-04 netplan]#cat /etc/ceph/ceph.client.admin.keyring 
[client.admin]
	key = AQDbe7lgx4txDxAAIp+ntjG+TM55XYBL+RgzKA==
	caps mds = "allow *"
	caps mgr = "allow *"
	caps mon = "allow *"
	caps osd = "allow *"
#client 挂载
[16:13:21 root@ubuntu18-04 netplan]#mount -t ceph 172.16.10.72:6789:/ /mnt -o name=admin,secret=AQDbe7lgx4txDxAAIp+ntjG+TM55XYBL+RgzKA==

#验证挂载点
[16:14:00 root@ubuntu18-04 netplan]#df -Th
/dev/rbd0           xfs      1014M  134M  881M  14% /opt
172.16.10.72:6789:/ ceph       83G     0   83G   0% /mnt

[16:14:32 root@ubuntu18-04 netplan]#cp /var/log/syslog /mnt/
[16:15:06 root@ubuntu18-04 netplan]#ls -l /mnt/
total 1397
-rw-r----- 1 root root 1430349 Jun  4 16:15 syslog

4.4 命令总结

列出存储池

[ceph@ceph-deploy ceph-cluster]$ ceph osd lspools
1 zhang
2 rdb1
3 .rgw.root
4 default.rgw.control
5 default.rgw.meta
6 default.rgw.log
7 cephfs-metadata
8 cephfs-data

查看pg状态

[ceph@ceph-deploy ceph-cluster]$ ceph pg stat
208 pgs: 208 active+clean; 216 MiB data, 9.8 GiB used, 260 GiB / 270 GiB avail; 3.0 KiB/s wr, 0 op/s

查看某个rbd状态

[ceph@ceph-deploy ceph-cluster]$ ceph osd pool stats cephfs-data
pool cephfs-data id 8
  nothing is going on

查看当前ceph集群磁盘状态

[ceph@ceph-deploy ceph-cluster]$ ceph df
GLOBAL:
    SIZE        AVAIL       RAW USED     %RAW USED 
    270 GiB     260 GiB      9.8 GiB          3.63 
POOLS:
    NAME                    ID     USED        %USED     MAX AVAIL     OBJECTS 
    zhang                   1          0 B         0        82 GiB           0 
    rdb1                    2      114 MiB      0.14        82 GiB          45 
    .rgw.root               3      1.1 KiB         0        82 GiB           4 
    default.rgw.control     4          0 B         0        82 GiB           8 
    default.rgw.meta        5          0 B         0        82 GiB           0 
    default.rgw.log         6          0 B         0        82 GiB         175 
    cephfs-metadata         7       33 KiB         0        82 GiB          22 
    cephfs-data             8      101 MiB      0.12        82 GiB          26 

结果分为两部分,GLOBAL 和 POOLS
GOOBAL 显示是存储量概括
POOLS 是存储池列表和对应的存储池的理论使用量。
SIZE:集群的整体存储容量
AVAIL:集群中科可以使用的可用空间容量
RAW USED:已经的原始存储量
%RAW USED:已用的原始存储量百分

[ceph@ceph-deploy ceph-cluster]$ ceph df detail
GLOBAL:
    SIZE        AVAIL       RAW USED     %RAW USED     OBJECTS 
    270 GiB     260 GiB      9.8 GiB          3.63        280  
POOLS:
    NAME                    ID     QUOTA OBJECTS     QUOTA BYTES     USED        %USED     MAX AVAIL     OBJECTS     DIRTY     READ        WRITE     RAW USED 
    zhang                   1      N/A               N/A                 0 B         0        82 GiB           0        0          2 B       3 B          0 B 
    rdb1                    2      N/A               N/A             114 MiB      0.14        82 GiB          45       45        307 B     264 B      343 MiB 
    .rgw.root               3      N/A               N/A             1.1 KiB         0        82 GiB           4        4         12 B       4 B      3.4 KiB 
    default.rgw.control     4      N/A               N/A                 0 B         0        82 GiB           8        8          0 B       0 B          0 B 
    default.rgw.meta        5      N/A               N/A                 0 B         0        82 GiB           0        0          0 B       0 B          0 B 
    default.rgw.log         6      N/A               N/A                 0 B         0        82 GiB         175      175      1.4 KiB     922 B          0 B 
    cephfs-metadata         7      N/A               N/A              33 KiB         0        82 GiB          22       22          0 B      78 B       99 KiB 
    cephfs-data             8      N/A               N/A             101 MiB      0.12        82 GiB          26       26          0 B      36 B      304 MiB 

查看osd状态

[ceph@ceph-deploy ceph-cluster]$ ceph osd stat
9 osds: 9 up, 9 in; epoch: e81

显示osd的底层详细信息

[ceph@ceph-deploy ceph-cluster]$ ceph osd dump
epoch 81
fsid 613e7f7c-57fe-4f54-af43-9d88ab1b861b
created 2021-06-04 09:03:23.258798
modified 2021-06-06 09:52:28.014547
....

显示osd和节点的对应关系

[ceph@ceph-deploy ceph-cluster]$ ceph osd tree
ID CLASS WEIGHT  TYPE NAME           STATUS REWEIGHT PRI-AFF 
-1       0.26367 root default                              
-3       0.08789     host ceph-node1                       
 0   hdd 0.02930         osd.0           up  1.00000 1.00000 
 1   hdd 0.02930         osd.1           up  1.00000 1.00000 
 2   hdd 0.02930         osd.2           up  1.00000 1.00000 
-5       0.08789     host ceph-node2                       
 3   hdd 0.02930         osd.3           up  1.00000 1.00000 
 4   hdd 0.02930         osd.4           up  1.00000 1.00000 
 5   hdd 0.02930         osd.5           up  1.00000 1.00000 
-7       0.08789     host ceph-node3                       
 6   hdd 0.02930         osd.6           up  1.00000 1.00000 
 7   hdd 0.02930         osd.7           up  1.00000 1.00000 
 8   hdd 0.02930         osd.8           up  1.00000 1.00000

查看mon节点状态

[ceph@ceph-deploy ceph-cluster]$ ceph mon stat
e3: 3 mons at {ceph-node1=172.16.10.71:6789/0,ceph-node2=172.16.10.72:6789/0,ceph-node3=172.16.10.73:6789/0}, election epoch 20, leader 0 ceph-node1, quorum 0,1,2 ceph-node1,ceph-node2,ceph-node3

查看mon节点详细信息

[ceph@ceph-deploy ceph-cluster]$ ceph mon stat
e3: 3 mons at {ceph-node1=172.16.10.71:6789/0,ceph-node2=172.16.10.72:6789/0,ceph-node3=172.16.10.73:6789/0}, election epoch 20, leader 0 ceph-node1, quorum 0,1,2 ceph-node1,ceph-node2,ceph-node3
[ceph@ceph-deploy ceph-cluster]$ ceph mon dump 
dumped monmap epoch 3
epoch 3
fsid 613e7f7c-57fe-4f54-af43-9d88ab1b861b
last_changed 2021-06-04 14:04:15.545839
created 2021-06-04 09:03:21.201516
0: 172.16.10.71:6789/0 mon.ceph-node1
1: 172.16.10.72:6789/0 mon.ceph-node2
2: 172.16.10.73:6789/0 mon.ceph-node3

4.5 ceph集群维护

4.5.1 通过套接字进行单机管理

[14:03:02 root@ceph-node1 mnt]#ll /var/run/ceph/
total 0
srwxr-xr-x 1 ceph ceph 0 Jun  6 09:51 ceph-client.rgw.ceph-node1.1193.94099450347520.asok
srwxr-xr-x 1 ceph ceph 0 Jun  6 09:51 ceph-mgr.ceph-node1.asok
srwxr-xr-x 1 ceph ceph 0 Jun  6 13:58 ceph-mon.ceph-node1.asok
srwxr-xr-x 1 ceph ceph 0 Jun  6 09:51 ceph-osd.0.asok
srwxr-xr-x 1 ceph ceph 0 Jun  6 09:51 ceph-osd.1.asok
srwxr-xr-x 1 ceph ceph 0 Jun  6 09:51 ceph-osd.2.asok

#可用在不同的节点通过不同的 socket 文件管理不同的服务

#查看帮助
[14:06:41 root@ceph-node1 mnt]#ceph --admin-socket /var/run/ceph/ceph-osd.0.asok --help

--admin-daemon #获取 daemon 运行时配置
[14:11:56 root@ceph-node1 mnt]#ceph --admin-daemon /var/run/ceph/ceph-mon.ceph-node1.asok help
[14:11:01 root@ceph-node1 mnt]#ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok config show
[14:11:01 root@ceph-node1 mnt]#ceph --admin-daemon /var/run/ceph/ceph-mon.ceph-node1.asok mon_status

4.5.2 ceph集群的停止或重启

重启之前,要提前设置 ceph 集群不要将 OSD 标记为 out,避免 node 节点关闭服务后被踢出 ceph 集群外。

#关闭服务前设置 noout
[14:13:09 root@ceph-node1 mnt]#ceph osd set noout 
noout is set

#启动服务后取消 noout
[14:13:54 root@ceph-node1 mnt]#ceph osd unset noout 
noout is unset

4.5.2.1 关闭顺序

#关闭服务前设置 noout
关闭存储客户端停止读写数据
关闭网关服务,如对象网关 RGW
关闭元数据服务
关闭 ceph OSD
关闭 ceph manager
关闭 ceph monitor

4.5.2.2 启动顺序

启动 ceph monitor
启动 ceph manager
启动 ceph OSD
启动元数据服务
启动网关服务,如对象网关 RGW
启动存储客户端
#启动服务后取消 noout-->ceph osd unset noout

4.6 ceph配置文件

Ceph 的主配置文件是 ini 配置是/etc/ceph/ceph.conf,ceph 服务在启动时会检查 ceph.conf, 文件格式(php 也是),分号;和#在 ini 文件都是注释,ceph.conf 主要由以下配置段组成:

[global] #全局配置
[osd] #osd 专用配置,可以使用 osd.N,来表示某一个 OSD 专用配置,N 为 osd 的编号,如0、2、1 等
[mon] #mon 专用配置,也可以使用 mon.A 来为某一个 monitor 节点做专用配置,其中 A 为该节点的名称,ceph-monitor-2、ceph-monitor-1 等。使用命令 ceph mon dump 可以获取节点的名称
[client] #客户端专用配置。

ceph 文件的加载顺序

$CEPH_CONF 环境变量
-c 指定的位置
/etc/ceph/ceph.conf 
~/.ceph/ceph.conf
./ceph.conf
#按顺序查找在上一个找到之后就不查找了

4.7 存储池、PG 与 CRUS

副本池:replicated,定义每个对象在集群中保存为多少个副本,默认为三个副本,一主两从, 实现高可用,是 ceph 默认的存储池类型。

纠删码池(erasure code): 把各对象存储为 N=K+M 个块,其中 K 为数据块数量,M 为编码快数量,因此存储池的尺寸为 K+M。即数据保存在 K 个数据块,并提供 M 个冗余块提供数据高可用,那么最多能故障的块就是 M 个,实际的磁盘占用就是 K+M 块,因此相比副本池机制比较节省存储资源,一般采用 8+4 机制,即 8 个数据块+4 个冗余块,那么也就是 12 个数据块有 8 个数据块保存数据,有 4 个实现数据冗余,即 1/3 的磁盘空间用于数据冗余,比默认副本池的三倍冗余节省空间,但是不能出现大于一定数据块故障。

4.7.1 副本池 IO

将一个数据对象存储为多个副本

在客户端写入操作时,ceph 客户端使用 CRUSH 算法计算出对象的 PG ID 和 primary OSD 主 OSD 根据设置的副本数、对象名称、存储池名称和集群运行图(cluster map)计算出 PG 的各辅助 OSD,然后由 OSD 将数据再同步给辅助OSD。

副本池数据读写过程

image-20210606142247150

image-20210606142302321

4.7.2 纠删码池

中文纠删码介绍:http://ceph.org.cn/2016/08/01/ceph-%E7%BA%A0%E5%88%A0%E7%A0%81%E4%BB%8B%E7%BB%8D/

Ceph 从 Firefly 版本开始支持纠删码,不推荐使用纠删码池

纠删码池降低了数据保存所需要的磁盘总空间数量,但是读写数据的计算成本要比副本池高

RGW 可以支持纠删码池

纠删码池可以降低企业的前期 TCO 总拥有成本

纠删码写: 数据将在主 OSD 进行编码然后分发到相应的 OSDs上去

image-20210606142500293

纠删码读: 从相应的 OSDs 中获取数据后进行解码

image-20210606142509459

如果此时有数据丢失,Ceph会自动从存放校验码的 OSD 中读取数据进行解码。

image-20210606142545511

4.7.3 PG与PGP

PG = Placement Group 归置组

PGP = Placement Group for Placement purpose 归置组的组合,pgp 相当于是 pg 对应 osd 的 一种排列组合关系。

归置组(placement group)是用于跨越多 OSD 将数据存储在每个存储池中的内部数据结构。 归置组在 OSD 守护进程和 ceph 客户端之间生成了一个中间层,CRUSH 算法负责将每个对象动态映射到一个归置组,然后再将每个归置组动态映射到一个或多个 OSD 守护进程,从而能够支持在新的 OSD 设备上线时进行数据重新平衡。

相对于存储池来说,PG 是一个虚拟组件,它是对象映射到存储池时使用的虚拟层。

可以自定义存储池中的归置组数量。

ceph 出于规模伸缩及性能方面的考虑,ceph 将存储池细分为多个归置组,把每个单独的对象映射到归置组,并将归置组分给一个主 OSD。

存储池由一系列的归置组组成,而 CRUSH 算法则根据集群运行图和集群状态,将个 PG 均匀、伪随机(基于 hash 映射,每次的计算结果够一样)的分布到集群中的 OSD 之上。

如果某个 OSD 失败或需要对集群进行重新平衡,ceph 则移动或复制整个归置组而不需要单独对每个镜像进行寻址

4.7.4 PG 与 OSD 的关系

ceph 基于 crush 算法将归置组 PG 分配至 OSD

当一个客户端存储对象的时候,CRUSH 算法映射每一个对象至归置组(PG)

image-20210606142900911

4.7.6 PG 分配计算

归置组(PG)的数量是由管理员在创建存储池的时候指定的,然后由 CRUSH 负责创建和使用, PG 的数量是 2 的 N 次方的倍数,每个 OSD 的 PG 不要超出 256 个 PG。

1.通常,PG 的数量应该是数据的合理力度的子集。
	例如:一个包含 256 个 PG 的存储池以为了每个 PG 包含大约 1/256 的存储池数据

2.当需要将 PG 从一个 OSD 移动到另一个 OSD 的时候,PG 的数量会对性能产生影响。
	PG 的数量过少,ceph 将不得不同时移动相当数量的数据,其产生的网络负载将对集群的性能输出	产生一定影响。
	PG 过多的时候,ceph 将会占用过多的 CPU 和内存资源用于记录 PG 的状态信息

3.PG 的数量在集群分发数据和重新平衡时扮演者重要的角色作用
	在所有 OSD 质检进行数据持久存储以及完成数据分布会需要较多的归置组,但是他们的数量应该减少到实现 ceph 最大性能所需的最小 PG 数量值,以节省 CPU 和内存资源。
	一般来说,对于有着超过 50 个 OSD 的 RADOS 集群,建议每个 OSD 大约有 50-100 个 PG
以平衡资源使用及取得更好的数据持久性和数据分布,而在更大的集群中,每个 OSD 可以有 100-200 个 PG
	至于应该使用多少个 PG,可以通过下面的公式计算后,将其值四舍五入到最近的 2 的 N次幂
		Total OSDs * PGPerOSD/replication factor => total P
		磁盘总数 x 每个磁盘 PG 数 => ceph 集群总 PG 数(略大于 2^n 次方)
		官方的计算公式:
			Total PGs = (Total_number_of_OSD * 100) / max_replication_count
例如:
有 100 个 osd,2 副本,5 个 pool
Total PGs =100*100/2=5000
每个 pool 的 PG=5000/5=1000,那么创建 pool 的时候就指定 pg 为1024
	需要结合数据数量、磁盘数量及磁盘空间计算出 PG 数量,8、16、32、64、128
	一个 RADOS 集群上可能会存在多个存储池,因此管理员还需要考虑所有存储池上的 PG分布后每个 OSD 需要映射的 PG 数量

4.7.6 验证PG与PGP组合

#查看某个pool的pg与pgp组合
[14:36:10 root@ceph-node1 mnt]#ceph pg ls-by-pool rdb1

[14:57:04 root@ceph-node1 ~]#ceph pg ls-by-pool zhang | awk '{print $1,$2,$15}'
PG OBJECTS ACTING
1.0 0 [3,7,2]p3
1.1 0 [7,0,5]p7
1.2 0 [4,0,8]p4
1.3 0 [1,5,8]p1
1.4 0 [7,3,1]p7
1.5 0 [8,2,5]p8
1.6 0 [6,4,1]p6
1.7 0 [5,6,2]p5
1.8 0 [5,2,8]p5
1.9 0 [3,7,2]p3
1.a 0 [7,5,0]p7
1.b 0 [6,0,3]p6
1.c 0 [1,4,8]p1
1.d 0 [4,1,8]p4
1.e 0 [4,2,8]p4
1.f 0 [3,1,8]p3

4.8 PG的状态

https://www.jianshu.com/p/36c2d5682d87

PG 的常见在状态如下

Peering

正在同步状态,同一个 PG 中的 OSD 需要将准备数据同步一致,而 Peering(对等)就是 OSD 同步过程中的状态。

Activating

Peering 已经完成,PG 正在等待所有 PG 实例同步 Peering 的结果(Info,log等)

Clean

干净态,PG 当前不存在待修复的对象,并且大小等于存储池的副本数,即 PG 的活动集(Acting Set)和上行集(Up Set)为同一组 OSD 且内容一致.

活动集(Acting Set):由 PG 当前主的 PSD 和其余处于活动状态的备用 OSD 组成,当前 PG 内的 OSD 负责处理用户的读写请求。

上行集(Up Set):在某一个 OSD 故障时,需要将故障的 OSD 更换为可用的 OSD,并主 PG 内部的主 OSD 同步数据到新的 OSD 上,例如 PG 内有 OSD1、OSD2、OSD3,当 OSD3 故障后需要用 OSD4 替换 OSD3,那么 OSD1、OSD2、OSD3 就是上行集,替换后 OSD1、OSD2、OSD4 就是活动集,OSD 替换完成后活动集最终要替换上行集。

Active

就绪状态或活跃状态,Active 表示主 OSD 和备 OSD 处于正常工作状态,此时的 PG 可以正常 处理来自客户端的读写请求,正常的 PG是Active+Clean 状态

Degraded:降级状态

降级状态出现于 OSD 被标记为 down 以后,那么其他映射到此 OSD 的 PG 都会转换到降级状态。

如果此 OSD 还能重新启动完成并完成 Peering 操作后,那么使用此 OSD 的 PG 将重新恢复为 clean 状态。

如果此 OSD 被标记为 down 的时间超过 5 分钟还没有修复,那么此 OSD 将会被 ceph 踢出集群,然后 ceph 会对被降级的 PG 启动恢复操作,直到所有由于此 OSD 而被降级的 PG 重新恢复为 clean 状态

恢复数据会从 PG 内的主 OSD 恢复,如果是主 OSD 故障,那么会在剩下的两个备用 OSD 重新选择一个作为主 OSD。

Stale:过期状态

正常状态下,每个主 OSD 都要周期性的向 RADOS 集群中的监视器(MGR)报告其作为主 OSD 所持有的所有 PG 的最新统计数据,因任何原因导致某个 OSD 无法正常向监视器发送汇报信息的、或者由其他 OSD 报告某个 OSD 已经 down 的时候,则所有以此 OSD 为主 PG 则会立 即被标记为 stale 状态,即他们的主 OSD 已经不是最新的数据了,如果是备份的 OSD 发送 down 的时候,则 ceph 会执行修复而不会触发 PG 状态转换为 stale 状态。

undersized

PG 当前副本数小于其存储池定义的值的时候,PG 会转换为 undersized 状态,比如两个备 份 OSD 都 down 了,那么此时 PG 中就只要一个主 OSD 了,不符合 ceph 最少要求一个主 OSD 加一个备 OSD 的要求,那么就会导致使用此 OSD 的 PG 转换为 undersized 状态,直到添加备 份 OSD 添加完成,或者修复完成

Scrubbing

scrub 是 ceph 对数据的清洗状态,用来保证数据完整性的机制,Ceph 的 OSD 定期启动 scrub 线程来扫描部分对象,通过与其他副本比对来发现是否一致,如果存在不一致,抛出 异常提示用户手动解决,scrub 以 PG 为单位,对于每一个 pg,ceph 分析该 pg 下所有的 object, 产生一个类似于元数据信息摘要的数据结构,如对象大小,属性等,叫 scrubmap, 比较主与 副 scrubmap,来保证是不是有 object 丢失或者不匹配,扫描分为轻量级扫描和深度扫描, 轻量级扫描也叫做 light scrubs 或者 shallow scrubs 或者 simply scrubs 即轻量级扫描

Light scrub(daily)比较 object size 和属性,deep scrub (weekly)读取数据部分并通过 checksum(CRC32 算法)对比和数据的一致性,深度扫描过程中的 PG 会处于 scrubbing+deep 状 态。

Recovering

正在恢复态,集群正在执行迁移或同步对象和他们的副本,这可能是由于添加了一个新的 OSD 到集群中或者某个 OSD 宕掉后,PG 可能会被 CRUSH 算法重新分配不同的 OSD,而由于 OSD 更换导致 PG 发生内部数据同步的过程中的 PG 会被标记为 Recovering

Backfilling

正在后台填充态,backfill 是 recovery 的一种特殊场景,指 peering 完成后,如果基于当前权 威日志无法对 Up Set(上行集)当中的某些 PG 实例实施增量同步(例如承载这些 PG 实例的 OSD 离线太久,或者是新的 OSD 加入集群导致的 PG 实例整体迁移) 则通过完全拷贝当前 Primary 所有对象的方式进行全量同步,此过程中的 PG 会处于 backfilling。

Backfill-toofull

某个需要被 Backfill 的 PG 实例,其所在的 OSD 可用空间不足,Backfill 流程当前被挂起时 PG 给的状态。

4.9 数据读写流程

image-20210606150846862

ceph 读写对象的时候,客户端从 ceph 监视器检索出集群运行图(cluster map),然后客户端访问指定的存储池,并对存储池内 PG 的对象执行读写操作

存储池的 CRUSH 计算结果和 PG 的数量,是决定 ceph 如何放置数据的关键因素。
基于集群的最新运行图,客户端能够了解到集群中的所有监视器和 OSD 以及他们各自当前的状态。
但是客户端仍然不知道对象的保存位置。

客户端在读写对象时,需要提供的是对象标识和存储池名称。

客户端需要在存储池中读写对象时,需要客户端将对象名称、对象名称的 hash 码、存储池中的 PG 数量和存储池名称作为输入信息提供给 ceph,然后由 CRUSH 计算出 PG 的 ID 以及此 PG 针对的主 OSD 即可读写 OSD 中的对象

1.APP 向 ceph 客户端发送对某个对象的请求,此请求包含对象和存储池,然后 ceph 客户端对对象就 hash 计算,并根据此 hash 值计算出对象所在的 PG,完成对象从 Pool 至 PG 的映射。
	APP 访问 pool ID 和 object ID (比如 pool = pool1 and object-id = “name1”)
	ceph client 对 objectID 做哈希
	ceph client 对该 hash 值取 PG 总数的模,得到 PG 编号(比如 20),(第 2 和第 3 步基本保证了一个 pool 的所有 PG 将会被均匀地使用)
	ceph client 对 pool ID 取 hash(比如 “pool1” = 5)
	ceph client 将 pool ID 和 PG ID 组合在一起(比如 5.20)得到 PG 的完整 ID。

image-20210606151129108

bash2.然后客户端据 PG、CRUSH 运行图和归置组(placement rules)作为输入参数并再次进行计算, 并计算出对象所在的 PG 内的主 OSD ,从而完成对象从 PG 到 OSD 的映射。
	Ceph client 从 MON 获取最新的 cluster map。 
	Ceph client 根据上面的第(2)步计算出该 object 将要在的 PG 的 ID。 
	Ceph client 再根据 CRUSH 算法计算出 PG 中目标主和备 OSD 的 ID,即可对 OSD 的数据进行读写。
3.客户端开始对主 OSD 进行读写请求(副本池 IO),如果发生了写操作,会有 ceph 服务端完 成对象从主 OSD 到备份 OSD 的同步。

image-20210606151239955

4.10 ceph 存储池操作

存储池的管理通常保存创建、列出、重命名和删除等操作,管理工具使用 ceph osd pool 的 子命令及参数,比如 create/ls/rename/rm 等。

4.10.1 常用命令

#创建存储池命令格式,默认为副本池可以写erasure为纠删码池
osd pool create <poolname> pg_num pgp_num {replicated|erasure}
[14:50:27 root@ceph-node1 ~]#ceph osd pool create web-nginx 32 32

#列出存储池
ceph osd pool ls [detail]
[15:38:25 root@ceph-node1 ~]#ceph osd pool ls detail

#获取存储池的统计信息
ceph osd pool stats [poolname]
[15:38:31 root@ceph-node1 ~]#ceph osd pool stats web-nginx

#重命名存储池
[15:39:25 root@ceph-node1 ~]#ceph osd pool rename web-nginx web-http

#显示存储池用量信息
[15:40:49 root@ceph-node1 ~]#rados df

4.10.2 存储池删除

如果把存储池删除会导致把存储池内的数据全部删除,因此 ceph 为了防止误删除存储池设置了两个机制来防止误删除操作。

第一个机制是 NODELETE 标志,需要设置为 false 但是默认就是 false 了

[15:40:58 root@ceph-node1 ~]#ceph osd pool get web-http nodelete
nodelete: false

#如果设置为了 true 就表示不能删除,可以使用 set 指令重新设置为 fasle
[15:42:51 root@ceph-node1 ~]#ceph osd pool set web-http nodelete true
set pool 9 nodelete to tru

[15:43:39 root@ceph-node1 ~]#ceph osd pool set web-http nodelete false
set pool 9 nodelete to false

[15:44:02 root@ceph-node1 ~]#ceph osd pool get web-http nodelete
nodelete: false

第二个机制是集群范围的配置参数 mon allow pool delete,默认值为 false,即监视器不允许删除存储池,可以在特定场合使用 tell 指令临时设置为(true)允许删除,在删除指定的 pool 之后再重新设置为 false。

#设置允许删除
[15:44:17 root@ceph-node1 ~]#ceph tell mon.* injectargs --mon-allow-pool-delete=true
mon.ceph-node1: injectargs:mon_allow_pool_delete = 'true' 
mon.ceph-node2: injectargs:mon_allow_pool_delete = 'true' 
mon.ceph-node3: injectargs:mon_allow_pool_delete = 'true'

#删除
[15:47:13 root@ceph-node1 ~]#ceph osd pool rm zhang zhang --yes-i-really-really-mean-it
pool 'zhang' removed

#取消允许删除
[15:48:58 root@ceph-node1 ~]#ceph tell mon.* injectargs --mon-allow-pool-delete=false
mon.ceph-node1: injectargs:mon_allow_pool_delete = 'false' 
mon.ceph-node2: injectargs:mon_allow_pool_delete = 'false' 
mon.ceph-node3: injectargs:mon_allow_pool_delete = 'false'

4.10.3 存储池配额

存储池可以设置两个配置对存储的对象进行限制,一个配额是最大空间(max_bytes),另外一个配额是对象最大数量(max_objects)。

[15:51:09 root@ceph-node1 ~]#ceph osd pool create web-nginx 16 16
pool 'web-nginx' created

[15:51:27 root@ceph-node1 ~]#ceph osd pool get-quota web-nginx
quotas for pool 'web-nginx':
  max objects: N/A  #默认不限制对象数量
  max bytes  : N/A  #默认不限制空间大小

#限制最大 1000 个对象,一般环境中不会设置对象
[15:51:31 root@ceph-node1 ~]#ceph osd pool set-quota web-nginx max_objects 1000
set-quota max_objects = 1000 for pool web-nginx

#限制最大1073741824字节,即1G,这里限制数量为字节需要换算
[15:52:33 root@ceph-node1 ~]#ceph osd pool set-quota web-nginx max_bytes 1073741824
set-quota max_bytes = 1073741824 for pool web-nginx

#验证
[15:54:21 root@ceph-node1 ~]#ceph osd  pool get-quota web-nginx
quotas for pool 'web-nginx':
  max objects: 1 k objects
  max bytes  : 1 GiB

4.10.4 存储池可用参数

size #存储池中的对象副本数,默认一主两个辅助 3 副本
[15:57:05 root@ceph-node1 ~]#ceph osd pool get web-nginx size
size: 3

min_size #提供服务所需要的最小副本数,如果定义 size 为 3,min_size 也为 3,坏掉一个OSD,如果 pool 池中有副本在此块 OSD 上面,那么此 pool 将不提供服务,如果将 min_size定义为 2,那么还可以提供服务,如果提供为 1,表示只要有一块副本都提供服
[15:57:10 root@ceph-node1 ~]#ceph osd pool get web-nginx min_size
min_size: 2

pg_num #定义 PG 的数量
[15:57:58 root@ceph-node1 ~]#ceph osd pool get web-nginx pg_num
pg_num: 16

pgp_num #定义归置时使用的 PG 数量
[15:58:39 root@ceph-node1 ~]#ceph osd pool get web-nginx pgp_num
pgp_num: 16

crush_rule #设置 crush 算法规则
[16:00:20 root@ceph-node1 ~]#ceph osd pool get web-nginx crush_rule
crush_rule: replicated_rule

nodelete #控制是否可删除,默认可以
[16:01:14 root@ceph-node1 ~]#ceph osd pool get web-nginx nodelete
nodelete: false

nopgchange #控制是否可更改存储池的 pg num 和 pgp num
[16:01:44 root@ceph-node1 ~]#ceph osd  pool get web-nginx nopgchange
nopgchange: false

nosizechange #控制是否可以更改存储池的大小
[16:03:07 root@ceph-node1 ~]#ceph osd  pool get web-nginx nosizechange
nosizechange: false

noscrub 和 nodeep-scrub #控制是否整理或深层整理存储池,可临时解决高 I/O 问题
[16:03:19 root@ceph-node1 ~]#ceph osd pool get web-nginx noscrub
noscrub: false
[16:04:03 root@ceph-node1 ~]#ceph osd pool get web-nginx nodeep-scrub
nodeep-scrub: false

scrub_min_interval #集群负载较低时整理存储池的最小时间间隔,默认值没有设置,可以通过配置文件中的 osd_scrub_min_interval 参数指定间隔
[16:04:16 root@ceph-node1 ~]#ceph osd pool get web-nginx scrub_min_interval
Error ENOENT: option 'scrub_min_interval' is not set on pool 'web-nginx'

scrub_max_interval#整理存储池的最大时间间隔,默认值没有设置,可以通过配置文件中的osd_scrub_max_interval 参数指定
[16:05:28 root@ceph-node1 ~]#ceph osd pool get web-nginx scrub_max_interval
Error ENOENT: option 'scrub_max_interval' is not set on pool 'web-nginx'

deep_scrub_interval #深层整理存储池的时间间隔,默认值没有设置,可以通过配置文件中的 osd_deep_scrub_interval 参数指定。
[16:06:11 root@ceph-node1 ~]#ceph osd pool get web-nginx deep_scrub_interval
Error ENOENT: option 'deep_scrub_interval' is not set on pool 'web-nginx'

#ceph node 的默认配置
[15:32:08 root@ceph-node4 ~]#ll /var/run/ceph/
total 0
srwxr-xr-x 1 ceph ceph 0 Jun 10 15:12 ceph-osd.10.asok
srwxr-xr-x 1 ceph ceph 0 Jun 10 15:13 ceph-osd.11.asok
srwxr-xr-x 1 ceph ceph 0 Jun 10 15:10 ceph-osd.9.asok
[16:08:17 root@ceph-node4 ~]#ceph daemon osd.9 config show | grep scrub
    "mds_max_scrub_ops_in_progress": "5",
    "mon_scrub_inject_crc_mismatch": "0.000000",
    "mon_scrub_inject_missing_keys": "0.000000",
    "mon_scrub_interval": "86400",
    "mon_scrub_max_keys": "100",
    "mon_scrub_timeout": "300",
    "mon_warn_not_deep_scrubbed": "0",
    "mon_warn_not_scrubbed": "0",
    "osd_debug_deep_scrub_sleep": "0.000000",
    "osd_deep_scrub_interval": "604800.000000", ##定义深度清洗间隔,604800 秒=7天
    "osd_deep_scrub_keys": "1024",
    "osd_deep_scrub_large_omap_object_key_threshold": "200000",
    "osd_deep_scrub_large_omap_object_value_sum_threshold": "1073741824",
    "osd_deep_scrub_randomize_ratio": "0.150000",
    "osd_deep_scrub_stride": "524288",
    "osd_deep_scrub_update_digest_min_age": "7200",
    "osd_max_scrubs": "1", ##定义一个 ceph OSD daemon 内能够同时进行 scrubbing 的操作数
    "osd_op_queue_mclock_scrub_lim": "0.001000",
    "osd_op_queue_mclock_scrub_res": "0.000000",
    "osd_op_queue_mclock_scrub_wgt": "1.000000",
    "osd_requested_scrub_priority": "120",
    "osd_scrub_auto_repair": "false",
    "osd_scrub_auto_repair_num_errors": "5",
    "osd_scrub_backoff_ratio": "0.660000",
    "osd_scrub_begin_hour": "0",
    "osd_scrub_begin_week_day": "0",
    "osd_scrub_chunk_max": "25",
    "osd_scrub_chunk_min": "5",
    "osd_scrub_cost": "52428800",
    "osd_scrub_during_recovery": "false",
    "osd_scrub_end_hour": "24",
    "osd_scrub_end_week_day": "7",
    "osd_scrub_interval_randomize_ratio": "0.500000",
    "osd_scrub_invalid_stats": "true", #定义 scrub 是否有效
    "osd_scrub_load_threshold": "0.500000",
    "osd_scrub_max_interval": "604800.000000", #定义最大执行 scrub 间隔,604800 秒=7天
    "osd_scrub_max_preemptions": "5",
    "osd_scrub_min_interval": "86400.000000", #定义最小执行普通 scrub 间隔,86400 秒=1天
    "osd_scrub_priority": "5",
    "osd_scrub_sleep": "0.000000",

4.11 存储池快照

快照用于读存储池中的数据进行备份与还原,创建快照需要占用的磁盘空间会比较大,取决于存储池中的数据大小,使用以下命令创建快照

4.11.1 创建快照

[16:08:27 root@ceph-node4 ~]#ceph osd pool ls
.rgw.root
default.rgw.control
default.rgw.meta
default.rgw.log
cephfs-metadata
cephfs-data
web-nginx

#命令1
ceph osd pool mksnap {pool-name} {snap-name}
[16:11:04 root@ceph-node4 ~]#ceph osd pool mksnap web-nginx web-nginx-snap
created pool web-nginx snap web-nginx-snap

#命令2
rados -p {pool-name} mksnap {snap-name}
[16:11:54 root@ceph-node4 ~]#rados -p web-nginx mksnap web-nginx-snap-1
created pool web-nginx snap web-nginx-snap-1

4.11.2 验证快照

[16:13:28 root@ceph-node4 ~]#rados lssnap -p web-nginx
1	web-nginx-snap	2021.06.10 16:11:50
2	web-nginx-snap-1	2021.06.10 16:12:33
2 snaps

4.11.3 回滚快照

测试上传文件后创建快照,然后删除文件再还原文件,基于对象还原。

#命令格式
rados rollback <obj-name> <snap-name> roll back object to snap <snap-name>
#上传文件
[16:14:41 root@ceph-node4 ~]#rados -p web-nginx put testfile /etc/hosts
#验证文件
[16:15:08 root@ceph-node4 ~]#rados -p web-nginx ls
testfile
#创建快照
[16:15:31 root@ceph-node4 ~]#ceph osd pool mksnap web-nginx web-nginx-snap-2
created pool web-nginx snap web-nginx-snap-2
#验证快照
[16:16:08 root@ceph-node4 ~]#rados lssnap -p web-nginx
1	web-nginx-snap	2021.06.10 16:11:50
2	web-nginx-snap-1	2021.06.10 16:12:33
3	web-nginx-snap-2	2021.06.10 16:16:04
3 snaps
#删除文件
[16:16:31 root@ceph-node4 ~]#rados -p web-nginx rm testfile
#删除文件后,无法再次删除文件,提升文件不存在
[16:17:30 root@ceph-node4 ~]#rados -p web-nginx rm testfile
error removing web-nginx>testfile: (2) No such file or directory
#通过快照还原某个文件
[16:17:58 root@ceph-node4 ~]#rados rollback -p web-nginx testfile web-nginx-snap-2
rolled back pool web-nginx to snapshot web-nginx-snap-2

#再次执行删除文件就可以执行成功
[16:18:58 root@ceph-node4 ~]#rados -p web-nginx rm testfile

4.11.4 删除快照

#命令格式
ceph osd pool rmsnap <poolname> <snap>

[16:20:52 root@ceph-node4 ~]#rados lssnap -p web-nginx
1	web-nginx-snap	2021.06.10 16:11:50
2	web-nginx-snap-1	2021.06.10 16:12:33
3	web-nginx-snap-2	2021.06.10 16:16:04
3 snaps
[16:21:56 root@ceph-node4 ~]#ceph osd pool rmsnap web-nginx web-nginx-snap
removed pool web-nginx snap web-nginx-snap
[16:22:08 root@ceph-node4 ~]#rados lssnap -p web-nginx
2	web-nginx-snap-1	2021.06.10 16:12:33
3	web-nginx-snap-2	2021.06.10 16:16:04
2 snaps

4.12 数据压缩

如果使用 bulestore 存储引擎,ceph 支持称为”实时数据压缩”即边压缩边保存数据的功能, 该功能有助于节省磁盘空间,可以在BlueStore OSD上创建的每个Ceph池上启用或禁用压缩, 以节约磁盘空间,默认没有开启压缩,需要后期配置并开启。

4.12.1 启用压缩并指定压缩算法

#命令格式
ceph osd pool set <pool name> compression_mode aggressive

[16:07:09 root@ceph-node1 ~]#ceph osd pool set web-nginx compression_algorithm snappy
set pool 10 compression_algorithm to snappy

snappy:压缩使用的算法,还有有 none、zlib、lz4、zstd 和 snappy 等算法,默认为 sanppy, zstd 压缩比好,但消耗 CPU,lz4 和 snappy 对 CPU 占用较低,不建议使用 zlib。

4.12.2 指定压缩模式

#命令格式
[16:26:29 root@ceph-node1 ~]#ceph osd pool set web-nginx compression_mode aggressive 
set pool 10 compression_mode to aggressive

aggressive:压缩的模式,有 none、aggressive、passive 和 force,默认 none。

none:从不压缩数据。

passive:除非写操作具有可压缩的提示集,否则不要压缩数据。

aggressive:压缩数据,除非写操作具有不可压缩的提示集。

force:无论如何都尝试压缩数据。即使客户端暗示数据不可压缩,在所有情况下都使用压缩。

存储池压缩设置参数

compression_algorithm  #压缩算法
compression_mode  #压缩模式
compression_required_ratio  #压缩后与压缩前的压缩比,默认为.875
compression_max_blob_size:
#大于此的块在被压缩之前被分解成更小的 blob(块),此设置将覆盖 bluestore 压缩 max blob * 的全局设置。
compression_min_blob_size:#小于此的块不压缩, 此设置将覆盖 bluestore 压缩 min blob *的全局设置。

全局压缩选项,这些可以配置到 ceph.conf 配置文件,作用于所有存储池

bluestore_compression_algorithm  #压缩算法
bluestore_compression_mode  #压缩模式
bluestore_compression_required_ratio  #压缩后与压缩前的压缩比,默认为.875
bluestore_compression_min_blob_size   #小于它的块不会被压缩,默认 0
bluestore_compression_max_blob_size   #大于它的块在压缩前会被拆成更小的块,默认 0
bluestore_compression_min_blob_size_ssd  #默认 8k
bluestore_compression_max_blob_size_ssd  #默认 64k
bluestore_compression_min_blob_size_hdd  #默认 128k
bluestore_compression_max_blob_size_hdd  #默认 512k

五、CephX认证机制

Ceph 使用 cephx 协议对客户端进行身份认证

cephx 用于对 ceph 保存的数据进行认证访问和授权,用于对访问 ceph 的请求进行认证和授权检测,与 mon 通信的请求都要经过 ceph 认证通过,但是也可以在 mon 节点关闭 cephx 认证,但是关闭认证之后任何访问都将被允许,因此无法保证数据的安全性

5.1 授权流程

每个 mon 节点都可以对客户端进行身份认证并分发秘钥,因此多个 mon 节点就不存在单点故障和认证性能瓶颈

mon 节点会返回用于身份认证的数据结构,其中包含获取 ceph 服务时用到的 session key, session key 通过客户端秘钥进行加密 ,秘钥是在客户端提前配置好的 ,/etc/ceph/ceph.client.admin.keyring

客户端使用 session key 向 mon 请求所需要的服务,mon 向客户端提供一个 tiket,用于向实际处理数据的 OSD 等服务验证客户端身份,MON 和 OSD 共享同一个 secret,因此 OSD 会信任有 MON 发放的 tiket

tiket 存在有效期

注意

  • CephX 身份验证功能仅限制在 Ceph 的各组件之间,不能扩展到其他非 ceph 组件
  • Ceph 只负责认证授权,不能解决数据传输的加密问题

image-20210610180012231

5.2 访问流程

无论 ceph 客户端是哪种类型,例如块设备、对象存储、文件系统,ceph 都会在存储池中将所有数据存储为对象

  • ceph 用户需要拥有存储池访问权限,才能读取和写入数据
  • ceph 用户必须拥有执行权限才能使用 ceph 的管理命令

image-20210610180139756

image-20210610180150110

5.3 Ceph用户

用户是指个人(ceph 管理者)或系统参与者(MON/OSD/MDS)。

通过创建用户,可以控制用户或哪个参与者能够访问 ceph 存储集群、以及可访问的存储池及存储池中的数据。

ceph 支持多种类型的用户,但可管理的用户都属于 client 类型

区分用户类型的原因在于,MON/OSD/MDS 等系统组件特使用 cephx 协议,但是它们为非客户端。

通过点号来分割用户类型和用户名,格式为 TYPE.ID,例如 client.admin。

[17:14:18 root@ceph-node1 ~]#cat /etc/ceph/ceph.client.admin.keyring 
[client.admin]
	key = AQDbe7lgx4txDxAAIp+ntjG+TM55XYBL+RgzKA==
	caps mds = "allow *"
	caps mgr = "allow *"
	caps mon = "allow *"
	caps osd = "allow *"

5.4 ceph 授权和使能

ceph 基于使能/能力(Capabilities,简称 caps )来描述用户可针对 MON/OSD 或 MDS 使用的授权范围或级别。

通用的语法格式:daemon-type ‘allow caps’ [....]

MON 能力

包括r/w/x和allow profile cap(ceph的运行图)

例如:

mon 'allow rwx' 
mon 'allow profile osd'

OSD能力

包括 r、w、x、class-read、class-write(类读取))和 profile osd(类写入),另外 OSD 能力还允许进行存储池和名称空间设置。

例如:

osd 'allow capability' [pool=poolname] [namespace=namespace-name]

MDS能力

只需要 allow 或空都表示允许。
mds 'allow'

能力一览表

r  #向用户授予读取权限。访问监视器以检索 CRUSH 运行图时需具有此能力。
w  #向用户授予针对对象的写入权限。
x  #授予用户调用类方法(包括读取和写入)的能力,以及在监视器中执行 auth 操作的能力。

class-read #授予用户调用类读取方法的能力。x 的子集。
class-write #授予用户调用类写入方法的能力。x 的子集。
* #授予用户对特定守护进程/存储池的读取、写入和执行权限,以及执行管理命令的能力。

profile osd #授予用户以某个 OSD 身份连接到其他 OSD 或监视器的权限。授予 OSD 权限,使 OSD 能够处理复制检测信号流量和状态报告(获取 OSD 的状态信息)
profile mds #授予用户以某个 MDS 身份连接到其他 MDS 或监视器的权限
profile bootstrap-osd #授予用户引导 OSD 的权限(初始化OSD并将OSD加入ceph集群)。授权给部署工具,使其在引导 OSD 时有权添加密钥
profile bootstrap-mds #授予用户引导元数据服务器的权限。授权部署工具权限,使其在引导元数据服务器时有权添加密钥。

5.5 Ceph用户管理

用户管理功能可让 Ceph 集群管理员能够直接在 Ceph 集群中创建、更新和删除用户。

在 Ceph 集群中创建或删除用户时,可能需要将密钥分发到客户端,以便将密钥添加到密钥环文件中/etc/ceph/ceph.client.admin.keyring,此文件中可以包含一个或者多个用户认证信息,凡是拥有此文件的节点,将具备访问 ceph 的权限,而且可以使用其中任何一个账户的权限,此文件类似于 linux 系统的中的/etc/passwd 文件。

5.5.1 列出用户

[18:13:41 root@ceph-node1 ~]#ceph auth ls
installed auth entries:

mds.ceph-node2
	key: AQBz3rlgY8DlORAA/P/S25pzyBWQtcCF4pMLow==
	caps: [mds] allow
	caps: [mon] allow profile mds
	caps: [osd] allow rwx
osd.0
	key: AQAll7lgXX34NhAAMgGhhX/SkonysWTzNj+uzA==
	caps: [mgr] allow profile osd
	caps: [mon] allow profile osd
	caps: [osd] allow *
....

注意:TYPE.ID 表示法

针对用户采用 TYPE.ID 表示法,例如 osd.0 指定 osd 类型的用户,其 ID 为 0。client.admin 是 client 类型的用户,其 ID 为 admin,另请注意,每个项包含一个 key: 值项,以及一个或多个 caps 项。

可以结合使用 -o 文件名选项和 ceph auth list 将输出保存到某个文件,一般用来备份集群用户数据

[18:14:30 root@ceph-node1 ~]#ceph auth ls -o ceph-user.key
installed auth entries:
[18:16:27 root@ceph-node1 ~]#cat ceph-user.key 
mgr.ceph-node3
	key: AQB0kblgq5j9GRAAsRX26+D+nqp73dCXPuLh7g==
	caps: [mds] allow *
	caps: [mon] allow profile mgr
	caps: [osd] allow *

5.5.2 列出指定用户信息

[18:16:27 root@ceph-node1 ~]#ceph auth get osd.0
exported keyring for osd.0
[osd.0]
	key = AQAll7lgXX34NhAAMgGhhX/SkonysWTzNj+uzA==
	caps mgr = "allow profile osd"
	caps mon = "allow profile osd"
	caps osd = "allow *"
[18:17:14 root@ceph-node1 ~]#ceph auth get client.admin
exported keyring for client.admin
[client.admin]
	key = AQDbe7lgx4txDxAAIp+ntjG+TM55XYBL+RgzKA==
	caps mds = "allow *"
	caps mgr = "allow *"
	caps mon = "allow *"
	caps osd = "allow *"

5.5.3 添加用户

添加一个用户会创建用户名 (TYPE.ID)、机密密钥,以及包含在命令中用于创建该用户的所有能力,用户可使用其密钥向 Ceph 存储集群进行身份验证。用户的能力授予该用户在 Ceph monitor (mon)、Ceph OSD (osd) 或 Ceph 元数据服务器 (mds) 上进行读取、写入或执行的能力,可以使用以下几个命令来添加用户:

5.5.3.1 ceph auth add

此命令是添加用户的规范方法。它会创建用户、生成密钥,并添加所有指定的能力。

#添加 key
[18:17:38 root@ceph-node1 ~]#ceph auth add client.nginx mon 'allow r' osd 'allow rwx pool=web-nginx'
added key for client.nginx

#验证key
[18:19:36 root@ceph-node1 ~]#ceph auth get client.nginx
exported keyring for client.nginx
[client.nginx]
	key = AQA458FggK5DIRAAhlKZiPrwHSHrH0xzVUDzkg==
	caps mon = "allow r"
	caps osd = "allow rwx pool=web-nginx"

5.5.3.2 ceph auth get-or-create

ceph auth get-or-create 此命令是创建用户较为常见的方式之一,因为它会返回包含用户名 (在方括号中)和密钥的密钥文件格式。如果该用户已存在,此命令只以密钥文件格式返回用户名和密钥。您可以使用 -o 文件名选项将输出保存到某个文件

#创建用户
[18:20:08 root@ceph-node1 ~]#ceph auth get-or-create client.nginx mon 'allow r' osd 'allow rwx pool=web-nginx'
[client.nginx]
	key = AQA458FggK5DIRAAhlKZiPrwHSHrH0xzVUDzkg==
#验证用户
[18:21:25 root@ceph-node1 ~]#ceph auth get client.nginx
exported keyring for client.nginx
[client.nginx]
	key = AQA458FggK5DIRAAhlKZiPrwHSHrH0xzVUDzkg==
	caps mon = "allow r"
	caps osd = "allow rwx pool=web-nginx"

5.5.3.3 ceph auth get-or-create-key

此命令是创建用户并仅返回用户密钥,对于只需要密钥的客户端(例如 libvirt),此命令非常有用。如果该用户已存在,此命令只返回密钥。您可以使用 -o 文件名选项将输出保存到某个文件。

创建客户端用户时,可以创建不具有能力的用户。不具有能力的用户可以进行身份验证,但不能执行其他操作,此类客户端无法从监视器检索集群地图,但是,如果希望稍后再添加能力,可以使用 ceph auth caps 命令创建一个不具有能力的用户。

典型的用户至少对 Ceph monitor 具有读取功能,并对 Ceph OSD 具有读取和写入功能。此外,用户的 OSD 权限通常限制为只能访问特定的存储池。

[18:21:52 root@ceph-node1 ~]#ceph auth get-or-create-key client.nginx mon 'allow r' osd 'allow rwx pool=web-nginx'
AQA458FggK5DIRAAhlKZiPrwHSHrH0xzVUDzkg==  # 用户有 key 就显示没有就创

5.5.3.4 ceph auth print-key

只获取单个指定用户的 key 信息

[18:24:21 root@ceph-node1 ~]#ceph auth print-key client.nginx
AQA458FggK5DIRAAhlKZiPrwHSHrH0xzVUDzkg==

5.5.3.5 修改用户能力

使用 ceph auth caps 命令可以指定用户以及更改该用户的能力,设置新能力会完全覆盖当前 的能力,因此要加上之前的用户已经拥有的能和新的能力,如果看当前能力,可以运行 ceph auth get USERTYPE.USERID,如果要添加能力,使用以下格式时还需要指定现有能力

#查看用户当前权限
[18:25:39 root@ceph-node1 ~]#ceph auth get client.nginx
exported keyring for client.nginx
[client.nginx]
	key = AQA458FggK5DIRAAhlKZiPrwHSHrH0xzVUDzkg==
	caps mon = "allow r"
	caps osd = "allow rwx pool=web-nginx"
#修改用户权限
[18:26:42 root@ceph-node1 ~]#ceph auth caps client.nginx mon 'allow r' osd 'allow rw pool=web-nginx'
updated caps for client.nginx
#再次验证权限
[18:27:37 root@ceph-node1 ~]#ceph auth get client.nginx
exported keyring for client.nginx
[client.nginx]
	key = AQA458FggK5DIRAAhlKZiPrwHSHrH0xzVUDzkg==
	caps mon = "allow r"
	caps osd = "allow rw pool=web-nginx"

5.5.3.6 删除用户

要删除用户使用 ceph auth del TYPE.ID,其中 TYPE 是 client、osd、mon 或 mds 之一,ID 是用 户名或守护进程的 ID

[18:28:59 root@ceph-node1 ~]#ceph auth del client.nginx
updated

5.5.3.7 导入用户

要导入一个或多个用户,请使用 ceph auth import并指定密钥环

[18:29:12 root@ceph-node1 ~]#ceph auth import -i client.nginx.key 
imported keyring

5.6 密钥环管理

ceph 的秘钥环是一个保存了 secrets、password、keys、certificates 并且能够让客户端通认证访问 ceph 的 keyring file(集合文件),一个 keyring file可以保存一个或者多个认证文件及认证信息,每一个 key 都有一个实体名称加权限,类型为:

{client、mon、mds、osd}.name

当客户端访问 ceph 集群时,ceph 会使用以下四个密钥环文件预设置密钥环设置

/etc/ceph/<$cluster name>.<user $type>.<user $id>.keyring #保存单个用户的 keyring
/etc/ceph/cluster.keyring  #保存多个用户的 keyring
/etc/ceph/keyring          #未定义集群名称的多个用户的 keyring
/etc/ceph/keyring.bin      #编译后的二进制文件

5.6.1 创建密钥环文件

使用 ceph auth add 等命令添加的用户还需要额外使用 ceph-authtool 命令为期创建用户秘钥环。 ceph客户端使用keyring 文件查找用户并检索秘钥。

[18:33:32 root@ceph-node1 ~]#ceph-authtool --create-keyring user
#其实就是创建了一个空文件
[18:33:51 root@ceph-node1 ~]#file user
user: empty

5.6.1.1 导出用户keyring过程

#重定向到文件
[18:35:56 root@ceph-node1 ~]#ceph auth get client.nginx > ceph.client.nginx.keyring
exported keyring for client.nginx
[18:36:29 root@ceph-node1 ~]#ceph auth get client.admin >> ceph.client.admin.keyring
exported keyring for client.admin
#验证
[18:36:44 root@ceph-node1 ~]#cat ceph.client.admin.keyring ceph.client.nginx.keyring 
[client.nginx]
	key = AQA458FggK5DIRAAhlKZiPrwHSHrH0xzVUDzkg==
	caps mon = "allow r"
	caps osd = "allow rw pool=web-nginx"
[client.admin]
	key = AQDbe7lgx4txDxAAIp+ntjG+TM55XYBL+RgzKA==
	caps mds = "allow *"
	caps mgr = "allow *"
	caps mon = "allow *"
	caps osd = "allow *"
#发送到其他主机进行测试
18:52:05 root@ubuntu18-04 ~]#ls /etc/ceph/
ceph.client.admin.keyring  ceph.client.nginx.keyring  ceph.conf  rbdmap
#默认不指定使用admin
#如要使用nginx用户需要指定参数--name
[18:52:52 root@ubuntu18-04 ~]#ceph --name client.nginx -s
  cluster:
    id:     613e7f7c-57fe-4f54-af43-9d88ab1b861b
    health: HEALTH_WARN
            application not enabled on 1 pool(s)
 
  services:
    mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3
    mgr: ceph-node1(active), standbys: ceph-node3, ceph-node2
    mds: mycephfs-1/1/1 up  {0=ceph-node2=up:active}
    osd: 12 osds: 12 up, 12 in
    rgw: 1 daemon active
 
  data:
    pools:   7 pools, 160 pgs
    objects: 238  objects, 101 MiB
    usage:   13 GiB used, 347 GiB / 360 GiB avail
    pgs:     160 active+clean

六、Ceph RDB使用详解

6.1 RBD架构图

Ceph 可以同时提供对象存储 RADOSGW、块存储 RBD、文件系统存储 Ceph FS,RBD 即 RADOS Block Device 的简称,RBD 块存储是最稳定且最常用的存储类型,RBD 块设备类似磁盘可以被挂载,RBD 块设备具有快照、多副本、克隆和一致性等特性,数据以条带化的方式存储在 Ceph 集群的多个 OSD 中。

条带化技术就是一种自动的将 I/O 的负载均衡到多个物理磁盘上的技术,条带化技术就是将一块连续的数据分成很多小部分并把他们分别存储到不同磁盘上去。这就能使多个进程同时访问数据的多个不同部分而不会造成磁盘冲突,而且在需要对这种数据进行顺序访问的时候可以获得最大程度上的 I/O 并行能力,从而获得非常好的性能

image-20210610200945394

6.2 创建存储池

#创建存储池
[20:12:18 root@ceph-node1 ~]#ceph osd pool create rbd-data1 32 32
pool 'rbd-data1' created

#验证存储池
[20:13:10 root@ceph-node1 ~]#ceph osd pool ls
.rgw.root
default.rgw.control
default.rgw.meta
default.rgw.log
cephfs-metadata
cephfs-data
rbd-data1

#在存储池启用rbd功能
#命令格式
osd pool application enable <poolname> <app> {--yes-i-really-mean-it} :  enable use of an application <app> [cephfs,rbd,rgw] on pool <poolname>

[20:13:39 root@ceph-node1 ~]#ceph osd pool application enable rbd-data1 rbd
enabled application 'rbd' on pool 'rbd-data1'

#初始化rbd
[20:15:22 root@ceph-node1 ~]#rbd pool init -p rbd-data1

6.3 创建img镜像

rbd 存储池并不能直接用于块设备,而是需要事先在其中按需创建映像(image),并把映像文件作为块设备使用。rbd 命令可用于创建、查看及删除块设备相在的映像(image), 以及克隆映像、创建快照、将映像回滚到快照和查看快照等管理操作。

6.3.1 命令格式

[20:16:20 root@ceph-node1 ~]#rbd help create
usage: rbd create [--pool <pool>] [--image <image>] 
                  [--image-format <image-format>] [--new-format] 
                  [--order <order>] [--object-size <object-size>] 
                  [--image-feature <image-feature>] [--image-shared] 
                  [--stripe-unit <stripe-unit>] 
                  [--stripe-count <stripe-count>] [--data-pool <data-pool>] 
                  [--journal-splay-width <journal-splay-width>] 
                  [--journal-object-size <journal-object-size>] 
                  [--journal-pool <journal-pool>] 
                  [--thick-provision] --size <size> [--no-progress] 
                  <image-spec> 

Create an empty image.

Positional arguments
  <image-spec>              image specification
                            (example: [<pool-name>/]<image-name>)

Optional arguments
  -p [ --pool ] arg         pool name
  --image arg               image name
  --image-format arg        image format [1 (deprecated) or 2]
  --new-format              use image format 2
                            (deprecated)
  --order arg               object order [12 <= order <= 25]
  --object-size arg         object size in B/K/M [4K <= object size <= 32M]
  --image-feature arg       image features
                            [layering(+), exclusive-lock(+*), object-map(+*),
                            fast-diff(+*), deep-flatten(+-), journaling(*)]
  --image-shared            shared image
  --stripe-unit arg         stripe unit in B/K/M
  --stripe-count arg        stripe count
  --data-pool arg           data pool
  --journal-splay-width arg number of active journal objects
  --journal-object-size arg size of journal objects [4K <= size <= 64M]
  --journal-pool arg        pool for journal objects
  --thick-provision         fully allocate storage and zero image
  -s [ --size ] arg         image size (in M/G/T) [default: M]
  --no-progress             disable progress output

Image Features:
  (*) supports enabling/disabling on existing images
  (-) supports disabling-only on existing images
  (+) enabled by default for new images if features not specified

6.3.2 创建镜像

#创建俩个镜像
[20:17:48 root@ceph-node1 ~]#rbd create data-img1 --size 3G --pool rbd-data1 --image-format 2 --image-feature layering
[20:19:36 root@ceph-node1 ~]#rbd create data-img2 --size 5G --pool rbd-data1 --image-format 2 --image-feature layering

#验证镜像
[20:19:55 root@ceph-node1 ~]#rbd ls --pool rbd-data1
data-img1
data-img2

#列出镜像多个信息
[20:20:17 root@ceph-node1 ~]#rbd ls --pool rbd-data1 -l
NAME       SIZE PARENT FMT PROT LOCK 
data-img1 3 GiB          2         
data-img2 5 GiB          2  

6.3.3 查看镜像详细信息

[20:20:49 root@ceph-node1 ~]#rbd --image data-img2 --pool rbd-data1 info
rbd image 'data-img2':
	size 5 GiB in 1280 objects
	order 22 (4 MiB objects)  #对象大小,每个对象是 2^22/1024/1024=4MiB
	id: 1532d6b8b4567         #镜像 id
	block_name_prefix: rbd_data.1532d6b8b4567 #size 里面的 1280 个对象名称前缀
	format: 2    #镜像文件格式版本
	features: layering  #特性,layering 支持分层快照以写时复制
	op_features: 
	flags: 
	create_timestamp: Thu Jun 10 20:19:55 2021
[20:21:41 root@ceph-node1 ~]#rbd --image data-img1 --pool rbd-data1 info
rbd image 'data-img1':
	size 3 GiB in 768 objects
	order 22 (4 MiB objects)
	id: 153276b8b4567
	block_name_prefix: rbd_data.153276b8b4567
	format: 2
	features: layering
	op_features: 
	flags: 
	create_timestamp: Thu Jun 10 20:19:36 2021

6.3.4 以json格式显示镜像信息

[20:23:04 root@ceph-node1 ~]#rbd ls --pool rbd-data1 -l --format json --pretty-format
[
    {
        "image": "data-img1",  #名称
        "size": 3221225472,    #大小
        "format": 2            #镜像格式
    },
    {
        "image": "data-img2",
        "size": 5368709120,
        "format": 2
    }
]

6.3.5 镜像的其他特性

#查看帮助
[20:24:12 root@ceph-node1 ~]#rbd help feature enable

#特性简介
layering  #支持镜像分层快照特性,用于快照及写时复制,可以对 image 创建快照并保护,然后从快照克隆出新的 image 出来,父子 image 之间采用 COW 技术,共享对象数据。

striping #支持条带化 v2,类似 raid 0,只不过在 ceph 环境中的数据被分散到不同的对象中,可改善顺序读写场景较多情况下的性能。

exclusive-lock #支持独占锁,限制一个镜像只能被一个客户端使用。

object-map #支持对象映射(依赖 exclusive-lock),加速数据导入导出及已用空间统计等,此特性开启的时候,会记录 image 所有对象的一个位图,用以标记对象是否真的存在,在一些场景下可以加速 io。

fast-diff  #快速计算镜像与快照数据差异对比(依赖 object-map)

deep-flatten #支持快照扁平化操作,用于快照管理时解决快照依赖关系等。

journaling #修改数据是否记录日志,该特性可以通过记录日志并通过日志恢复数据(依赖独占锁),开启此特性会增加系统磁盘 IO 使用。


#默认开启的特性包括: layering/exlcusive lock/object map/fast diff/deep flatte
有些特性centos系统由于内核版本过低无法映射,所以一般都只指定layering

6.3.6 镜像特性的启用

#启用指定存储池中的指定镜像的特性
[20:25:21 root@ceph-node1 ~]#rbd feature enable exclusive-lock --pool rbd-data1 --image data-img1
[20:31:57 root@ceph-node1 ~]#rbd feature enable object-map --pool rbd-data1 --image data-img1
[20:32:41 root@ceph-node1 ~]#rbd feature enable fast-diff --pool rbd-data1 --image data-img1

#验证
[20:32:53 root@ceph-node1 ~]#rbd --image data-img1 --pool rbd-data1 info
rbd image 'data-img1':
	size 3 GiB in 768 objects
	order 22 (4 MiB objects)
	id: 153276b8b4567
	block_name_prefix: rbd_data.153276b8b4567
	format: 2
	features: layering, exclusive-lock, object-map, fast-diff
	op_features: 
	flags: object map invalid, fast diff invalid
	create_timestamp: Thu Jun 10 20:19:36 2021

6.3.7 镜像特性的禁用

#禁用指定存储池中指定镜像的特性
[20:33:29 root@ceph-node1 ~]#rbd feature disable fast-diff,object-map --pool rbd-data1 --image data-img1
#验证
[20:34:56 root@ceph-node1 ~]#rbd --image data-img1 --pool rbd-data1 info
rbd image 'data-img1':
	size 3 GiB in 768 objects
	order 22 (4 MiB objects)
	id: 153276b8b4567
	block_name_prefix: rbd_data.153276b8b4567
	format: 2
	features: layering, exclusive-lock
	op_features: 
	flags: 
	create_timestamp: Thu Jun 10 20:19:36 2021

6.4 配置客户端使用RBD

在 centos 客户端挂载 RBD,并分别使用 admin 及普通用户挂载 RBD 并验证使用

6.4.1 客户端安装ceph-common

#centos
yum install ceph-common
#ubuntu
apt install ceph-common

6.4.2 客户端使用admin账户挂载并使用RBD

#拷贝ceph.conf配置文件与ceph.client.admin.keyring
[20:10:22 root@ubuntu18-04 ~]#ls /etc/ceph/
ceph.conf  ceph.keyring  rbdmap
#测试
[20:38:02 root@ubuntu18-04 ~]#ceph -s
  cluster:
    id:     613e7f7c-57fe-4f54-af43-9d88ab1b861b
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3
    mgr: ceph-node3(active), standbys: ceph-node2, ceph-node1
    mds: mycephfs-1/1/1 up  {0=ceph-node2=up:active}
    osd: 12 osds: 12 up, 12 in
    rgw: 1 daemon active
 
  data:
    pools:   7 pools, 160 pgs
    objects: 242  objects, 101 MiB
    usage:   13 GiB used, 347 GiB / 360 GiB avail
    pgs:     160 active+clean
#客户端使用存储池中rbd-data的img最小权限
[20:49:07 root@ceph-node1 ~]#ceph auth get client.rbd-data1
exported keyring for client.rbd-data1
[client.rbd-data1]
	key = AQBLCMJgasVMFRAAzTYgf2hhQMWuNgvoiFf7IQ==
	caps mon = "allow r"
	caps osd = "allow rwx pool=rbd-data1"

6.4.2.1 客户端映射镜像

[20:49:11 root@ubuntu18-04 ~]#rbd --name client.rbd-data1 -p rbd-data1 map data-img1
/dev/rbd0
[20:53:05 root@ubuntu18-04 ~]#rbd --name client.rbd-data1 -p rbd-data1 map data-img2
/dev/rbd1
#可能的报错
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbdfeature disable rbd-data1/data-img1 object-map".
In some cases useful info is found in syslog - try "dmesg | tail". rbd: map failed: (6) No such device or address #部分特性不支持,需要在 ceph 管理端关闭特性object-map

6.4.2.2 客户端验证镜像

[20:53:19 root@ubuntu18-04 ~]#lsblk 
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop1    7:1    0 99.2M  1 loop /snap/core/10958
loop2    7:2    0 99.2M  1 loop /snap/core/11167
sda      8:0    0   20G  0 disk 
├─sda1   8:1    0    1M  0 part 
└─sda2   8:2    0   20G  0 part /
sr0     11:0    1 1024M  0 rom  
rbd0   252:0    0    3G  0 disk 
rbd1   252:16   0    5G  0 disk 

6.4.2.3 客户端格式化磁盘并挂载使用

#格式化
[20:53:33 root@ubuntu18-04 ~]#mkfs.xfs /dev/rbd0
[20:54:38 root@ubuntu18-04 ~]#mkfs.xfs /dev/rbd1

#挂载
[20:54:50 root@ubuntu18-04 ~]#mkdir /data /data1 -p
[20:55:37 root@ubuntu18-04 ~]#mount /dev/rbd0 /data
[20:56:06 root@ubuntu18-04 ~]#mount /dev/rbd1 /data1

#验证挂载
[20:56:10 root@ubuntu18-04 ~]#df -TH
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/rbd0      xfs       3.3G   38M  3.2G   2% /data
/dev/rbd1      xfs       5.4G   41M  5.4G   1% /data1

6.4.2.4 客户端验证写入数据

[20:56:27 root@ubuntu18-04 ~]#dd if=/dev/zero of=/data/test bs=100M count=1
[20:58:17 root@ubuntu18-04 ~]#dd if=/dev/zero of=/data1/test bs=100M count=1

#验证数据
[20:58:33 root@ubuntu18-04 ~]#ls /data /data1
/data:
test

/data1:
test

#验证存储池空间
[21:00:44 root@ubuntu18-04 ~]#ceph --name client.rbd-data1 df 
GLOBAL:
    SIZE        AVAIL       RAW USED     %RAW USED 
    360 GiB     347 GiB       13 GiB          3.70 
POOLS:
    NAME                    ID     USED        %USED     MAX AVAIL     OBJECTS 
    .rgw.root               3      1.1 KiB         0       109 GiB           4 
    default.rgw.control     4          0 B         0       109 GiB           8 
    default.rgw.meta        5          0 B         0       109 GiB           0 
    default.rgw.log         6          0 B         0       109 GiB         175 
    cephfs-metadata         7       46 KiB         0       109 GiB          22 
    cephfs-data             8      101 MiB      0.09       109 GiB          27 
    rbd-data1               11     229 MiB      0.20       109 GiB          82 

6.4.2.5 验证ceph内核模块

挂载 rbd 之后系统内核会自动加载 libceph.ko 模块

[21:01:05 root@ubuntu18-04 ~]#modinfo libceph
filename:       /lib/modules/4.15.0-76-generic/kernel/net/ceph/libceph.ko
license:        GPL
description:    Ceph core library
author:         Patience Warnick <patience@newdream.net>
author:         Yehuda Sadeh <yehuda@hq.newdream.net>
author:         Sage Weil <sage@newdream.net>
srcversion:     899059C79545E4ADF47A464
depends:        libcrc32c
retpoline:      Y
intree:         Y
name:           libceph
vermagic:       4.15.0-76-generic SMP mod_unload 
signat:         PKCS#7
signer:       
sig_key:      
sig_hashalgo:   md4

6.4.2.6 rbd镜像空间拉伸

可以扩展空间,不建议缩小空间

#命令帮助查看
[21:04:08 root@ubuntu18-04 ~]#rbd help resize

#当前 rbd 镜像空间大小
[21:04:02 root@ubuntu18-04 ~]#rbd --name client.rbd-data1 ls -p rbd-data1 -l
NAME      SIZE PARENT FMT PROT LOCK 
data-img1 3GiB          2      excl 
data-img2 5GiB          2  

#拉伸前磁盘空间
[21:04:56 root@ubuntu18-04 ~]#fdisk -l /dev/rbd0
Disk /dev/rbd0: 3 GiB, 3221225472 bytes, 6291456 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 4194304 bytes / 4194304 bytes

[21:05:41 root@ubuntu18-04 ~]#lsblk 
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
rbd0   252:0    0    3G  0 disk /data

#拉伸空间
[21:07:48 root@ubuntu18-04 ~]#rbd --name client.rbd-data1 resize --pool rbd-data1 --image data-img1 --size 8G
Resizing image: 100% complete...done.
[21:07:59 root@ubuntu18-04 ~]#rbd --name client.rbd-data1 -p rbd-data1 ls -l
NAME      SIZE PARENT FMT PROT LOCK 
data-img1 8GiB          2         
data-img2 5GiB          2     

#拉伸后空间
[21:08:47 root@ubuntu18-04 ~]#lsblk 
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
rbd0   252:0    0    8G  0 disk /data
[21:09:10 root@ubuntu18-04 ~]#fdisk -l /dev/rbd0
Disk /dev/rbd0: 8 GiB, 8589934592 bytes, 16777216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 4194304 bytes / 4194304 bytes
[21:09:34 root@ubuntu18-04 ~]#df -TH
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/rbd0      xfs       3.3G  143M  3.1G   5% /data #文件系统挂载的大小还是3G需要重新格式化硬盘

6.4.3.7 开机自动挂载

#ubuntu需要自己创建,centos系统自带无需创建
[21:11:45 root@ubuntu18-04 ~]#mkdir /etc/rc.d
[21:14:01 root@ubuntu18-04 ~]#cat /etc/rc.d/rc.local
#!/bin/bash
rbd --name client.rbd-data1 -p rbd-data1 map data-img1
mount /dev/rbd0 /data
[21:15:16 root@ubuntu18-04 ~]#chmod +x /etc/rc.d/rc.local
#先测试
[21:17:16 root@ubuntu18-04 ~]#bash /etc/rc.d/rc.local
#验证
[21:17:27 root@ubuntu18-04 ~]#lsblk  
rbd0   252:0    0    8G  0 disk /data
#之后重启主机验证

6.4.3.8 卸载rbd镜像

[21:14:27 root@ubuntu18-04 ~]#rbd --user rbd-data1 -p rbd-data1 unmap data-img1
[21:15:11 root@ubuntu18-04 ~]#rbd --user rbd-data1 -p rbd-data1 unmap data-img2

6.4.3.9 删除rbd镜像

#命令帮助
[21:27:42 root@ubuntu18-04 ~]#rbd help rm


[21:26:55 root@ubuntu18-04 ~]#rbd --user rbd-data1 rm  -p rbd-data1 --image data-img2
Removing image: 100% complete...done.

6.4.3.10 rbd 镜像回收站机制

删除的镜像数据无法恢复,但是还有另外一种方法可以先把镜像移动到回收站,后期确认删除的时候再从回收站删除即可。

#挂载镜像
[13:38:24 root@ubuntu18-04 ~]#rbd --user rbd-data1 -p rbd-data1 map data-img1
/dev/rbd0

#查看镜像挂载状态
[13:38:35 root@ubuntu18-04 ~]#rbd status --user rbd-data1 -p rbd-data1 --image data-img1
Watchers:
	watcher=172.16.10.1:0/2967766265 client.105075 cookie=18446462598732840961

#将镜像移动到回收站
[13:38:38 root@ubuntu18-04 ~]#rbd --user rbd-data1 trash move -p rbd-data1 --image data-img1

#查看回收站的镜像
[13:40:19 root@ubuntu18-04 ~]#rbd --user rbd-data1 trash list -p rbd-data1
153276b8b4567 data-img1

#pool中查看镜像列表
[13:41:33 root@ubuntu18-04 ~]#rbd --user rbd-data1 -p rbd-data1 ls -l
NAME      SIZE PARENT FMT PROT LOCK 
data-img2 5GiB          2         

#从回收站删除镜像
如果镜像不再使用,可以直接使用 trash remove 将其从回收站删除
[13:48:03 root@ubuntu18-04 ~]#rbd --user rbd-data1 trash remove -p rbd-data1 --image-id 153276b8b4567
Removing image: 100% complete...done.

#还原镜像
[13:44:43 root@ubuntu18-04 ~]#rbd --user rbd-data1 trash restore -p rbd-data1 --image data-img1 --image-id 153276b8b4567

#验证镜像
[13:45:41 root@ubuntu18-04 ~]#rbd --user rbd-data1 -p rbd-data1 ls -l
NAME      SIZE PARENT FMT PROT LOCK 
data-img1 8GiB          2         
data-img2 5GiB          2        

6.5 镜像快照

#命令帮助
rbd help snap 

--user 执行用户cepex认证用户,默认不写是admin
-p pool名称
--image 镜像名称
--snap  快照命令

#创建快照
#rbd snap create
rbd --user rbd-data1 snap create -p rbd-data1 --image data-img1 --snap img1-snap-1

#删除快照
#rbd snap remove
rbd --user rbd-data1 snap remove -p rbd-data1 --image data-img1 --snap img1-snap-1

#快照回滚
#rbd snap rollback
rbd --user rbd-data1 snap rollback -p rbd-data1 --image data-img1 --snap img1-snap-1

#快照数量限制
#rbd snap limit
rbd --user rbd-data1 snap limit set --pool rbd-data1 --image data-img1 --limit 30

6.5.1 客户端当前数据

#映射磁盘
[13:50:19 root@ubuntu18-04 ~]#rbd --user rbd-data1 -p rbd-data1 map data-img1
/dev/rbd0
#挂载创建数据
[13:50:48 root@ubuntu18-04 ~]#mount /dev/rbd0 /mnt/
[13:51:38 root@ubuntu18-04 ~]#cp /etc/passwd /mnt/
[13:51:44 root@ubuntu18-04 ~]#cp /etc/fstab /mnt/
[13:51:49 root@ubuntu18-04 ~]#ls /mnt/
fstab  passwd

6.5.2 创建并验证快照

#创建快照
[13:52:47 root@ubuntu18-04 ~]#rbd --user rbd-data1 snap create -p rbd-data1 --image data-img1 --snap img1-snap-1

#验证快照
[13:54:20 root@ubuntu18-04 ~]#rbd --user rbd-data1 snap list -p rbd-data1 --image data-img1
SNAPID NAME        SIZE TIMESTAMP              
     4 img1-snap-1 8GiB Tue Jun 15 13:53:33 2021 

6.5.3 删除数据并还原快照

#客户端删除数据
[13:54:24 root@ubuntu18-04 ~]#rm -rf /mnt/passwd 
#验证数据
[13:54:56 root@ubuntu18-04 ~]#ll /mnt/
total 8
drwxr-xr-x  2 root root   19 Jun 15 13:54 ./
drwxr-xr-x 24 root root 4096 Apr 26 09:54 ../
-rw-r--r--  1 root root  473 Jun 15 13:51 fstab
#卸载rbd
[13:55:24 root@ubuntu18-04 ~]#umount /mnt 
[13:55:56 root@ubuntu18-04 ~]#rbd --user rbd-data1 unmap /dev/rbd0

#回滚快照
[13:57:11 root@ubuntu18-04 ~]#rbd --user rbd-data1 snap rollback -p rbd-data1 --image data-img1 --snap img1-snap-1
Rolling back to snapshot: 100% complete...done.

6.5.4 客户端验证数据

#客户端映射块设备
[13:57:31 root@ubuntu18-04 ~]#rbd --user rbd-data1 -p rbd-data1 map data-img1
/dev/rbd0
#客户端挂载rbd
[13:58:35 root@ubuntu18-04 ~]#mount /dev/rbd0 /mnt/
#客户端验证数据
[13:58:59 root@ubuntu18-04 ~]#ls /mnt/
fstab  passwd

6.5.5 删除快照

#删除指定快照
[13:59:01 root@ubuntu18-04 ~]#rbd --user rbd-data1 snap remove -p rbd-data1 --image data-img1 --snap img1-snap-1
Removing snap: 100% complete...done.

#验证快照是否删除
[14:00:46 root@ubuntu18-04 ~]#rbd --user rbd-data1 snap list -p rbd-data1 --image da
ta-img1

6.5.6 快照数量限制

#设置与修改快照数量限制
[14:02:31 root@ubuntu18-04 ~]#rbd --user rbd-data1 snap limit set --pool rbd-data1 --image data-img1 --limit 30
[14:02:42 root@ubuntu18-04 ~]#rbd --user rbd-data1 snap limit set --pool rbd-data1 --image data-img1 --limit 20
[14:02:48 root@ubuntu18-04 ~]#rbd --user rbd-data1 snap limit set --pool rbd-data1 --image data-img1 --limit 15

#清除快照数量限制
[14:03:28 root@ubuntu18-04 ~]#rbd --user rbd-data1 snap limit clear -p rbd-data1 --image data-img1

七、CephFS使用

ceph FS 即 ceph filesystem,可以实现文件系统共享功能,客户端通过 ceph 协议挂载并使用 ceph 集群作为数据存储服务器。

Ceph FS 需要运行 Meta Data Services(MDS)服务,其守护进程为 ceph-mds,ceph-mds 进程管 理与 cephFS 上存储的文件相关的元数据,并协调对 ceph 存储集群的访问。

image-20210615163546743

7.1 部署MDS服务

如果第一次使用cephFS,需要部署cephfs服务。

[16:03:25 root@ceph-node2 ~]#yum install ceph-mds
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy mds create ceph-node2

7.2 创建cephFS metadata和data存储池

使用 CephFS 之前需要事先于集群中创建一个文件系统,并为其分别指定元数据和数据相关的存储池。下面创建一个名为 cephfs 的文件系统用于测试,它使用 cephfs-metadata 为元数 据存储池,使用 cephfs-data 为数据存储。

#创建保存metadata的pool
[16:43:39 root@ceph-node1 ~]#ceph osd pool create cephfs-metadata 32 32
pool 'cephfs-metadata' created
#创建保存数据的pool
[16:44:34 root@ceph-node1 ~]#ceph osd pool create cephfs-data 64 64
pool 'cephfs-data' created
#当前ceph状态
[16:45:48 root@ceph-node1 ~]#ceph -s
  cluster:
    id:     613e7f7c-57fe-4f54-af43-9d88ab1b861b
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3
    mgr: ceph-node3(active), standbys: ceph-node1, ceph-node2
    osd: 9 osds: 9 up, 9 in
    rgw: 1 daemon active
 
  data:
    pools:   7 pools, 144 pgs
    objects: 191  objects, 1.2 KiB
    usage:   9.4 GiB used, 261 GiB / 270 GiB avail
    pgs:     144 active+clean

7.3 创建cephFS并验证

#创建一个cephfs
[16:47:02 root@ceph-node1 ~]#ceph fs new cephfs cephfs-metadata cephfs-data
new fs with metadata pool 13 and data pool 14

#查看cephfs列表信息
[16:47:16 root@ceph-node1 ~]#ceph fs ls
name: cephfs, metadata pool: cephfs-metadata, data pools: [cephfs-data ]

#查看指定cephfs状态
[16:47:48 root@ceph-node1 ~]#ceph fs status cephfs
cephfs - 0 clients
======
+------+--------+------------+---------------+-------+-------+
| Rank | State  |    MDS     |    Activity   |  dns  |  inos |
+------+--------+------------+---------------+-------+-------+
|  0   | active | ceph-node2 | Reqs:    0 /s |   10  |   13  |
+------+--------+------------+---------------+-------+-------+
+-----------------+----------+-------+-------+
|       Pool      |   type   |  used | avail |
+-----------------+----------+-------+-------+
| cephfs-metadata | metadata | 2286  | 82.3G |
|   cephfs-data   |   data   |    0  | 82.3G |
+-----------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
+-------------+
MDS version: ceph version 13.2.10 (564bdc4ae87418a232fc901524470e1a0f76d641) mimic (stable)

7.4 验证cephFs服务状态

[16:48:24 root@ceph-node1 ~]#ceph mds stat
cephfs-1/1/1 up  {0=ceph-node2=up:active}  #现在已经转变为活动状态

7.5 创建客户端账户

#创建账户
[16:50:37 root@ceph-node1 ~]#ceph auth add client.cephfs mon 'allow r' mds 'allow rw' osd 'allow rwx pool=cephfs-data'
added key for client.cephfs
#验证账户
[16:50:44 root@ceph-node1 ~]#ceph auth  get client.cephfs
exported keyring for client.cephfs
[client.cephfs]
	key = AQDkachg1jjjAxAAVJcUqaLVYJCLswPyfyJHMA==
	caps mds = "allow rw"
	caps mon = "allow r"
	caps osd = "allow rwx pool=cephfs-data"
#在客户机生成key文件
[16:52:00 root@ubuntu18-04 ~]#cat /etc/ceph/keyring 
[client.cephfs]
    key = AQDkachg1jjjAxAAVJcUqaLVYJCLswPyfyJHMA==
    caps mds = "allow rw"
    caps mon = "allow r"
    caps osd = "allow rwx pool=cephfs-data"
#验证权限
[16:52:26 root@ubuntu18-04 ~]#ceph -s --user cephfs
  cluster:
    id:     613e7f7c-57fe-4f54-af43-9d88ab1b861b
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3
    mgr: ceph-node3(active), standbys: ceph-node1, ceph-node2
    mds: cephfs-1/1/1 up  {0=ceph-node2=up:active}
    osd: 9 osds: 9 up, 9 in
    rgw: 1 daemon active
 
  data:
    pools:   7 pools, 144 pgs
    objects: 213  objects, 3.4 KiB
    usage:   9.4 GiB used, 261 GiB / 270 GiB avail
    pgs:     144 active+clean

7.6 内核客户端挂载

客户端挂载有两种方式,一种是内核空间一种是用户空间,内核空间挂载需要内核支持 ceph 模 块,用户空间挂载需要安装 ceph-fuse

7.6.1 客户端通过key文件挂载

#挂载
[17:07:09 root@ubuntu18-04 ~]#mount -t ceph 172.16.10.72:6789:/ /mnt -o name=cephfs,secretfile=cephfs.key 
#密钥文件
[17:07:14 root@ubuntu18-04 ~]#cat cephfs.key 
AQDkachg1jjjAxAAVJcUqaLVYJCLswPyfyJHMA==

7.6.2 客户端通过key挂载

#挂载
[17:01:10 root@ubuntu18-04 ~]#mount -t ceph 172.16.10.72:6789:/ /mnt -o name=cephfs,secret=AQDkachg1jjjAxAAVJcUqaLVYJCLswPyfyJHMA==

#验证挂载
[17:01:47 root@ubuntu18-04 ~]#df -h
Filesystem           Size  Used Avail Use% Mounted on
172.16.10.72:6789:/   83G     0   83G   0% /mnt

#测速写入数据
[17:01:27 root@ubuntu18-04 ~]#cp /etc/passwd /mnt/
[17:01:50 root@ubuntu18-04 ~]#ls /mnt/
passwd

#查看挂载点状态
[17:02:18 root@ubuntu18-04 ~]#stat -f /mnt/
  File: "/mnt/"
    ID: f4e27dce4fc9e5fc Namelen: 255     Type: ceph
Block size: 4194304    Fundamental block size: 4194304
Blocks: Total: 21083      Free: 21083      Available: 21083
Inodes: Total: 1          Free: -1

7.6.3 开机挂载

[17:09:50 root@ubuntu18-04 ~]#cat /etc/fstab 
172.16.10.72:6789:/ /mnt ceph defaults,name=cephfs,secretfile=/root/cephfs.key,_netdev 0 0

_netdev参数表示是一个网络存储
[17:10:51 root@ubuntu18-04 ~]#mount -a

7.6.4 客户端模块

客户端内核加载 ceph.ko 模块挂载 cephfs 文件系统

[17:11:01 root@ubuntu18-04 ~]#modinfo ceph
filename:       /lib/modules/4.15.0-76-generic/kernel/fs/ceph/ceph.ko
license:        GPL
description:    Ceph filesystem for Linux
author:         Patience Warnick <patience@newdream.net>
author:         Yehuda Sadeh <yehuda@hq.newdream.net>
author:         Sage Weil <sage@newdream.net>
alias:          fs-ceph
srcversion:     E6D32552A20D8B6EB52CC12
depends:        libceph,fscache
retpoline:      Y
intree:         Y
name:           ceph
vermagic:       4.15.0-76-generic SMP mod_unload 
signat:         PKCS#7
signer:       
sig_key:      
sig_hashalgo:   md4

7.7 ceph-fuse 挂载

如果内核本较低而没有 ceph 模块,那么可以安装 ceph-fuse 挂载,但是推荐使用内核模块挂载。

#安装ceph-fuse
#ubuntu
[17:12:51 root@ubuntu18-04 ~]#apt install ceph-fuse
#centos
[17:12:51 root@centos7 ~]#yum install ceph-fuse

#通过ceph-fuse挂载
[17:13:36 root@ubuntu18-04 ~]#ceph-fuse --name client.cephfs -m 172.16.10.72:6789 /mnt/
ceph-fuse[1785]: starting ceph client
2021-06-15 17:14:52.711905 7f9ed7a37680 -1 init, newargv = 0x55855898c3a0 newargc=9
ceph-fuse[1785]: starting fuse

#验证挂载
[17:14:52 root@ubuntu18-04 ~]#df -h
Filesystem      Size  Used Avail Use% Mounted on
ceph-fuse        83G     0   83G   0% /mnt

#开机挂载,指定用户会自动根据用户名称加载授权文件及配置文件 ceph.conf
[17:16:56 root@ubuntu18-04 ~]#cat /etc/fstab 
none /data fuse.ceph ceph.id=cephfs,ceph.conf=/etc/ceph/ceph.conf,_netdev,defaults 0 0

[17:18:29 root@ubuntu18-04 ~]#mount -a
ceph-fuse[1880]: starting ceph client
2021-06-15 17:18:30.457042 7f618faeb680 -1 init, newargv = 0x55debbcddb80 newargc=11
ceph-fuse[1880]: starting fuse

7.8 ceph mds高可用

Ceph mds(etadata service)作为 ceph 的访问入口,需要实现高性能及数据备份,假设启动 4 个 MDS 进程,设置 2 个 Rank。这时候有 2 个 MDS 进程会分配给两个 Rank,还剩下 2 个 MDS 进程分别作为另外2个的备份。

官方帮助:https://docs.ceph.com/en/latest/cephfs/add-remove-mds/

设置每个 Rank 的备份 MDS,也就是如果此 Rank 当前的 MDS 出现问题马上切换到另个 MDS。 设置备份的方法有很多,常用选项如下。

mds_standby_replay #值为 true 或 false,true 表示开启 replay 模式,这种模式下主 MDS 内的数量将实时与从 MDS 同步,如果主宕机,从可以快速的切换。如果为 false 只有宕机的时候才去同步数据,这样会有一段时间的中断。
mds_standby_for_name #设置当前 MDS 进程只用于备份于指定名称的 MDS。
mds_standby_for_rank #设置当前 MDS 进程只用于备份于哪个 Rank,通常为 Rank 编号。另外在存在之个 CephFS 文件系统中,还可以使用 mds_standby_for_fscid 参数来为指定不同的文件系统。
mds_standby_for_fscid #指定 CephFS 文件系统 ID,需要联合 mds_standby_for_rank 生效,如果设置 mds_standby_for_rank,那么就是用于指定文件系统的指定 Rank,如果没有设置,就是指定文件系统的所有 Rank。

7.8.1 当前mds服务器状态

[16:59:20 root@ceph-node1 ~]#ceph mds stat
cephfs-1/1/1 up  {0=ceph-node2=up:active}

7.8.2 添加mds服务器

将ceph-node1,ceph-node3,ceph-node4服务角色添加至ceph集群

#服务器安装ceph-mds服务
[17:23:16 root@ceph-node1 ~]#yum install ceph-mds
[17:50:59 root@ceph-node3 ~]#yum install ceph-mds
[17:51:09 root@ceph-node4 ~]#yum install ceph-mds

#添加 mds 服务器
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy mds create ceph-node1
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy mds create ceph-node3
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy mds create ceph-node4
#验证当前mfs服务器当前状态
[17:52:58 root@ceph-node1 ~]#ceph mds stat 
cephfs-1/1/1 up  {0=ceph-node2=up:active}, 3 up:standby


#验证当前集群状态
[17:53:05 root@ceph-node1 ~]#ceph fs status 
cephfs - 0 clients
======
+------+--------+------------+---------------+-------+-------+
| Rank | State  |    MDS     |    Activity   |  dns  |  inos |
+------+--------+------------+---------------+-------+-------+
|  0   | active | ceph-node2 | Reqs:    0 /s |   11  |   14  |
+------+--------+------------+---------------+-------+-------+
+-----------------+----------+-------+-------+
|       Pool      |   type   |  used | avail |
+-----------------+----------+-------+-------+
| cephfs-metadata | metadata | 8211  |  109G |
|   cephfs-data   |   data   | 1749  |  109G |
+-----------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
|  ceph-node1 |
|  ceph-node3 |
|  ceph-node4 |
+-------------+
MDS version: ceph version 13.2.10 (564bdc4ae87418a232fc901524470e1a0f76d641) mimic (stable)

7.8.3 当前的文件系统状态

[17:53:17 root@ceph-node1 ~]#ceph fs get cephfs
Filesystem 'cephfs' (2)
fs_name	cephfs
epoch	30
flags	12
created	2021-06-15 16:47:15.982006
modified	2021-06-15 16:47:16.990688
tableserver	0
root	0
session_timeout	60
session_autoclose	300
max_file_size	1099511627776
min_compat_client	-1 (unspecified)
last_failure	0
last_failure_osd_epoch	0
compat	compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,8=no anchor table,9=file layout v2,10=snaprealm v2}
max_mds	1
in	0
up	{0=105645}
failed
damaged
stopped
data_pools	[14]
metadata_pool	13
inline_data	disabled
balancer
standby_count_wanted	1
105645:	172.16.10.72:6800/2326179293 'ceph-node2' mds.0.29 up:active seq 27

7.8.4 设置处于激活状态 mds 的数量

如果有四个 mds 服务器,可以设置为两主两备

#设置cephfs的FS存储处于激活状态的节点数量
[17:53:43 root@ceph-node1 ~]#ceph fs set cephfs max_mds 2
#验证
[17:55:00 root@ceph-node1 ~]#ceph fs status 
cephfs - 0 clients
======
+------+--------+------------+---------------+-------+-------+
| Rank | State  |    MDS     |    Activity   |  dns  |  inos |
+------+--------+------------+---------------+-------+-------+
|  0   | active | ceph-node2 | Reqs:    0 /s |   11  |   14  |
|  1   | active | ceph-node4 | Reqs:    0 /s |   10  |   13  |
+------+--------+------------+---------------+-------+-------+
+-----------------+----------+-------+-------+
|       Pool      |   type   |  used | avail |
+-----------------+----------+-------+-------+
| cephfs-metadata | metadata | 9531  |  109G |
|   cephfs-data   |   data   | 1749  |  109G |
+-----------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
|  ceph-node1 |
|  ceph-node3 |
+-------------+
MDS version: ceph version 13.2.10 (564bdc4ae87418a232fc901524470e1a0f76d641) mimic (stable)

7.8.5 MDS高可用配置

现在是ceph-node2和ceph-node4分别是active状态,ceph-node1和ceph-mgr3分别处于standby 状态,现在将 ceph-node1 设置为 ceph-node2 的 standby,将 ceph-node3 设置为 ceph-node4 的 standby,则配置文件如下:

[ceph@ceph-deploy ceph-cluster]$ cat ceph.conf 
[global]
fsid = 613e7f7c-57fe-4f54-af43-9d88ab1b861b
public_network = 172.16.10.0/24
cluster_network = 192.168.10.0/24
mon_initial_members = ceph-node1
mon_host = 172.16.10.71
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

[mds.ceph-node1]
mds_standby_for_name = ceph-node2
mds_standby_replay = true

[mds.ceph-node3]
mds_standby_for_name = ceph-node4
mds_standby_replay = true

7.8.6 分发配置文件重启mds服务

#分发配置文件
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy --overwrite-conf config push ceph-node1
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy --overwrite-conf config push ceph-node2
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy --overwrite-conf config push ceph-node3
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy --overwrite-conf config push ceph-node4

#重启服务
[18:03:12 root@ceph-node1 ~]#systemctl restart ceph-mds@ceph-node1.service
[18:03:12 root@ceph-node2 ~]#systemctl restart ceph-mds@ceph-node2.service
[18:03:12 root@ceph-node3 ~]#systemctl restart ceph-mds@ceph-node3.service 
[18:03:16 root@ceph-node4 ~]#systemctl restart ceph-mds@ceph-node4.service 

7.8.7 ceph集群mds高可用状态

[18:06:45 root@ceph-node4 ~]#ceph fs status
cephfs - 0 clients
======
+------+--------+------------+---------------+-------+-------+
| Rank | State  |    MDS     |    Activity   |  dns  |  inos |
+------+--------+------------+---------------+-------+-------+
|  0   | active | ceph-node3 | Reqs:    0 /s |   11  |   14  |
|  1   | active | ceph-node1 | Reqs:    0 /s |   10  |   13  |
+------+--------+------------+---------------+-------+-------+
+-----------------+----------+-------+-------+
|       Pool      |   type   |  used | avail |
+-----------------+----------+-------+-------+
| cephfs-metadata | metadata | 11.4k |  109G |
|   cephfs-data   |   data   | 1749  |  109G |
+-----------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
|  ceph-node2 |
|  ceph-node4 |
+-------------+
MDS version: ceph version 13.2.10 (564bdc4ae87418a232fc901524470e1a0f76d641) mimic (stable)


[18:06:46 root@ceph-node4 ~]#ceph fs get cephfs
Filesystem 'cephfs' (2)
fs_name	cephfs
epoch	55
flags	12
created	2021-06-15 16:47:15.982006
modified	2021-06-15 18:06:25.277751
tableserver	0
root	0
session_timeout	60
session_autoclose	300
max_file_size	1099511627776
min_compat_client	-1 (unspecified)
last_failure	0
last_failure_osd_epoch	399
compat	compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,8=no anchor table,9=file layout v2,10=snaprealm v2}
max_mds	2
in	0,1
up	{0=106437,1=106449}
failed
damaged
stopped
data_pools	[14]
metadata_pool	13
inline_data	disabled
balancer
standby_count_wanted	1
106437:	172.16.10.73:6807/1340086625 'ceph-node3' mds.0.51 up:active seq 44 (standby for rank 0 'ceph-node4')
106449:	172.16.10.71:6806/2877929859 'ceph-node1' mds.1.44 up:active seq 6 (standby for rank -1 'ceph-node2')

八、对象存储RadosGW使用

对象是对象存储系统中数据存储的基本单位,每个 Object 是数据和数据属性集的综合体, 数据属性可以根据应用的需求进行设置,包括数据分布、服务质量等每个对象自我维护其属性,从而简化了存储系统的管理任务,对象的大小可以不同,对象存储(Object Storage)是无层次结构的数据存储方法,通常用于云计算环境中,不同于其他数据存储方法,基于对象的存储不使用目录树:

数据作为单独的对象进行存储
数据并不放置在目录层次结构中,而是存在于平面地址空间内的同一级别
应用通过唯一地址来识别每个单独的数据对象
每个对象可包含有助于检索的元数据
专为使用 API 在应用级别(而非用户级别)进行访问而设计

8.1 RadosGW 对象存储简介

RadosGW 是对象存储(OSS,Object Storage Service)的一种实现方式,RADOS 网关也称为 Ceph 对象网关、RADOSGW、RGW,是一种服务,使客户端能够利用标准对象存储 API 来访问 Ceph 集群,它支持AWS S3和Swift API,rgw运行于librados之上,在ceph 0.8版本之后使用Civetweb 的 web 服务器来响应 api 请求,可以使用 nginx 或或者 apache 替代,客户端基于 http/https 协议通过 RESTful API 与 rgw 通信,而 rgw 则使用 librados 与 ceph 集群通信,rgw 客户端通 过 s3 或者 swift api 使用 rgw 用户进行身份验证,然后 rgw 网关代表用户利用 cephx 与 ceph 存储进行身份验证。

S3 由 Amazon 于 2006 年推出,全称为 Simple Storage Service,S3 定义了对象存储,是对象存储事实上的标准,从某种意义上说,S3 就是对象存储,对象存储就是 S3,它对象存储市场的霸主,后续的对象存储都是对 S3 的模仿

8.2 对象存储特点

通过对象存储将数据存储为对象,每个对象除了包含数据,还包含数据自身的元数据。

对象通过 Object ID 来检索,无法通过普通文件系统的方式通过文件路径及文件名称操作来直接访问对象,只能通过 API 来访问,或者第三方客户端(实际上也是对 API 的封装)。

对象存储中的对象不整理到目录树中,而是存储在扁平的命名空间中,Amazon S3 将这个扁平命名空间称为 bucket,而 swift 则将其称为容器。

无论是 bucket 还是容器,都不能嵌套。

bucket 需要被授权才能访问到,一个帐户可以对多个 bucket 授权,而权限可以不同。

方便横向扩展、快速检索数据

不支持客户端挂载,且需要客户端在访问的时候指定文件名称。

不是很适用于文件过于频繁修改及删除的场景。

ceph 使用 bucket作为存储桶(存储空间),实现对象数据的存储和多用户隔离,数据存储在 bucket 中,用户的权限也是针对 bucket 进行授权,可以设置用户对不同的 bucket 拥有不同的权限,以实现权限管理。

bucket 特性

存储空间是您用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。您可以设置和修改存储空间属性用来控制地域、访问权限、生命周期等,这些属性设置直接作用于该存储空间内所有对象,因此您可以通过灵活创建不同的存储空间来完成不同的管理功能。

同一个存储空间的内部是扁平的,没有文件系统的目录等概念,所有的对象都直接隶属于其对应的存储空间。

每个用户可以拥有多个存储空间

存储空间的名称在 OSS 范围内必须是全局唯一的,一旦创建之后无法修改名称。

存储空间内部的对象数目没有限制。

bucket 命名规范

只能包括小写字母、数字和短横线(-)。
必须以小写字母或者数字开头和结尾。
长度必须在 3-63 字节之间

radosgw 架构图

image-20210615181654309

radosgw 逻辑图

image-20210615181715343

8.3 对象存储访问对比

Amazon S3:提供了 user、bucket 和 object 分别表示用户、存储桶和对象,其中 bucket 隶属于 user,因此 user 名称即可做为 bucket 的名称空间,不同用户允许使用相同名称的 bucket。

OpenStack Swift:提供了 user、container 和 object 分别对应于用户、存储桶和对象,不过它还额外为 user 提供了父级组件 account,用于表示一个项目或租户,因此一个 account 中可包含一到多个 user,它们可共享使用同一组 container,并为 container 提供名

RadosGW:提供了 user、subuser、bucket 和 object,其中的 user 对应于 S3 的 user,而 subuser则对应于 Swift 的 user,不过 user 和 subuser 都不支持为 bucket 提供名称空间,因此,不同用户的存储桶也不允许同名;不过,自 Jewel 版本起,RadosGW 引入了 tenant(租户)用于为 user 和 bucket 提供名称空间,但它是个可选组件,RadosGW 基于 ACL 为不同的用户设置不同的权限控制,如:

Read 读加执行权限
Write 写权限
Readwrite 只读
full-control 全部控制权限

8.4 部署 RadosGW服务

将ceph-node1,ceph-node2服务部署为高可用的radosGW服务

8.4.1 安装radosgw服务并初始化

[18:19:54 root@ceph-node1 ~]#yum install ceph-radosgw
[18:21:01 root@ceph-node2 ~]#yum install ceph-radosgw

#在ceph-deploy服务器初始化服务
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy rgw create ceph-node1
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy rgw create ceph-node2

#验证集群信息
[18:23:31 root@ceph-node1 ~]#ceph -s
  cluster:
    id:     613e7f7c-57fe-4f54-af43-9d88ab1b861b
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3
    mgr: ceph-node3(active), standbys: ceph-node1, ceph-node2
    mds: cephfs-2/2/2 up  {0=ceph-node3=up:active,1=ceph-node1=up:active}, 2 up:standby
    osd: 12 osds: 12 up, 12 in
    rgw: 2 daemons active    #2个
 
  data:
    pools:   7 pools, 144 pgs
    objects: 233  objects, 15 KiB
    usage:   13 GiB used, 347 GiB / 360 GiB avail
    pgs:     144 active+clean

8.4.2 访问radosgw服务

image-20210615182452995

8.5 radosgw服务配置

8.5.1 radosgw高可用架构

image-20210615182555061

8.5.2 自定义端口

配置文件可以在 ceph deploy 服务器修改然后统一推送,或者单独修改每个 radosgw 服务器的配置为同一配置。

官方配置:https://docs.ceph.com/en/latest/radosgw/frontends/

[18:28:34 root@ceph-node1 ~]#cat /etc/ceph/ceph.conf

[client.rgw.ceph-node1]   #在最后面添加针对当前节点的自定义配置如下
rgw_host = ceph-node1
rgw_frontends = civetweb port=8080

#重启服务
[18:28:37 root@ceph-node1 ~]#systemctl restart ceph-radosgw@rgw.ceph-node1.service

验证:

image-20210615182950587

8.5.3 启用SSL

生成签名证书并配置 radosgw 启用 SSL

8.5.3.1 自签名证书

[18:29:20 root@ceph-node1 ~]#cd /etc/ceph/
[18:30:52 root@ceph-node1 ceph]#mkdir certs
[18:31:05 root@ceph-node1 certs]#openssl genrsa -out civetweb.key 2048
[18:33:11 root@ceph-node1 certs]#openssl req -new -x509 -key civetweb.key -out civetweb.crt -subj "/CN=ceph.zhangzhuo.org"
[18:33:28 root@ceph-node1 certs]#cat civetweb.key  civetweb.crt >civetweb.pem
[18:33:47 root@ceph-node1 certs]#tree 
.
├── civetweb.crt
├── civetweb.key
└── civetweb.pem

8.5.3.2 SSL配置

#修改配置文件
[18:36:39 root@ceph-node1 certs]#cat /etc/ceph/ceph.conf
[client.rgw.ceph-node1]
rgw_host = ceph-node1
rgw_frontends = "civetweb port=8080+8443s ssl_certificate=/etc/ceph/certs/civetweb.pem"

#重启服务
[18:35:13 root@ceph-node1 certs]#systemctl restart ceph-radosgw@rgw.ceph-node1.service 

#验证端口
[18:36:42 root@ceph-node1 certs]#ss -ntl | grep 8443
LISTEN     0      128          *:8443                     *:*   

#验证访问
[18:37:29 root@ceph-node1 certs]#curl http://172.16.10.71:8080
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>
[18:38:15 root@ceph-node1 ~]#curl -k https://172.16.10.71:8443
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>

8.5.3.3 优化配置

#创建日志目录
[18:38:30 root@ceph-node1 ~]#mkdir /var/log/radosgw
[18:39:20 root@ceph-node1 ~]#chown ceph: /var/log/radosgw

#修改配置
[18:39:32 root@ceph-node1 ~]#vim /etc/ceph/ceph.conf 
[client.rgw.ceph-node1]
rgw_host = ceph-node1
rgw_frontends = "civetweb port=8080+8443s ssl_certificate=/etc/ceph/certs/civetweb.pem request_timeout_ms=30000 error_log_file=/var/log/radosgw/civetweb.error.log access_log_file=/var/log/radosgw/civetweb.access.log num_threads=100"

#重启服务
[18:42:07 root@ceph-node1 ~]#systemctl restart ceph-radosgw@rgw.ceph-node1.service

#访问测试
[18:43:21 root@ceph-node1 ~]#curl http://172.16.10.71:8080
[18:43:24 root@ceph-node1 ~]#curl -k https://172.16.10.71:8443

#验证日志
[18:44:08 root@ceph-node1 ~]#tail /var/log/radosgw/civetweb.access.log 
172.16.10.71 - - [15/Jun/2021:18:43:24 +0800] "GET / HTTP/1.1" 200 414 - curl/7.29.0
172.16.10.71 - - [15/Jun/2021:18:43:56 +0800] "GET / HTTP/1.1" 200 414 - curl/7.29.0

九、ceph dashboard及监控

Ceph dashboard 是通过一个 web 界面,对已经运行的 ceph 集群进行状态查看及功能配置等 功能,早期 ceph 使用的是第三方的 dashboard 组件,如

Calamari

Calamari 对外提供了十分漂亮的 Web 管理和监控界面,以及一套改进的 REST API 接口(不同于 Ceph 自身的 REST API),在一定程度上简化了 Ceph 的管理。最初 Calamari 是作为 Inktank公司的 Ceph 企业级商业产品来销售,红帽 2015 年收购 Inktank 后为了更好地推动 Ceph 的发展,对外宣布 Calamari 开源

https://github.com/ceph/calamari
优点:
	管理功能好
	界面友好
	可以利用它来部署 Ceph 和监控 Ceph
缺点:
	非官方
	依赖 OpenStack 某些包
[ceph@ceph-deploy ceph-cluster]$ ceph-deploy -h | grep calamari
    calamari            Install and configure Calamari nodes. Assumes that a

VSM

Virtual Storage Manager (VSM)是 Intel 公司研发并且开源的一款 Ceph 集群管理和监控软件,简化了一些 Ceph 集群部署的一些步骤,可以简单的通过 WEB 页面来操作
https://github.com/intel/virtual-storage-manager

优点:
	易部署
	轻量级
	灵活(可以自定义开发功能)
缺点:
	监控选项少
	缺乏 Ceph 管理功能

Inkscope

Inkscope 是一个 Ceph 的管理和监控系统,依赖于 Ceph 提供的 API,使用 MongoDB 来存储实时的监控数据和历史信息。
https://github.com/inkscope/inkscope
优点:
	易部署
	轻量级
	灵活(可以自定义开发功能)
缺点:
	监控选项少
	缺乏 Ceph 管理功能

Ceph-Dash

Ceph-Dash 是用 Python 开发的一个 Ceph 的监控面板,用来监控 Ceph 的运行状态。同时提供 REST API 来访问状态数据
http://cephdash.crapworks.de/

优点:
	易部署
	轻量级
	灵活(可以自定义开发功能)
缺点:
	功能相对简单

9.1 启用 dashboard 模块

Ceph mgr 是一个多模块化的组件,其组件可以单独的启用或关闭。以下为在 ceph-deploy 服务器操作

#查看帮助
[ceph@ceph-deploy ceph-cluster]$ ceph mgr module -h
#列出所有模块
[ceph@ceph-deploy ceph-cluster]$ ceph mgr module ls
{
    "enabled_modules": [ #已开启的模块
        "balancer",
        "crash",
        "iostat",
        "restful",
        "status"
    ],
    "disabled_modules": [ #已关闭的模块
        {
            "name": "dashboard",
            "can_run": true, #是否可以启用
            "error_string": ""
        },
        {
            "name": "hello",
            "can_run": true,
            "error_string": ""
        },
        {
            "name": "influx",
            "can_run": false,
            "error_string": "influxdb python module not found" #确实模块不能启用
        },
        {
            "name": "localpool",
            "can_run": true,
            "error_string": ""
        },
        {
            "name": "prometheus",
            "can_run": true,
            "error_string": ""
        },
        {
            "name": "selftest",
            "can_run": true,
            "error_string": ""
        },
        {
            "name": "smart",
            "can_run": true,
            "error_string": ""
        },
        {
            "name": "telegraf",
            "can_run": true,
            "error_string": ""
        },
        {
            "name": "telemetry",
            "can_run": true,
            "error_string": ""
        },
        {
            "name": "zabbix",
            "can_run": true,
            "error_string": ""
        }
    ]
}
#启用模块
[ceph@ceph-deploy ceph-cluster]$ ceph mgr module enable dashboard

注:模块启用后还不能直接访问,需要配置关闭 SSL 或启用 SSL 及指定监听地址。

9.1.1 启用dashboard模块

Ceph dashboard 在 mgr 节点进行开启设置,并且可以配置开启或者关闭 SSL,如下

#关闭SSL
[ceph@ceph-deploy ceph-cluster]$ ceph config set mgr mgr/dashboard/ssl false
#指定 dashboard 监听地址
[ceph@ceph-deploy ceph-cluster]$ ceph config set mgr mgr/dashboard/ceph-node1/server_addr 172.16.10.71
#指定 dashboard 监听端口
[ceph@ceph-deploy ceph-cluster]$ ceph config set mgr mgr/dashboard/ceph-node1/server_port 9009
#验证集群状态
[ceph@ceph-deploy ceph-cluster]$ ceph -s
  cluster:
    id:     613e7f7c-57fe-4f54-af43-9d88ab1b861b
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3
    mgr: ceph-node3(active), standbys: ceph-node1, ceph-node2
    mds: cephfs-2/2/2 up  {0=ceph-node3=up:active,1=ceph-node1=up:active}, 2 up:standby
    osd: 12 osds: 12 up, 12 in
    rgw: 2 daemons active
 
  data:
    pools:   7 pools, 144 pgs
    objects: 233  objects, 15 KiB
    usage:   13 GiB used, 347 GiB / 360 GiB avail
    pgs:     144 active+clean

如果有以下报错:
Module 'dashboard' has failed: error('No socket could be created',)
需要检查 mgr 服务是否正常运行,可以重启一遍 mgr 服务

9.1.2 在mgr节点验证端口与进程

[19:36:58 root@ceph-node1 ~]#lsof -i:9009
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ceph-mgr 1156 ceph   28u  IPv4  58642      0t0  TCP ceph-node1.zhangzhuo.org:pichat (LISTEN)

访问验证

image-20210615194158692

9.1.3 设置dashboard账户密码

#命令帮助
[ceph@ceph-deploy ceph-cluster]$ ceph dashboard set-login-credentials -h

#创建用户
[ceph@ceph-deploy ceph-cluster]$ ceph dashboard set-login-credentials zhangzhuo 123456
Username and password updated

登录验证

image-20210615194533398

9.1.4 dashboard SSL

如果要使用 SSL 访问。则需要配置签名证书。证书可以使用 ceph 命令生成,或是 opessl 命令生成。

官方帮助:https://docs.ceph.com/en/latest/mgr/dashboard/

9.1.4.1 ceph自签名证书

#生成证书
[ceph@ceph-deploy ceph-cluster]$ ceph dashboard create-self-signed-cert 
Self-signed certificate created
#启用SSL
[ceph@ceph-deploy ceph-cluster]$ ceph config set mgr mgr/dashboard/ssl true

#查看当前dashboard状态
[ceph@ceph-deploy ceph-cluster]$ ceph mgr services 
{
    "dashboard": "http://ceph-node3.zhangzhuo.org:8080/"
}
#重启mgr服务
[19:41:04 root@ceph-node1 ~]#systemctl restart ceph-mgr@ceph-node1.service 
#再次验证
[ceph@ceph-deploy ceph-cluster]$ ceph mgr services 
{
    "dashboard": "https://ceph-node3.zhangzhuo.org:8443/"
}

访问测试

image-20210615195230899

证书信息

image-20210615195306527

9.2 通过prometheus监控ceph node节点

9.2.1 部署prometheus

[20:03:24 root@ceph-deploy apps]#tar xf prometheus-2.27.1.linux-amd64.tar.gz 
[20:03:35 root@ceph-deploy apps]#mv prometheus-2.27.1.linux-amd64 prometheus
[20:04:21 root@ceph-deploy apps]#ls
prometheus 
[20:04:31 root@ceph-deploy apps]#cat /etc/systemd/system/prometheus.service 
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
Restart=on-failure
WorkingDirectory=/apps/prometheus/
ExecStart=/apps/prometheus/prometheus --config.file=/apps/prometheus/prometheus.yml
[Install]
WantedBy=multi-user.target

#启动服务
[20:04:50 root@ceph-deploy apps]#systemctl start prometheus.service 

测试访问prometheus

image-20210615200623579

9.2.2 部署node_exporter

[20:11:33 root@ceph-node1 apps]#ls
node_exporter-1.0.1.linux-amd64.tar.gz
[20:11:40 root@ceph-node1 apps]#tar xf node_exporter-1.0.1.linux-amd64.tar.gz 
[20:11:45 root@ceph-node1 apps]#mv node_exporter-1.0.1.linux-amd64 node_exporter
[20:12:47 root@ceph-node1 apps]#cat /etc/systemd/system/node-exporter.service
[Unit]
Description=Prometheus Node Exporter
After=network.target
[Service]
ExecStart=/apps/node_exporter/node_exporter
[Install]
WantedBy=multi-user.targe

#启动服务
[20:12:50 root@ceph-node1 apps]#systemctl start node-exporter.service

验证node_exporter

image-20210615201351840

9.2.3 配置prometheus server数据并验证

[20:15:45 root@ceph-deploy apps]#cat prometheus/prometheus.yml
  - job_name: 'node'
    static_configs:
    - targets: ['172.16.10.71:9100']
#重启服务
[20:24:48 root@ceph-deploy prometheus]#systemctl restart prometheus.service 

验证服务

image-20210615202719595

9.3 通过prometheus监控ceph服务

Ceph manager 内部的模块中包含了 prometheus 的监控模块,并监听在每个 manager 节点的 9283 端口,该端口用于将采集到的信息通过 http 接口向 prometheus 提供数据。

9.3.1 启用prometheus监控模块

#启用模块
[20:20:25 root@ceph-node1 apps]#ceph mgr module enable prometheus

#manager节点验证端口
[20:29:42 root@ceph-node1 apps]#ss -ntl | grep 9283
LISTEN     0      5         [::]:9283                  [::]:*  

浏览器验证数据

image-20210615203658323

9.3.2 配置prometheus采集数据

[20:38:18 root@ceph-deploy ~]#cat /apps/prometheus/prometheus.yml
  - job_name: 'ceph'
    static_configs:
    - targets: ['172.16.10.71:9283']
#重启服务
[20:41:08 root@ceph-deploy ~]#systemctl restart prometheus.service 

验证数据

image-20210615204221923

9.4 通过grafana显示监控数据

通过 granfana'显示对 ceph 的监控数据及 node 数据

9.4.1 安装grafana

[20:45:16 root@ceph-deploy ~]#yum localinstall grafana-7.3.6-1.x86_64.rpm 
[20:47:26 root@ceph-deploy ~]#systemctl restart grafana-server.service

9.4.2 登录grafana

用户名密码:admin

image-20210615204917214

9.4.3 配置数据源

在 grafana 添加 prometheus 数据源

image-20210615205139895

9.4.4 导入模板

监控OSD:https://grafana.com/grafana/dashboards/5336

监控pools:https://grafana.com/grafana/dashboards/5342

监控ceph cluser:https://grafana.com/grafana/dashboards/7056

依次添加即可

效果图

image-20210615210123313


标题:Ceph分布式存储
作者:Carey
地址:HTTPS://zhangzhuo.ltd/articles/2021/06/18/1623993444076.html

生而为人

取消