有关Ceph的一些使用经验

Thomas是本人在Ceph中国社区的笔名,该文同步发表在Ceph中国社区,现转载到本博客,方便大家查阅

本文由 Ceph中国社区-Thomas翻译,小猴子校稿 。

英文出处:Some Ceph experiments 欢迎加入 翻译小组

有关Ceph的一些使用经验_第1张图片

有时候,验证理论是有趣的,只是为了获得“哦,好!它像我们期望的那样工作”的快感。这也是今天我要与大家分享两个特别的标志:nooutnodown的原因。由于 Ceph 良好的设计,文章中描述的现象都已为大家所熟知,所以不要对我大声吼道:‘请告诉些我们不知道的!’,仅仅把本文看作是证明 Ceph 某些内部功能的一个练习吧:-)。

I. 它们的作用?

标志定义:

  • noout:一个 OSD 被标记为out表明该 OSD 可能还在运行但不再接受数据请求,因为它已经不属于 CRUSH Map(这与被标记为in相反)。因此,这个选项用来阻止 OSDs 被标记为out
  • nodown:一个 OSD 被标记为down表明该 OSD 不再响应伙伴 OSD 的心跳检查,因此其权重被设置为 0 并且不再接受数据请求,这将阻止客户端向其写入数据。然而需要注意的是该 OSD 仍然是 CRUSH Map 的一部分。使用nodown选项后,会强制保持所有 OSD 的权重为 1(或者其他的值,但是 Ceph 一定不会改变该值)。

II. 试验

II.1. 在运行集群上设置noout

查看 PG 的行为是有趣的。一个编号为 3.4 的 PG 示例如下:

$ ceph pg dump | egrep ^3.4
3.4 0 0 0 0 0 0 0 active+clean  2013-03-27 18:20:33.847308  0'0 57'10 [1,4] [1,4] 0'0 2013-03-27 18:20:33.847246  0'0 2013-03-27 18:20:33.847246

可以看到编号为 3.4 的 PG 的主 OSD 是osd.1,因为active是 [1,4] ,其中第一个 OSD 便是主 OSD。

然后设置noout标记:

$ ceph osd set noout
set noout 

从命令行界面你会得到通知:

$ ceph -s
    health HEALTH_WARN noout flag(s) set
    monmap e3: 3 mons at {0=192.168.252.10:6789/0,1=192.168.252.11:6789/0,2=192.168.252.12:6789/0}, election epoch 14, quorum 0,1,2 0,1,2
    osdmap e63: 6 osds: 6 up, 6 in
    pgmap v285: 200 pgs: 200 active+clean; 20480 KB data, 391 MB used, 23452 MB / 23844 MB avail
    mdsmap e1: 0/0/1 up

回想一下,基于不同的对象,OSD 可能处于不同的状态:

  • 主 OSD:它负责

    • 拷贝副本到副本 OSDs
    • 数据再平衡
    • 故障恢复
    • 数据一致性(scrubbing 操作)
  • 副本 OSD:

    • 作为主 OSD 从属并接受来自主 OSD 的请求

然后停止主 OSD:

$ sudo service ceph stop osd.1
$ ceph pg dump | egrep ^3.4
3.4 0 0 0 0 20971520  595 595 active+degraded 2013-03-27 18:29:52.215491  61'5  60'20 [4] [4] 0'0 2013-03-27 18:20:33.847246  0'0 2013-03-27 18:20:33.847246

现在只有 OSD 4 是活动的并且成为了该 PG 的主 OSD,它会接受所有的 IO 操作。在正常情况下(因为初始化脚本就是这么做的),OSD 会自动被标记为 out 。然后选出一个新的副本 OSD 。

创建一个对象并通过 RADOS 写入 Ceph 集群:

$ dd if=/dev/zero of=seb bs=10M count=2
2+0 records in
2+0 records out
20971520 bytes (21 MB) copied, 0.0386746 s, 542 MB/s

$ sync

$ rados put seb seb

是的,正如期望的那样,数据写到了 osd.4 中:

$ sudo ls /var/lib/ceph/osd/osd.4/current/3.4_head/seb__head_3E715054__3

很显然,你不会在之前的主 OSD(1)上找到任何信息。当然,pg dump 证明只有一个对象(第二个字段):

$ ceph pg dump | egrep ^3.4
3.4 1 0 1 0 20971520  595 595 active+degraded 2013-03-27 18:29:52.215491  61'5  60'20 [4] [4] 0'0 2013-03-27 18:20:33.847246  0'0 2013-03-27 18:20:33.847246

现在,我们重启 OSD 进程并且重置noout值:

$ sudo service ceph start osd.1

$ ceph osd unset noout
unset noout

OSD 1 重新被提升为主 OSD,而 OSD 4 变成副本 OSD, 同时对象从 osd.4 拷贝到 osd.1。pg dump可以证实这一情况:

$ ceph pg dump | egrep ^3.4
3.4 1 0 0 0 20971520  595 595 active+clean  2013-03-27 18:41:50.970358  61'5  62'20 [1,4] [1,4] 0'0 2013-03-27 18:20:33.847246  0'0 2013-03-27 18:20:33.847246

停下来思考下,那好,我们从这个练习中学到了什么?你可能已经猜到了,这个选项是运维时的一个理想选择。是的,对象副本数无法满足但只是一个临时过程,这也正是 Ceph 具有的灵活性。现在让我们转到nodown选项,它会是个完全不同的故事。

II.2. 在运行集群中设置nodown

设置标志:

$ ceph osd set nodown
set nodown

$ ceph -s
health HEALTH_WARN nodown flag(s) set
monmap e3: 3 mons at {0=192.168.252.10:6789/0,1=192.168.252.11:6789/0,2=192.168.252.12:6789/0}, election epoch 14, quorum 0,1,2 0,1,2
osdmap e66: 6 osds: 6 up, 6 in
pgmap v294: 200 pgs: 200 active+clean; 20480 KB data, 395 MB used, 23448 MB / 23844 MB avail
mdsmap e1: 0/0/1 up

创建一个对象并通过 RADOS 写入 Ceph 集群:

$ dd if=/dev/zero of=baba bs=10M count=2
2+0 records in
2+0 records out
20971520 bytes (21 MB) copied, 0.0428323 s, 490 MB/s

$ sync

$ rados put baba baba

喔!!!Ceph 集群挂起了,挂起了, 挂起了…!!!

仅仅因为这样那样的同步及写请求的原子性得不到满足。或者主 OSD 或者副本 OSD 仍然保持权重使得它能够接受客户端数据。

最后你会看到如下的告警日志:

osd.4 [WRN] 1 slow requests, 1 included below; oldest blocked for > 30.211296 secs
osd.4 [WRN] slow request 30.211296 seconds old, received at 2013-03-27 19:01:58.127010: osd_op(client.4757.0:1 baba [writefull 0~4194304] 3.f9c3dd2e) v4 currently waiting for subops from [1]
osd.4 [WRN] 1 slow requests, 1 included below; oldest blocked for > 60.235452 secs
osd.4 [WRN] slow request 60.235452 seconds old, received at 2013-03-27 19:01:58.127010: osd_op(client.4757.0:1 baba [writefull 0~4194304] 3.f9c3dd2e) v4 currently waiting for subops from [1]

这是正常的因为 OSD 挂掉了却显示还活着,因此客户端尝试向它写入数据…

然而,有趣的是,条带模式很容易被发现。在这里,主 OSD 是 osd.4,所以第一个 4M 写入时是 ok 的:

-rw-r--r--  1 root root 4.0M Mar 27 19:10 baba__head_F9C3DD2E__3

从这里,能很容易的确定对象是如何写入的。Ceph 按照 4M 的块写入,看看下面的过程:

--> first 4M osd.primary journal --> osd.primary --> osd.secondary journal --> osd.secondary --> second 4M osd.primary journal --> osd.primary --> and so on...

下面的命令将会按 8M 的块写入:

$ rados -b 8388608 put baba baba

停下来想想,那好,我们从这个练习中学到了什么?恩,也许我遗漏了某些东西,如果有 Inktank 的同事在身边,我会很开心的想要了解这个选项背后的想法,因为我还未能想到一个合适的场景来使用这个选项。

结论:

我希望你能从这些练习中得到快乐(学到东西)。这篇文章的中心点是通过使用noout选项,使你能很容易的在降级模式下进行操作。更有深度的技术文档请看 Ceph documentation。

你可能感兴趣的:(Ceph)