1.2 Ceph 基础命令及集群基本管理

1. Ceph基础命令

$ ceph osd pool ls           #显示存储池
$ ceph osd lspools           #显示存储池和其ID
$ ceph pg stat               #查看pg状态
$ ceph osd pool stats <mypool> #查看指定pool或所有pool的状态
$ ceph df                    #查看集群存储状态
$ ceph osd stat              #查看OSD的状态
$ ceph osd dump              #显示OSD的底层信息
$ ceph osd tree              #显示OSD和节点的对应关系
$ ceph mon stat              #显示mon节点状态
$ ceph mon dump              #查看mond节点的详细信息

2. Ceph的集群维护

http://docs.ceph.org.cn/rados #ceph集群的配置、部署与维护

2.1 通过套接字进行单机管理

该方式不太推荐

  • node节点和mon节点上的ceph套接字位置:/var/run/ceph 中的*.asok文件
  • 在node节点或mon节点通过ceph命令进行单机管理本机的mon或者osd服务

2.1.1 将admin认证文件同步到mon或者node节点

$ scp ceph.client.admin.keyring root@192.168.6.64:/etc/ceph

2.1.2 查看及修改单个节点上某个osd的配置

$ ceph --admin-socket /var/run/ceph/ceph-osd.0.asok --help
$ ceph --admin-socket /var/run/ceph/ceph-osd.0.asok status

2.1.3 在mon节点获取daemon服务帮助

$ ceph --admin-daemon /var/run/ceph/ceph-mon.ceph-mon1.asok help
$ ceph --admin-daemon /var/run/ceph/ceph-mon.ceph-mon1.asok mon_status
$ ceph --admin-daemon /var/run/ceph/ceph-mon.ceph-mon1.asok config show

3. Ceph集群的停止和重启

重启之前,要提前设置ceph间不要将OSD标记为out,避免node节点服务关闭后被剔除ceph(osd会6s向mon汇报状态,mon 20s连续没有收到osd状态汇报,会进行数据同步,noout是取消此机制,即不会进行数据同步和数据高可用)

$ ceph osd set noout     #关闭前noout
$ ceph osd unset noout   #重启后取消noout

3.1 关闭顺序

  • 关闭服务前设置noout
  • 关闭存储客户端,停止数据读写
  • 如果启用了RGW,关闭RGW 节点
  • 关闭cephfs 元数据服务节点
  • 关闭ceph osd 节点
  • 关闭ceph manager 节点
  • 关闭ceph monitor 节点

3.2 启动顺序

  • 启动ceph monitor 节点
  • 启动ceph manager 节点
  • 启动ceph osd 节点
  • 启动cephfs 数据服务
  • 启动RGW
  • 启动存储客户端
  • 启动集群后取消noout设置

3.3 添加服务器

  1. 添加仓库源
  2. ceph-deploy install --release pacific ceph-node4
  3. 擦除磁盘: ceph-deploy disk zap ceph-node1 /dev/sdb
  4. 添加osd:sudo ceph-deploy osd create ceph-node1 --data /dev/sdb

3.4 剔除服务器

停止服务前要将服务器中的osd先停止,并从ceph集群中删除

  1. 把osd提集群: ceph osd out #可以通过ceph osd in 在加回来
  2. 等待一段时间,进行内部数据平衡
  3. 停止osd.x 进程:systemctl stop ceph-osd@0.service
  4. 删除osd:ceph osd rm 1
  5. 当前主机的其它磁盘重复以上操作
  6. osd全部完成操作后下线主机

4. Ceph的配置文件

  • 位置:/etc/ceph/ceph.conf

  • 组成:

    [global] #全局配置

    [osd] #osd专用配置,可以使用osd.num 来表示具体的哪一个osd

    [mon] #monitor专用配置,可以使用mon.A 来表示具体的哪一个monitor,其中A表示该节点的名称,如ceph-monitor-2等,使用ceph mon dump可以查看

    [client] #客户端专用配置

  • ceph配置文件的加载顺序:

    • $CEPH_CONF 环境变量
    • -c 指定的位置
    • /etc/ceph/ceph.conf
    • ~/.ceph/ceph.conf
    • ./ceph.conf

5. 存储池、PG和CRUSH

副本池:replicated

  • 定义每个对象在集群中保存为多少个副本,默认为三个副本,一主两备
  • 实现高可用,副本池是 ceph 默认的存储池类型。

纠删码池(erasure code)

  • 把各对象存储为 N=K+M 个块,其中 K 为数据块数量,M 为编码快 数量,因此存储池的尺寸为 K+M。
  • 即数据保存在 K 个数据块,并提供 M 个冗余块提供数据高可用,那么最多能故障的块就是 M 个,实际的磁盘占用就是 K+M 块,因此相比副本池机制比较节省存储资源,一般采用 8+4 机制,即 8 个数据块+4 个冗余块,那么也就是 12 个数据块有 8 个数据块保存数据,有 4 个 实现数据冗余,即 1/3 的磁盘空间用于数据冗余,比默认副本池的三倍冗余节省空间,但是 不能出现大于一定数据块故障。
  • 但是不是所有的应用都支持纠删码池,RBD 只支持副本池而 radosgw 则可以支持纠删码池。

5.1 副本池IO

  • 将一个数据对象存储为多个副本。
  • 在客户端写入操作时,ceph 使用 CRUSH 算法计算出与对象相对应的 PG ID 和 primary OSD 主 OSD 根据设置的副本数、对象名称、存储池名称和集群运行图(cluster map)计算出 PG 的 各辅助 OSD,然后由 OSD 将数据再同步给辅助 OSD。
  • 读取数据:
  1. 客户端发送读请求,RADOS 将请求发送到主 OSD。
  2. 主 OSD 从本地磁盘读取数据并返回数据,最终完成读请求。
  • 写入数据:
  1. 客户端APP请求写入数据,RADOS发送数据到主OSD。
  2. 主OSD识别副本OSDs,并发送数据到各副本OSD。
  3. 副本OSDs写入数据,并发送写入完成信号给主OSD。
  4. 主OSD发送写入完成信号给客户端APP。

image-20211008021736172

image-20211008021938652

5.2 纠删码池 IO

http://ceph.org.cn/2016/08/01/ceph-%E7%BA%A0%E5%88%A0%E7%A0%81%E4%BB%8B%E7%BB%8D/

  • Ceph 从 Firefly 版本开始支持纠删码,但是不推荐在生产环境使用纠删码池。
  • 纠删码池降低了数据保存所需要的磁盘总空间数量,但是读写数据的计算成本要比副本池高 RGW 可以支持纠删码池,RBD 不支持。
  • 纠删码池可以降低企业的前期 TCO 总拥有成本

5.2.1 纠删码写

  • 数据将在主 OSD 进行编码然后分发到相应的 OSDs 上去。
    1. 计算合适的数据块并进行编码
    2. 对每个数据块进行编码并写入 OSD

image-20211008022253403

#创建纠删码池
ceph@ceph-deploy:/home/ceph/ceph-cluster$ ceph osd pool create erasure-testpool 16 16 erasure

pool 'erasure-testpool' created

ceph@ceph-deploy:/home/ceph/ceph-cluster$ ceph osd erasure-code-profile get default
  • k=2 #k 为数据块的数量,即要将原始对象分割成的块数量,例如,如果 k = 2,则会将一个 10kB 对象分割成各为 5kB 的 k 个对象。
  • m=2 #编码块(chunk)的数量,即编码函数计算的额外块的数量。如果有 2 个编码块,则表示 有两个额外的备份,最多可以从当前 pg 中宕机 2 个 OSD,而不会丢失数据。
  • plugin=jerasure #默认的纠删码池插件
  • technique=reed_sol_van
#写入数据:
ceph@ceph-deploy:/home/ceph/ceph-cluster$ sudo rados put -p erasure-testpool testfile1 /var/log/syslog


#验证数据:
ceph@ceph-deploy:/home/ceph/ceph-cluster$ ceph osd map erasure-testpool testfile1

osdmap e193 pool 'erasure-testpool' (5) object 'testfiles' -> pg 5.c66b4094 (5.4) -> up ([10,3,18,6], p10) acting ([10,3,18,6], p10)

#验证当前pg状态:
ceph@ceph-deploy:/home/ceph/ceph-cluster$ ceph pg ls-by-pool |awk '{print $1,$2,$15}'
PG OBJECTS ACTING
5.0 0 [12,4,6,15]p12
5.1 1 [7,0,17,10]p7
5.2 0 [6,2,11,17]p6
5.3 0 [0,18,9,14]p0
5.4 0 [10,3,18,6]p10
5.5 0 [0,14,17,7]p0
5.6 0 [2,8,16,13]p2
5.7 0 [19,4,13,8]p19 
5.8 0 [18,7,12,2]p18 
5.9 0 [19,7,14,3]p19 
5.a 0 [2,14,15,5]p2 
5.b 1 [16,3,7,14]p16

#测试获取数据:
ceph@ceph-deploy:/home/ceph/ceph-cluster$ rados --pool erasure-testpool get testfile1 -
ceph@ceph-deploy:/home/ceph/ceph-cluster$ sudo rados get -p erasure-testpool testfile1 /tmp/testfile1

image-20211008022538183

5.2.2 纠删码读

从相应的 OSDs 中获取数据后进行解码。

image-20211008023859332

如果此时有数据丢失,Ceph 会自动从存放校验码的 OSD 中读取数据进行解码

image-20211008024214294

5.3 PG与PGP

  • PG = Placement Group #归置组
  • PGP = Placement Group for Placement purpose #归置组的组合,pgp 相当于是 pg 对应 osd 的 一种排列组合关系。

归置组(placement group)是用于跨越多 OSD 将数据存储在每个存储池中的内部数据结构。 归置组在 OSD 守护进程和 ceph 客户端之间生成了一个中间层,CRUSH 算法负责将每个对象动态映射到一个归置组,然后再将每个归置组动态映射到一个或多个 OSD 守护进程,从而能够支持在新的 OSD 设备上线时进行数据重新平衡。

  • 相对于存储池来说,PG 是一个虚拟组件,它是对象映射到存储池时使用的虚拟层。 可以自定义存储池中的归置组数量。
  • ceph 出于规模伸缩及性能方面的考虑,ceph 将存储池细分为多个归置组,把每个单独的对 象映射到归置组,并为归置组分配一个主 OSD。
  • 存储池由一系列的归置组组成,而 CRUSH 算法则根据集群运行图和集群状态,将个 PG 均匀、 伪随机(基于 hash 映射,每次的计算结果够一样)的分布到集群中的 OSD 之上。
  • 如果某个 OSD 失败或需要对集群进行重新平衡,ceph 则移动或复制整个归置组而不需要单 独对每个镜像进行寻址。

5.3.1 PG与OSD的关系

  • ceph 基于 crush 算法将归置组 PG 分配至 OSD
  • 当一个客户端存储对象的时候,CRUSH 算法映射每一个对象至归置组(PG)

image-20211008141242924

5.3.2 PG的分配计算

归置组(PG)的数量是由管理员在创建存储池的时候指定的,然后由 CRUSH 负责创建和使用, PG 的数量是 2 的 N 次方的倍数,每个 OSD 的 PG 不要超出 250 个 PG,官方是每个 OSD 100 个左右: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 的状态信息。
  1. PG 的数量在集群分发数据和重新平衡时扮演者重要的角色作用。
  • 在所有 OSD 之间进行数据持久存储以及完成数据分布会需要较多的归置组,但是他们的数量应该减少到实现最大性能所需的最小数量值,以节省 CPU 和内存资源。
  • 一般来说,对于有着超过 50 个 OSD 的 RADOS 集群,建议每个 OSD 大约有 50-100 个 PG 以平衡资源使用及取得更好的数据持久性和数据分布,而在更大的集群中,每个 OSD 可以 有 100-200 个 PG。
  • 至于一个 pool 应该使用多少个 PG,可以通过下面的公式计算后,将 pool 的 PG 值四舍五入到最近的 2 的 N 次幂,如下先计算出 ceph 集群的总 PG 数:
    • Total OSDs * PGperOSD/repication factor => total PGs
    • 磁盘总数 * 每个磁盘的PG数 / 副本数 =>Ceph集群总PG数(略大于2^n)
    • Total PGS = (Total_number_of _osd * 100) / max_replication_count
    • 单个pool的PG计算:
      • 有100个osd,3副本,5个pool
      • Total PGs = 100*100/3 = 3333
      • 每个pool的PG=3333/5=512,创建pool的时候就指定PG为512。这里是按照5个存储池平分的,实际上每个pool的大小是不一样的,要按照实际要存储的数据大小,进行加权分配。
  • 需要结合数据数量、磁盘数量及磁盘空间计算出 PG 数量,8、16、32、64、128、256 等2的N次方。
  • 一个 RADOS 集群上会存在多个存储池,因此管理员还需要考虑所有存储池上的 PG 分布后 每个 OSD 需要映射的 PG 数量。
  • ceph 的 pg 数量推荐是 2 的整次幂,如果不是 2 的整次方会有提示

5.3.3 PG与PGP组合

由CRUSH算法完成PG组合成PGP

$ ceph pg ls-by-pool mypool
$ ceph pg ls-by-pool mypool | awk '{print $1,$2,$15}'

image-20211008144323399

5.3.4 PG的状态

PG 的常见在状态如下:

5.4.4.1 Peering
  • 正在同步状态,同一个 PG 中的 OSD 需要将准备数据同步一致,而 Peering(对等)就是 OSD同步过程中的状态。
5.4.4.2 Activating
  • Peering 已经完成,PG 正在等待所有 PG 实例同步 Peering 的结果(Info、Log 等)。
5.4.4.3 Clean

干净态,PG当前不存在待修复的对象,并且大小等于存储池的副本数,即PG的活动集(Acting Set)和上行集(Up Set)为同一组 OSD 且内容一致。

  • 活动集(Acting Set):由 PG 当前主的 OSD 和其余处于活动状态的备用 OSD 组成,当前 PG 内 的 OSD 负责处理用户的读写请求。
  • 上行集(Up Set):在某一个 OSD 故障时,需要将故障的 OSD 更换为可用的 OSD,并主 PG 内部 的主 OSD 同步数据到新的 OSD 上,例如 PG 内有 OSD1、OSD2、OSD3,当 OSD3 故障后需要 用 OSD4 替换 OSD3,那么 OSD1、OSD2、OSD3 就是上行集,替换后 OSD1、OSD2、OSD4 就是活动集,OSD 替换完成后活动集最终要替换上行集。
5.4.4.4 Active

就绪状态或活跃状态,Active 表示主 OSD 和备 OSD 处于正常工作状态,此时的 PG 可以正常 处理来自客户端的读写请求,正常的 PG 默认就是 Active+Clean 状态。

ceph@ceph-deploy:/home/ceph/ceph-cluster$ ceph pg stat
129 pgs: 129 active+clean; 319 KiB data, 1.1 GiB used, 2.0 TiB / 2.0 TiB avail
5.4.4.5 Degraded-降级状态
  • 降级状态出现于 OSD 被标记为 down 以后,那么其他映射到此 OSD 的 PG 都会转换到降级状 态。
  • 如果此 OSD 还能重新启动完成并完成 Peering 操作后,那么使用此 OSD 的 PG 将重新恢复为 clean 状态。
  • 如果此 OSD 被标记为 down 的时间超过 5 分钟还没有修复,那么此 OSD 将会被 ceph 踢出集 群,然后 ceph 会对被降级的 PG 启动恢复操作,直到所有由于此 OSD 而被降级的 PG 重新恢复为 clean 状态。
  • 恢复数据会从 PG 内的主 OSD 恢复,如果是主 OSD 故障,那么会在剩下的两个备用 OSD 重新选择一个作为主 OSD 。
5.4.4.6 Stale-过期状态
  • 正常状态下,每个主 OSD 都要周期性的向 RADOS 集群中的监视器(Mon)报告其作为主 OSD 所持有的所有PG的最新统计数据,因任何原因导致某个OSD无法正常向监视器发送汇报信 息的、或者由其他 OSD 报告某个 OSD 已经 down 的时候,则所有以此 OSD 为主 PG 则会立 即被标记为 stale 状态,即他们的主 OSD 已经不是最新的数据了,如果是备份的 OSD 发送 down 的时候,则 ceph 会执行修复而不会触发 PG 状态转换为 stale 状态。
5.4.4.7 undersized
  • PG 当前副本数小于其存储池定义的值的时候,PG 会转换为 undersized 状态,比如两个备 份 OSD 都 down 了,那么此时 PG 中就只有一个主 OSD 了,不符合 ceph 最少要求一个主 OSD 加一个备 OSD 的要求,那么就会导致使用此 OSD 的 PG 转换为 undersized 状态,直到添加备 份 OSD 添加完成,或者修复完成。
5.4.4.8 Scrubbing
  • scrub 是 ceph 对数据的清洗状态,用来保证数据完整性的机制,Ceph 的 OSD 定期启动 scrub 线程来扫描部分对象,通过与其他副本比对来发现是否一致,如果存在不一致,抛出 异常提示用户手动解决,scrub 以 PG 为单位,对于每一个 pg,ceph 分析该 pg 下所有的 object, 产生一个类似于元数据信息摘要的数据结构,如对象大小,属性等,叫 scrubmap, 比较主与 副 scrubmap,来保证是不是有 object 丢失或者不匹配,扫描分为轻量级扫描和深度扫描,轻量级扫描也叫做 light scrubs 或者 shallow scrubs 或者 simply scrubs 即轻量级扫描。
  • Light scrub(daily)比较 object size 和属性,deep scrub (weekly)读取数据部分并通过 checksum(CRC32 算法)对比和数据的一致性,深度扫描过程中的 PG 会处于 scrubbing+deep 状态。
5.4.4.9 Recovering
  • 正在恢复态,集群正在执行迁移或同步对象和他们的副本,这可能是由于添加了一个新的 OSD 到集群中或者某个 OSD 宕掉后,PG 可能会被 CRUSH 算法重新分配不同的 OSD,而由于 OSD 更换导致 PG 发生内部数据同步的过程中的 PG 会被标记为 Recovering。
5.4.4.10 Backfilling
  • 正在后台填充态,backfill 是 recovery 的一种特殊场景,指 peering 完成后,如果基于当前权 威日志无法对 Up Set(上行集)当中的某些 PG 实例实施增量同步(例如承载这些 PG 实例的 OSD 离线太久,或者是新的 OSD 加入集群导致的 PG 实例整体迁移) 则通过完全拷贝当前 Primary 所有对象的方式进行全量同步,此过程中的 PG 会处于 backfilling。
5.4.4.11 Backfill-toofull
  • 某个需要被 Backfill 的 PG 实例,其所在的 OSD 可用空间不足,Backfill 流程当前被挂起时 PG给的状态。
5.4.4.12 PG状态演示

https://www.jianshu.com/p/36c2d5682d87

6. 数据的读写流程

image-20211008145733725

  • ceph 读写对象的时候,客户端从 ceph 监视器检索出集群运行图(cluster map),然后客户端 访问指定的存储池,并对存储池内 PG 的对象执行读写操作。

    • 存储池的 CRUSH 计算结果和 PG 的数量,是决定 ceph 如何放置数据的关键因素。

    • 基于集群的最新运行图,客户端能够了解到集群中的所有监视器和 OSD 以及他们各自当前 的状态。

    • 但是客户端仍然不知道对象的保存位置。

  • 客户端在读写对象时,需要提供的是对象标识和存储池名称。

  • 客户端需要在存储池中读写对象时,需要客户端将对象名称、对象名称的 hash 码、存储池 中的 PG 数量和存储池名称作为输入信息提供给 ceph,然后由 CRUSH 计算出 PG 的 ID 以及 此 PG 针对的主 OSD 即可读写 OSD 中的对象。

  • 具体写操作如下:

  1. APP 向 ceph 客户端发送对某个对象的请求,此请求包含对象和存储池,然后 ceph 客户端 对访问的对象做 hash 计算,并根据此 hash 值计算出对象所在的 PG,完成对象从 Pool 至 PG 的映射。

    • 1.1 APP 访问 pool ID 和 object ID ( 如pool = pool1 and object-id = “name1”)

    • 1.2 ceph client对objectID做hash

    • 1.3 ceph client 对该 hash 值取 PG
      一个 pool 内部的所有PG总数的模,得到PG的编号(如32),(第2、3步基本保证了一个pool内部的所有PG将会被均衡的使用。)

    • 1.4 ceph client 对 pool ID 取 hash (比如“pool1” = 3)

    • 1.5 ceph client 将 pool ID 和 PG ID 组合在一起, (比如 3.23),得到完整的PG ID。

  2. 客户端据 PG、CRUSH 运行图和归置组(placement rules)作为输入参数并再次进行计算, 并计算出对象所在的 PG 内的主 OSD ,从而完成对象从 PG 到 OSD 的映射。

    • 2.1 Ceph client 从 MON获取最新的cluster map。
    • 2.2 Ceph client 根据上面1.2步骤算出该object所在PG的ID。
    • 2.3 Ceph client 在根据CRUSH算法计算出PG中目标主和备OSD的ID,即可对OSD上的数据进行直接的读写。
  3. 客户端开始对主 OSD 进行读写请求(副本池 IO),如果发生了写操作,会有 ceph 服务端完 成对象从主 OSD 到备份 OSD 的同步。

7 Ceph存储池的管理

存储池的管理通常保存创建、列出、重命名和删除等操作,管理工具使用 ceph osd pool 的 子命令及参数,比如 create/ls/rename/rm 等。
ceph 官方运维手册:http://docs.ceph.org.cn/rados/

7.1 创建存储池命令格式:

$ceph osd pool create <poolname> pg_num pgp_num {replicated|erasure}

7.2 列出存储池

$ ceph osd pool ls mypool
myrdb1
.rgw.root
default.rgw.control default.rgw.meta default.rgw.log cephfs-metadata cephfs-data

$ ceph osd 1 mypool lspools #带 pool ID
2 myrdb1
3 .rgw.root
4 default.rgw.control 5 default.rgw.meta
6 default.rgw.log
7 cephfs-metadata
8 cephfs-data

7.3 获取存储池的事件信息

$ ceph osd pool stats mypool pool mypool id 1
nothing is going on

7.4 重命名存储池

$ ceph osd pool rename old-name new-name 
$ ceph osd pool rename myrbd1 myrbd2

7.5 显示存储池的用量信息

$ rados df

image-20211008151625316

7.6 存储池的删除

如果把存储池删除会导致把存储池内的数据全部删除,因此 ceph 为了防止误删除存储池设 置了两个机制来防止误删除操作。

  • 第一个机制是 NODELETE 标志,需要设置为 false 但是默认就是 false 了
$ ceph osd pool create mypool2 32 32 pool 'mypool2' created #创建一个测试 pool
$ ceph osd pool get mypool2 nodelete nodelete: false
#如果设置为了 true 就表示不能删除,可以使用set指令重新设置为fasle 
$ ceph osd pool set mypool2 nodelete true 
set pool 9 nodelete to true
$ ceph osd pool set mypool2 nodelete false 
set pool 9 nodelete to false
$ ceph osd pool get mypool2 nodelete nodelete: false
  • 第二个机制是集群范围的配置参数 mon allow pool delete,默认值为 false,即监视器不允许 删除存储池,可以在特定场合使用 tell 指令临时设置为(true)允许删除,在删除指定的 pool 之后再重新设置为 false。
$ ceph tell mon.* injectargs --mon-allow-pool-delete=true 
mon.ceph-mon1: injectargs:mon_allow_pool_delete = 'true' 
mon.ceph-mon2: injectargs:mon_allow_pool_delete = 'true' 
mon.ceph-mon3: injectargs:mon_allow_pool_delete = 'true'
$ ceph osd pool rm mypool2 mypool2 --yes-i-really-really-mean-it pool 'mypool2' removed
$ ceph tell mon.* injectargs --mon-allow-pool-delete=false 
mon.ceph-mon1: injectargs:mon_allow_pool_delete = 'false' 
mon.ceph-mon2: injectargs:mon_allow_pool_delete = 'false' 
mon.ceph-mon3: injectargs:mon_allow_pool_delete = 'false

7.7 存储池的配额

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

$ ceph osd pool get-quota mypool
quotas for pool 'mypool':
max objects: N/A #默认不限制对象数量 
max bytes : N/A #默认不限制空间大小

$ ceph osd pool set-quota mypool max_objects 1000 #限制最大 1000 个对象 
set-quota max_objects = 1000 for pool mypool

$ ceph osd pool set-quota mypool max_objects 1000 #限制mypool存储池最多 1000 个对象
set-quota max_objects = 1000 for pool mypool 

$ ceph osd pool set-quota mypool max_bytes 10737418240 #限制最大 10737418240 字节
set-quota max_bytes = 10737418240 for pool mypool

$ ceph osd pool get-quota mypool 
quotas for pool 'mypool':
max objects: 1 k objects #最多 1000 对象 
max bytes : 10 GiB #最大 10G 空间

7.8 存储池可用参数

7.8.1 size:存储池中的对象副本数,默认一主两个备 3 副本。

$ ceph osd pool get mypool size
size: 3
$ ceph osd pool get mypool min_size 
min_size: 2
$ ceph osd pool ls detail   #列出详细信息
  • min_size:提供服务所需要的最小副本数,如果定义 size 为 3,min_size 也为 3,坏掉一个 OSD,如果 pool 池中有副本在此块 OSD 上面,那么此 pool 将不提供服务,如果将 min_size 定义为 2,那么还可以提供服务,如果提供为 1,表示只要有一块副本都提供服务。

7.8.2 pg_num:查看当前 PG 的数量

$ ceph osd pool get mypool pg_num pg_num: 32

7.8.3 crush_rule:设置 crush 算法规则

$ ceph osd pool get mypool crush_rule 
crush_rule: replicated_rule #默认为副本池

7.8.4 nodelete:控制是否可删除,默认可以

$ ceph osd pool get mypool nodelete nodelete: false

7.8.5 nopgchange:控制是否可更改存储池的 pg num 和 pgp num

$ ceph osd pool get mypool nopgchange
nopgchange: false

$ ceph osd pool set mypool pg_num 64 #修改指定 pool 的 pg 数量 set pool 1 pg_num to 64

7.8.6 nosizechange:控制是否可以更改存储池的大小

$ ceph osd pool get mypool nosizechange nosizechange: false #默认允许修改存储池大小

7.8.7 noscrub 和 nodeep-scrub:控制是否不进行轻量扫描或是否深层扫描存储池,可临时解决高 I/O 问题

$ ceph osd pool get mypool noscrub
noscrub: false #查看当前是否关闭轻量扫描数据,默认为不关闭,即开启
$ ceph osd pool set mypool noscrub true
set pool 1 noscrub to true #可以修改某个指定的 pool 的轻量级扫描测量为 true,即不执行 轻量级扫描
$ ceph osd pool get mypool noscrub
noscrub: true #再次查看就不进行轻量级扫描了
$ ceph osd pool get mypool nodeep-scrub
nodeep-scrub: false #查看当前是否关闭深度扫描数据,默认为不关闭,即开启
$ ceph osd pool set mypool nodeep-scrub true
set pool 1 nodeep-scrub to true #可以修改某个指定的 pool 的深度扫描测量为 true,即不执 行深度扫描
$ ceph osd pool get mypool nodeep-scrub nodeep-scrub: true #再次查看就不执行深度扫描了

7.8.9 scrub_min_interval:集群存储池的最小清理时间间隔,默认值没有设置,可以通过配置文件 中的 osd_scrub_min_interval 参数指定间隔时间。

$ ceph osd pool get mypool scrub_min_interval
Error ENOENT: option 'scrub_min_interval' is not set on pool 'mypool'

7.8.10 scrub_max_interval:整理存储池的最大清理时间间隔,默认值没有设置,可以通过配置文件 中的 osd_scrub_max_interval 参数指定。

$ ceph osd pool get mypool scrub_max_interval
Error ENOENT: option 'scrub_max_interval' is not set on pool 'mypool'

7.8.11 deep_scrub_interval:深层整理存储池的时间间隔,默认值没有设置,可以通过配置文件中 的 osd_deep_scrub_interval 参数指定。

$ ceph osd pool get mypool deep_scrub_interval
Error ENOENT: option 'deep_scrub_interval' is not set on pool 'mypool'

7.8.12 Ceph node 的默认配置

[root@ceph-node1 ~]# ll /var/run/ceph/ total 0
srwxr-xr-x 1 ceph ceph 0 Nov 3 12:22 ceph-osd.3.asok
srwxr-xr-x 1 ceph ceph 0 Nov 3 12:22 ceph-osd.6.asok
srwxr-xr-x 1 ceph ceph 0 Nov 3 12:23 ceph-osd.9.asok

[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_not_deep_scrubbed": "0", 
"mon_warn_not_scrubbed": "0", 
"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_deep_scrub_interval":"604800.000000",
"osd_op_queue_mclock_scrub_lim": "0.001000", 
"osd_op_queue_mclock_scrub_res": "0.000000", 
"osd_op_queue_mclock_scrub_wgt": "1.000000", 
"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": "24", 
"osd_scrub_end_week_day": "7", 
"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",

8. 数据压缩-生产环境不建议配置

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

8.1 启用压缩并指定压缩算法

$ ceph osd pool set <pool name> compression_algorithm snappy #默认算法为
snappy

snappy:该配置为指定压缩使用的算法默认为 sanppy,还有 none、zlib、lz4、zstd 和 snappy

等算法,zstd 压缩比好,但消耗 CPU,lz4 和 snappy 对 CPU 占用较低,不建议使用 zlib。

8.2 指定压缩模式

$ ceph osd pool set <pool name> compression_mode aggressive
  • aggressive:压缩的模式,有 none、aggressive、passive 和 force,默认 none。

  • none:从不压缩数据。

  • passive:除非写操作具有可压缩的提示集,否则不要压缩数据。

  • aggressive:压缩数据,除非写操作具有不可压缩的提示集。

  • force:无论如何都尝试压缩数据,即使客户端暗示数据不可压缩也会压缩,也就是在所有 情况下都使用压缩。

8.2.1 存储池压缩设置参数

  • compression_algorithm :压缩算法
  • compression_mode :压缩模式
  • compression_required_ratio :压缩后与压缩前的压缩比,默认为.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 #压缩后与压缩前的压缩比,默认为.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

到 node 节点验证:

~]# ceph daemon osd.11 config show | grep compression

image-20211008155204514

8.3 修改压缩算法

[ceph@ceph-deploy ~]$ ceph osd pool set mypool compression_algorithm snappy
set pool 2 compression_algorithm to snappy

[ceph@ceph-deploy ~]$ ceph osd pool get mypool compression_algorithm
compression_algorithm: snappy

8.4 修改压缩模式

[ceph@ceph-deploy ~]$ ceph osd pool set mypool compression_mode passive
set pool 2 compression_mode to passive
[ceph@ceph-deploy ~]$ ceph osd pool get mypool compression_mode
compression_mode: passive

9. 存储池快照-生产环境不建议配置

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

9.1.1 创建快照

$ ceph osd pool ls

#命令 1:ceph osd pool mksnap {pool-name} {snap-name} 
$ ceph osd pool mksnap mypool mypool-snap
created pool mypool snap mypool-snap

#命令 2: rados -p {pool-name} mksnap {snap-name} 
$ rados -p mypool mksnap mypool-snap2
created pool mypool snap mypool-snap2

9.2 验证快照

$ rados lssnap -p mypool
1 mypool-snap 2020.11.03 16:12:56
2 mypool-snap2 2020.11.03 16:13:40
2 snaps

9.3 快照回滚

测试上传文件后创建快照,然后删除文件再还原文件,基于对象还原。

rados rollback <obj-name> <snap-name> roll back object to snap <snap-name>
#上传文件
[ceph@ceph-deploy ceph-cluster]$ rados -p mypool put testfile /etc/hosts

#验证文件
[ceph@ceph-deploy ceph-cluster]$ rados -p mypool ls
msg1
testfile
my.conf

#创建快照
[ceph@ceph-deploy ceph-cluster]$ ceph osd pool mksnap mypool mypool-snapshot001 
created pool mypool snap mypool-snapshot001

#验证快照
[ceph@ceph-deploy ceph-cluster]$ rados lssnap -p mypool 
3 mypool-snap 2020.11.04 14:11:41
4 mypool-snap2 2020.11.04 14:11:49
5 mypool-conf-bak 2020.11.04 14:18:41
6 mypool-snapshot001 2020.11.04 14:38:50 
4 snaps

#删除文件
[ceph@ceph-deploy ceph-cluster]$ rados -p mypool rm testfile

#删除文件后,无法再次删除文件,提升文件不存在
[ceph@ceph-deploy ceph-cluster]$ rados -p mypool rm testfile 
error removing mypool>testfile: (2) No such file or directory

#通过快照还原某个文件
[ceph@ceph-deploy ceph-cluster]$ rados rollback -p mypool testfile mypool-snapshot001 
rolled back pool mypool to snapshot mypool-snapshot001

#再次执行删除就可以执行成功
[ceph@ceph-deploy ceph-cluster]$ rados -p mypool rm testfile

9.4 删除快照

ceph osd pool rmsnap <poolname> <snap>
[ceph@ceph-deploy ceph-cluster]$ rados lssnap -p mypool
3 mypool-snap 2020.11.04 14:11:41
4 mypool-snap2 2020.11.04 14:11:49
5 mypool-conf-bak 2020.11.04 14:18:41
6 mypool-snapshot001 2020.11.04 14:38:50
4 snaps

[ceph@ceph-deploy ceph-cluster]$ ceph osd pool rmsnap mypool mypool-snap 
removed pool mypool snap mypool-snap

[ceph@ceph-deploy ceph-cluster]$ rados lssnap -p mypool
4 mypool-snap2 2020.11.04 14:11:49
5 mypool-conf-bak 2020.11.04 14:18:41
6 mypool-snapshot001 2020.11.04 14:38:50
3 snaps

10. 集群报错解决

10.1 clock skew detected

时间状态不同步,如果时间漂移量过大,且无法通过时间同步解决,则可调整时间漂移窗口值

http://docs.ceph.org.cn/rados/configuration/mon-config-ref/

#在deploy节点上添加配置
$ cat ceph.conf
...
mon clock drift allowed = 3    #监视器默认允许的时间漂移量为0.05s,可调整为3s
mon clock drift warn backoff = 10 #时间偏移告警的退避指数,即连续多少次时间偏差后发出告警

#推送更新配置
$ ceph-deploy --overwrite-conf config push mon{0..3}

#在mon节点上同步时间
$ ntpdate time1.aliyun.com && hwclock -w
$ systemctl restart ceph-mon.target
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值