Ceph 网络通信总体设计
作为一个分布式存储系统,Ceph自然需要一个稳定的网络通信模块,用于客户端和服务端,以及各个节点之间的消息通信。Ceph的网络模块位于源代码的ceph/src/msg 下,该模块构造了网络通信的基本框架。在文件夹下还包含了三种接口的实现:simple、async、xio。由于simple比较简单,也是目前生产环境中可以使用的,所以就只介绍它。
simple对于每一个连接,都会创建两个线程,其中一个用于监听和读取该终端的读事件,另一个用于写事件。读线程得到请求以后会解析网络流并开始构建消息,然后派发到后面的 Dispatcher。写线程在大部分时候会处于 Sleep 状态,直到有新的消息需要发送才会被唤醒。
Messenger是网络模块的核心数据结构,负责接收/发送消息。OSD主要有两个Messenger:ms_public处于与客户端的消息,ms_cluster处理与其它OSD的消息。
基础类介绍
Message
该类是消息的基类,所有要发送的消息都是继承自该类的,它由消息头(header)、数据(user_data)、结束标记(footer)构成。
打开 ceph/src/msg/Message.h
class Message : public RefCountedObject {
protected:
ceph_msg_header header; // headerelope
ceph_msg_footer footer;
bufferlist payload; // "front" unaligned blob
bufferlist middle; // "middle" unaligned blob
bufferlist data; // data payload (page-alignment will be preserved where possible)
...
...
...
类中封装了ceph_msg_header 、ceph_msg_footer 。他们就是信息头和信息结束标志的结构体。数据则是由三部分组成的,分别是playload(一般保存相关元数据)、middle(留用)、data(读写数据)。
ceph_msg_header 主要是封装数据相关信息
struct ceph_msg_header {
__le64 seq; /* message seq# for this session ## 当前session内 消息的唯一 序号*/
__le64 tid; /* transaction id ## 消息的全局唯一的 id*/
__le16 type; /* message type ## 消息类型 */
__le16 priority; /* priority. higher value == higher priority */
__le16 version; /* version of message encoding */
__le32 front_len; /* bytes in main payload ## payload 的长度*/
__le32 middle_len; /* bytes in middle payload ## middle 的长度*/
__le32 data_len; /* bytes of data payload ## data 的 长度 */
...
...
...
} __attribute__ ((packed));
ceph_msg_footer 主要是封装结束标记和CRC校验码
struct ceph_msg_footer {
__le32 front_crc, middle_crc, data_crc;//三个部分的 crc 效验码
__le64 sig; // 消息的64位 signature
__u8 flags; //结束标志
} __attribute__ ((packed));
Simple的通信机制
在