Ceph开发每周谈Vol 7

2016年01月 · 麦子迈

这是Ceph开发每周谈的第七篇文章,记录从16年1月18号到16年1月24号的社区开发情况。笔者从前年开始做Ceph的技术模块分析到今年中告一段落,想必有挺多人期待下一篇Ceph技术分析。考虑到Ceph的发展已经从前年的一穷二白到现在的如火如荼,但对于社区的方向和实况仍有所脱节,笔者考虑开始Ceph开发每周谈这个系列。每篇文章都会综述上周技术更新,围绕几个热点进行深度解析,如果正好有产业届新闻的话就进行解读,最后有读者反馈问题的话并且值得一聊的话,就附上答疑部分。

上周综述

上周,主要围绕 C++11 带来的 Move 特性进行了一些模块的修改,避免 Copy Structure。另外,C++11 的 chrono 时间库也被用来替换已有的 utime_t 体系。

Weighted Priority Queue

Weighted Priority Queue 是由 Robert LeBlanc 发起的对于已有的 PriorityQueue 的修改,PriorityQueue 是位于 Messenger 和 PG Worker 之间的队列,主要用来维护消息的优先级调度,比如客户端 IO 消息会优先出队列被处理,副本写成功回复的优先级也非常高。目前已有的算法是采用令牌向量实现,为每个客户端和每个消息作了一个 cost 控制,避免存在消息”饿死”情况。目前的主要问题是当某个 OSD 性能非常差时,可能会导致前端 IO 好几倍的延迟。因为 OSD 的副本写请求优先级是高于直接给这个 OSD 发起的主请求,因此当客户端队列深度足够的时候,有可能来自其它 OSD 的写请求会淹没这个 OSD 的处理能力,导致该 OSD 无法处理发给它的 IO 消息。

因此 Robert 实现了基于权重的队列算法,这个实现最大区别就是大大降低的高优先级消息在出队列的优势,使得低优先消息仍有机会被处理。

OSD 启动信息与系统盘的隔离

目前 OSD 虽然使用了一块独立的硬盘作为 OSD 的数据或者日志的存储位置,但是仍然依赖于系统的一些 udev,ceph.conf 来启动。因此,当系统盘坏掉时,虽然仍能够启动,但是之前 OSD 的一些设置可能会丢失,造成一些不便。同时,在新的 ceph-disk 设计中,/var/lib/ceph/osd/ceph-*/ 中的元数据文件会留在系统盘文件系统上,外部数据盘会使用符号链接的形式进行引用,这样有利于 OSD 的分区,journal 等信息的归一化,使得部署工具和服务管理需要操心的配置大大减少,但是这样也使得存在系统盘的文件存在丢失可能。

因此,未来 Ceph 可能会将启动信息也写到数据盘上,这样使得 OSD 数据盘可以在任意节点上挂载然后启动,并不依赖操作系统环境,这些信息包括配置,目标盘,fsid 等信息。