ceph(二)
一、ceph 存储池操作
存储池的管理通常保存创建、列出、重命名和删除等操作,管理工具使用 ceph osd pool的子命令及参数,比如 create/ls/rename/rm 等。http://docs.ceph.org.cn/rados/ #ceph 官方运维手册
1、存储池管理常用命令
创建存储池命令格式:
$ceph osd pool create <poolname> pg_num pgp_num {replicated|erasure}
列出存储池:
ceph osd pool ls #不带 pool ID
ceph osd lspools #带 pool ID
获取存储池的事件信息:
ceph osd pool stats myrbd1
重命名存储池:
$ ceph osd pool rename old-name new-name
$ ceph osd pool rename myrbd1 myrbd2
显示存储池的用量信息:
$ rados df
2、存储池的删除:
如果把存储池删除会导致把存储池内的数据全部删除,因此 ceph 为了防止误删除存储池设置了两个机制来防止误删除操作。
第一个机制是 NODELETE 标志,需要设置为 false 但是默认就是 false 了。
ceph osd pool create mypool2 32 32 ceph osd pool get mypool2 nodelete 如果设置为了 true 就表示不能删除,可以使用 set 指令重新设置为 fasle ceph osd pool set mypool2 nodelete true ceph osd pool set mypool2 nodelete false
第二个机制是集群范围的配置参数 mon allow pool delete,默认值为 false,即监视器不允许删除存储池,可以在特定场合使用 tell 指令临时设置为(true)允许删除,在删除指定的 pool之后再重新设置为 false。
ceph tell mon.* injectargs --mon-allow-pool-delete=true ceph osd pool rm mypool2 mypool2 --yes-i-really-really-mean-it
ceph tell mon.* injectargs --mon-allow-pool-delete=false
3、存储池配额:
存储池可以设置两个配对存储的对象进行限制,一个配额是最大空间(max_bytes),另外一个配额是对象最大数量(max_objects)。
ceph osd pool get-quota mypool
ceph osd pool set-quota mypool max_objects 1000 #限制最大 1000 个对象
ceph osd pool set-quota mypool max_bytes 10737418240 #限制最大 10737418240 字节
4、存储池可用参数
size:存储池中的对象副本数,默认一主两个备 3 副本。
ceph osd pool get mypool size
ceph osd pool get mypool min_size
min_size:提供服务所需要的最小副本数,如果定义 size 为 3,min_size 也为 3,坏掉一个OSD,如果 pool 池中有副本在此块 OSD 上面,那么此 pool 将不提供服务,如果将 min_size定义为 2,那么还可以提供服务,如果提供为 1,表示只要有一块副本都提供服务。
pg_num:查看当前 PG 的数量
ceph osd pool get mypool pg_num
crush_rule:设置 crush 算法规则
ceph osd pool get mypool crush_rule
nodelete:控制是否可删除,默认可以
ceph osd pool get mypool nodelete
nopgchange:控制是否可更改存储池的 pg num 和 pgp num
ceph osd pool get mypool nopgchange
ceph osd pool set mypool pg_num 64 #修改指定 pool 的 pg 数量
nosizechange:控制是否可以更改存储池的大小
ceph osd pool get mypool nosizechange #默认允许修改存储池大小
ceph osd pool get-quota mypool
quotas for pool 'mypool': max objects: 1 k objects max bytes : 10 GiB
ceph osd pool set-quota mypool max_bytes 21474836480
set-quota max_bytes = 21474836480 for pool mypool
ceph osd pool set-quota mypool max_objects 1000
set-quota max_objects = 1000 for pool mypool
ceph osd pool get-quota mypool
quotas for pool 'mypool': max objects: 1 k objects max bytes : 20 GiB
noscrub 和 nodeep-scrub:控制是否不进行轻量扫描或是否深层扫描存储池,可临时解决高 I/O 问题
ceph osd pool get mypool noscrub #查看当前是否关闭轻量扫描数据,默认为不关闭,即开启
ceph osd pool set mypool noscrub true #可以修改某个指定的 pool 的轻量级扫描测量为 true,即不执行轻量级扫描
ceph osd pool get mypool noscrub #再次查看就不进行轻量级扫描了
ceph osd pool get mypool nodeep-scrub #查看当前是否关闭深度扫描数据,默认为不关闭,即开启
ceph osd pool set mypool nodeep-scrub true #可以修改某个指定的 pool 的深度扫描测量为 true,即不执行深度扫描
ceph osd pool get mypool nodeep-scrub #再次查看就不执行深度扫描了
scrub_min_interval:集群存储池的最小清理时间间隔,默认值没有设置,可以通过配置文件中的 osd_scrub_min_interval 参数指定间隔时间。
ceph osd pool get mypool scrub_min_interval
scrub_max_interval:整理存储池的最大清理时间间隔,默认值没有设置,可以通过配置文件中的 osd_scrub_max_interval 参数指定。
ceph osd pool get mypool scrub_max_interval
deep_scrub_interval:深层整理存储池的时间间隔,默认值没有设置,可以通过配置文件中的 osd_deep_scrub_interval 参数指定。
ceph osd pool get mypool deep_scrub_interval
ceph node 的默认配置:
root@ceph-node1:~# ceph daemon osd.3 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_pg_not_deep_scrubbed_ratio": "0.750000", "mon_warn_pg_not_scrubbed_ratio": "0.500000", "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_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": "0", "osd_scrub_end_week_day": "0", "osd_scrub_extended_sleep": "0.000000", "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",
5、存储池快照:
快照用于将存储池中的数据进行备份与还原,创建快照需要占用的磁盘空间会比较大,取决于存储池中的数据大小,使用以下命令创建快照:
创建快照
命令 1:ceph osd pool mksnap {pool-name} {snap-name}
ceph osd pool mksnap mypool mypool-snap
命令 2: rados -p {pool-name} mksnap {snap-name}
rados -p mypool mksnap mypool-snap2
验证快照:
rados lssnap -p mypool
回滚快照:
测试上传文件后创建快照,然后删除文件再还原文件,基于对象还原。 rados rollback <obj-name> <snap-name> roll back object to snap <snap-name> #上传文件 rados -p mypool put testfile /etc/hosts # 验证文件 rados -p mypool ls #创建快照 ceph osd pool mksnap mypool mypool-snapshot001 #验证快照 rados lssnap -p mypool #删除文件 rados -p mypool rm testfile #删除文件后,无法再次删除文件,提升文件不存在 rados -p mypool rm testfile #通过快照还原某个文件 rados rollback -p mypool testfile mypool-snapshot001 #再次执行删除就可以执行成功
删除快照:
ceph osd pool rmsnap <poolname> <snap>
查看
rados lssnap -p mypool
删除
ceph osd pool rmsnap mypool mypool-snap
rados lssnap -p mypool
二、 pg 与 pgp
PG = Placement Group #归置组,默认每个 PG 三个 OSD(数据三个副本)
PGP = Placement Group for Placement purpose #归置组的组合,pgp 相当于是 pg 对应osd 的一种逻辑排列组合关系(在不同的 PG 内使用不同组合关系的 OSD)。
加入 PG=32,PGP=32,那么:数据最多被拆分为 32 份(PG),写入到有 32 种组合关系(PGP)的 OSD 上。
归置组(placement group)是用于跨越多 OSD 将数据存储在每个存储池中的内部数据结构。
归置组在 OSD 守护进程和 ceph 客户端之间生成了一个中间层,CRUSH 算法负责将每个对象动态映射到一个归置组,然后再将每个归置组动态映射到一个或多个 OSD 守护进程,从而能够支持在新的 OSD 设备上线时进行数据重新平衡。
相对于存储池来说,PG 是一个虚拟组件,它是对象映射到存储池时使用的虚拟层。
可以自定义存储池中的归置组数量。 ceph 出于规模伸缩及性能方面的考虑,ceph 将存储池细分为多个归置组,把每个单独的对 象映射到归置组,并为归置组分配一个主 OSD。
存储池由一系列的归置组组成,而 CRUSH 算法则根据集群运行图和集群状态,将个 PG 均 匀、伪随机(基于 hash 映射,每次的计算结果够一样)的分布到集群中的 OSD 之上。
如果某个 OSD 失败或需要对集群进行重新平衡,ceph 则移动或复制整个归置组而不需要 单独对每个镜像进行寻
PG 分配计算
归置组(PG)的数量是由管理员在创建存储池的时候指定的,然后由 CRUSH 负责创建和使用,PG 的数量是 2 的 N 次方的倍数,每个 OSD 的 PG 不要超出 250 个 PG,官方是每个OSD100个左右:https://docs.ceph.com/en/mimic/rados/configuration/pool-pg-config-ref/
确保设置了合适的归置组大小,我们建议每个 OSD 大约 100 个,例如,osd 总数乘以 100除以副本数量(即 osd 池默认大小),因此,对于 10 个 osd、存储池为 4 个,我们建议每个存储池大约(100 * 10) / 4 = 256
1.通常,PG 的数量应该是数据的合理力度的子集。
例如:一个包含 256 个 PG 的存储池,每个 PG 中包含大约 1/256 的存储池数据
2.当需要将 PG 从一个 OSD 移动到另一个 OSD 的时候,PG 的数量会对性能产生影响。
PG 的数量过少,一个 OSD 上保存的数据数据会相对加多,那么 ceph 同步数据的时候产生的网络负载将对集群的性能输出产生一定影响。
PG 过多的时候,ceph 将会占用过多的 CPU 和内存资源用于记录 PG 的状态信息
3.PG 的数量在集群分发数据和重新平衡时扮演者重要的角色作用
在所有 OSD 之间进行数据持久存储以及完成数据分布会需要较多的归置组,但是他们的数量应该减少到实现 ceph 最大性能所需的最小 PG 数量值,以节省 CPU 和内存资源。
一般来说,对于有着超过 50 个 OSD 的 RADOS 集群,建议每个 OSD 大约有 50-100 个PG 以平衡资源使用及取得更好的数据持久性和数据分布,而在更大的集群中,每个 OSD可以有 100-200 个 PG
至于一个 pool 应该使用多少个 PG,可以通过下面的公式计算后,将 pool 的 PG 值四舍五入到最近的 2 的 N 次幂,如下先计算出 ceph 集群的总 PG 数:
Total OSDs * PGPerOSD/replication factor => total PGs
磁盘总数 x 每个磁盘 PG 数/副本数 => ceph 集群总 PG 数(略大于 2^n 次方)
单个 pool 的 PG 计算如下:
有 100 个 osd,3 副本,5 个 pool
Total PGs =100*100/3=3333
每个 pool 的 PG=3333/5=512,那么创建 pool 的时候就指定 pg 为 512
需要结合数据数量、磁盘数量及磁盘空间计算出 PG 数量,8、16、32、64、128、256等 2 的 N 次方。
一个 RADOS 集群上会存在多个存储池,因此管理员还需要考虑所有存储池上的 PG 分布后每个 OSD 需要映射的 PG 数量。
ceph 的 pg 数量推荐是 2 的整次幂,比如 2 的平方叫二次幂,立方叫三次幂,幂的大小是整数
验证 PG 与 PGP 组合
ceph pg ls-by-pool mypool
ceph pg ls-by-pool mypool | awk '{print $1,$2,$15}'
三、ceph 的用户管理及授权
Ceph 使用 cephx 协议对客户端进行身份认证
cephx 用于对 ceph 保存的数据进行认证访问和授权,用于对访问 ceph 的请求进行认证和授权检测,与 mon 通信的请求都要经过 ceph 认证通过,但是也可以在 mon 节点关闭 cephx认证,但是关闭认证之后任何访问都将被允许,因此无法保证数据的安全性,
1、授权流程
每个 mon 节点都可以对客户端进行身份认证并分发秘钥,因此多个 mon 节点就不存在单点故障和认证性能瓶颈
mon 节点会返回用于身份认证的数据结构,其中包含获取 ceph 服务时用到的 session key,session key 通过客户端秘钥进行加密传输,而秘钥是在客户端提前配置好的,保存在/etc/ceph/ce ph.client.admin.keyring 文件中。
客户端使用 session key 向 mon 请求所需要的服务,mon 向客户端提供一个 tiket,用于向实际处理数据的 OSD 等服务验证客户端身份,MON 和 OSD 共享同一个 secret,因此OSD 会信任所有 MON 发放的 tiket。tiket 存在有效期,过期后重新发放。
注意:
CephX 身份验证功能仅限制在 Ceph 的各组件之间,不能扩展到其他非 ceph 组件
Ceph 只负责认证授权,不能解决数据传输的加密问题
2、访问流程
无论 ceph 客户端是哪种类型,例如块设备、对象存储、文件系统,ceph 都会在存储池中将所有数据存储为对象:
ceph 用户需要拥有存储池访问权限,才能读取和写入数据
ceph 用户必须拥有执行权限才能使用 ceph 的管理命令
3、ceph 用户
用户是指个人(ceph 管理者)或系统参与者(MON/OSD/MDS)。
通过创建用户,可以控制用户或哪个参与者能够访问 ceph 存储集群、以及可访问的存储池及存储池中的数据。
ceph 支持多种类型的用户,但可管理的用户都属于 client 类型
区分用户类型的原因在于,MON/OSD/MDS 等系统组件特使用 cephx 协议,但是它们为非客户端。
通过点号来分割用户类型和用户名,格式为 TYPE.ID,例如 client.admin。
客户端。
通过点号来分割用户类型和用户名,格式为 TYPE.ID,例如 client.admin。
列出指定用户信息:
ceph auth get osd.10
ceph auth get client.admin
4、ceph 授权和使能
ceph 基于使能/能力(Capabilities,简称 caps )来描述用户可针对 MON/OSD 或 MDS 使用的授权范围或级别。
通用的语法格式:daemon-type ‘allow caps’ [...]
能力一览表:
r:向用户授予读取权限。访问监视器(mon)以检索 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:授予用户引导元数据服务器的权限,授权部署工具权限,使其在引导元数据服务器时有权添加密钥。
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'
5、ceph 用户管理:
用户管理功能可让 Ceph 集群管理员能够直接在 Ceph 集群中创建、更新和删除用户。在 Ceph 集群中创建或删除用户时,可能需要将密钥分发到客户端,以便将密钥添加到密钥环文件中/etc/ceph/ceph.client.admin.keyring,此文件中可以包含一个或者多个用户认证信息,凡是拥有此文件的节点,将具备访问 ceph 的权限,而且可以使用其中任何一个账户的权限,此文件类似于 linux 系统的中的/etc/passwd 文件。
5.1、列出用户
ceph auth list
installed auth entries: mds.ceph-mgr1 key: AQBbV8JjZL9OExAAKEgnt8eKbhSTtrqNSI05nA== caps: [mds] allow caps: [mon] allow profile mds caps: [osd] allow rwx osd.0 key: AQDMhbVjWklpMRAAuJQ6FPhkuDzB3Yt7b9+BCw== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.1 key: AQBphrVjQs1AHhAAhHAjpwa3ohcieOZwElmaag== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * client.admin key: AQAJd7VjxAc1KBAALWtHJZ7WcdZ8MVo8Ov2aXQ== caps: [mds] allow * caps: [mgr] allow * caps: [mon] allow * caps: [osd] allow *
注意:TYPE.ID 表示法
针对用户采用 TYPE.ID 表示法,例如 osd.0 指定是 osd 类并且 ID 为 0 的用户(节点),
client.admin 是 client 类型的用户,其 ID 为 admin
另请注意,每个项包含一个 key=xxxx 项,以及一个或多个 caps 项。
可以结合使用-o 文件名选项和 ceph auth list 将输出保存到某个文件。
ceph auth list -o 123.key
5.2、添加用户
添加一个用户会创建用户名 (TYPE.ID)、机密密钥,以及包含在命令中用于创建该用户的所有能力,用户可使用其密钥向 Ceph 存储集群进行身份验证。用户的能力授予该用户在Ceph monitor (mon)、Ceph OSD (osd) 或 Ceph 元数据服务器 (mds) 上进行读取、写入或执行的能力,可以使用以下几个命令来添加用户:
ceph auth add
此命令是添加用户的规范方法。它会创建用户、生成密钥,并添加所有指定的能力
auth add <entity> {<caps> [<caps>...]}
#添加认证 key:
ceph auth add client.tom mon 'allow r' osd 'allow rwx pool=mypool'
#验证 key
ceph auth get client.tom
ceph auth get-or-create
ceph auth get-or-create 此命令是创建用户较为常见的方式之一,它会返回包含用户名(在方括号中)和密钥的密钥文,如果该用户已存在,此命令只以密钥文件格式返回用户名和密钥,还可以使用 -o 指定文件名选项将输出保存到某个文件。
#创建用户
ceph auth get-or-create client.jack mon 'allow r' osd 'allow rwx pool=mypool'
#验证用户
ceph auth get client.jack
#再次创建用户
ceph auth get-or-create client.jack mon 'allow r' osd 'allow rwx pool=mypool'
ceph auth get-or-create-key
此命令是创建用户并仅返回用户密钥,对于只需要密钥的客户端(例如 libvirt),此命令非常有用。如果该用户已存在,此命令只返回密钥。您可以使用 -o 文件名选项将输出保存到某个文件。
创建客户端用户时,可以创建不具有能力的用户。不具有能力的用户可以进行身份验证,但不能执行其他操作,此类客户端无法从监视器检索集群地图,但是,如果希望稍后再添加能力,可以使用 ceph auth caps 命令创建一个不具有能力的用户。典型的用户至少对 Ceph monitor 具有读取功能,并对 Ceph OSD 具有读取和写入功能。此外,用户的 OSD 权限通常限制为只能访问特定的存储池。
ceph auth get-or-create-key client.jack mon 'allow r' osd 'allow rwx pool=mypool' # 用户有 key 就显示没有就创建
ceph auth print-key
只获取单个指定用户的 key 信息
5.3、修改用户能力
使用 ceph auth caps 命令可以指定用户以及更改该用户的能力,设置新能力会完全覆盖当前的能力,因此要加上之前的用户已经拥有的能和新的能力,如果看当前能力,可以运行ceph auth get USERTYPE.USERID,如果要添加能力,使用以下格式时还需要指定现有能力:
root # ceph auth caps USERTYPE.USERID daemon 'allow [r|w|x|*|...] \
[pool=pool-name] [namespace=namespace-name]' [daemon 'allow [r|w|x|*|...] \
[pool=pool-name] [namespace=namespace-name]']
例如:
#查看用户当前权限
ceph auth get client.jack
#修改用户权限
ceph auth caps client.jack mon 'allow r' osd 'allow rw pool=mypool'
#再次验证权限
ceph auth get client.jack
5.4、删除用户
要删除用户使用 ceph auth del TYPE.ID,其中 TYPE 是 client、osd、mon 或 mds 之一,ID 是用户名或守护进程的 ID。
ceph auth del client.tom
6、秘钥环管理
ceph 的秘钥环是一个保存了 secrets、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 #编译后的二进制文件
6.1、通过秘钥环文件备份与恢复用户
使用 ceph auth add 等命令添加的用户还需要额外使用 ceph-authtool 命令为其创建用户秘钥环文件。
创建 keyring 文件命令格式:
ceph-authtool --create-keyring FILE
导出用户认证信息至 keyring 文件
将用户信息导出至 keyring 文件,对用户信息进行备份。
#创建用户
ceph auth get-or-create client.user1 mon 'allow r' osd 'allow * pool=mypool'
#验证用户
ceph auth get client.user1
#创建 keyring 文件
ceph-authtool --create-keyring ceph.client.user1.keyring
#验证 keyring 文件
cat ceph.client.user1.keyring #是个空文件
file ceph.client.user1.keyring
#导出 keyring 至指定文件
ceph auth get client.user1 -o ceph.client.user1.keyring
#验证指定用户的 keyring 文件:
cat ceph.client.user1.keyring
在创建包含单个用户的密钥环时,通常建议使用 ceph 集群名称、用户类型和用户名及keyring 来 命 名 , 并 将 其 保 存 在 /etc/ceph 目 录 中 。 例 如 为 client.user1 用 户 创 建ceph.client.user1.keyring。
从 keyring 文件恢复用户认证信息
可以使用 ceph auth import -i 指定 keyring 文件并导入到 ceph,其实就是起到用户备份和恢复的目的:
cat ceph.client.user1.keyring #验证用户的认证文件
ceph auth del client.user1 #演示误删除用户
ceph auth get client.user1 #确认用户被删除
ceph auth import -i ceph.client.user1.keyring #导入用户
ceph auth get client.user1 #验证已恢复用户
6.2、秘钥环文件多用户
一个 keyring 文件中可以包含多个不同用户的认证文件。
将多用户导出至秘钥环
#创建 keyring 文件:
ceph-authtool --create-keyring ceph.client.user.keyring #创建空的 keyring 文件
#把指定的 admin 用户的 keyring 文件内容导入到 user 用户的 keyring 文件
ceph-authtool ./ceph.client.user.keyring --import-keyring ./ceph.client.admin.keyring
#验证 keyring 文件
ceph-authtool -l ./ceph.client.user.keyring
#再导入一个其他用户的 keyring
ceph-authtool ./ceph.client.user.keyring --import-keyring ./ceph.client.user1.keyring
#再次验证 keyring 文件是否包含多个用户的认证信息
四、普通客户挂载块存储
1、创建存储池
#创建存储池 ceph osd pool create rbd-data1 32 32 #验证存储池: ceph osd pool ls #在存储池启用 rbd osd pool application enable <poolname> <app> {--yes-i-really-mean-it} enable use of an application <app> [cephfs,rbd,rgw] on pool <poolname> ceph osd pool application enable rbd-data1 rbd #初始化 rbd:
rbd pool init -p rbd-data1
2、创建 img 镜像
rbd 存储池并不能直接用于块设备,而是需要事先在其中按需创建映像(image),并把映像文件作为块设备使用。rbd 命令可用于创建、查看及删除块设备相在的映像(image),以及克隆映像、创建快照、将映像回滚到快照和查看快照等管理操作。例如,下面的命令能够在指定的 RBD 即 rbd-data1 创建一个名为 myimg1 的映像:
2.1、创建镜像
#创建两个镜像: rbd create data-img1 --size 3G --pool rbd-data1 --image-format 2 --image-feature layering rbd create data-img2 --size 5G --pool rbd-data1 --image-format 2 --image-feature layering #验证镜像: rbd ls --pool rbd-data1 #列出镜像个多信息 rbd ls --pool rbd-data1 -l
2.2、查看镜像详细信息
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: d42b6b8b4567 #镜像 id
block_name_prefix: rbd_data.d42b6b8b4567 #size 里面的 1280 个对象名称前缀
format: 2 #镜像文件格式版本
features: layering #特性,layering 支持分层快照以写时复制
op_features:
flags:
create_timestamp: Mon Dec 14 12:22:27 2020
$ rbd --image data-img1 --pool rbd-data1 info
rbd image 'data-img1':
size 3 GiB in 768 objects
order 22 (4 MiB objects)
id: d45b6b8b4567
block_name_prefix: rbd_data.d45b6b8b4567
format: 2
features: layering
op_features:
flags:
reate_timestamp: Mon Dec 14 12:35:44 2020
2.3、镜像的其他特性
#特性简介
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 使用。
2.4、镜像特性的启用
#启用指定存储池中的指定镜像的特性 rbd feature enable exclusive-lock --pool rbd-data1 --image data-img1 rbd feature enable object-map --pool rbd-data1 --image data-img1 rbd feature enable fast-diff --pool rbd-data1 --image data-img1 #验证镜像特性 rbd --image data-img1 --pool rbd-data1 info
2.5、镜像特性的禁用
#禁用指定存储池中指定镜像的特性 rbd feature disable fast-diff --pool rbd-data1 --image data-img1 #验证镜像特性 rbd --image data-img1 --pool rbd-data1 info
3、配置客户端使用 RBD
在 centos 客户端挂载 RBD,并分别使用 admin 及普通用户挂载 RBD 并验证使用。admin在ceph(一)叙述过,这里省略
3.1、客户端配置 yum 源
客户端要想挂载使用 ceph RBD,需要安装 ceph 客户端组件 ceph-common,但是ceph-common 不在 cenos 的 yum 仓库,因此需要单独配置 yum 源。
#配置 yum 源: # yum install epel-release # yum install https://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch/ceph-release-1-1.el7.noarch.rpm -y
3.2、客户端安装 ceph-common
yum install ceph-common
3.3、创建普通账户并授权
#创建普通账户 [cephadmin@ceph-deploy ceph-cluster]$ceph auth add client.nuo mon 'allow r' osd 'allow rwx pool=rbd-data1' #验证用户信息 [cephadmin@ceph-deploy ceph-cluster]$ ceph auth get client.nuo
#创建用 keyring 文件
[cephadmin@ceph-deployceph-cluster]$ceph-authtool --create-keyring ceph.client.nuo.keyring
#导出用户 keyring
[cephadmin@ceph-deploy ceph-cluster]$ ceph auth get client.nuo -o ceph.client.nuo.keyring
#验证指定用户的 keyring 文件
cat ceph.client.nuo.keyring
3.4、同步普通用户认证文件
scp ceph.conf ceph.client.nuo.keyring root@10.247.8.190:/etc/ceph/
3.5、在客户端验证权限
cd /etc/ceph/ ls ceph --user nuo -s #默认使用 admin 账户
3.6、映射 rbd
使用普通用户权限映射 rbd
#映射 rbd rbd --user nuo -p rbd-data1 map data-img2 #验证 rbd fdisk -l /dev/rbd0
3.7、格式化并使用 rbd 镜像
mkfs.ext4 /dev/rbd0 mkdir /data mount /dev/rbd0 /data/ cp /var/log/messages /data/ ll /data/
df -TH
#管理端验证镜像状态 rbd ls -p rbd-data1 -l
3.8、验证 ceph 内核模块
挂载 rbd 之后系统内核会自动加载 libceph.ko 模块
Centos:
3.9、rbd 镜像空间拉伸
可以扩展空间,不建议缩小空间
#当前 rbd 镜像空间大小 rbd ls -p rbd-data1 -l #rbd 镜像空间拉伸命令 usage: rbd resize [--pool <pool>] [--image <image>] --size <size> [--allow-shrink] [--no-progress] <image-spec> #拉伸 rbd 镜像空间 rbd resize --pool rbd-data1 --image data-img2 --size 8G
3.10、客户端验证镜像空间
3.11、开机自动挂载
vi /etc/rc.d/rc.local rbd --user shijie -p rbd-data1 map data-img2 mount /dev/rbd0 /data/ chmod a+x /etc/rc.d/rc.local reboot #查看映射 rbd showmapped #验证挂载 df -TH
3.12、卸载 rbd 镜像
umount /data rbd --user nuo -p rbd-data1 unmap data-img2
3.13、删除 rbd 镜像
镜像删除后数据也会被删除而且是无法恢复,因此在执行删除操作的时候要慎重。
rbd rm --pool rbd-data1 --image data-img1
3.14、rbd 镜像回收站机制
删除的镜像数据无法恢复,但是还有另外一种方法可以先把镜像移动到回收站,后期确认删除的时候再从回收站删除即可。
#查看镜像状态 rbd status --pool rbd-data1 --image data-img2 #将进行移动到回收站 rbd trash move --pool rbd-data1 --image data-img2 #查看回收站的镜像: rbd trash list --pool rbd-data1 #从回收站删除镜像 如果镜像不再使用,可以直接使用 trash remove 将其从回收站删除 rbd trash remove --pool rbd-data1 8659a3691aec #还原镜像 rbd trash restore --pool rbd-data1 --image data-img2 --image-id d42b6b8b4567 #验证镜像 rbd ls --pool rbd-data1 -l
五、普通用户挂载 cephfs
1、部署 MDS 服务
如果要使用 cephFS,需要部署 cephfs 服务。
Ubuntu:
root@ceph-mgr1:~# apt-cache madison ceph-mds
root@ceph-mgr1:~# apt install ceph-mds
Centos:
[root@ceph-mgr1 ~]# yum install ceph-mds
$ ceph-deploy mds create ceph-mgr1
2、创建 CephFS metadata 和 data 存储池
使用 CephFS 之前需要事先于集群中创建一个文件系统,并为其分别指定元数据和数据相关的存储池。下面创建一个名为 cephfs 的文件系统用于测试,它使用 cephfs-metadata 为元数据存储池,使用 cephfs-data 为数据存储池:
ceph osd pool create cephfs-metadata 32 32
ceph osd pool create cephfs-data 64 64
3、创建 cephFS 并验证
ceph fs new mycephfs cephfs-metadata cephfs-data #new fs with metadata pool 7 and data pool 8
ceph fs ls #name: mycephfs, metadata pool: cephfs-metadata, data pools: [cephfs-data ]
ceph fs status mycephfs #查看指定 cephFS 状 态
4、验证 cepfFS 服务状态
ceph mds stat #mycephfs-1/1/1 up {0=ceph-mgr1=up:active} #现在已经转变为活动状态
5、创建客户端账户
#创建账户 ceph auth add client.yanyan mon 'allow r' mds 'allow rw' osd 'allow rwx pool=cephfs-data' #验证账户 ceph auth get client.yanyan #创建用 keyring 文件 ceph auth get client.yanyan -o ceph.client.yanyan.keyring #创建 key 文件 ceph auth print-key client.yanyan > yanyan.key #验证用户的 keyring 文件 cat ceph.client.yanyan.keyring
6、安装 ceph 客户端
yum install epel-release -y yum install https://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch/ceph-release-1-1.el7.noarch.rpm yum install ceph-common -y
7、同步客户端认证文件
scp ceph.conf ceph.client.yanyan.keyring yanyan.key root@10.247.8.190:/etc/ceph/
8、客户端验证权限
9、内核空间挂载 ceph-fs
客户端挂载有两种方式,一是内核空间一是用户空间,内核空间挂载需要内核支持 ceph 模块,用户空间挂载需要安装 ceph-fuse
9.1 客户端通过 key 文件挂载
mkdir /data mount -t ceph 10.247.8.202:6789,10.247.8.203:6789,10.247.8.204:6789:/ /data -o name=yanyan,secretfile=/etc/ceph/yanyan.key
#验证写入数据
cp /etc/issue /data/
dd if=/dev/zero of=/data/testfile bs=1M count=100
9.2 客户端通过 key 挂载
tail /etc/ceph/yanyan.key AQAl9O1jhgFiCBAAqtIySmdKIh60OsVdjsh2uw== umount /data/ mount -t ceph 10.247.8.202:6789,10.247.8.203:6789,10.247.8.204:6789:/ /data -o name=yanyan,secret=AQAl9O1jhgFiCBAAqtIySmdKIh60OsVdjsh2uw==
#测试写入数据
cp /etc/yum.repos.d/epel.repo /data/
#查看挂载点状态
stat -f /data/
9.3 开机挂载
vi /etc/fstab
10.247.8.202:6789,10.247.8.203:6789,10.247.8.204:6789:/ /data ceph defaults,name=yanyan,secretfile=/etc/ceph/yanyan.key,_netdev 0 0 #加入此项
六、实现 MDS 服务的多主一备高可用架构
Ceph mds(metadata service)作为 ceph 的访问入口,需要实现高性能及数据备份,而 MDS支持多 MDS 结构,甚至还能实现类似于 redis cluster 的多主从结构,以实现 MDS 服务的高性能和高可用,假设启动 4 个 MDS 进程,设置最大 max_mds 为 2,这时候有 2 个
MDS 成为主节点,另外的两个 2 个 MDS 作为备份节点。https://docs.ceph.com/en/latest/cephfs/add-remove-mds/
设置每个主节点专用的备份 MDS,也就是如果此主节点出现问题马上切换到另个 MDS 接管主 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。
1、当前 mds 服务器状态
ceph mds stat # mycephfs:1 {0=ceph-mgr1=up:active}
2、添加 MDS 服务器
将 ceph-mgr2 和 ceph-mon2 和 ceph-mon3 作为 mds 服务角色添加至 ceph 集群,最后实两主两备的 mds 高可用和高性能结构。
#mon3、mon2、mgr2安装以下命令 apt install ceph-mds=16.2.10-1focal #布置节点添加mds服务器 ceph-deploy mds create ceph-mgr2 ceph-deploy mds create ceph-mon2 ceph-deploy mds create ceph-mon3 #验证 mds 服务器当前状态: ceph mds stat #mycephfs:1 {0=ceph-mgr1=up:active} 3 up:standby
3、验证 ceph 集群当前 状态
当前处于激活状态的 mds 服务器有一台,处于备份状态的 mds 服务器有三台。
ceph fs status
4、当前的文件系统状态
ceph fs get mycephfs
5、设置处于激活状态 mds 的数量
目前有四个 mds 服务器,但是有一个主三个备,可以优化一下部署架构,设置为为两主两备。
ceph fs set mycephfs max_mds 2 #设置同时活 跃的主 mds 最大值为 2。
6、MDS 高可用优化
目前的状态是 ceph-mgr1 和 ceph-mon2 分别是 active 状态,ceph-mon3 和 ceph-mgr2分别处于 standby 状态,现在可以将 ceph-mgr2 设置为 ceph-mgr1 的 standby,将ceph-mon3 设置为 ceph-mon2 的 standby,以实现每个主都有一个固定备份角色的结构,
则修改配置文件如下
[cephadmin@ceph-deploy ceph-cluster]$ vim ceph.conf
[global] fsid = 23b0f9f2-8db3-477f-99a7-35a90eaf3dab public_network = 10.247.8.0/24 cluster_network = 172.25.0.0/24 mon_initial_members = ceph-mon1 mon_host = 10.247.8.202 auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx [mds.ceph-mgr2] #mds_standby_for_fscid = mycephfs mds_standby_for_name = ceph-mgr1 mds_standby_replay = true [mds.ceph-mgr1] #mds_standby_for_fscid = mycephfs mds_standby_for_name = ceph-mgr2 mds_standby_replay = true [mds.ceph-mon3] mds_standby_for_name = ceph-mon2 mds_standby_replay = true [mds.ceph-mon2] mds_standby_for_name = ceph-mon3 mds_standby_replay = true
7、分发配置文件并重启 mds 服务
#分发配置文件保证各 mds 服务重启有效 ceph-deploy --overwrite-conf config push ceph-mon3 ceph-deploy --overwrite-conf config push ceph-mon2 ceph-deploy --overwrite-conf config push ceph-mgr1 ceph-deploy --overwrite-conf config push ceph-mgr2 systemctl restart ceph-mds@ceph-mon2.service systemctl restart ceph-mds@ceph-mon3.service systemctl restart ceph-mds@ceph-mgr2.service systemctl restart ceph-mds@ceph-mgr1.service
8、ceph 集群 mds 高可用状态
ceph fs status