云原生之深入解析分布式存储系统Ceph的环境部署和实战操作

一、Ceph 简介

① 什么是 Ceph ?

  • Ceph 是当前非常流行的开源分布式存储系统,具有高扩展性、高性能、高可靠性等优点,同时提供块存储服务(rbd)、对象存储服务(rgw)以及文件系统存储服务(cephfs),Ceph 在存储的时候充分利用存储节点的计算能力,在存储每一个数据时都会通过计算得出该数据的位置,尽量的分布均衡。
  • 目前,Ceph 也是 OpenStack 的主流后端存储。

在这里插入图片描述

② Ceph 特点

  • 高性能:
    • 摒弃了传统的集中式存储元数据寻址的方案,采用 CRUSH 算法,数据分布均衡,并行度高;
    • 考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等;
    • 能够支持上千个存储节点的规模,支持 TB 到 PB 级的数据。
  • 高可用性:
    • 副本数可以灵活控制;
    • 支持故障域分隔,数据强一致性;
    • 多种故障场景自动进行修复自愈;
    • 没有单点故障,自动管理。
  • 高可扩展性:
    • 去中心化;
    • 扩展灵活;
    • 随着节点增加而线性增长。
  • 特性丰富:
    • 支持三种存储接口:块存储、文件存储、对象存储;
    • 支持自定义接口,支持多种语言驱动。

③ Ceph 架构

  • Ceph 支持三种接口:
    • Object:有原生的 API,而且也兼容 Swift 和 S3 的 API;
    • Block:支持精简配置、快照、克隆;
    • File:Posix 接口,支持快照。

在这里插入图片描述

  • 说明:
    • RADOS:全称 Reliable Autonomic Distributed Object Store,即可靠的、自动化的、分布式对象存储系统,RADOS 是 Ceph 集群的精华,用户实现数据分配、Failover 等集群操作;
    • Librados:Rados 提供库,因为 RADOS 是协议很难直接访问,因此上层的 RBD、RGW 和 CephFS 都是通过 librados 访问的,目前提供 PHP、Ruby、Java、Python、C 和 C++ 支持。
    • MDS:存储 Ceph 文件系统的元数据。

④ Ceph 核心组件

在这里插入图片描述

  • OSD 是负责物理存储的进程,一般配置成和磁盘一一对应,一块磁盘启动一个 OSD 进程,主要功能是存储数据、复制数据、平衡数据、恢复数据,以及与其它 OSD 间进行心跳检查,负责响应客户端请求返回具体数据的进程等。OSD 是 Ceph 集群中存储实际用户数据的惟一组件,通常一个 OSD 守护进程绑定到集群中的一个物理磁盘。因此,通常来说,Ceph 集群中物理磁盘的总数与在每个物理磁盘上存储用户数据的 OSD 守护进程的总数相同。
  • Ceph 中引入了 PG(placement group)的概念,PG 是一个虚拟的概念而已,并不对应什么实体,ceph 先将 object 映射成 PG,然后从 PG 映射成 OSD。

在这里插入图片描述

  • Pool 是存储对象的逻辑分区,它规定了数据冗余的类型和对应的副本分布策略,支持两种类型:副本(replicated)和 纠删码( Erasure Code)。
  • Pool、PG 和 OSD 的关系如下:
    • 一个 Pool 里有很多 PG;
    • 一个 PG 里包含一堆对象,一个对象只能属于一个 PG;
  • PG 有主从之分,一个 PG 分布在不同的 OSD 上(针对三副本类型);
  • Monitor 监控:一个 Ceph 集群需要多个 Monitor 组成的小集群,它们通过 Paxos 同步数据,用来保存 OSD 的元数据,负责监控整个 Ceph 集群运行的 Map 视图(如 OSD Map、Monitor Map、PG Map 和 CRUSH Map),维护集群的健康状态,维护展示集群状态的各种图表,管理集群客户端认证与授权。
  • MDS 全称 Ceph Metadata Server,是 CephFS 服务依赖的元数据服务,负责保存文件系统的元数据,管理目录结构。对象存储和块设备存储不需要元数据服务;如果不使用 CephFS 可以不安装。
  • Mgr:ceph 官方开发了 ceph-mgr,主要目标实现 ceph 集群的管理,为外界提供统一的入口,例如 cephmetrics、zabbix、calamari、prometheus。Ceph manager 守护进程(Ceph -mgr)是在 Kraken 版本中引入的,它与 monitor 守护进程一起运行,为外部监视和管理系统提供额外的监视和接口。
  • RGW 全称 RADOS gateway,是 Ceph 对外提供的对象存储服务,接口与 S3 和 Swift 兼容。
  • CephFS:ceph 文件系统提供了一个符合 posix 标准的文件系统,它使用 Ceph 存储集群在文件系统上存储用户数据,与 RBD(块存储)和 RGW(对象存储)一样,CephFS 服务也作为 librados 的本机接口实现。

⑤ 更多学习

二、Ceph 存储类型

① 块存储服务(RBD)

  • 块是一个字节序列(通常为 512),基于块的存储接口是一种成熟且常见的数据存储方式,介质包括硬盘、固态硬盘、CD、软盘,甚至磁带。块设备接口的无处不在非常适合交互具有包括 Ceph 在内的海量数据存储,Ceph 数据块设备可精简配置、可调整大小,并按条带方式存储数据在多个 OSD。

在这里插入图片描述

  • 优点:
    • 通过 Raid 与 LVM 等手段,对数据提供了保护;
    • 多块廉价的硬盘组合起来,提高容量;
    • 多块磁盘组合出来的逻辑盘,提升读写效率;
  • 缺点:
    • 采用 SAN 架构组网时,光纤交换机,造价成本高;
    • 主机之间无法共享数据;
  • 使用场景:
    • docker 容器、虚拟机磁盘存储分配;
    • 日志存储;
    • 文件存储;
  • 一个 Linux 内核级的块设备,允许用户像任何其他 Linux 块设备一样访问 Ceph。

② 文件系统存储服务(CephFS)

  • Ceph 文件系统(CephFS),是建立在 Ceph 分布式对象存储的顶部, CephFS 提供了最先进的、多用途、高度可用且高性能的文件存储在各种场景应用,包括共享 home 目录、FTP 和 NFS 共享存储等。

在这里插入图片描述

  • Ceph 有块存储,为什么还需要文件系统接口呢?主要是因为应用场景的不同,Ceph 的块设备具有优异的读写性能,但不能多处挂载同时读写,目前主要用在 OpenStack 上作为虚拟磁盘,而 Ceph 的文件系统接口读写性能较块设备接口差,但具有优异的共享性。
  • 优点:
    • 造价低,随便一台机器就可以;
    • 方便文件共享。
  • 缺点:
    • 读写速率低;
    • 传输速率慢;
  • 使用场景:
    • 日志存储;
    • 有目录结构的文件存储。

③ 对象存储服务(RGW)

  • Ceph 对象网关是构建在 librados,它在应用程序和 Ceph 之间提供了一个 RESTful 网关存储集群。Ceph 对象存储支持两种接口:
    • S3 兼容:通过接口提供对象存储功能 与 Amazon S3 RESTful API 的大部分子集兼容;
    • 快速兼容:通过接口提供对象存储功能 与 OpenStack Swift API 的一大块子集兼容。

在这里插入图片描述

  • 优点:
    • 具备块存储的读写高速;
    • 具备文件存储的共享等特性。
  • 使用场景:
    • 图片存储;
    • 视频存储。

三、Ceph 集群部署

① Ceph 的部署工具

  • ceph-deploy:官方的部署工具,不再积极维护 ceph-deploy,它不支持 RHEL8,CentOS 8 或更新的操作系统;
  • ceph-ansible:红帽的部署工具;
  • ceph-chef:利用 chef 进行自动部署 Ceph 的工具;
  • puppet-ceph:puppet 的 ceph 模块;
  • cephadm:仅支援 Octopus 及更新版本(推荐)。

② 集群部署规划

IP hostname 角色 磁盘 操作系统
192.168.182.130 local-168-182-130 monitor,mgr,rgw,mds,osd 2*20G centos7
192.168.182.131 local-168-182-131 monitor,mgr,rgw,mds,osd 2*20G centos7
192.168.182.132 local-168-182-132 monitor,mgr,rgw,mds,osd 2*20G centos7
  • monitor:Ceph 监视管理节点,承担 Ceph 集群重要的管理任务,一般需要 3 或 5 个节点。
  • mgr:Ceph 集群管理节点(manager),为外界提供统一的入口。
  • rgw: Ceph 对象网关,是一种服务,使客户端能够利用标准对象存储 API 来访问 Ceph 集群。
  • mds:Ceph 元数据服务器,MetaData Server,主要保存的文件系统服务的元数据,使用文件存储时才需要该组件。
  • osd:Ceph 存储节点 Object Storage Daemon,实际负责数据存储的节点。

③ 前期准备

  • 关闭 filewalld 服务:
systemctl stop firewalld.service
systemctl disable firewalld.service
  • 关闭并禁用 SELinux:
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
setenforce 0
  • 配置 hosts:
192.168.182.130 local-168-182-130
192.168.182.131 local-168-182-131
192.168.182.132 local-168-182-132
  • ssh 免密配置:
ssh-keygen
# ...一路Enter
ssh-copy-id root@local-168-182-130  //会有一次密码输入
ssh-copy-id root@local-168-182-131
ssh-copy-id root@local-168-182-132
  • 配置时间同步:
yum install -y chrony
systemctl enable --now chronyd

④ 添加磁盘

  • 如果添加完磁盘看不到,可以执行以下命令:
# 重新扫描SCSI总线添加设备
echo "- - -" > /sys/class/scsi_host/host0/scan
echo "- - -" > /sys/class/scsi_host/host1/scan
echo "- - -" > /sys/class/scsi_host/host2/scan

在这里插入图片描述

⑤ 安装 docker(所有节点操作,包括新增)

# centos7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

# 安装yum-config-manager配置工具
yum -y install yum-utils
# 设置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker-ce版本
yum install -y docker-ce

#启动docker服务并开机自启
systemctl enable --now docker

# 查看版本号
docker --version
# 查看版本具体信息
docker version

# Docker镜像源设置
# 修改文件 /etc/docker/daemon.json,没有这个文件就创建
# 添加以下内容后,重启docker服务:
cat >/etc/docker/daemon.json<<EOF
{
    
    
   "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
EOF

systemctl restart docker

⑥ 安装 cephadm

  • 下载 cephadm 脚本(只在主节点操作):
mkdir -p /opt/ceph/my-cluster ; cd /opt/ceph/my-cluster
curl --silent --remote-name --location https://github.com/ceph/ceph/raw/octopus/src/cephadm/cephadm  -o cephadm
chmod +x cephadm
# 或者:
#curl https://raw.githubusercontent.com/ceph/ceph/v15.2.1/src/cephadm/cephadm -o cephadm
#chmod +x cephadm
#//**//下载出错:配置/etc/hosts 文件--—> 199.232.28.133 raw.githubusercontent.com

# 安装python3:(所有节点执行)
yum install python3 -y

# 配置ceph存储库  :(或指定版本)
./cephadm add-repo --release octopus
#或
#./cephadm add-repo --version 15.2.1

# 开始安装ceph-common,ceph工具
./cephadm install ceph-common ceph
# 安装cephadm工具
./cephadm install
which cephadm
which ceph

⑦ 初始化 ceph 集群

  • 当前节点安装 mon、 mgr 角色,部署 prometheus、grafana、alertmanager、node-exporter 等服务:
#先安装一个节点,其它节点通过后面的命令添加到集群中即可
#您需要知道用于集群的第一个监视器守护程序的IP地址。
#如果有多个网络和接口,要确保选择任何可供访问Ceph群集的主机访问的网络和接口。

cephadm bootstrap --mon-ip 192.168.182.130

##### 命令特点:

#在本地主机上为新集群创建监视和管理器守护程序。
#为Ceph集群生成一个新的SSH密钥,并将其添加到root用户的/root/.ssh/authorized_keys文件中。
#将与新集群进行通信所需的最小配置文件编写为/etc/ceph/ceph.conf。
#将client.admin管理密钥的副本写入/etc/ceph/ceph.client.admin.keyring。
#将公用密钥的副本写入 /etc/ceph/ceph.pub。

# 查看部署的服务
docker ps

#=======输出信息=======
Ceph Dashboard is now available at:

             URL: https://local-168-182-130:8443/
            User: admin
        Password: 0ard2l57ji

You can access the Ceph CLI with:

        sudo /usr/sbin/cephadm shell --fsid d1e9b986-89b8-11ed-bec2-000c29ca76a9 -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring

Please consider enabling telemetry to help improve Ceph:

        ceph telemetry on

For more information see:

        https://docs.ceph.com/docs/master/mgr/telemetry/

在这里插入图片描述

  • 根据提示可知,有个 web 地址:https://ip:8443/,这里的截图是部署完之后的截图:

在这里插入图片描述

  • 通过 ceph 命令查看集群状态:
ceph -s

在这里插入图片描述

⑧ 添加新节点

  • 在新主机的根用户 authorized_keys 文件中安装群集的公共 SSH 密钥:
ssh-copy-id -f -i /etc/ceph/ceph.pub root@local-168-182-131
ssh-copy-id -f -i /etc/ceph/ceph.pub root@local-168-182-132

在这里插入图片描述

  • 配置新节点:
ceph orch host add local-168-182-131
ceph orch host add local-168-182-132

#第一次部署新节点时直接用上边的命令即可:
#但是之后的节点新增有可能上述命令出错:
ceph orch host add local-168-182-131 192.168.182.133  #后边跟上对应的IP

# 查看节点
ceph orch host ls

在这里插入图片描述

⑨ 部署监视器(monitor)

# ceph orch apply mon *<number-of-monitors>*
# 确保在此列表中包括第一台(引导)主机。
ceph orch apply mon local-168-182-130,local-168-182-131,local-168-182-132

⑩ 部署 osd

  • 存储设备清单可以显示为:
ceph orch device ls

在这里插入图片描述

  • 可用存储设备的条件:
    • 设备必须没有分区;
    • 设备不得具有任何 LVM 状态;
    • 不得安装设备;
    • 该设备不得包含文件系统;
    • 该设备不得包含 Ceph BlueStore OSD;
    • 设备必须大于 5 GB。
  • 创建 osd 的方式:
# 【第一种方式】告诉Ceph使用任何可用和未使用的存储设备:
ceph orch apply osd --all-available-devices

# 【第二种方式】或者使用下面命令指定使用的磁盘(推荐)
#1. ceph orch daemon add osd *<host>*:*<device-path>*
#例如:
#从特定主机上的特定设备创建OSD:
ceph orch daemon add osd local-168-182-130:/dev/sdb
ceph orch daemon add osd local-168-182-130:/dev/sdc

ceph orch daemon add osd local-168-182-131:/dev/sdb
ceph orch daemon add osd local-168-182-131:/dev/sdc

ceph orch daemon add osd local-168-182-132:/dev/sdb
ceph orch daemon add osd local-168-182-132:/dev/sdc
  • 删除 OSD 节点:
#1.停止osd进程
ceph osd stop x  //(x 可以通过ceph osd ls 查看)
#停止osd的进程,这个是通知集群这个osd进程不在了,不提供服务了,因为本身没权重,就不会影响到整体的分布,也就没有迁移
#2.将节点状态标记为out
ceph osd out osd.x
#停止到osd的进程,这个是通知集群这个osd不再映射数据了,不提供服务了,因为本身没权重,就不会影响到整体的分布,也就没有迁移
#3. 从crush中移除节点
ceph osd crush remove osd.x
这个是从crush中删除,
#4. 删除节点
ceph osd rm osd.x
这个是从集群里面删除这个节点的记录ls
#5. 删除节点认证(不删除编号会占住)
ceph auth del osd.x
这个是从认证当中去删除这个节点的信息

⑪ 部署 mds(cephFS 元数据守护程序)

# ceph orch apply mds *<fs-name>* --placement="*<num-daemons>* [*<host1>* ...]"

ceph orch apply mds myfs --placement="3 local-168-182-130 local-168-182-131 local-168-182-132"

⑫ 部署 RGW

# 为特定领域和区域部署一组radosgw守护程序:
# ceph orch apply rgw *<realm-name>* *<zone-name>* --placement="*<num-daemons>* [*<host1>* ...]"

ceph orch apply rgw myorg us-east-1 --placement="3 local-168-182-130 local-168-182-131 local-168-182-132"

###说明:
#myorg : 领域名  (realm-name)
#us-east-1: 区域名 (zone-name)myrgw

#Cephadm将等待运行正常的群集,并在部署rgw守护程序之前自动创建所提供的领域和区域(realm-name和zone-name不存在的情况)
  • 查看集群状态:
ceph -s

在这里插入图片描述

⑬ 添加专用的 ceph-mgr 节点

# ceph-mgr节点默认会挑选一主一备
# 添加新节点
ceph orch host add local-168-182-131 192.168.182.133

# 部署ceph-mgr
ceph orch apply mgr local-168-182-130,local-168-182-131,local-168-182-132

# ceph orch apply mgr local-168-182-130,local-168-182-131,local-168-182-132,local-168-182-133

在这里插入图片描述

四、cephadm 工具的使用

① cephadm 工具简介

  • Cephadm 是用于管理 Ceph 集群的实用程序或者是管理工具,Cephadm 的目标是提供一个功能齐全、健壮且维护良好的安装和管理层,可供不在 Kubernetes 中运行 Ceph 的任何环境使用。
  • Cephadm 的具体特性如下:
    • 将所有组件部署在容器中:使用容器简化了不同发行版之间的依赖关系和打包复杂度,当然仍在构建 RPM 和 Deb 软件包,但是随着越来越多的用户过渡到 cephadm(或 Rook)并构建容器,可以看到的特定于操作系统的 bug 就越少;
    • 与 Orchestrator API 紧密集成:Ceph 的 Orchestrator 界面在 cephadm 的开发过程中得到了广泛的发展,以匹配实现并清晰地抽象出 Rook 中存在的(略有不同)功能,最终结果是不管是看起来还是感觉都像 Ceph 的一部分;
    • 不依赖管理工具:Salt 和 Ansible 之类的工具在大型环境中进行大规模部署时非常出色,但是使 Ceph 依赖于这种工具意味着用户还需要学习该相关的软件。更重要的是,与专为管理 Ceph 而专门设计的部署工具相比,依赖这些工具(Salt 和 Ansible 等)的部署最终可能变得更加复杂,难以调试并且(最显着)更慢;
    • 最小的操作系统依赖性:Cephadm 需要Python 3,LVM和container runtime(Podman或Docker),任何当前的 Linux 发行版都可以;
    • 将群集彼此隔离:支持多个 Ceph 集群同时存在于同一主机上一直是一个比较小众的场景,但是确实存在,并且以一种健壮,通用的方式将集群彼此隔离,这使得测试和重新部署集群对于开发人员和用户而言都是安全自然的过程;
    • 自动升级:一旦 Ceph“拥有”自己的部署方式,它就可以以安全和自动化的方式升级 Ceph;
    • 从“传统”部署工具轻松迁移:需要从现有工具(例如 ceph-ansible,ceph-deploy 和 DeepSea)中现有的 Ceph 部署轻松过渡到 cephadm。
  • 如下是一些事情的列表 cephadm 可以做:
    • cephadm 可以将 Ceph 容器添加到集群;
    • cephadm 可以从集群中移除 Ceph 容器;
    • cephadm 可以更新 Ceph 容器。

② cephadm 安装

mkdir -p /opt/ceph/my-cluster ; cd /opt/ceph/my-cluster
curl --silent --remote-name --location https://github.com/ceph/ceph/raw/octopus/src/cephadm/cephadm  -o cephadm
chmod +x cephadm

# 开始安装ceph-common,ceph工具
./cephadm install ceph-common ceph
# 安装cephadm工具
./cephadm install
which cephadm
which ceph

# 查看帮助
cephadm --help

③ cephadm 常用命令使用

  • 一般使用 cephadm 用作环境初始化,其它的操作交由 ceph 工具完成,常用命令如下:
### 1、配置ceph安装源(或指定版本)
./cephadm add-repo --release octopus
#或
#./cephadm add-repo --version 15.2.1

### 2、集群初始化
cephadm bootstrap --help # 查看帮助
# cephadm bootstrap --mon-ip *<mon-ip>*
cephadm bootstrap --mon-ip 192.168.182.130
  • cephadm 模型有一个简单的“ Bootstrap ”步骤,该步骤从命令行启动,该命令行在本地主机上启动一个最小的 Ceph 群集(一个 monitor 与 manager 守护程序)。然后,使用 orchestrator 命令部署集群的其余部分,以添加其他主机,使用存储设备并为集群服务部署守护程序。

④ 启用 ceph shell

  • cephadm 命令一般只是作为部署的引导作用,但是建议建议启用对 ceph 命令,因为 ceph 命令更加简洁强大:
# 启用ceph shell
cephadm shell
# 这命令在容器中启动 bash shell 并在本机上安装了所有 Ceph 软件包。

# 查看ceph集群状态,非交互式
cephadm shell ceph status
# 或者
cephadm shell ceph -s
  • 可以安装 ceph-common 包,其中包含所有 Ceph 命令,包括 ceph、rbd、mount.ceph (用于安装 CephFS 文件系统)等:
cephadm add-repo --release quincy
cephadm install ceph-common
# 当然也只安装ceph命令
cephadm install ceph

五、ceph 命令使用

① 添加新节点

ceph orch host add local-168-182-131
ceph orch host add local-168-182-132

#第一次部署新节点时直接用上边的命令即可:
#但是之后的节点新增有可能上述命令出错:
ceph orch host add local-168-182-131 192.168.182.133  #后边跟上对应的IP

# 查看节点
ceph orch host ls

② 使用 ceph 安装软件

### 1、部署监视器(monitor)
# ceph orch apply mon *<number-of-monitors>*
# 确保在此列表中包括第一台(引导)主机。
ceph orch apply mon local-168-182-130,local-168-182-131,local-168-182-132

### 2、部署 osd
# 查看
ceph orch device ls
# 开始部署
# 【第一种方式】告诉Ceph使用任何可用和未使用的存储设备:
ceph orch apply osd --all-available-devices

# 【第二种方式】或者使用下面命令指定使用的磁盘(推荐)
# ceph orch daemon add osd *<host>*:*<device-path>*
#例如:
#从特定主机上的特定设备创建OSD:
ceph orch daemon add osd local-168-182-130:/dev/sdb
ceph orch daemon add osd local-168-182-130:/dev/sdc

ceph orch daemon add osd local-168-182-131:/dev/sdb
ceph orch daemon add osd local-168-182-131:/dev/sdc

ceph orch daemon add osd local-168-182-132:/dev/sdb
ceph orch daemon add osd local-168-182-132:/dev/sdc

### 3、部署mds
# ceph orch apply mds *<fs-name>* --placement="*<num-daemons>* [*<host1>* ...]"
ceph orch apply mds myfs --placement="3 local-168-182-130 local-168-182-131 local-168-182-132"

### 4、部署RGW
# 为特定领域和区域部署一组radosgw守护程序:
# ceph orch apply rgw *<realm-name>* *<zone-name>* --placement="*<num-daemons>* [*<host1>* ...]"
ceph orch apply rgw myorg us-east-1 --placement="3 local-168-182-130 local-168-182-131 local-168-182-132"

###说明:
#myorg : 领域名  (realm-name)
#us-east-1: 区域名 (zone-name)myrgw

### 5、部署ceph-mgr
ceph orch apply mgr local-168-182-130,local-168-182-131,local-168-182-132
  • 删除 OSD 节点:
### 1.停止osd进程
ceph osd stop x  //(x 可以通过ceph osd ls 查看)
#停止osd的进程,这个是通知集群这个osd进程不在了,不提供服务了,因为本身没权重,就不会影响到整体的分布,也就没有迁移

### 2.将节点状态标记为out
ceph osd out osd.x
#停止到osd的进程,这个是通知集群这个osd不再映射数据了,不提供服务了,因为本身没权重,就不会影响到整体的分布,也就没有迁移

### 3. 从crush中移除节点
ceph osd crush remove osd.x
# 这个是从crush中删除,

### 4. 删除节点
ceph osd rm osd.x
# 这个是从集群里面删除这个节点的记录ls

### 5. 删除节点认证(不删除编号会占住)
ceph auth del osd.x
#这个是从认证当中去删除这个节点的信息

#【注意】
# 比如卸载了node3的某osd,(osd.x 即:node:/dev/sdb),在node3上执行以下操作,可以后继续使用node3:/dev/sdb

#1. lvremove /dev/ceph-3f728c86-8002-47ab-b74a-d00f4cf0fdd2/osd-block-08c6dc02-85d1-4da2-8f71-5499c115cd3c  // dev 后的参数可以通过lsblk查看
#2. vgremove  ceph-3f728c86-8002-47ab-b74a-d00f4cf0fdd2
  • 查看服务:
# 其实可以通过docker ps查看,但是不太直观,所以既然有ceph命令,肯定是用ceph查看更为详细直观了。
ceph orch ps
ceph orch ps --daemon-type alertmanager
ceph orch ps --daemon-type osd
# ceph orch ps --daemon-type [alertmanager|crash|grafana|mds|mgrmon|node-exporter|osd|prometheus|rgw]

在这里插入图片描述

③ 主机操作

  • 列出主机:
# ceph orch host ls [--format yaml] [--host-pattern <name>] [--label <label>] [--host-status <status>]
ceph orch host ls
  • 添加主机,要将每个新主机添加到群集,请执行以下步骤:
    • 在新主机的根用户的 authorized_keys 文件:
# ssh-copy-id -f -i /etc/ceph/ceph.pub root@*<new-host>*
ssh-copy-id -f -i /etc/ceph/ceph.pub root@192.168.182.133
    • 告诉 Ceph 新节点是集群的一部分:
# ceph orch host add *<newhost>* [*<ip>*] [*<label1> ...*]
ceph orch host add local-168-182-130 192.168.182.130
# 最好显式提供主机 IP 地址。 如果 IP 是 未提供,则主机名将立即通过 将使用该 DNS 和该 IP
    • 还可以包含一个或多个标签以立即标记新主机:
ceph orch host add local-168-182-130 192.168.182.130 --labels _admin
  • 删除主机,删除所有守护程序后,可以安全地从集群中移除主机从它:
    • 要从主机中排出所有守护程序,请运行以下形式的命令:
# ceph orch host drain *<host>*
ceph orch host drain local-168-182-130

#将计划删除主机上的所有 osd。您可以通过以下方式检查 osd 删除进度:
ceph orch osd rm status

# 可以使用以下命令检查主机上是否没有守护程序:
# ceph orch ps <host>
ceph orch ps local-168-182-130
    • 删除所有守护程序后,可以使用以下命令删除主机:
# ceph orch host rm <host>
ceph orch host rm local-168-182-130
    • 如果主机处于脱机状态且无法恢复,仍可以通过以下方法将其从群集中移除:
# ceph orch host rm <host> --offline --force
ceph orch host rm local-168-182-130 --offline --force
  • 主机标签:业务流程协调程序支持将标签分配给主机,标签是自由形式的,本身和每个主机都没有特定的含义可以有多个标签,它们可用于指定放置的守护进程。
    • 添加标签:
# ceph orch host add my_hostname --labels=my_label1
ceph orch host add local-168-182-130 --labels=my_label1,my_label2

# 也可以,ceph orch host label add my_hostname my_label
ceph orch host label add local-168-182-130 my_label
    • 删除标签:
# ceph orch host label rm my_hostname my_label
ceph orch host label rm local-168-182-130 my_label
    • 特殊主机标签,如下宿主标签对头孢具有特殊含义:
      • _no_schedule:不要在此主机上调度或部署守护程序,此标签可防止 cephadm 在此主机上部署守护程序,如果它被添加到 已经包含 Ceph 守护进程的现有主机,将导致 cephadm 移动 其他位置的守护程序(OSD 除外,不会自动删除)。
      • _no_autotune_memory:不自动调整此主机上的内存,此标签将阻止守护程序内存被调整,即使 osd_memory_target_autotune 或为一个或多个守护程序启用类似选项 在该主机上;
      • _admin:将 client.admin 和 ceph.conf 分发到此主机,默认情况下,一个 _admin 标签应用于群集中的第一个主机(其中引导程序最初是运行的),并且 client.admin 密钥设置为分发到该主机通过功能,添加此标签到其他主机通常会导致 CEPHADM 部署配置和密钥环文件。从版本 16.2.10 和 17.2.1 开始添加到默认位置 Cephadm 还存储配置和密钥环文件中的文件目录,ceph orch client-keyring …/etc/ceph/etc/ceph//var/lib/ceph//config。

④ 维护模式

  • 将主机置于维护模式和退出维护模式(停止主机上的所有 Ceph 守护进程):
# 进入维护模式
# ceph orch host maintenance enter <hostname> [--force]
ceph orch host maintenance enter local-168-182-130

# 退出维护模式
# ceph orch host maintenance exit <hostname>
ceph orch host maintenance exit local-168-182-130

⑤ 查看服务状态

  • 查看一个的状态 在 Ceph 集群中运行的服务中,执行以下操作:
# ceph orch ls [--service_type type] [--service_name name] [--export] [--format f] [--refresh]

# 查看所有服务
ceph orch ls
# 查看指定服务
ceph orch ls alertmanager
ceph orch ls  --service_name crash

⑥ 查看守护进程状态

  • 打印业务流程协调程序已知的所有守护程序的列表:
# ceph orch ps [--hostname host] [--daemon_type type] [--service_name name] [--daemon_id id] [--format f] [--refresh]
ceph orch ps

# 然后查询特定服务实例的状态(mon、osd、mds、rgw),对于 OSDID 是数字 OSD ID,对于 MDS 服务,id 是文件 系统名称:
ceph orch ps --daemon_type osd --daemon_id 0

⑦ OSD 服务

  • 列出设备:
    • ceph-volume 按顺序不时扫描群集中的每个主机,确定存在哪些设备以及它们是否有资格用作 OSD。
    • 查看列表,运行以下命令:
# ceph orch device ls [--hostname=...] [--wide] [--refresh]
ceph orch device ls

# 使用 --wide 选项提供与设备相关的所有详细信息, 包括设备可能不符合用作 OSD 条件的任何原因。
ceph orch device ls --wide

在这里插入图片描述

    • 在上面的示例中,可以看到名为“运行状况”、“标识”和“故障”的字段,此信息通过与 libstoragemgmt 默认情况下,此集成已禁用(因为 libstoragemgmt 可能不是 100% 与您的硬件兼容)。
    • 要使 cephadm 包括这些字段, 启用 CEPHADM 的“增强设备扫描”选项,如下所示:
ceph config set mgr mgr/cephadm/device_enhanced_scan true
  • 创建新的 OSD:
    • Ceph 使用任何可用和未使用的存储设备:
# 如果将新磁盘添加到群集,它们将自动用于 创建新的 OSD。
ceph orch apply osd --all-available-devices
    • 从特定主机上的特定设备创建 OSD:
# ceph orch daemon add osd *<host>*:*<device-path>*
ceph orch daemon add osd local-168-182-133:/dev/sdb
ceph orch daemon add osd local-168-182-133:/dev/sdc

# 或者
# ceph orch daemon add osd host1:data_devices=/dev/sda,/dev/sdb,db_devices=/dev/sdc,osds_per_device=2
ceph orch daemon add osd local-168-182-133:data_devices=/dev/sdb,/dev/sdc

# 使用lvm
# ceph orch daemon add osd *<host>*:*<lvm-path>*
ceph orch daemon add osd host1:/dev/vg_osd/lvm_osd1701
    • 试运行,不是真正的执行:
# 这 --dry-run 标志使业务流程协调程序显示内容的预览 将在不实际创建 OSD 的情况下发生。

ceph orch apply osd --all-available-devices --dry-run
  • 移除 OSD:
    • 从集群中删除 OSD 涉及两个步骤:从集群中撤出所有归置组 (PG),从集群中删除无 PG 的 OSD。
    • 以下命令执行这两个步骤:
# ceph orch osd rm <osd_id(s)> [--replace] [--force]
ceph orch osd rm 0
  • 监控 OSD 删除的状态:
ceph orch osd rm status
  • 停止删除 OSD:
# ceph orch osd rm stop <osd_id(s)>
ceph orch osd rm stop 4
  • 激活现有 OSD,如果重新安装主机的操作系统,则需要激活现有的 OSD,对于此用例,cephadm 提供了一个包装器,激活主机上的所有现有 OSD:
# ceph cephadm osd activate <host>...
ceph cephadm osd activate local-168-182-133
  • 查看数据延迟:
ceph osd perf
  • 详细列出集群每块磁盘的使用情况:
ceph osd df

⑧ pool 相关操作

  • 查看 ceph 集群中的 pool 数量:
ceph osd lspools
#或者
ceph osd pool ls
  • 在 ceph 集群中创建一个 pool:
#这里的100指的是PG:
ceph osd pool create rbdtest 100

⑨ PG 相关

  • 查看 pg 组的映射信息:
ceph pg dump
# 或者
# ceph pg ls
  • 查看一个 PG 的 map:
ceph pg map 7.1a
  • 查看 PG 状态:
ceph pg stat
  • 显示一个集群中的所有的 pg 统计:
ceph pg dump --format plain

六、实战操作演示

① 块存储使用(RDB)

在这里插入图片描述

  • 使用 create 创建 pool 池:
ceph osd lspools

# 创建
ceph osd pool create ceph-demo 64 64

# 创建命令时需要指定PGPGP数量,还可以指定复制模型还是纠删码模型,副本数量等
# osd pool create <pool> [<pg_num:int>] [<pgp_num:int>] [replicated|erasure] [<erasure_code_  create pool profile>] [<rule>] [<expected_num_objects:int>] [<size:int>] [<pg_num_min:int>] [on|off| warn] [<target_size_bytes:int>] [<target_size_ratio:float>]
  • 获取 pool 池属性信息,可以重新设置,有很多参数,都可以如下设置:
# 1、获取 pg 个数
ceph osd pool get ceph-demo pg_num

# 2、获取 pgp 个数
ceph osd pool get ceph-demo pgp_num

# 3、获取副本数
ceph osd pool get ceph-demo size

# 4、获取使用模型
ceph osd pool get ceph-demo crush_rule

# 5、设置副本数
ceph osd pool set ceph-demo size 2

# 6、设置 pg 数量
ceph osd pool set ceph-demo pg_num 128

# 7、设置 pgp 数量
ceph osd pool set ceph-demo pgp_num 128
  • 需要初始化 pool:
rbd pool init ceph-demo
  • 创建 rbd 块设备:
# 查看 块设备
rbd -p ceph-demo ls
# 【方式一】创建块设备
rbd create -p ceph-demo --image rbd-demo.img --size 10G
# 【方式二】创建块设备
rbd create ceph-demo/rbd-demo2.img --size 10G
# 查看 块设备
rbd -p ceph-demo ls
  • 查看块设备信息:
rbd info ceph-demo/rbd-demo2.img
  • 删除块设备:
rbd rm -p ceph-demo --image rbd-demo2.img
  • 设备挂载,由于没有虚拟机进行挂载,因此需要使用内核 map 进行挂载:
rbd map ceph-demo/rbd-demo.img
  • 映射的过程当中出现错误,这是因为 Centos7 当中不支持这几个特性,可以在创建时指定 features:
rbd feature disable ceph-demo/rbd-demo.img deep-flatten
rbd feature disable ceph-demo/rbd-demo.img fast-diff
rbd feature disable ceph-demo/rbd-demo.img object-map

rbd feature disable ceph-demo/rbd-demo.img exclusive-lock
  • 再次挂载,挂载成功:
rbd map ceph-demo/rbd-demo.img
  • 查看设备列表:
rbd device list
  • 通过 fdisk 查看设备列表:
fdisk -l
  • 使用 rbd 设备:
# 格式化
mkfs.ext4 /dev/rbd0
# 创建挂载目录
mkdir /mnt/rbd-demo
# 挂载
mount /dev/rbd0 /mnt/rbd-demo/
  • 块设备扩容,设备可以扩容,也可以缩容,但不建议使用缩容,有可能产生数据丢失:
# 扩容
rbd resize ceph-demo/rbd-demo.img --size 10G
# 查看
rbd -p ceph-demo info --image rbd-demo.img
# 也可以通过lsblk查看
lsblk
  • 卸载:
umount /mnt/rbd-demo

② 文件系统使用(CephFS)

在这里插入图片描述

  • 查看 ceph 文件系统:
ceph fs ls
  • 创建存储池:
ceph osd pool create cephfs_data 128
ceph osd pool create cephfs_metadata 128

# 创建命令时需要指定PGPGP数量,还可以指定复制模型还是纠删码模型,副本数量等
# osd pool create <pool> [<pg_num:int>] [<pgp_num:int>] [replicated|erasure] [<erasure_code_  create pool profile>] [<rule>] [<expected_num_objects:int>] [<size:int>] [<pg_num_min:int>] [on|off| warn] [<target_size_bytes:int>] [<target_size_ratio:float>]
  • PG (Placement Group),pg 是一个虚拟的概念,用于存放 object,PGP(Placement Group for Placement purpose),相当于是 pg 存放的一种 osd 排列组合。
  • 创建文件系统
ceph fs new 128 cephfs_metadata cephfs_data

#此时再回头查看文件系统,mds节点状态
ceph fs ls
ceph mds stat
  • 查看存储池配额:
ceph osd pool get-quota cephfs_metadata
  • 内核驱动挂载 ceph 文件系统:
    • 创建挂载点:
mkdir /mnt/mycephfs
    • 获取存储密钥,如果没有前往管理节点重新复制:
cat /etc/ceph/ceph.client.admin.keyring

#将存储密钥保存到/etc/ceph/admin.secret文件中:
vim /etc/ceph/admin.secret
# AQBFVrFjqst6CRAA9WaF1ml7btkn6IuoUDb9zA==

#如果想开机挂载可以写入/etc/rc.d/rc.local文件中
    • 挂载:
# Ceph 存储集群默认需要认证,所以挂载时需要指定用户名 name 和创建密钥文件一节中创建的密钥文件 secretfile ,例如:
# mount -t ceph {
    
    ip-address-of-monitor}:6789:/ /mnt/mycephfs
mount -t ceph 192.168.182.130:6789:/ /mnt/mycephfs -o name=admin,secretfile=/etc/ceph/admin.secret

在这里插入图片描述

    • 卸载:
umount /mnt/mycephfs
  • 常用命令:
# 查看存储池副本数
ceph osd pool get [存储池名称] size
# 修改存储池副本数
ceph osd pool set [存储池名称] size 3
# 打印存储池列表
ceph osd lspools
# 创建存储池
ceph osd pool create [存储池名称] [pg_num的取值] 
# 存储池重命名
ceph osd pool rename [旧的存储池名称] [新的存储池名称]
# 查看存储池的pg_num
ceph osd pool get [存储池名称] pg_num
# 查看存储池的pgp_num
ceph osd pool get [存储池名称] pgp_num
# 修改存储池的pg_num值
ceph osd pool set [存储池名称] pg_num [pg_num的取值]
# 修改存储池的pgp_num值
ceph osd pool set [存储池名称] pgp_num [pgp_num的取值]

③ 对象存储使用(RGW)

  • rados 是和 Ceph 的对象存储集群(RADOS),Ceph 的分布式文件系统的一部分进行交互是一种实用工具:

在这里插入图片描述

  • 查看 ceph 集群中有多少个 pool:
rados lspools
# 同  ceph osd pool ls 输出结果一致
  • 显示整个系统使用率:
rados df
  • 创建一个 pool:
ceph osd pool create test
  • 创建一个对象 object:
rados create test-object -p test
  • 查看对象文件:
rados -p test ls
  • 删除一个对象:
rados rm test-object -p test
  • 通过 api 接口使用 Ceph 存储存储:为了使用 Ceph SGW REST 接口,,需要为 S3 接口初始化一个 Ceph 对象网关用户,然后为 Swif 接口新建一个子用户,最后就可以通过创建的用户访问对象网关验证。
    • 创建 S3 网关用户:
radosgw-admin user create --uid="rgwuser" --display-name="This is first rgw test user"
  • info:
{
    
    
    "user_id": "rgwuser",
    "display_name": "This is first rgw test user",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [],
    "keys": [
        {
    
    
            "user": "rgwuser",
            "access_key": "48AIAPCYK7S4X9P72VOW",
            "secret_key": "oC5qKL0BMMzUJHAS76rQAwIoJh4s6NwTnLklnQYX"
        }
    ],
    "swift_keys": [],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "default_storage_class": "",
    "placement_tags": [],
    "bucket_quota": {
    
    
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "user_quota": {
    
    
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "temp_url_keys": [],
    "type": "rgw",
    "mfa_ids": []
}

在这里插入图片描述

    • 测试访问 S3 接口:
#参照官方文档,我们需要编写一个 Python 测试脚本,该脚本将会连接 radosgw,然后新建一个新的 bucket 再列出所有的 buckets。脚本变量 aws_access_key_id 和 aws_secret_access_key 的值就是上边返回值中的 access_key 和 secret_key。

#首先,我们需要安装 python-boto 包,用于测试连接 S3。:
yum install python-boto -y

# 然后,编写 python 测试脚本。
# cat s3.py
#!/usr/bin/python

import boto
import boto.s3.connection
access_key = '48AIAPCYK7S4X9P72VOW'
secret_key = 'oC5qKL0BMMzUJHAS76rQAwIoJh4s6NwTnLklnQYX'
conn = boto.connect_s3(
    aws_access_key_id = access_key,
    aws_secret_access_key = secret_key,
    host = 'local-168-182-130', port=80,
    is_secure=False,
    calling_format = boto.s3.connection.OrdinaryCallingFormat(),
)
bucket = conn.create_bucket('my-first-s3-bucket')
for bucket in conn.get_all_buckets():
        print "{name}\t{created}".format(
                name = bucket.name,
                created = bucket.creation_date,
)
    • 这里使用了 python-boto 包,使用认证信息连接 S3,然后创建了一个 my-first-s3-bucket 的 bucket,最后列出所有已创建的 bucket,打印名称和创建时间:

在这里插入图片描述

  • 创建 Swift 用户:
#要通过 Swift 访问对象网关,需要 Swift 用户,我们创建subuser作为子用户。
radosgw-admin subuser create --uid=rgwuser --subuser=rgwuser:swift --access=full
    • Info:
{
    
    
    "user_id": "rgwuser",
    "display_name": "This is first rgw test user",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [
        {
    
    
            "id": "rgwuser:swift",
            "permissions": "full-control"
        }
    ],
    "keys": [
        {
    
    
            "user": "rgwuser",
            "access_key": "48AIAPCYK7S4X9P72VOW",
            "secret_key": "oC5qKL0BMMzUJHAS76rQAwIoJh4s6NwTnLklnQYX"
        }
    ],
    "swift_keys": [
        {
    
    
            "user": "rgwuser:swift",
            "secret_key": "6bgDOAsosiD28M0eE8U1N5sZeGyrhqB1ca3uDtI2"
        }
    ],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "default_storage_class": "",
    "placement_tags": [],
    "bucket_quota": {
    
    
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "user_quota": {
    
    
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "temp_url_keys": [],
    "type": "rgw",
    "mfa_ids": []
}
  • 创建密钥:
radosgw-admin key create --subuser=rgwuser:swift --key-type=swift --gen-secret

#注意:返回的 Json 值中,我们要记住swift_keys中的secret_key 因为下边我们测试访问 Swift 接口时需要使用。secret_key以这条命令为准
    • Info:
{
    
    
    "user_id": "rgwuser",
    "display_name": "This is first rgw test user",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [
        {
    
    
            "id": "rgwuser:swift",
            "permissions": "full-control"
        }
    ],
    "keys": [
        {
    
    
            "user": "rgwuser",
            "access_key": "48AIAPCYK7S4X9P72VOW",
            "secret_key": "oC5qKL0BMMzUJHAS76rQAwIoJh4s6NwTnLklnQYX"
        }
    ],
    "swift_keys": [
        {
    
    
            "user": "rgwuser:swift",
            "secret_key": "AVThl3FGiVQW3VepkQl4Wsoyq9lbPlLlpKhXLhtR"
        }
    ],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "default_storage_class": "",
    "placement_tags": [],
    "bucket_quota": {
    
    
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "user_quota": {
    
    
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "temp_url_keys": [],
    "type": "rgw",
    "mfa_ids": []
}
    • 测试访问 Swift 接口:
#注意,以下命令需要python环境和可用的pip服务。
yum install python-pip -y
pip install --upgrade python-swiftclient

#测试
swift -A http://192.168.182.130/auth/1.0 -U rgwuser:swift -K 'AVThl3FGiVQW3VepkQl4Wsoyq9lbPlLlpKhXLhtR' list

在这里插入图片描述

  • S3 相关操作:
# 1、删除S3用户
radosgw-admin  user rm --uid=rgwuser

# 2、权限调整,允许rgwuser读写users信息:
radosgw-admin caps add --uid=rgwuser --caps="users=*"

# 3、允许admin读写所有的usage信息
radosgw-admin caps add --uid=rgwuser --caps="usage=read,write"

# 4、删除swift子用户
radosgw-admin subuser rm  --subuser=rgwuser:swift

# 5、列出当前系统下所有的bucket信息
radosgw-admin bucket list

# 6、查看具体某个BUCKET属性
radosgw-admin bucket stats --bucket=my-first-s3-bucket

猜你喜欢

转载自blog.csdn.net/Forever_wj/article/details/131696936