侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

Ceph 管理操作

zze
zze
2021-09-29 / 0 评论 / 0 点赞 / 139 阅读 / 11941 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

常用命令

# 创建存储池
$ ceph osd pool create <pool_name> [pg_num] [pgp_num]
# 列出存储池
$ ceph osd pool ls [detail]
$ ceph osd lspools
# 查看存储池的事件信息
$ ceph osd pool stats [pool_name]
# 存储池重命名
$ ceph osd pool rename <src_pool_name> <dst_pool_name>
# 查看存储池资源使用情况
$ ceph df [detail]
$ rados df
# 查看集群状态
$ ceph -s 
$ ceph status
# 查看 pg 状态
$ ceph pg stat
# 查看每个 osd 的状态
$ ceph osd status
# 查看 osd 整体状态
$ ceph osd stat
# 查看 osd 详细底层信息
$ ceph osd dump
# 查看 osd 组成结构
$ ceph osd tree
# 查看 mon 服务状态
$ ceph mon stat
# 查看 mon 服务详细信息
$ ceph mon dump

删除存储池

# 查看存储池本身的禁删属性值
$ ceph osd pool get <pool_name> nodelete
# 关闭存储池本身的禁删属性
$ ceph osd pool set <pool_name> nodelete false
# 修改 mon 配置允许删除存储池
$ ceph tell mon.* injectargs --mon-allow-pool-delete=true
# 执行删除操作
$ ceph osd pool rm <pool_name> <pool_name> --yes-i-really-really-mean-it

存储池配额

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

# 查看指定存储池的配额
$ ceph osd pool get-quota <pool_name>
# 设置指定存储池存储对象个数的上限
$ ceph osd pool set-quota <pool_name> max_objects <num_of_objects>
# 设置指定存储池存储容量的上限
$ ceph osd pool set-quota <pool_name> max_bytes <num_of_bytes>

副本数调整

# 查看指定存储池副本数,默认为 3
$ ceph osd pool get <pool_name> size
# 设置指定存储池副本数
$ ceph osd pool set <pool_name> size <num_of_size>
# 提供服务所需要的最小副本数,如果定义 size 为 3, min_size 也为 3。此时坏掉一个 OSD,如果 pool 池中有副本在此块 OSD 上面,那么此 pool 将不提供服务,如果将 min_size 定义为 2,那么还可以提供服务,如果提供为 1,表示只要有一块副本都提供服务。
$ ceph osd pool get <pool_name> min_size
# 设置指定存储池最少可用副本数
$ ceph osd pool set <pool_name> min_size <num_of_min_size>

存储池参数

# 查看指定存储池 PG 和 PGP 数量
$ ceph osd pool get <pool_name> pg_num
$ ceph osd pool get <pool_name> pgp_num
# 查看指定存储池使用的 crush 规则,默认即可不需要改动
$ ceph osd pool get <pool_name> crush_rule
# 控制是否可以更改存储池的 pg_num 和 pgp_num
$ ceph osd pool get <pool_name> nopgchange
# 控制是否可以更改存储池的大小
$ ceph osd pool get <pool_name> nosizechange
# noscrub 和 nodeep-scrub 可临时解决高 I/O 问题
# 控制是否进行轻量扫描存储池
$ ceph osd pool get <pool_name> noscrub
# 控制是否进行深度扫描存储池
$ ceph osd pool get <pool_name> nodeep-scrub
# 控制轻量扫描的最小间隔时长
# 	轻量扫描的默认间隔时长设置在每个 OSD 上,可通过如下命令查看指定 OSD 的扫描配置
# 	ceph daemon osd.1 config show | grep scrub
$ ceph osd pool get <pool_name> scrub_min_interval
  • 轻量扫描每天执行一次,扫描同一个 PG 中不同的 OSD 中的元数据是否一致,每个 OSD 的扫描结果是一个 JSON 数据,如果对比多个 JSON 数据发现不一致,则说明各副本中的数据不一致,则会将告警提示显示到 ceph status 中;

  • 深层扫描每周执行一次,作用和轻量扫描相同,但深层扫描除了扫描元数据还会扫描数据本身以对比数据块,非常占 I/O。

所以在 Ceph 集群本身 I/O、负载很高的情况下可以临时关闭这两个参数来禁用轻量和深层扫描以减轻集群压力。

存储池快照

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

# 创建快照
# 	方式一
$ ceph osd pool mksnap <pool_name> <snap_name>
# 	方式二
$ rados -p <pool_name> mksnap <snap_name>
# 查看存储池的快照列表
$ rados -p <pool_name> lssnap
# 从存储池的指定快照还原文件
$ rados rollback -p <pool_name> <file_name> <snap_name>
# 删除存储池的指定快照
$ ceph osd pool rmsnap <pool_name> <snap_name>

数据压缩

生产环境不推荐启用压缩。

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

# 默认算法为 snappy,还有 none、zlib、lz4、zstd 和 snappy 等算法,zstd 压缩比好,但消耗 CPU,lz4 和 snappy 对 CPU 占用较低,不建议使用 zlib。
$ ceph osd pool set <pool_name> compression_algorithm snappy
# 指定压缩模式,默认为 none
#    none:从不压缩数据;
#    passive:除非写操作时客户端指定压缩,否则不要压缩数据;
#    aggressive:压缩数据,除非写操作客户端指定不压缩;
#    force:无论如何都尝试压缩数据,即使客户端指定数据不可压缩也会压缩,也就是在所有情况下都使用压缩;
$ ceph osd pool set <pool_name> compression_mode aggressive

相关参数:

compression_algorithm # 压缩算法
compression_mode # 压缩模式
compression_required_ratio # 压缩比,默认为 0.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 # 压缩比,默认为 0.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

可通过如下命令查看当前某 OSD 当前生效的压缩相关配置:

$ ceph daemon osd.1 config show | grep compression

认证机制

Ceph 使用 Cephx 协议对客户端进行身份认证。
Cephx 用于对访问 Ceph 的请求进行认证和授权检测,与 MON 通信的请求都要经过 Ceph 认证通过,但是也可以在 MON 节点关闭 Cephx 认证, 但是关闭认证之后任何访问都将被允许,因此无法保证数据的安全性。

授权流程

每个 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 组,Cephx 只负责认证授权,不能解决数据传输的加密问题。

用户管理

用户是指个人(Ceph 管理者)或系统参与者(MON/OSD/MDS)。
通过创建用户,可以控制用户或哪个参与者能够访问 Ceph 存储集群、以及可访问的存储池及存储池中的数据。
Ceph 支持多种类型的用户,但可管理的用户都属于 client 类型。

区分用户类型的原因在于,MON、OSD、MDS 等系统组件也使用 Cephx 协议,但是它们为非客户端。
通过点号来分割用户类型和用户名,格式为 TYPE.ID,例如 client.admin

  • Capabilities

Ceph 基于使能/能力(Capabilities,简称 caps)来描述用户可针对 MON、OSD 或 MDS 使用的授权范围或级别。
通用的语法格式:daemon-type 'allow caps'[...]

r: 向用户投予读取权限,访问监视器(mon)以检索CRUSH运行图时需具有此能力
w: 向用户授予针对对象的写入权限
x: 授予用户调用类方法(包括读取和写入)的能力.以及在监视器中执行 auth 操作的能力
*: 授予用户对特定守护进程/存储池的读取、写入和执行权限,以及执行管理命令的能力
class-read: 授予用户调用类读取方法的能力,属于是 × 能力的子集
class-write: 授予用户调用类写入方法的能力,属于是 × 能力的子集
profile osd: 授予用户以某个 OSD 身份连接到其他 OSD 或监视器的权限,授予 OSD 权限,使 OSD 能够处理复制检测信号流量和状态报告(获取 OSD 的状态信息)
profile mds: 授予用户以某个 MDS 身份连接到其他 MDS 或监视器的权限
profile bootstrap-osd: 授予用户引导 OSD 的权限(初始化 OSD 并将 OSD 加入 ceph 集群),授权给部署工具,使其在引导 OSD 时有权添加密钥
profile bootstrap-mds: 授予用户引导元数据服务器的权限,授权部署工具权限,使其在引导元数据服务器时有权添加密钥

MON 能力包含 r/w/xallow profile cap(Ceph 的运行图),例如:

mon 'allow rwx'
mon 'allow profile osd'

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

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

MDS 能力只需要 allow 或空。

mds 'allow'
  • 创建用户

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

# 查看所有用户信息
$ ceph auth list
# 查看指定用户信息
$ ceph auth get client.admin

针对用户采用 TYPE.ID 表示法,例如 osd.0 指定是 osd 类并且 ID 为 0 的用户(节点),client.adminclient 类型的用户,其 ID 为 admin
另请注意,每个项包含一个 key=xxxx 项,以及一个或多个 caps 项,可以结合使用 -o 文件名 选项和 ceph auth list 将输出保存到某个文件。

$ ceph auth list -o 123.key

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

# 此命令是添加用户的规范方法。它会创建用户、生成密钥.并添加所有指定的能力。
$ ceph auth add <type>.<id> [caps]...
# 此命令也是创建用户较为常见的方式之一,它会返回包含用户名(在方括号中)和密钥的密钥文,如果该用户已存在,此命令只以密钥文件格式返回用户名和密钥,还可以使用 -o 指定文件名选项将输出保存到某个文件。
$ ceph auth get-or-create <type>.<id> [caps]...
# 此命令是创建用户并仅返回用户密钥,对于只需要密钥的客户端(例如 libvirt),此命令非常有用。如果该用户已存在,此命令只返回密钥,您可以使用 -o 文件名选项将输出保存到某个文件。
$ ceph auth get-or-create-key <type>.<id> [caps]...
# 例如添加 zze 用户,让它只能对 mypool 存储池有读写权限
$ ceph auth add client.zze mon 'allow r' osd 'allow rwx pool mypool'
# 查看用户信息
$ ceph auth get client.zze
[client.zze]
	key = AQAi4FJhHH0eMRAAL9gmtj3pftedAKrirCOctQ==
	caps mon = "allow r"
	caps osd = "allow rwx pool mypool"
exported keyring for client.zze
# 只输出某用户的 key
$ ceph auth print-key client.zze

创建客户端用户时,可以创建不具有能力的用户,不具有能力的用户可以进行身份验证,但不能执行其他操作,此类客户端无法从监视器检索集群地图,但是,如果希望稍后再添加能力,可以使用 ceph auth add <type>.<id> 命令创建一个不具有能力的用户。
典型的用户至少对 MON 具有读取功能.并对 Ceph OSD 具有读取和写入功能,此外,用户的 OSD 权限通常限制为只能访问特定的存储池。

  • 修改能力

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

$ ceph auth caps <type>.<id> [caps]...
# 以修改 client.zze 用户能力为例:
$ ceph auth caps client.zze mon 'allow r' osd 'allow rw pool mypool'
  • 删除用户
$ ceph auth del <type>.<id>

秘钥环管理

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

{client|mon|mds|osd}.name

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

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

使用 ceph auth add 等命令添加的用户还需要额外使用 ceph-authtool 命令为其创建用户秘钥环文件。
创建 keyring 文件命令格式:

$ ceph-authtool --create-keyring <file>

以为 client.zze 用户创建 keyring 文件为例:

$ ceph-authtool --create-keyring ceph.client.zze.keyring
$ ceph auth get client.zze -o ceph.client.zze.keyring
  • 从 keyring 文件恢复用户

可以使用 ceph auth import -i 指定 keyring 文件并导人到 Ceph,其实就是起到用户备份和恢复的目的:

# 模拟误删
$ ceph auth del client.zze
# 从 keyring 文件恢复
$ ceph auth import -i ceph.client.zze.keyring
  • 保存多个用户到 keyring 文件

一个 keyring 文件中可以包含多个不同用户的认证文件。

# 创建 client.nocaps 用户的 keyring 文件
$ ceph-authtool --create-keyring ceph.client.nocaps.keyring
$ ceph auth get client.nocaps -o ceph.client.nocaps.keyring
# 创建保存多用户的空  keyring 文件,导入 client.nocaps 和 client.zze 用户信息到该文件
$ ceph-authtool --create-keyring ceph.client.users.keyrin
$ ceph-authtool ./ceph.client.users.keyring --import-keyring ./ceph.client.zze.keyring 
$ ceph-authtool ./ceph.client.users.keyring --import-keyring ./ceph.client.nocaps.keyring 
# 查看用户
$ ceph-authtool -l ./ceph.client.users.keyring 
[client.nocaps]
	key = AQCa4lJhSxwgCxAAnOACOyJugHD8w3R4TYSZ3w==
[client.zze]
	key = AQAi4FJhHH0eMRAAL9gmtj3pftedAKrirCOctQ==
	caps mon = "allow r"
	caps osd = "allow rwx pool mypool"
0

评论区