Thomas是本人在Ceph中国社区的笔名,该文同步发表在Ceph中国社区,现转载到本博客,方便大家查阅
本文由 Ceph中国社区-Thomas翻译,小猴子校稿 。
英文出处:Some Ceph experiments 欢迎加入 翻译小组
有时候,验证理论是有趣的,只是为了获得“哦,好!它像我们期望的那样工作”的快感。这也是今天我要与大家分享两个特别的标志:noout
和nodown
的原因。由于 Ceph 良好的设计,文章中描述的现象都已为大家所熟知,所以不要对我大声吼道:‘请告诉些我们不知道的!’,仅仅把本文看作是证明 Ceph 某些内部功能的一个练习吧:-)。
标志定义:
noout
:一个 OSD 被标记为out
表明该 OSD 可能还在运行但不再接受数据请求,因为它已经不属于 CRUSH Map(这与被标记为in
相反)。因此,这个选项用来阻止 OSDs 被标记为out
。nodown
:一个 OSD 被标记为down
表明该 OSD 不再响应伙伴 OSD 的心跳检查,因此其权重被设置为 0 并且不再接受数据请求,这将阻止客户端向其写入数据。然而需要注意的是该 OSD 仍然是 CRUSH Map 的一部分。使用nodown
选项后,会强制保持所有 OSD 的权重为 1(或者其他的值,但是 Ceph 一定不会改变该值)。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:它负责
副本 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
选项,它会是个完全不同的故事。
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。