Ceph学习——Ceph网络通信机制与源码分析

本文深入探讨Ceph的网络通信设计,主要关注简单通信机制SimpleMessager,包括Message类、Connection、Pipe和Dispatcher的角色。Ceph通过Pipe的读写线程处理收发消息,Dispatcher负责消息分发。文章还详细分析了消息的发送和接收流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的通信机制

http://www.wzxue.com/ceph-network/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值