一个部署好的Ceph集群

我们在servera上使用Ansible部署Ceph。查看 /etc/ansible/hosts文件,我们看到,serverc、serverd、servere三个节点同时作为mons、osds、mgr角色。servera作为client。

Ceph实战大演练-存储池:Ceph学习系列9_java

查看部署好的Ceph集群:

Ceph实战大演练-存储池:Ceph学习系列9_java_02





整体目标

接下来,我们配置复制池。

  • 在部署于 serverc、serverd 和 servere 的集群上,创建一个名为 onhdd 的 CRUSH 规则,将基于 HDD 的 OSD 作为复制池的目标。

  • 创建一个名为 rbd 的复制池,其含有 16 个 PG 并且使用 onhdd CRUSH map 规则。将应用类型设置为 rbd,并将这个池中对象的副本数量设置为三。

  • 创建以下 CRUSH 层次结构。不要将任何 OSD 与这个新树关联。

    default-4-lab        (root bucket)
       DC01             (datacenter bucket)
           firstfloor   (room bucket)
               hostc    (host bucket)
           secondfloor  (room bucket)
               hostd    (host bucket)
  • 新建一个名为 ceph125 的纠删代码 profile。使用这个 profile 的池必须为每个对象设置两个数据区块和一个编码区块。

  • 使用新的 ceph125 profile,创建一个名为 testec 的纠删代码池。将它配置为使用 16 个 PG,并将其应用类型设置为 rgw。

  • 创建一个名为 client.fortestec 的用户,此用户可以在名为 testec 的池中 docs namespace 下存储和检索对象。此用户不得具有任何其他池或 namespace 的访问权限。将 client.fortestec keyring 文件复制到 servera 上的 /etc/ceph 目录。

  • 上传 /usr/share/dict/words 文件,作为名为 testec 的池中 docs namespace 下名为 report 的对象。

  • 更新 serverc、serverd 和 servere 集群的 OSD near-capacity 限值信息。将 full 比率设置为 90%,将 near-full 比率设置为 86%。

  • 将名为 rbd 的池的第一个 PG (ID: 0) 重新 map 到 OSD 0、3 和 6。





创建复制池

使用 ceph osd crush rule create-replicated 命令创建一条名为 onhdd 的新规则,将基于 HDD 的 OSD 作为复制池的目标。

ceph osd crush rule create-replicated onhdd default host hdd

创建一个名为 rbd 的复制池,其含有 16 个 PG 并且使用 onhdd CRUSH map 规则。将应用类型设置为 rbd,并将这个池中对象的副本数量设置为三。


新建一个名为 rbd 的复制池,其含有 16 个 PG 并且使用 onhdd CRUSH map 规则。将 rbd 设置为池的应用类型。

ceph osd pool create rbd 16 16 onhdd

查看rbd pool的详细信息。我们可以看到,这个pool中的pg数量为16,replicated size是2。

将池的副本数量增加到三,再验证新值。

ceph osd pool set rbd size 3

我们看到pool的replicated size已经变为3.

查看ceph集群的整体状态,目前Ceph集群中有一个pool,这个pool有16个pg。





创建CRUSH层次结构

创建以下 CRUSH 层次结构。不要将任何 OSD 与这个新树关联。

default-4-lab        (root bucket)
   DC01             (datacenter bucket)
       firstfloor   (room bucket)
           hostc    (host bucket)
       secondfloor  (room bucket)
           hostd    (host bucket)


使用 ceph osd crush add-bucket 命令创建 bucket。

[ceph@serverc ~]$ ceph osd crush add-bucket default-4-lab root
[ceph@serverc ~]$ ceph osd crush add-bucket DC01 datacenter
[ceph@serverc ~]$ ceph osd crush add-bucket firstfloor room
[ceph@serverc ~]$ ceph osd crush add-bucket hostc host
[ceph@serverc ~]$ ceph osd crush add-bucket secondfloor room

[ceph@serverc ~]$ ceph osd crush add-bucket hostd host


使用 ceph osd crush move 命令构建层次结构。

[ceph@serverc ~]$ ceph osd crush move DC01 root=default-4-lab
[ceph@serverc ~]$ ceph osd crush move firstfloor datacenter=DC01
[ceph@serverc ~]$ ceph osd crush move hostc room=firstfloor
[ceph@serverc ~]$ ceph osd crush move secondfloor datacenter=DC01
[ceph@serverc ~]$ ceph osd crush move hostd room=secondfloor

显示 CRUSH map 树,以验证新的层次结构。

$ceph osd crsh tree



创建用纠删码池

新建一个名为 ceph125 的纠删代码 profile。使用这个 profile 的池必须为每个对象设置两个数据区块和一个编码区块。

使用 ceph osd erasure-code-profile set 命令,新建一个名为 ceph125 的纠删代码 profile。

ceph osd erasure-code-profile set ceph125 k=2 m=1

并使用 ceph osd erasure-code-profile get 命令,验证新的纠删代码 profile 参数。

使用 ceph125 profile,创建一个名为 testec 的纠删代码池,将 rgw 设置为池的应用类型。

$ceph osd pool create testec 16 16 erasure ceph125
$ceph osd pool application enable testec rgw


列出新的池参数。

Ceph实战大演练-存储池:Ceph学习系列9_java_03

创建一个名为 client.fortestec 的用户,此用户可以在名为 testec 的池中 docs namespace 下存储和检索对象。此用户应当无权访问任何其他池或 namespace。





创建用户

创建一个名为 client.fortestec 的用户,该用户在池 testec 的 namespace docs 中具有读写功能。将关联的 keyring 文件保存为 /etc/ceph/ceph.client.fortestec.keyring,将用户的 keyring 文件复制到 servera。

$ceph auth get-or-create client.fortestec mon 'allow r'  osd 'allow rw pool=testec namespace=docs'  -o /etc/ceph/ceph.client.fortestec.keyring

$scp /etc/ceph/ceph.client.fortestec.keyring servera:/etc/ceph/

Ceph实战大演练-存储池:Ceph学习系列9_java_04

以 ceph 用户身份登录 servera,并尝试存储和检索对象来验证您的工作。完成后,删除这个对象。

[ceph@serverc ~]$ ssh ceph@servera
ceph@servera's password: redhat
[ceph@servera ~]$ rados --id fortestec -p testec -N docs \
> put testdoc /etc/services
[ceph@servera ~]$ rados --id fortestec -p testec -N docs get testdoc /tmp/test

[ceph@servera ~]$ diff /etc/services /tmp/test

上面命令的对比结果,两个文件没有区别。


使用 rados 命令上传 /usr/share/dict/words 文件,作为 testec 池中 docs namespace 下的 report 对象,并进行确认。

$rados --id fortestec -p testec -N docs put report /usr/share/dict/words

$rados --id fortestec -p testec -N docs stat report

Ceph实战大演练-存储池:Ceph学习系列9_java_05





设置存储池的限值比率

更新 serverc、serverd 和 servere 集群的 OSD near-capacity 限值信息。将 full 比率设置为 90%,将 near-full 比率设置为 86%。

[object Object]

Ceph实战大演练-存储池:Ceph学习系列9_java_06

使用 ceph osd dump 命令打印 OSD map,并验证这两个参数的新值。





设置客户端兼容性和OSD map

将最低客户端兼容性设置为 luminous。

 ceph osd set-require-min-compat-client luminous

检索完整 PG ID 以重新 map。记住 PG ID 中的第一个数字是池 ID:poolID.ID。因此,您首先需要检索名为 rbd 的池的 ID。显示 ID 为 1.0 的 PG 的 map,其中 1 是 rbd 池 ID。

Ceph实战大演练-存储池:Ceph学习系列9_java_07

使用 pg-unmap 功能将 PG 1.0 map 到 OSD 0、3 和 6。也就是,从上一命令

的输出中,将 OSD 8 重新 map 到 OSD 6。OSD 0 和 3 已经设置。

ceph osd pg-upmap-items 1.0 8 6

Ceph实战大演练-存储池:Ceph学习系列9_java_08





和存储池相关的信息查看

查看存储池使用率

Ceph实战大演练-存储池:Ceph学习系列9_java_09

为存储池拍摄快照,并利用以下命令来检索并回滚到特定的快照:

ceph osd pool mksnap rbd rbd-snapshot1
rados -p rbd rollback object-name rbd-snapshot1

Ceph实战大演练-存储池:Ceph学习系列9_java_10

查看新能数据:

$ceph osd pool stats

Ceph实战大演练-存储池:Ceph学习系列9_java_11

Ceph实战大演练-存储池:Ceph学习系列9_java_12