ceph rbd:nbd原理

前言

rbd是ceph提供的块存储服务。主要有几种使用场景:

  • map成块设备直接使用
  • 结合iSCSI使用
  • 结合OpenStack使用

map成块设备,主要有两种方式:

经过考察,发现RBD Kernel Module项目更新缓慢,其功能已经远远落后于librbd提供的功能。像striping、object map、exclusive lock等功能均不支持。

RBD-NBD方式,基于Network Block Device(nbd)实现,并且nbd已经经过了很长时间的实践,稳定性有所保证。对块设备的请求,由nbd间接调用librbd完成,可以支持最新的特性,是比较理想的方式。

下文将对rbd通过nbd进行读写和map的实现进行介绍。

nbd

nbd是一种起源于linux的轻量级块访问协议,可以让你将任何存储方式作为操作系统的块设备来使用。它主要分成两部分,server端和client端。client端位于linux内核。server端需要由你实现。

当我们对/dev/nbdx设备发起io操作时,会由内核中的nbd client封装成nbd请求通过tcp网络发送给对应的nbd server,server端解析请求,做出处理后,返回结果到nbd client端。

image.png

有关协议的内容和操作方式,见官方文档
注意,这里文档里称内核中的部分为server,我们实现的部分为client。

rbd-nbd

ceph社区为nbd实现了一个server,这个server会接收来自内核中nbd的请求,然后转调librdb完成请求,返回结果。

rbd对nbd的支持全部位于rbd-nbd.cc文件,大概1000行代码。

命令基本实现

  • 使用rbd-nbd map image-spec|snap-spec 命令将一个rbd镜像map到块设备,是fork出一个server进程,并为该server进程和内核client指定通信所用的socket fd。当然,还要为client设置timeout、block size、device size等等一些参数,以及一些flags。之后,server进程会运行两个线程,然后调用ioctl(nbd, NBD_DO_IT)进入阻塞状态,直到unmap过程中调用ioctl(nbd, NBD_DISCONNECT)。一个为读线程,接收来自client的请求,解析后放入一个pending队列,然后调用image.aio_write``image.aio_read``image.aio_flush等命令异步执行操作,在其完成后会调用提前注册的回调函数,将请求从pending队列转移到finish队列。另一个为写线程,finish队列为空时,写线程阻塞,当finish队列不为空时,写线程负责从finish队列中取出完成的请求,将结果返回给nbd client端。
  • 使用rbd-nbd unmap devpath命令进行unmap操作,其实只有两行代码: int nbd = open_device(devpath.c_str())ioctl(nbd, NBD_DISCONNECT)(NBD_DISCONNECT是nbd的协议原语之一)。
  • 使用rbd-nbd list-mapped命令查看所有map的nbd设备和rbd镜像的对应关系,其步骤是:从x=0开始遍历,通过/sys/block/nbd<x>/pid获取该nbd设备对应的server进程pid,然后通过/proc/<pid>/cmdline获取该进程启动时的命令(肯定是rbd-nbd map image-spec|snap-spec),通过解析cmdline来获得image、pool等信息。

一些要点

  • rbd-nbd server与client的通信是使用socketpair(AF_UNIX, SOCK_STREAM, 0, fd)产生fd进行的。client端通过fd[0]向server发送请求与接收结果。server端通过fd[1]接收client端发送的请求,并返回结果。
  • 通过nbd map的块设备只可能有两个cache,一个是内核中的块设备缓存,一个是librbd的缓存。nbd本身没有做缓存。
  • rbd-nbd会监控rbd image size的变化,发生变化时,会依次清空blk设备缓存ioctl(fd, BLKFLSBUF, NULL),设置新size到nbd clientioctl(fd, NBD_SET_SIZE, new_size),重新扫描分区表ioctl(fd, BLKRRPART, NULL),清空image缓存image.invalidate_cache()

写的不是很详细,有问题私戳我吧。。

参考

https://sourceforge.net/p/nbd/code/ci/master/tree/doc/proto.md
https://nbd.sourceforge.io/
https://github.com/ceph/ceph/blob/master/src/tools/rbd_nbd/rbd-nbd.cc

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容