Ceph:关于Ceph 中对象存储集群组件管理的一些笔记整理

对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》

写在前面


+

  • 理解不足小伙伴帮忙指正

对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》


创建对象存储集群组件

使用逻辑卷创建 BlueStore OSD

BlueStore 简介

BlueStore 取代 FileStore 作为 OSD 的存储后端。FileStore 现已弃用

FileStore 将对象存储为块设备基础上的文件系统(通常是 XFS)中的文件。

BlueStore 将对象直接存储在原始块设备上,免除了对文件系统层的需要,从而提高了读写操作速度,通过直接操作底层块设备来管理数据,而不是传统的文件系统。

这种方法提供了更好的性能和可靠性,因为可以将数据划分为较小的块并使用校验和来检测错误。此外,BlueStore可以直接与Solid State Drive(SSD)交互,并利用其快速读写速度。

BlueStore还具有可扩展性,可以处理数百万个物理盘和千亿个对象。它实现了动态负载平衡和自动恢复机制,以确保高可用性和数据可靠性。

BlueStore 架构

Ceph 集群中存储的对象具有:

  • 集群范围的唯一标识符
  • 二进制对象数据
  • 对象元数据

BlueStore 将 对象元数据存储在块数据库中,块数据库将元数据作为键值对存储在 RocksDB 数据库中,这是一种高性能的键值存储,块数据库驻留于存储设备上的一个小型 BlueFS 分区,BlueFS 是一种最小的文件系统,设计用于保存 RocksDB 文件,BlueStore 利用预写式日志 (WAL) 以原子式将数据写入到块设备。预写式日志执行日志记录功能,并记录所有事务

BlueStore 性能

FileStore 先写入到日志,然后从日志中写入到块设备。

BlueStore 可避免这种双重写入的性能损失,直接将数据写入块设备,同时使用单独的数据流将事务记录到预写式日志。

当工作负载相似 时,BlueStore 的写操作速度约为 FileStore 的 两倍,如果在集群中混用不同的存储设备,您可以自定义BlueStore OSD来提入性能。

创建新的 BlueStore OSD 时,默认为将数据、块数据库和预写式日志都放置到同一个块设备上。从数据中分离块数据库和预写式日志,并将它们放入更快速的 SSD 或 NVMe 设备,或许能提高性能。

如果将块数据库或预写式日志放置到与对象数据不同的存储设备上,或许能够提升性能,但条件是这个设备的速度要快于主要存储设备。

在这里插入图片描述

例如,如果对象数据位于 HDD 设备上,可以通过将块数据库放在 SSD 设备上并将预写式日志放到 NVMe 设备上来提高性能

使用服务规范文件定义 BlueStore 数据、块数据库和预写日志设备的 位置。示例如下:

指定 OSD 服务对应的 BlueStore 设备

1
2
3
4
5
6
7
8
9
10
11
12
13
service_type: osd
service_id: osd_example
placement:
host_pattern: '*'
data_devices: # 对象数据
paths:
- /dev/vda
db_devices: # 块数据库
paths:
- /dev/nvme0
wal_devices: # 预写日志
paths:
- /dev/nvme1

BlueStore 存储后端提供下列功能:

  • 允许将不同的设备用于数据、块数据库和预写式日志 (WAL)
  • 支持以虚拟方式使用 HDD、SSD 和 NVMe 设备的任意组合
  • 通过提高元数据效率,可以消除对存储设备的双重写入

BlueStore 在用户空间内运行,管理自己的缓存,并且其内存占用比 FileStore 少。如有需要,可以手动调优 BlueStore 参数,BlueStore 使用 RocksDB 存储键值元数据,BlueStore默认是自调优,但如果需要,可以手动调优BlueStore参数

BlueStore 分区写数据的块大小为 bluestore_ min_alloc_size 参数的大小,缺省值为4kib .

bluestore_min_alloc_size 参数指定了每个对象分配所需的最小空间量,即使对象实际大小较小也会分配该数量的空间。如果要写入的数据小于该大小,则 BlueStore 将剩余空间用0填充。

设置较小的 bluestore_min_alloc_size 可能会导致过多的碎片和浪费,因为一些较小的对象在分配时仍然需要使用与较大对象相同的空间。但是,如果设置较大的 bluestore_min_alloc_size ,则可能会浪费更多的空间,因为对象可能只使用其中的一部分空间。

总之,bluestore_min_alloc_size 参数应根据特定的工作负载和性能需求进行调整。对于需要存储许多小型对象的应用程序,可能需要将此值设置得较小,而对于需要存储大型对象的应用程序,可能需要将此值设置得较大。

BlueStore 数据库分片

BlueStore 可以限制存储在 RocksDB 中的大型 map 对象的大小,并将它们分布到多个列族中,这个过程被称为分片。

使用 sharding(分片) 时,将访问修改频率相近的密钥分组,以提高性能节省磁盘空间。Sharding 可以缓解RocksDB压缩的影响,压缩数据库之前,RocksDB 需要达到一定的已用空间,这会影响 OSD 性能,这些操作与已用空间级别无关,可以更精确地进行压缩,并将对 OSD 性能的影响降到最低

Red Hat建议配置的 RocksDB 空间至少为数据设备大小的 4%

在Red Hat Ceph Storage 5(Ceph Nautilus(14.x)) 中,默认启用分片,从早期版本迁移过来的集群的osd中没有启用分片,从以前版本迁移过来的集群中的osd将不会启用分片

使用 ceph config get 验证一个 OSD 是否启用了 sharding ,并查看当前的定义

1
2
3
[ceph: root@clienta /]# ceph \
config get osd.1 bluestore_rocksdb_cf
true

为 true 的时候说明默认启用了分片

osd 分片的参数定义

1
2
3
[ceph: root@clienta /]# ceph \
config get osd.1 bluestore_rocksdb_cfs
m(3) p(3,0-12) O(3,0-13)=block_cache={type=binned_lru} L P

block_cache={type=binned_lru}: 这是 RocksDB 的缓存设置。这里使用了 binned LRU 策略作为块缓存的替换策略。

L: 这是 BlueStore 的 日志设置,表示将日志写入硬盘而不是内存。这对数据持久性非常重要,因为任何未同步的写操作都会在下次启动时丢失。

P: 这是 BlueStore 的 预分配设置。预分配是一种优化技术,可以在写入新对象时事先分配足够的磁盘空间,以减少写入延迟和碎片。此处,“P”表示预分配已启用。

m(3) p(3,0-12) O(3,0-13):在这个映射中

  • m(3) 表示使用 mon0、mon1 和 mon2 作为监视器。
  • p(3,0-12) 表示数据池中有 13 个 PG,它们被分配到了 OSD 0 到 OSD 12 上
  • O(3,0-13) 表示对象池中也有 13 个 PG,它们被分配到了 OSD 0 到 OSD 13 上

数据池(Data Pools):数据池用于存储客户端的数据。例如,如果您想在Ceph中创建一个文件系统或块设备,就必须将其存储在数据池中。数据池通常会经过复制或编码以提高容错性和可靠性。

对象池(Object Pools):对象池用于存储Ceph内部使用的对象,如 PG Map、OSD Map、Mon Map等。这些对象也可以被视为元数据,因为它们包含了关于Ceph集群的配置信息和状态信息。与数据池不同,对象池通常不需要复制或编码,因为它们已经具有容错性和可靠性。

在大多数 Ceph 用例中,默认值会带来良好的性能。生产集群的最佳分片定义取决于几个因素,Red Hat建议使用默认值,除非面临显著的性能问题。

在生产升级的集群中,可能需要权衡在大型环境中为 RocksDB 启用分片所带来的性能优势和维护工作

可以使用 BlueStore 管理工具 ceph-bluestore-tool 重新共享 RocksDB 数据库,而无需重新配置 osd 。要重新共享一个 OSD,需要停止守护进程并使用 --sharding 选项传递新的 sharding 定义。--path 选项表示 OSD 数据 Location,默认为/var/lib/ceph/$fsid/osd.$ID/

1
2
3
[ceph: root@node /]# ceph-bluestore-tool \
--path <data path> \
--sharding="m{3) p{3,0-12) 0(3,0-13)= block_cache={type=binned_lru} L P" reshard

提供 BlueStore OSD

作为存储管理员,可以使用 Ceph Orchestrator 服务在集群中添加或删除osd,添加OSD时,需要满足以下条件:

  1. 设备不能有分区
  2. 设备不能被挂载
  3. 设备空间要求5GB以上
  4. 设备不能包含 Ceph BlueStore OSD

使用ceph orch device ls命令列出集群中主机中的设备

1
2
3
4
5
[ceph: root@clienta /]# ceph orch device ls
Hostname Path Type Serial Size Health Ident Fault Available
clienta.lab.example.com /dev/vdb hdd 10.7G Unknown N/A N/A Yes
clienta.lab.example.com /dev/vdc hdd 10.7G Unknown N/A N/A Yes
clienta.lab.example.com /dev/vdd hdd 10.7G Unknown N/A N/A Yes

Available 列中标签为Yes的节点为OSD发放的候选节点。如果需要查看已使用的存储设备,请使用 ceph device ls命令

使用ceph orch device zap命令准备设备,该命令删除所有分区并清除设备中的数据,以便将其用于资源配置,使用–force选项确保删除上一个OSD可能创建的任何分区

1
2
[ceph: root@node /]# ceph orch \
device zap node /dev/vda --force

回顾BlueStore配置方法

在rhcs5中,cephadm是提供和管理osd的推荐工具,它在后台使用cephvolume工具来进行OSD操作,cephadm工具可能看不到手动操作使用ceph -volume,建议仅为故障排除手动执行ceph-volume OSD

以 root 用户执行 ceph orch daemon add osd 命令,在指定主机上使用指定设备创建 osd

1
2
[ceph: root@admin /]# ceph orch \
daemon add osd osd-1:/dev/vdb

有多种方式提供OSDs与cephadm,根据需要的集群行为考虑适当的方法

基于Orchestrator提供

Orchestrator服务可以发现集群主机之间的可用设备,添加设备,并创建OSD守护进程。Orchestrator处理在主机之间平衡的新osd的放置,以及处理BlueStore设备选择

使用ceph orch apply osd –all-available-devices命令提供所有可用的、未使用的设备

1
2
[ceph: root@node /]# ceph \
orch apply osd --all-available-devices

该命令创建一个OSD服务,名为osd.all-available-devices,使Orchestrator服务能够管理所有OSD供应。
Orchestrator从集群中的新磁盘设备和使用ceph orch设备zap命令准备的现有设备自动创建osd

若要禁用Orchestrator自动供应osd,请将非托管标志设置为true

1
2
[ceph: root@node /]# ceph \
orch apply osd --all-available-devices --unmanaged=true

基于指定目标提供

可以使用特定的设备和主机创建OSD进程,使用ceph orch daemon add命令创建带有指定主机和存储设备的单个OSD守护进程

1
[ceph: root@node /]# ceph orch daemon add osd node:/dev/vdb

停止OSD进程,使用带OSD ID的ceph orch daemon stop命令

1
[ceph: root@node /]# ceph arch daemon stop osd.12 

使用ceph orch daemon rm命令移除OSD守护进程

1
[ceph: root@node /)# ceph orch daemon rm osd.12

释放一个OSD ID,使用ceph osd rm命令

1
[ceph: root@node /]# ceph osd rm 12

基于服务规范文件提供

使用服务规范文件描述OSD服务的集群布局,可以使用过滤器自定义服务发放,通过过滤器,可以在不知道具体硬件架构的情况下配置OSD服务,这种方法在自动化集群引导和维护窗口时很有用

下面是一个示例服务规范YAML文件,它定义了两个OSD服务,每个服务使用不同的过滤器来放置和BlueStore设备位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
service_type: osd
service_id: osd_size_and_model
placement:
host_pattern: '*'
data_devices:
size: '100G:'
db_devices:
model: My-Disk
wal_devices:
size: '10G:20G'
unmanaged: true
---
service_type: osd
service_id: osd_host_and_path
placement:
host_pattern: 'node[6-10]'
data_devices:
paths:
- /dev/sdb
db_devices:
paths:
- /dev/sdc
wal_devices:
paths:
- /dev/sdd
encrypted: true

osd_size_and_model服务指定任何主机都可以用于放置,并且该服务将由存储管理员管理,数据设备必须有一个100gb或更多的设备,提前写日志必须有一个10 - 20gb的设备。数据库设备必须是My-Disk型号

osd_host_and_path服务指定目标主机必须在node6和node10之间的节点上提供,并且服务将由协调器服务管理,数据、数据库和预写日志的设备路径必须 /dev/sdb、 /dev/sdc 和 /dev/sdd,此服务中的设备将被加密

执行ceph orch apply命令应用服务规范

1
[ceph: root@node /]# ceph orch apply -i service_spec.yaml 

其他OSD实用工具

ceph-volume命令是将逻辑卷部署为osd的模块化工具,它在框架类型中使用了插件,ceph -volume实用程序支持lvm插件和原始物理磁盘,它还可以管理由遗留的ceph-disk实用程序提供的设备

使用ceph-volume lvm命令手动创建和删除BlueStore osd,在块存储设备/dev/vdc上创建一个新的BlueStore OSD:

1
2
[ceph: root@node /]# ceph-volume \
lvm create --bluestore --data /dev/vdc

create子命令的另一种选择是使用ceph-volume lvm prepare和ceph -volume lvm activate子命令,通过这种方法,osd逐渐引入到集群中,可以控制新的osd何时处于up或in状态,因此可以确保大量数据不会意外地在osd之间重新平衡

prepare子命令用于配置OSD使用的逻辑卷,可以指定逻辑卷或设备名称,如果指定了设备名,则会自动创建一个逻辑卷

1
2
[ceph: root@node /]# ceph-volume \
lvm prepare --bluestore --data /dev/vdc

activate子命令为OSD启用一个systemd单元,使其在启动时启动,使用activate子命令时,需要从命令ceph-vo lume lvm list的输出信息中获取OSD的fsid (UUID)。提供唯一标识符可以确保激活正确的OSD,因为OSD id可以重用

1
2
[ceph: root@node /]# ceph-volume \
lvm activate <osd-fsid>

创建OSD后,使用systemctl start ceph-osd@$id命令启动OSD,使其在集群中处于up状态

batch子命令可以同时创建多个osd。

1
2
[ceph: root@node /]# ceph-volume \
lvm batch --bluestore /dev/vdc /dev/vdd /dev/nvme0n1

inventory子命令用于查询节点上所有物理存储设备的信息

1
[ceph: root@node /]# ceph-volume inventory

4.2 创建和配置池

了解池的含义

  1. 池是存储对象的逻辑分区。Ceph客户端将对象写入池

  2. Ceph客户机需要集群名称(默认情况下是Ceph)和一个监视器地址来连接到集群,Ceph客户端通常从Ceph配置文件中获取这些信息,或者通过指定为命令行参数来获取

  3. Ceph客户端使用集群映射检索到的池列表来确定存储新对象的位置

  4. Ceph客户端创建一个输入/输出上下文到一个特定的池,Ceph集群使用CRUSH算法将这些池映射到放置组,然后放置组映射到特定的osd

  5. 池为集群提供了一层弹性,因为池定义了可以在不丢失数据的情况下发生故障的osd的数量

池类型

可用的池类型有复制池和纠删代码池,工作负载的用例和类型可以帮助您确定要创建复制池还是纠删代码池

  • 复制池是默认的池类型,通过将各个对象复制到多个 OSD 来发挥作用,它们需要更多的存储空间, 因为会创建多个对象副本,但读取操作不受副本丢失的影响
    对于经常访问并且需要快速读取性能的数据,复制池通常都是更好的选择。

  • 纠删代码池需要的存储空间和网络带宽较小,但因为奇偶校验计算,计算开销会更高一些
    对于不需要频繁访问且不需要低延迟的数据,纠删代码池通常是更好的选择。

每一种池的恢复时间取决于特定的部署和故障情景

创建池后,不能修改池的类型

池属性

在创建池时,您必须指定特定的属性:

  1. pool name,必须在集群中唯一

  2. pool type,决定了池用于确保数据持久性的保护机制

  3. replicated 类型,将每个对象的多个副本分发到集群中

  4. erasure coded 类型,将每个对象分割为多个区块,并将它们与额外的纠删代码区块一起分发,以使用自动纠错机制来保护对象

  5. 池中的 placement groups (PG) 数量,这将其对象存储到由 CRUSH 算法决定的一组 OSD 中

  6. 可选的 CRUSH rule set,Ceph 使用它来标识要用于存储池对象的放置组

更改 osd_pool_default_pg_num 和 osd_pool_default_pgp_num 配置设置,以设置池的默认 PG 数

创建复制池

Ceph通过为每个对象创建多个副本来保护复制池中的数据,Ceph使用CRUSH故障域来确定作用集的主要osd来存储数据,然后,Ceph使用CRUSH 故障域来决定主OSD来存储数据,然后住OSD查找当前的池副本数量并计算辅助OSD来写入数据,当主OSD收到写响应并完成写操作后,主OSD确认写成功到Ceph客户端,这样可以在一个或多个osd失效时保护对象中的数据

使用以下命令创建一个复制池

1
[ceph: root@node /]# ceph osd pool create pool-name pg-num pgp-num replicated crush-rule-name 

其中:

  1. pool_name 是新池的名称

  2. pg_num 是为这个池配置的放置组 (PG) 总数

  3. pgp_num 是这个池的有效放置组数量,将它设置为与 pg_num 相等

  4. replicated 指定这是复制池,如果命令中未包含此参数,这是默认值

  5. crush-rule-name 是想要⽤于这个池的 CRUSH 规则集的名称,osd_pool_default_crush_replicated_ruleset 配置参数设置其默认值

在初始配置池之后,可以调整池中放置组的数量,如果pg_num和pgp_num被设置为相同的数字,那么以后任何对pg_num的调整都会自动进行调整pgp_num的值。如果需要,对pgp_num的调整会触发跨osd的pg移动,以实现更改,使用以下命令在池中定义新的pg数量

1
[ceph: root@node /]# ceph osd pool set my_pool pg_num 32

使用ceph osd pool create命令创建池时,不指定副本个数(size),osd_pool _default size配置参数定义了副本的数量,默认值为3

1
2
[ceph: root@node /]# ceph config get mon osd_pool_default_size 
3

使用ceph osd pool set pooI-name size number-of-replica 命令修改池大小,或者,更新osd_pool_default_size配置设置的默认设置

osd_pool_default_min_size参数设置一个对象的拷贝数,必须可以接受I/O的请求,缺省值为2

配置Erasure编码池

Erasure编码池使用擦除编码代替复制来保护对象数据

存储在Erasure编码池中的对象被划分为多个数据块,这些数据块存储在单独的osd中,编码块的数量是根据数据块计算出来的,并存储在不同的osd中,当OSD出现故障时,编码块用于重建对象的数据,主OSD接收到写操作后,将写载荷编码成K+M块,通过Erasure编码池发送给备OSD

Erasure编码池使用这种方法来保护它们的对象,并且与复制池不同,它不依赖于存储每个对象的多个副本

总结Erasure编码池的工作原理:

  1. 每个对象的数据被划分为k个数据块

  2. 计算M个编码块

  3. 编码块大小与数据块大小相同

  4. 该对象总共存储在k + m个osd上

Erasure编码比复制更有效地利用存储容量,复制池维护一个对象的n个副本,而纠删编码只维护k + m块,例如,3副本的复制池使用3倍的存储空间,k=4和m=2的Erasure编码池只使用1.5倍的存储空间

Red Hat支持以下k+m值,从而产生相应的可用到原始比率:

4 + 2(1:1.5比率)

8 + 3(1:1.375比率)

8 + 4(1:1.5比率)

erasure code开销的计算公式为nOSD * k / (k+m) * 0SD大小,例如,如果您有64个4TB的osd(总共256 TB), k=8, m=4,那么公式是64 * 8 /(8+4)* 4 = 170.67,然后将原始存储容量除以开销,得到这个比率。256TB /170.67 TB = 1.5

与复制池相比,Erasure编码池需要更少的存储空间才能获得类似级别的数据保护,从而降低存储集群的成本和规模。但是,计算编码块会增加Erasure编码池的CPU处理和内存开销,从而降低整体性能

使用以下命令创建Erasure编码池

1
2
3
4
[ceph: root@node /]# ceph \
osd pool create pool-name \
pg-num pgp-num \
erasure erasure-code-profile crush-rule-name

其中:

  1. pool-name 是新池的名称

  2. pg-num 是这个池的放置组 (PG) 总数

  3. pgp-num 是这个池的有效放置组数量,通常而言,这应当与 PG 总数相等

  4. erasure 指定这是纠删代码池

  5. erasure-code-profile 要使⽤的配置文件的名称,可以使用ceph osd erasure-code-profile set 命令创建新的配置⽂件,配置文件定义 k 和 m 值,以及要使用的纠删代码池插件。默认情况下,Ceph 使用default 配置文件

  6. crush-rule-name 是要用于这个池的 CRUSH 规则集的名称。如果不设置,Ceph 将使用纠删代码池配置文件中定义的规则集

可以在池上配置放置组自动伸缩,自动缩放允许集群计算放置组的数量,并自动选择适当的pg_num值,自动缩放在Red Hat Ceph Storage 5中是默认启用的

集群中的每个池都有一个pg_autoscale_mode选项,其值为on、off或warn

  1. on:启用自动调整池的PG计数

  2. off:禁用池的PG自动伸缩

  3. warn:当PG计数需要调整时,引发健康警报并将集群健康状态更改为HEALTH_WARN

本例在Ceph MGR节点上启用pg_autoscaler模块,并将池的自动缩放模式设置为on:

1
2
3
4
5
[ceph: root@node /]# ceph mgr module enable pg_autoscaler 
module 'pg_autoscaler' is already enabled (always-on)
[ceph: root@node /]# ceph \
osd pool set pool-name pg_autoscale_mode on
set pool 7 pg_autoscale_mode to on

纠删代码池不能使用对象映射特性,对象映射是一个对象索引,跟踪rbd对象块的分配位置,拥有池的对象映射可以提高调整大小、导出、扁平化和其他操作的性能。

Erasure Code配置文件

Erasure Code配置文件配置你的Erasure Code池用来存储对象的数据块和编码块的数量,以及使用哪些Erasure Code插件和算法

创建配置文件来定义不同的纠删编码参数集,Ceph在安装过程中自动创建默认概要文件,这个配置文件被配置为将对象分为两个数据块和一个编码块

使用以下命令创建一个新的概要文件

1
2
[ceph: root@node /]# ceph \
osd erasure-code-profile set profile-name arguments

以下是可用的参数:

k

跨osd分割的数据块的数量,缺省值为2

m

数据不可用前可能发生故障的osd数量,缺省值为1

directory

这个可选参数是插件库的位置,默认值为/usr/lib64/ceph/erasure-code

plugin

此可选参数定义要使用的纠删编码算法

crush-failure-domain

这个可选参数定义了CRUSH故障域,它控制块的放置,默认情况下,它被设置为host,这确保一个对象的块被放置在不同主机的osd上,如果设置为osd,那么一个对象的chunk可以放置在同一主机上的osd上,将故障域设置为osd,会导致主机上所有的osd故障,弹性较差,主机失败,可以定义并使用故障域,以确保块放置在不同数据中心机架或其他指定的主机上的osd上

crush-device-class

此可选参数仅为池选择由该类设备支持的osd,典型的类可能包括hdd、ssd或nvme

crush-root

该可选参数设置CRUSH规则集的根节点

key=value

插件可能具有该插件特有的键值参数

technique

每个插件提供一组不同的技术,用于实现不同的算法

不能修改已存在存储池的erasure code配置文件

使用ceph osd erasure-code-profile ls 命令列出已存在的配置文件

使用ceph osd erasure-code-profile get命令查看已创建配置文件的详细信息

使用ceph osd erasure-code-profile rm删除已存在的配置文件

管理和操作池

可以查看、修改已创建的存储池,并修改存储池的配置信息

  1. 使用ceph osd pool rename命令重命名池,这不会影响存储在池中的数据,如果重命名池,并且为经过身份验证的用户提供了每个池的功能,则必须使用新的池名称更新用户的功能

  2. 使用ceph osd pool delete命令删除osd池

  3. 使用ceph osd pool set pool_name nodelete true命令可以防止指定池被删除,使用实例将nodedelete设置为false以允许删除池

  4. 使用ceph osd pool setceph osd pool get命令查看和修改池配置

  5. 使用ceph osd lspoollsceph osd pool ls detail命令列出池和池配置设置

  6. 使用ceph dfceph osd pool stats命令列出池的使用情况和性能统计信息

  7. 使用ceph osd pool application enable命令启用池中的Ceph应用,应用类型为Ceph File System的 cepfs、Ceph Block Device的rbd、RADOS Gateway的rgw

  8. 使用ceph osd pool set-quota命令设置池配额,限制池中最大字节数或最大对象数

当存储池达到设置的配额时,将阻止操作,可以通过将配额值设置为0来删除配额

配置这些设置值的示例,以启用对池重新配置的保护:

osd_ pool _default flag_nodelete

设置池上的nodedelete标志的默认值,设置该值为true,以防止删除池

osd_pool_default_flag_nopgchange

设置池上的nopgchange标志的默认值,设置为true可以防止pg_ num和pgp_num的变化

osd_pool_default_flag_nosizechange

设置池的nosizechange标志的默认值。设置该值为true,以防止池的大小变化

池名称空间

命名空间是池中对象的逻辑组,可以限制对池的访问,以便用户只能在特定的名称空间中存储或检索对象,名称空间的一个优点是限制用户访问池的一部分,名称空间对于限制应用程序的存储访问非常有用,它们允许对池进行逻辑分区,并将应用程序限制到池中的特定名称空间。

可以为每个应用程序专用一个完整的池,但是拥有更多的池意味着每个OSD拥有更多的pg,而pg在计算上是非常昂贵的,随着负载的增加,这可能会降低OSD的性能,使用名称空间,可以保持池的数量相同,而不必为每个应用程序专用整个池

要在名称空间中存储对象,客户机应用程序必须提供池和名称空间名称。默认情况下,每个池包含一个名称为空的名称空间,称为默认名称空间。

使用rados命令从池中存储和检索对象。使用-n name和–namespace=name选项指定要使用的池和命名空间

下面以将/etc/services文件作为srv对象存储在系统命名空间下的mytestpool池中为例

1
2
3
4
[ceph: root@node /]# rados \
-p mytestpool -N system put srv /etc/services
[ceph: root@node /]# rados \
-p mytestpool -N system ls

使用–all选项列出池中所有名称空间中的所有对象,要获得JSON格式的输出,请添加–format=j son-pretty选项

下面的例子列出了mytestpool池中的对象。mytest对象有一个空的名称空间。其他对象属于system或flowers名称空间

1
2
3
4
5
[ceph: root@node /]# rados \
-p mytestpool --all ls
[ceph: root@node /]# rados \
-p mytestpool --all ls --format=json-pretty
...

4.3 管理Ceph认证

用户身份验证

Red Hat Ceph Storage使用cephx协议对集群中客户端、应用程序和守护进程之间的通信进行授权。cephx协议基于共享密钥

安装过程默认启用cephx,因此集群需要所有客户端应用程序进行用户身份验证和授权,Ceph使用用户帐户有以下几个目的:

  1. 用于Ceph守护进程之间的内部通信

  2. 对于通过librados库访问集群的客户机应用程序

  3. 为集群管理员

Ceph守护进程使用的帐户名称与其关联的守护进程osd.1或mgr.serverc相匹配,并且其在安装过程中创建

使用librados的客户端应用程序所使用的帐户具有client.名称前缀,例如,在集成OpenStack和Ceph时,通常会创建一个专用的client.openstack用户帐户。对于Ceph对象网关,安装会创建一个专用的client.rgw.hostname用户帐号,在librados之上创建定制软件的开发人员应该创建具有适当功能的专用帐户

管理员帐户名也具有client.前缀。在运行ceph、rados等命令时使用,安装程序创建超级用户帐户client.admin,具有允许帐户访问所有内容和修改集群配置的功能。Ceph使用client.admin帐户用于运行管理命令,除非使用–name或–id选项明确指定用户名

可以设置CEPH_ARGS环境变量来定义诸如集群名称或用户ID等参数

1
[ceph: root@node /]# export CEPH_ARGS="--id cephuser" 

Ceph-aware应用程序的最终用户没有Ceph集群上的帐户。相反,他们访问应用程序,然后应用程序代表他们访问Ceph。从Ceph的角度来看,应用程序就是客户端。应用程序可以通过其他机制提供自己的用户身份验证

下图概述了应用程序如何提供自己的用户身份验证

Ceph对象网关有自己的用户数据库来认证Amazon S3和Swift用户,但使用client.rgw.hosttname用于访问集群的帐号

Keyring 文件

对于身份验证,客户端配置一个Ceph用户名和一个包含用户安全密钥的密钥环文件,Ceph在创建每个用户帐户时为其生成密匙环文件,但是,必须将此文件复制到需要它的每个客户机系统或应用程序服务器

在这些客户机系统上,librados使用来自/etc/ceph/ceph.conf的密匙环参数。Conf配置文件以定位密钥环文件。默认值为/etc/ceph/$cluster.$name.keyring密匙环。例如,对于client.openstack帐户,密钥环文件/etc/ceph/ceph.client.openstack.keyring密匙环

密钥环文件以纯文本的形式存储密钥,对文件进行相应的Linux文件权限保护,仅允许Linux授权用户访问,只在需要Ceph用户的密匙环文件进行身份验证的系统上部署它

传输密钥

cephx协议不以纯文本的形式传输共享密钥,相反,客户机从Monitor请求一个会话密钥,Monitor使用客户机的共享密钥加密会话密钥,并向客户机提供会话密钥,客户机解密会话密钥并从Monitor请求票据,以对集群守护进程进行身份验证。这类似于Kerberos协议,cephx密钥环文件类似于Kerberos keytab文件

配置用户身份验证

使用命令行工具,如ceph、rados和rbd,管理员可以使用–id和–keyring选项指定用户帐户和密钥环文件。如果没有指定,命令作为client.admin进行身份验证

在本例中,ceph命令作为client.operator3进行身份验证列出可用的池

1
2
3
[ceph: root@node /]# ceph \
--id operator3 \
osd lspools

在使用–id 的时候不适用client.的前缀,–id会自动使用client.前缀,而使用–name的时候就需要使用client.的前缀

如果将密钥环文件存储在默认位置,则不需要–keyring选项。cephadm shell自动从/etc/ceph/目录挂载密钥环

配置用户授权

创建新用户帐户时,授予群集权限,以授权用户的群集任务,cephx中的权限被称为能力,可以通过守护进程类型(mon、osd、mgr或mds)授予它们,使用功能来根据应用程序标记限制或提供对池、池的名称空间或一组池中的数据的访问。功能还允许集群中的守护进程相互交互

Cephx能力

在cephx中,对于每个守护进程类型,有几个可用的功能:

R 授予读访问权限,每个用户帐户至少应该对监视器具有读访问权限,以便能够检索CRUSH map

W 授予写访问权限,客户端需要写访问来存储和修改osd上的对象。对于manager (MGRs), w授予启用或禁用模块的权限

X 授予执行扩展对象类的授权,这允许客户端对对象执行额外的操作,比如用rados lock get或list列出RBD图像

***** 授予完全访问权

class-read和class-write 是x的子集,你通常在RBD池中使用它们

本例创建了formyappl用户帐户,并赋予了从任意池中存储和检索对象的能力:

1
2
3
4
[ceph: root@node /]# ceph auth \
get-or-create client.formyappl \
mon 'allow r' \
osd 'allow rw'

使用配置文件设置能力

Cephx提供预定义的功能配置文件,在创建用户帐户时,利用配置文件简化用户访问权限的配置

本例通过rbd配置文件定义新的forrbd用户帐号的访问权限,客户端应用程序可以使用该帐户使用RADOS块设备对Ceph存储进行基于块的访问

1
2
3
4
[ceph: root@node /]# ceph auth \
get-or-create client.forrbd \
mon 'profile rbd' \
osd 'profile rbd'

rbd-read-only配置文件的工作方式相同,但授予只读访问权限,Ceph利用其他现有的配置文件在守护进程之间进行内部通信,不能创建自己的配置文件,Ceph在内部定义它们

下表列出了默认安装下Ceph的功能

能力 描述
allow 授予允许能力
r 赋予用户读访问权限,需要监视器来检索CRUSH map
w 赋予用户对对象的写访问权
x 使用户能够调用类方法(即读取和写入)并在监视器上执行身份验证操作
class-read 赋予用户调用类读取方法的能力,x的子集
class-write 赋予用户调用类写入方法的能力,x的子集
* 为用户提供特定守护进程或池的读、写和执行权限,以及执行管理命令的能力
profile osd 允许用户作为OSD连接到其他OSD或监视器,授予osd权限,使osd能够处理复制心跳流量和状态报告。
profile bootstrap-osd 允许用户引导一个OSD,这样用户在引导一个OSD时就有了添加key的权限
profile rbd 允许用户对Ceph块设备进行读写访问
profile rbd-read-only 为用户提供对Ceph块设备的只读访问权限

限制访问

限制用户OSD的权限,使用户只能访问自己需要的池

下面的例子创建了formyapp2用户,并限制了他们对myapp池的读写权限:

1
2
3
4
[ceph: root@node /]# ceph auth \
get-or-create client.formyapp2 \
mon 'allow r' \
osd 'allow rw pool=myapp'

如果在配置功能时没有指定池,那么Ceph将在所有现有的池上设置它们,cephx机制可以通过其他方式限制对对象的访问:

通过对象名称前缀,下面的示例限制对任何池中名称以pref开头的对象的访问

1
2
3
4
[ceph: root@node /]# ceph auth \
get-or-create client.formyapp3 \
mon 'allow r' \
osd 'allow rw object_prefix pref'

通过namespace,实现namespace来对池中的对象进行逻辑分组,然后可以将用户帐户限制为属于特定namespace的对象:

1
2
3
4
[ceph: root@node /)# ceph auth \
get-or-create client.designer \
mon 'allow r' \
osd 'allow rw namespace=photos'

通过路径,Ceph文件系统(cepphfs)利用这种方法来限制对特定目录的访问,下面的例子创建了一个新的用户帐户webdesigner,它只能访问/webcontent目录及其内容:

1
2
3
4
5
6
7
8
9
10
11
[ceph: root@node /]# ceph \
fs authorize WEBFS \
client.webdesigner \
/webcontent rw
[ceph: root@node /]# ceph auth get client.webdesigner
exported keyring for client .webdesigner
[client.webdesigner]
key = AQBrVE9aNwoEGRAApYR6m71ECRzUlLpp4wEJkw==
caps mds = "allow rw path=/webcontent"
caps mon = "allow r"
caps osd = "allow rw pool=cephfs_data"

通过monitor命令,这种方法将管理员限制在特定的命令列表中,创建operator1用户帐户并限制其访问两个命令的示例如下:

1
2
3
[ceph: root@node /]# ceph auth \
get-or-create client.operator1 \
mon 'allow r, allow command "auth get-or-create", allow command "auth list" '

用户管理

需要查询现有用户,使用ceph auth list命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[ceph: root@node /]# ceph auth list 
... output omitted ...
osd.0
key: AQBW6Tha5z6OIhAAMQ7nY/4MogYecxKqQxX1sA==
caps : [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
client.admin
key: AQCi6Dhajw7pIRAA/ECkwyipx2/raLWjgbklyA==
caps: [mds] allow *
caps: [mgr] allow *
caps: [mon] allow *
caps: [osd] allow *
. . . output omitted ...

要获取特定帐户的详细信息,使用ceph auth get命令:

1
2
3
4
5
6
7
8
[ceph: root@node /]# ceph auth get client.admin 
exported keyring for client.admin
[client . ad min]
key = AQCi6Dhajw7pIRAA/ECkwyipx2/raLWj gbklyA==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"

可以打印密钥:

1
2
[ceph: root@node /]# ceph auth print-key client.adrnin 
AQCi6Dhajw7pIRAA/ECkwyipx2/raLWjgbklyA==

需要导出和导入用户帐号,使用ceph auth export和ceph auth import命令

1
2
3
4
[ceph: root@node /]# ceph auth \
export client.operator1 > ~/operatorl.export
[ceph: root@node /]# ceph auth \
import -i ~/operator1.export

创建新用户帐户

ceph auth get-or-create命令创建一个新用户帐户并生成它的密钥,该命令默认将该密钥打印到stdout,因此通常会添加-o选项来将标准输出保存到密钥环文件中。

本例创建了对所有池具有读写权限的app1用户帐户,并将密钥环文件存储在 /etc/ceph/ceph.client.app1.keyring

1
2
3
4
5
[ceph: root@node /]# ceph auth \
get-or-create client.app1 \
mon 'allow r' \
osd 'allow rw' \
-o /etc/ceph/ceph.client.app1.keyring

身份验证需要密匙环文件,因此必须将该文件复制到使用此新用户帐户操作的所有客户端系统

修改用户能力

用 ceph auth caps 命令修改用户帐户的能力,这个例子修改了 osd 上的 appuser account 功能,只允许对myapp池进行读写访问:

1
2
3
4
5
[ceph: root@node /]# ceph auth \
caps client.app1 \
mon 'allow r' \
osd 'allow rw pool=myapp'
updated caps for client.app1

ceph auth caps 命令覆盖现有功能,使用该命令时,必须为所有守护进程指定完整的功能集,而不仅仅是要修改的那些。定义一个空字符串来删除所有功能。

1
2
[ceph: root@node /]# ceph auth caps client.app1 osd '' 
updated caps for client.app1

删除用户帐号

ceph auth del命令用于删除用户帐号

1
2
[ceph: root@node /]# ceph auth del client.app1
updated

然后可以删除相关的密钥环文件

博文部分内容参考

© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知,这是一个开源项目,如果你认可它,不要吝啬星星哦 :)



© 2018-至今 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

发布于

2023-04-16

更新于

2024-11-22

许可协议

评论
加载中,最新评论有1分钟缓存...
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×