Ceph

一、概述

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

分布式存储系统 Ceph 实战操作 - 图1

二、cephadm 工具的使用

cephadm 官方文档

1)cephadm 工具的介绍

cephadm 是用于管理 Ceph 集群的实用程序或者是管理工具。

Cephadm 的目标是提供一个功能齐全、健壮且维护良好的安装和管理层,可供不在 Kubernetes 中运行 Ceph 的任何环境使用。具体特性如下:

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

以下是一些事情的列表 cephadm 可以做:

  • cephadm 可以将 Ceph 容器添加到集群。
  • cephadm 可以从集群中移除 Ceph 容器。
  • cephadm 可以更新 Ceph 容器。

2)cephadm 安装

  1. mkdir -p /opt/ceph/my-cluster ; cd /opt/ceph/my-cluster
  2. curl --silent --remote-name --location https://github.com/ceph/ceph/raw/octopus/src/cephadm/cephadm -o cephadm
  3. chmod +x cephadm
  4. # 开始安装ceph-common,ceph工具
  5. ./cephadm install ceph-common ceph
  6. # 安装cephadm工具
  7. ./cephadm install
  8. which cephadm
  9. which ceph
  10. # 查看帮助
  11. cephadm --help

3)cephadm 常用命令使用

一般使用 cephadm 用作环境初始化,其它的操作交由 ceph 工具完成,常用命令如下:

cephadm 模型有一个简单的“ Bootstrap ”步骤,该步骤从命令行启动,该命令行在本地主机上启动一个最小的 Ceph 群集(一个 monitor 与 manager 守护程序)。然后,使用 orchestrator 命令部署集群的其余部分,以添加其他主机,使用存储设备并为集群服务部署守护程序。
  1. ### 1、配置ceph安装源(或指定版本)
  2. ./cephadm add-repo --release octopus
  3. #或
  4. #./cephadm add-repo --version 15.2.1
  5. ### 2、集群初始化
  6. cephadm bootstrap --help # 查看帮助
  7. # cephadm bootstrap --mon-ip *<mon-ip>*
  8. cephadm bootstrap --mon-ip 192.168.182.130

4)启用 ceph shell

cephadm 命令一般只是作为部署的引导作用。但是,建议启用对 ceph 命令,因为 ceph 命令更加简洁强大。

  1. # 启用ceph shell
  2. cephadm shell
  3. # 这命令在容器中启动 bash shell 并在本机上安装了所有 Ceph 软件包。
  4. # 查看ceph集群状态,非交互式
  5. cephadm shell ceph status
  6. # 或者
  7. cephadm shell ceph -s

可以安装 ceph-common 包,其中包含所有 Ceph 命令,包括 ceph, rbd, mount.ceph (用于安装 CephFS 文件系统)等:

  1. cephadm add-repo --release quincy
  2. cephadm install ceph-common
  3. # 当然也只安装ceph命令
  4. cephadm install ceph

接下来就可以开心的使用 ceph 命令部署软件等等。

三、ceph 命令使用

上面已经安装了 ceph 的全家桶,这里就不重复了。

1)添加新节点

  1. ceph orch host add local-168-182-131
  2. ceph orch host add local-168-182-132
  3. #第一次部署新节点时直接用上边的命令即可:
  4. #但是之后的节点新增有可能上述命令出错:
  5. ceph orch host add local-168-182-131 192.168.182.133 #后边跟上对应的IP
  6. # 查看节点
  7. ceph orch host ls

2)使用 ceph 安装软件

  1. ### 1、部署监视器(monitor)
  2. # ceph orch apply mon *<number-of-monitors>*
  3. # 确保在此列表中包括第一台(引导)主机。
  4. ceph orch apply mon local-168-182-130,local-168-182-131,local-168-182-132
  5. ### 2、部署 osd
  6. # 查看
  7. ceph orch device ls
  8. # 开始部署
  9. # 【第一种方式】告诉Ceph使用任何可用和未使用的存储设备:
  10. ceph orch apply osd --all-available-devices
  11. # 【第二种方式】或者使用下面命令指定使用的磁盘(推荐使用这种方式吧)
  12. # ceph orch daemon add osd *<host>*:*<device-path>*
  13. #例如:
  14. #从特定主机上的特定设备创建OSD:
  15. ceph orch daemon add osd local-168-182-130:/dev/sdb
  16. ceph orch daemon add osd local-168-182-130:/dev/sdc
  17. ceph orch daemon add osd local-168-182-131:/dev/sdb
  18. ceph orch daemon add osd local-168-182-131:/dev/sdc
  19. ceph orch daemon add osd local-168-182-132:/dev/sdb
  20. ceph orch daemon add osd local-168-182-132:/dev/sdc
  21. ### 3、部署mds
  22. # ceph orch apply mds *<fs-name>* --placement="*<num-daemons>* [*<host1>* ...]"
  23. ceph orch apply mds myfs --placement="3 local-168-182-130 local-168-182-131 local-168-182-132"
  24. ### 4、部署RGW
  25. # 为特定领域和区域部署一组radosgw守护程序:
  26. # ceph orch apply rgw *<realm-name>* *<zone-name>* --placement="*<num-daemons>* [*<host1>* ...]"
  27. ceph orch apply rgw myorg us-east-1 --placement="3 local-168-182-130 local-168-182-131 local-168-182-132"
  28. ###说明:
  29. #myorg : 领域名 (realm-name)
  30. #us-east-1: 区域名 (zone-name)myrgw
  31. ### 5、部署ceph-mgr
  32. ceph orch apply mgr local-168-182-130,local-168-182-131,local-168-182-132

删除 OSD 节点

  1. ### 1.停止osd进程
  2. ceph osd stop x //(x 可以通过ceph osd ls 查看)
  3. #停止osd的进程,这个是通知集群这个osd进程不在了,不提供服务了,因为本身没权重,就不会影响到整体的分布,也就没有迁移
  4. ### 2.将节点状态标记为out
  5. ceph osd out osd.x
  6. #停止到osd的进程,这个是通知集群这个osd不再映射数据了,不提供服务了,因为本身没权重,就不会影响到整体的分布,也就没有迁移
  7. ### 3. 从crush中移除节点
  8. ceph osd crush remove osd.x
  9. # 这个是从crush中删除,
  10. ### 4. 删除节点
  11. ceph osd rm osd.x
  12. # 这个是从集群里面删除这个节点的记录ls
  13. ### 5. 删除节点认证(不删除编号会占住)
  14. ceph auth del osd.x
  15. #这个是从认证当中去删除这个节点的信息
  16. #【注意】
  17. #比如卸载了node3的某osd,(osd.x 即:node:/dev/sdb),在node3上执行以下操作,可以后继续使用node3:/dev/sdb
  18. #1. lvremove /dev/ceph-3f728c86-8002-47ab-b74a-d00f4cf0fdd2/osd-block-08c6dc02-85d1-4da2-8f71-5499c115cd3c // dev 后的参数可以通过lsblk查看
  19. #2. vgremove ceph-3f728c86-8002-47ab-b74a-d00f4cf0fdd2

查看服务

  1. # 其实可以通过docker ps查看,但是不太直观,所以既然有ceph命令,肯定是用ceph查看更为详细直观了。
  2. ceph orch ps
  3. ceph orch ps --daemon-type alertmanager
  4. ceph orch ps --daemon-type osd
  5. # ceph orch ps --daemon-type [alertmanager|crash|grafana|mds|mgrmon|node-exporter|osd|prometheus|rgw]

分布式存储系统 Ceph 实战操作 - 图2

3)主机操作

1、列出主机

  1. # ceph orch host ls [--format yaml] [--host-pattern <name>] [--label <label>] [--host-status <status>]
  2. ceph orch host ls

2、添加主机

要将每个新主机添加到群集,请执行以下步骤:

  • 【1】在新主机的根用户的 authorized_keys 文件:
  1. # ssh-copy-id -f -i /etc/ceph/ceph.pub root@*<new-host>*
  2. ssh-copy-id -f -i /etc/ceph/ceph.pub root@192.168.182.133
  • 【2】告诉 Ceph 新节点是集群的一部分:
  1. # ceph orch host add *<newhost>* [*<ip>*] [*<label1> ...*]
  2. ceph orch host add local-168-182-130 192.168.182.130
  3. # 最好显式提供主机 IP 地址。 如果 IP 是 未提供,则主机名将立即通过 将使用该 DNS 和该 IP。

还可以包含一个或多个标签以立即标记 新主机。

  1. ceph orch host add local-168-182-130 192.168.182.130 --labels _admin

3、删除主机

删除所有守护程序后,可以安全地从集群中移除主机 从它。

  • 【1】要从主机中排出所有守护程序,请运行以下形式的命令:
  1. # ceph orch host drain *<host>*
  2. ceph orch host drain local-168-182-130
  3. #将计划删除主机上的所有 osd。您可以通过以下方式检查 osd 删除进度:
  4. ceph orch osd rm status
  5. # 可以使用以下命令检查主机上是否没有守护程序:
  6. # ceph orch ps <host>
  7. ceph orch ps local-168-182-130
  • 【2】删除所有守护程序后,可以使用以下命令删除主机:
  1. # ceph orch host rm <host>
  2. ceph orch host rm local-168-182-130

如果主机处于脱机状态且无法恢复,仍可以通过以下方法将其从群集中移除:

  1. # ceph orch host rm <host> --offline --force
  2. ceph orch host rm local-168-182-130 --offline --force

4、主机标签

业务流程协调程序支持将标签分配给主机。标签 是自由形式的,本身和每个主机都没有特定的含义可以有多个标签。它们可用于指定放置的守护进程。

  • 【1】添加标签
  1. # ceph orch host add my_hostname --labels=my_label1
  2. ceph orch host add local-168-182-130 --labels=my_label1,my_label2
  3. # 也可以,ceph orch host label add my_hostname my_label
  4. ceph orch host label add local-168-182-130 my_label
  • 【2】删除标签
  1. # ceph orch host label rm my_hostname my_label
  2. ceph orch host label rm local-168-182-130 my_label

特殊主机标签

以下宿主标签对头孢具有特殊含义。一切始于 <font style="background-color:rgb(255, 245, 227);">_.</font>

  • _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 还存储配置和密钥环 文件中的文件 目录。<font style="background-color:rgb(255, 245, 227);">ceph orch client-keyring .../etc/ceph/etc/ceph//var/lib/ceph/<fsid>/config</font> ### 4)维护模式 将主机置于维护模式和退出维护模式(停止主机上的所有 Ceph 守护进程): bash # 进入维护模式 # 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 ### 5)查看服务状态 查看一个的状态 在 Ceph 集群中运行的服务中,执行以下操作: bash # 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 ### 6)查看守护进程状态 首先,打印业务流程协调程序已知的所有守护程序的列表: bash # ceph orch ps [--hostname host] [--daemon_type type] [--service_name name] [--daemon_id id] [--format f] [--refresh] ceph orch ps # 然后查询特定服务实例的状态(mon、osd、mds、rgw)。 对于 OSD,ID 是数字 OSD ID。对于 MDS 服务,id 是文件 系统名称: ceph orch ps --daemon_type osd --daemon_id 0 ### 7)OSD 服务 #### 1、列出设备 ceph-volume 按顺序不时扫描群集中的每个主机 确定存在哪些设备以及它们是否有资格 用作 OSD。 查看列表,运行以下命令: bash # ceph orch device ls [--hostname=...] [--wide] [--refresh] ceph orch device ls # 使用 --wide 选项提供与设备相关的所有详细信息, 包括设备可能不符合用作 OSD 条件的任何原因。 ceph orch device ls --wide 分布式存储系统 Ceph 实战操作 - 图3 在上面的示例中,可以看到名为“运行状况”、“标识”和“故障”的字段。此信息通过与 libstoragemgmt.默认情况下, 此集成已禁用(因为 libstoragemgmt 可能不是 100% 与硬件兼容)。要使 cephadm 包括这些字段, 启用 CEPHADM 的“增强设备扫描”选项,如下所示; bash ceph config set mgr mgr/cephadm/device_enhanced_scan true #### 2、创建新的 OSD 有几种方法可以创建新的 OSD: + 【1】告诉 Ceph 使用任何可用和未使用的存储设备: bash # 如果将新磁盘添加到群集,它们将自动用于 创建新的 OSD。 ceph orch apply osd --all-available-devices + 【2】从特定主机上的特定设备创建 OSD: bash # 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 + 【3】试运行,不是真正的执行 bash # 这 --dry-run 标志使业务流程协调程序显示内容的预览 将在不实际创建 OSD 的情况下发生。 ceph orch apply osd --all-available-devices --dry-run #### 3、移除 OSD 从集群中删除 OSD 涉及两个步骤: + 从集群中撤出所有归置组 (PG) + 从集群中删除无 PG 的 OSD 以下命令执行这两个步骤: bash # ceph orch osd rm <osd_id(s)> [--replace] [--force] ceph orch osd rm 0 #### 4、监控 OSD 删除的状态 bash ceph orch osd rm status #### 5、停止删除 OSD bash # ceph orch osd rm stop <osd_id(s)> ceph orch osd rm stop 4 #### 6、激活现有 OSD 如果重新安装主机的操作系统,则需要激活现有的 OSD 再。对于此用例,cephadm 提供了一个包装器 激活 那 激活主机上的所有现有 OSD。 bash # ceph cephadm osd activate <host>... ceph cephadm osd activate local-168-182-133 #### 7、查看数据延迟 bash ceph osd perf #### 8、详细列出集群每块磁盘的使用情况 bash ceph osd df ### 8)pool 相关操作 #### 1、查看 ceph 集群中的 pool 数量 bash ceph osd lspools #或者 ceph osd pool ls #### 2、在 ceph 集群中创建一个 pool bash #这里的100指的是PG组: ceph osd pool create rbdtest 100 ### 9)PG 相关 PG =“放置组”。当集群中的数据,对象映射到编程器,被映射到这些 PGS 的 OSD。 #### 1、查看 pg 组的映射信息 bash ceph pg dump # 或者 # ceph pg ls #### 2、查看一个 PG 的 map bash ceph pg map 7.1a #### 3、查看 PG 状态 bash ceph pg stat #### 4、显示一个集群中的所有的 pg 统计 bash ceph pg dump --format plain 这里只是列举了一些常用的操作命令,更多的命令可以查看帮助或者查看官方文档。 ## 四、实战操作演示 ### 1)块存储使用(RDB ) 分布式存储系统 Ceph 实战操作 - 图4 #### 1、 使用 create 创建 pool 池 ```bash ceph osd lspools # 创建 ceph osd pool create ceph-demo 64 64 # 创建命令时需要指定PG、PGP数量,还可以指定复制模型还是纠删码模型,副本数量等等 # osd pool create [] [] [replicated|erasure] [<erasure_code create pool profile>] [] [] [] [] [on|off| warn] [] [] ``` 【温馨提示】PG (Placement Group),pg 是一个虚拟的概念,用于存放 object,PGP(Placement Group for Placement purpose),相当于是 pg 存放的一种 osd 排列组合。

获取 pool 池属性信息,可以重新设置,有很多参数,都可以如下设置

  1. # 1、获取 pg 个数
  2. ceph osd pool get ceph-demo pg_num
  3. # 2、获取 pgp 个数
  4. ceph osd pool get ceph-demo pgp_num
  5. # 3、获取副本数
  6. ceph osd pool get ceph-demo size
  7. # 4、获取使用模型
  8. ceph osd pool get ceph-demo crush_rule
  9. # 5、设置副本数
  10. ceph osd pool set ceph-demo size 2
  11. # 6、设置 pg 数量
  12. ceph osd pool set ceph-demo pg_num 128
  13. # 7、设置 pgp 数量
  14. ceph osd pool set ceph-demo pgp_num 128

2、需要初始化 pool

  1. rbd pool init ceph-demo

3、创建 rbd 块设备

  1. # 查看 块设备
  2. rbd -p ceph-demo ls
  3. # 【方式一】创建块设备
  4. rbd create -p ceph-demo --image rbd-demo.img --size 10G
  5. # 【方式二】创建块设备
  6. rbd create ceph-demo/rbd-demo2.img --size 10G
  7. # 查看 块设备
  8. rbd -p ceph-demo ls

4、查看块设备信息

  1. rbd info ceph-demo/rbd-demo2.img

5、删除块设备

  1. rbd rm -p ceph-demo --image rbd-demo2.img

6、设备挂载

由于没有虚拟机进行挂载,所以需要使用内核 map 进行挂载;

  1. rbd map ceph-demo/rbd-demo.img
[root@local-168-182-130 ceph]# rbd map ceph-demo/rbd-demo.img
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with “rbd feature disable ceph-demo/rbd-demo.img 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

映射的过程当中出现错误,这是因为 Centos7 当中不支持这几个特性,可以在创建时指定 features 。

  1. rbd feature disable ceph-demo/rbd-demo.img deep-flatten
  2. rbd feature disable ceph-demo/rbd-demo.img fast-diff
  3. rbd feature disable ceph-demo/rbd-demo.img object-map
  4. rbd feature disable ceph-demo/rbd-demo.img exclusive-lock

再次挂载,挂载成功

  1. rbd map ceph-demo/rbd-demo.img

查看设备列表

  1. rbd device list

通过 fdisk 查看设备列表

  1. fdisk -l

使用 rbd 设备

  1. # 格式化
  2. mkfs.ext4 /dev/rbd0
  3. # 创建挂载目录
  4. mkdir /mnt/rbd-demo
  5. # 挂载
  6. mount /dev/rbd0 /mnt/rbd-demo/

7、块设备扩容

设备可以扩容,也可以缩容,但不建议使用缩容,有可能产生数据丢失。

  1. # 扩容
  2. rbd resize ceph-demo/rbd-demo.img --size 10G
  3. # 查看
  4. rbd -p ceph-demo info --image rbd-demo.img
  5. # 也可以通过lsblk查看
  6. lsblk

8、卸载

  1. umount /mnt/rbd-demo

2)文件系统使用(CephFS)

分布式存储系统 Ceph 实战操作 - 图5

1、查看 ceph 文件系统

  1. ceph fs ls

2、创建存储池

  1. ceph osd pool create cephfs_data 128
  2. ceph osd pool create cephfs_metadata 128
  3. # 创建命令时需要指定PG、PGP数量,还可以指定复制模型还是纠删码模型,副本数量等等
  4. # 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 排列组合。

3、创建文件系统

  1. ceph fs new 128 cephfs_metadata cephfs_data
  2. #此时再回头查看文件系统,mds节点状态
  3. ceph fs ls
  4. ceph mds stat

4、查看存储池配额

  1. ceph osd pool get-quota cephfs_metadata

5、内核驱动挂载 ceph 文件系统

【1】创建挂载点

  1. mkdir /mnt/mycephfs

【2】获取存储密钥,如果没有前往管理节点重新复制

  1. cat /etc/ceph/ceph.client.admin.keyring
  2. #将存储密钥保存到/etc/ceph/admin.secret文件中:
  3. vim /etc/ceph/admin.secret
  4. # AQBFVrFjqst6CRAA9WaF1ml7btkn6IuoUDb9zA==
  5. #如果想开机挂载可以写入/etc/rc.d/rc.local文件中

【3】挂载

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

分布式存储系统 Ceph 实战操作 - 图6

【4】卸载

  1. umount /mnt/mycephfs

6、常用命令

  1. # 查看存储池副本数
  2. ceph osd pool get [存储池名称] size
  3. # 修改存储池副本数
  4. ceph osd pool set [存储池名称] size 3
  5. # 打印存储池列表
  6. ceph osd lspools
  7. # 创建存储池
  8. ceph osd pool create [存储池名称] [pg_num的取值]
  9. # 存储池重命名
  10. ceph osd pool rename [旧的存储池名称] [新的存储池名称]
  11. # 查看存储池的pg_num
  12. ceph osd pool get [存储池名称] pg_num
  13. # 查看存储池的pgp_num
  14. ceph osd pool get [存储池名称] pgp_num
  15. # 修改存储池的pg_num值
  16. ceph osd pool set [存储池名称] pg_num [pg_num的取值]
  17. # 修改存储池的pgp_num值
  18. ceph osd pool set [存储池名称] pgp_num [pgp_num的取值]

3)对象存储使用(RGW)

rados 是和 Ceph 的对象存储集群(RADOS),Ceph 的分布式文件系统的一部分进行交互是一种实用工具。
分布式存储系统 Ceph 实战操作 - 图7 #### 1、查看 ceph 集群中有多少个 pool bash rados lspools # 同 ceph osd pool ls 输出结果一致 #### 2、显示整个系统使用率 bash rados df #### 3、创建一个 pool bash ceph osd pool create test #### 4、创建一个对象 object bash rados create test-object -p test #### 5、查看对象文件 bash rados -p test ls #### 6、删除一个对象 bash rados rm test-object -p test #### 7、通过 api 接口使用 Ceph 存储存储 为了使用 Ceph SGW REST 接口,需要为 S3 接口初始化一个 Ceph 对象网关用户. 然后为 Swif 接口新建一个子用户,最后就可以通过创建的用户访问对象网关验证了。 ceph-restful-api 官方文档 这里使用radosgw-adminradosgw-admin 是 RADOS 网关用户管理工具,可用于创建和修改用户。

【1】创建 S3 网关用户

  1. radosgw-admin user create --uid="rgwuser" --display-name="This is first rgw test user"

info

  1. {
  2. "user_id": "rgwuser",
  3. "display_name": "This is first rgw test user",
  4. "email": "",
  5. "suspended": 0,
  6. "max_buckets": 1000,
  7. "subusers": [],
  8. "keys": [
  9. {
  10. "user": "rgwuser",
  11. "access_key": "48AIAPCYK7S4X9P72VOW",
  12. "secret_key": "oC5qKL0BMMzUJHAS76rQAwIoJh4s6NwTnLklnQYX"
  13. }
  14. ],
  15. "swift_keys": [],
  16. "caps": [],
  17. "op_mask": "read, write, delete",
  18. "default_placement": "",
  19. "default_storage_class": "",
  20. "placement_tags": [],
  21. "bucket_quota": {
  22. "enabled": false,
  23. "check_on_raw": false,
  24. "max_size": -1,
  25. "max_size_kb": 0,
  26. "max_objects": -1
  27. },
  28. "user_quota": {
  29. "enabled": false,
  30. "check_on_raw": false,
  31. "max_size": -1,
  32. "max_size_kb": 0,
  33. "max_objects": -1
  34. },
  35. "temp_url_keys": [],
  36. "type": "rgw",
  37. "mfa_ids": []
  38. }

分布式存储系统 Ceph 实战操作 - 图8

【2】测试访问 S3 接口

  1. #参照官方文档,我们需要编写一个 Python 测试脚本,该脚本将会连接 radosgw,然后新建一个新的 bucket 再列出所有的 buckets。脚本变量 aws_access_key_id 和 aws_secret_access_key 的值就是上边返回值中的 access_key 和 secret_key。
  2. #首先,我们需要安装 python-boto 包,用于测试连接 S3。:
  3. yum install python-boto -y
  4. # 然后,编写 python 测试脚本。
  5. # cat s3.py
  6. #!/usr/bin/python
  7. import boto
  8. import boto.s3.connection
  9. access_key = '48AIAPCYK7S4X9P72VOW'
  10. secret_key = 'oC5qKL0BMMzUJHAS76rQAwIoJh4s6NwTnLklnQYX'
  11. conn = boto.connect_s3(
  12. aws_access_key_id = access_key,
  13. aws_secret_access_key = secret_key,
  14. host = 'local-168-182-130', port=80,
  15. is_secure=False,
  16. calling_format = boto.s3.connection.OrdinaryCallingFormat(),
  17. )
  18. bucket = conn.create_bucket('my-first-s3-bucket')
  19. for bucket in conn.get_all_buckets():
  20. print "{name}\t{created}".format(
  21. name = bucket.name,
  22. created = bucket.creation_date,
  23. )
【温馨提示】这里使用了 python-boto 包,使用认证信息连接 S3,然后创建了一个 my-first-s3-bucket 的 bucket,最后列出所有已创建的 bucket,打印名称和创建时间。

分布式存储系统 Ceph 实战操作 - 图9

【3】创建 Swift 用户

  1. #要通过 Swift 访问对象网关,需要 Swift 用户,我们创建subuser作为子用户。
  2. radosgw-admin subuser create --uid=rgwuser --subuser=rgwuser:swift --access=full

info

  1. {
  2. "user_id": "rgwuser",
  3. "display_name": "This is first rgw test user",
  4. "email": "",
  5. "suspended": 0,
  6. "max_buckets": 1000,
  7. "subusers": [
  8. {
  9. "id": "rgwuser:swift",
  10. "permissions": "full-control"
  11. }
  12. ],
  13. "keys": [
  14. {
  15. "user": "rgwuser",
  16. "access_key": "48AIAPCYK7S4X9P72VOW",
  17. "secret_key": "oC5qKL0BMMzUJHAS76rQAwIoJh4s6NwTnLklnQYX"
  18. }
  19. ],
  20. "swift_keys": [
  21. {
  22. "user": "rgwuser:swift",
  23. "secret_key": "6bgDOAsosiD28M0eE8U1N5sZeGyrhqB1ca3uDtI2"
  24. }
  25. ],
  26. "caps": [],
  27. "op_mask": "read, write, delete",
  28. "default_placement": "",
  29. "default_storage_class": "",
  30. "placement_tags": [],
  31. "bucket_quota": {
  32. "enabled": false,
  33. "check_on_raw": false,
  34. "max_size": -1,
  35. "max_size_kb": 0,
  36. "max_objects": -1
  37. },
  38. "user_quota": {
  39. "enabled": false,
  40. "check_on_raw": false,
  41. "max_size": -1,
  42. "max_size_kb": 0,
  43. "max_objects": -1
  44. },
  45. "temp_url_keys": [],
  46. "type": "rgw",
  47. "mfa_ids": []
  48. }

【4】创建密钥

  1. radosgw-admin key create --subuser=rgwuser:swift --key-type=swift --gen-secret
  2. #注意:返回的 Json 值中,我们要记住swift_keys中的secret_key 因为下边我们测试访问 Swift 接口时需要使用。secret_key以这条命令为准

info

  1. {
  2. "user_id": "rgwuser",
  3. "display_name": "This is first rgw test user",
  4. "email": "",
  5. "suspended": 0,
  6. "max_buckets": 1000,
  7. "subusers": [
  8. {
  9. "id": "rgwuser:swift",
  10. "permissions": "full-control"
  11. }
  12. ],
  13. "keys": [
  14. {
  15. "user": "rgwuser",
  16. "access_key": "48AIAPCYK7S4X9P72VOW",
  17. "secret_key": "oC5qKL0BMMzUJHAS76rQAwIoJh4s6NwTnLklnQYX"
  18. }
  19. ],
  20. "swift_keys": [
  21. {
  22. "user": "rgwuser:swift",
  23. "secret_key": "AVThl3FGiVQW3VepkQl4Wsoyq9lbPlLlpKhXLhtR"
  24. }
  25. ],
  26. "caps": [],
  27. "op_mask": "read, write, delete",
  28. "default_placement": "",
  29. "default_storage_class": "",
  30. "placement_tags": [],
  31. "bucket_quota": {
  32. "enabled": false,
  33. "check_on_raw": false,
  34. "max_size": -1,
  35. "max_size_kb": 0,
  36. "max_objects": -1
  37. },
  38. "user_quota": {
  39. "enabled": false,
  40. "check_on_raw": false,
  41. "max_size": -1,
  42. "max_size_kb": 0,
  43. "max_objects": -1
  44. },
  45. "temp_url_keys": [],
  46. "type": "rgw",
  47. "mfa_ids": []
  48. }

【5】测试访问 Swift 接口

  1. #注意,以下命令需要python环境和可用的pip服务。
  2. yum install python-pip -y
  3. pip install --upgrade python-swiftclient
  4. #测试
  5. swift -A http://192.168.182.130/auth/1.0 -U rgwuser:swift -K 'AVThl3FGiVQW3VepkQl4Wsoyq9lbPlLlpKhXLhtR' list

分布式存储系统 Ceph 实战操作 - 图10

【5】S3 相关操作

  1. # 1、删除S3用户
  2. radosgw-admin user rm --uid=rgwuser
  3. # 2、权限调整,允许rgwuser读写users信息:
  4. radosgw-admin caps add --uid=rgwuser --caps="users=*"
  5. # 3、允许admin读写所有的usage信息
  6. radosgw-admin caps add --uid=rgwuser --caps="usage=read,write"
  7. # 4、删除swift子用户
  8. radosgw-admin subuser rm --subuser=rgwuser:swift
  9. # 5、列出当前系统下所有的bucket信息
  10. radosgw-admin bucket list
  11. # 6、查看具体某个BUCKET属性
  12. radosgw-admin bucket stats --bucket=my-first-s3-bucket

一般是通过 api 接口使用对象存储,这里只是演示了一个非常简单的示例。