Ceph 开发者月报 2019-05

ceph周报logo5月

 

本期看点:

在 async recovery 之后,本期合并的 partial recovery 标志着 Ceph的故障恢复对正常 IO 影响将进一步减少,再期待一下 recovery QoS,最终会解决recovery一直受人诟病的问题。

osd: partial recovery strategy based on PGLog #21722 (https://github.com/ceph/ceph/pull/21722)

 

本篇为 2019 年度《Ceph 开发者月报》专栏的第五篇,在《Ceph 开发者月报》中,我们 UMCloud 存储团队将以月度为单位,为大家分享当月 Ceph 社区的有趣的提交和重要的变更,方便大家即刻掌握一手 Ceph 社区开发资料。

每篇将以对象存储、块存储、文件存储、统一存储层、集群管理、基础库等模块组织,为大家一一介绍。

 

对象存储

radosgw-admin 新增两条命令列出和删除旧的逾期对象

rgw: object expirer fixes #27870 (https://github.com/ceph/ceph/pull/27870)

关于 RGW 的一个 bug fix 和 workround.

之前 bucket 的分片会导致 Swift 对象逾期删除功能失效,对象在磁盘上不会被自动删除,上面 PR 修复了这个问题,并且加入两个 radosgw-admin 的命令,可以管理在之前版本的 RGW 中 自动分片后可能留下的旧的逾期对象。

命令如下:

# 列出之前版本RGW中自动分片后留下的旧的逾期对象
radosgw-admin objects expire-stale list --bucket {bucketname}    
# 删除之前版本RGW中自动分片后留下的旧的逾期对象
radosgw-admin objects expire-stale rm --bucket {bucketname}

 

块存储

1、优化 librbd 提升 IOPS 和提升 CPU 使用效率

librbd: tweaks to increase IOPS and reduce CPU usage #28044 (https://github.com/ceph/ceph/pull/28044)

主要通过以下方法提升:

  • 对于 hot IO 路径上简单的 small requests 使用新增的轻量级 object striper 来避免堆分配
  • librbd 是以 object buffer extent 为单位进行缓存的,对于单个 object buffer extent 的读写,不会分配新的 bufferlist

用零拷贝提升 CPU 效率:

librbd: support zero-copy writes via the C API #27895 (https://github.com/ceph/ceph/pull/27895)

 

2、librbd 复制稀疏镜像时,可以保持新镜像的稀疏性

意味着,新镜像占用的空间是实际使用的空间,而非整个镜像的大小。

librbd: clone copy-on-write operations should preserve sparseness #27999 (https://github.com/ceph/ceph/pull/27999)

 

文件存储

1、cephfs-shell 添加 quota 命令,可以无需挂载就可以直接设置目录的配额属性

cephfs-shell: add quota management #27483 (https://github.com/ceph/ceph/pull/27483)

使用如下:

cephfs-shell quota get dir
cephfs-shell quota set {--max_files MAX_FILES} {--max_bytes MAX_BYTES} dir

 

2、cephfs-shell 添加 stat 命令显示文件或文件系统状态

cephfs-shell: Add stat command #27753 (https://github.com/ceph/ceph/pull/27753)

使用如下:

cephfs-shell stat <file_name>
3、新增 cephfs subvolume 模块用于管理 CephFS subvolumes
pybind/mgr: add cephfs subvolumes module #27594 (https://github.com/ceph/ceph/pull/27594)

subvolume 可以看做是一个 cephfs volume 的子目录,可以设定配额限制、单独的 RADOS 名称空间(存储池内对象的逻辑分组,用户对存储池的读写可以仅在命名空间内进行)、唯一的 cephx 用户。

上面的 PR 在 mgr 里新加了一个管理 subvolume 的模块。新增命令:

# 可以在创建 subvolume 时指定创建在一个 subvolume group 里 (subvolume 的父目录)
ceph fs subvolume create <myvol> <mysubvol> <size> <group>
ceph fs subvolume rm <myvol> <mysubvol> <group>

ceph fs subvolumegroup create
ceph fs subvolumegroup rm

# 获得 subvolume 路径: {prefix}/{group_id}/{subvolume_id}
ceph fs subvolume getpath

# subvolume group snapshots 的创建和删除
ceph fs subvolumegroup snapshot create
ceph fs subvolumegroup snapshot rm 

# subvolume snapshots 的创建和删除
ceph fs subvolume snapshot create
ceph fs subvolume snapshot rm

 

统一存储层

1、支持部分对象的增量恢复以提升 recovery 的速度

osd: partial recovery strategy based on PGLog #21722 (https://github.com/ceph/ceph/pull/21722)

pg 的每个操作都记录在 pg log 里,因此可以用 pg log 来计算 missing set 来恢复数据。

如果 pg log 有对象被修改的记录,无论被修改多少,会让整个对象从一个 OSD 恢复到另一个 OSD。例如一个 4M 对象,修改了 4k 的内容,也会恢复整个 4M 对象而不是修改后的 4k 内容,造成了极大的带宽和磁盘性能的浪费和损耗,严重影响了恢复的效率。

在上面的 PR 中,为了解决这些问题,社区引入了 partial recovery 机制,会根据对象被修改的位置和 object_map 来支持对象的部分恢复,以提升恢复的速度。

 

2、基于 seastar 重构 OSD 的工作推进

More PeeringState and related cleanups to ease use in crimson #28048 (https://github.com/ceph/ceph/pull/28048)

crimson: add support for basic write path #27873 (https://github.com/ceph/ceph/pull/27873)

crimson: support pgnls and delete op #28079 (https://github.com/ceph/ceph/pull/28079/)

 

集群管理

1、mgr/zabbix 可以周期性搜集存储池和 OSD 相关监控数据

mgr/zabbix Added pools discovery and per-pool statistics #26152 (https://github.com/ceph/ceph/pull/26152)

可以收集特定存储池和 OSD 的监控数据,例如存储池使用情况、存储池读写带宽、OSD 状态等信息。

也可以手动用命令给 zabbix 发送这些监控数据:

ceph zabbix discovery

 

2、在 dashboard 新增配置 scrub 相关的配置

mgr/dashboard: PG scrub configuration #27072 (https://github.com/ceph/ceph/pull/27072)

 

3、支持在 dashboard 上调低存储池的 pg_num

mgr/dashboard: Allow the decrease of pg’s of an existing pool #27785 (https://github.com/ceph/ceph/pull/27785)

 

4、mgr/restful 新增获取 perf counter 的 API

restful: Expose perf counters #27885 (https://github.com/ceph/ceph/pull/27885)

 

 

基础工具集

ceph -s 可以看到存储池的 no[deep]-scrub flag 了

mon: show no[deep-]scrub flags per pool in the status #26488 (https://github.com/ceph/ceph/pull/26488)

$> ./bin/ceph -s
  cluster:
    id:     e8f8a0a9-75d9-4097-a9db-9b56044d1d14
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum a (age 26s)
    mgr: x(active, since 13m)
    osd: 3 osds: 3 up (since 12m), 3 in (since 12m)

  data:
    pools:   2 pools, 140 pgs
    objects: 0 objects, 0 B
    usage:   3.2 GiB used, 27 GiB / 30 GiB avail
    pgs:     140 active+clean

  notes:
    pool rbd has noscrub flag
    pool rbd has nodeep-scrub flag
    pool mypool has nodeep-scrub flag

 

本月提交情况

发表评论

电子邮件地址不会被公开。 必填项已用*标注