rbd-nbd分析

原理

rbd通过内核的NBD驱动映射成网络设备,用户可以通过读写nbd0…等网络设备,来实现对rbd设备的读写。

优点:

  • nbd设备成功将客户端和rbd隔离开,不再依赖以往的内核rbd驱动;
  • nbd与librbd的读写在应用层完成,可使用rbd cache提高性能;
  • rbd的数据保护,可通过ceph命令完成,不需要nbd支持。

缺点:

  • 要求系统必须支持nbd驱动;
  • 内核nbd与librbd通信,需要通过文件socket通信,增加数据拷贝,会影响性能;

架构

rbd-nbd_frame

  • 客户端直接读写nbd设备(同步)
  • 内核nbd驱动,将客户端的读写信息转化成nbd_request,并通过socket发送给NBDServer(rbd-nbd实现)
  • NBDServer是守护进程,一个快设备对应一个nbd设备,对应一个守护进程
  • NBDServer收到内核nbd驱动的nbd_reqeust后,向librbd发起同步读写请求
  • librbd 向 Ceph集群读写数据
  • NBDServer接收到librbd同步读写结果后,向内核nbd驱动发送reply
  • 内核nbd驱动收到reply,向客户端return

关键数据结构

Reqeust & Reply

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct nbd_request {
u32 magic;
u32 type; /* == READ || == WRITE */
char handle[8];
u64 from;
u32 len;
}
#ifdef __GNUC__
__attribute__ ((packed))
#endif
;

struct nbd_reply {
u32 magic;
u32 error; /* 0 = ok, else error */
char handle[8]; /* handle you got from reqeust */
};

参考&鸣谢