【Ceph】Ceph通信模块messager使用实例(monitor模块)--01

本文深入介绍了Ceph中的网络通信模块messager,特别是针对monitor模块的使用。文章阐述了messager的基础知识,包括msg目录下相关的类如message、connection、messenger、dispatcher等,并详细讲解了它们的功能和作用。此外,还探讨了网络层的处理流程,如数据流向和线程模型,以及存在的问题和可能的重构方案。
摘要由CSDN通过智能技术生成

目录

基础知识

1.src/msg

1.1 相关的类

1.1 .1 message

1.1.2 connection

 1.1.3 messenger

1.1.4 dispatcher

1.1.5 Accepter 

1.1.6 Pipe

1.1.7 DispatchQueue

1.2 详细过程

实例

monitor 例子

《网络层的处理》--基础知识


引用:https://blog.csdn.net/zhq5515/article/details/49814941

基础知识

1.src/msg

msg是客户端和服务器间通信的底层模块,用来在客户端和服务器间发送和接收请求。

在src/msg 目录下:首先定义了一个网络通信的框架,完成通信接口和具体实现的分离,子目录Simple,Async,XIO分别是三种不同的实现方式。

simple:每一个网络连接都会创建两个线程,一个负责接收,一个负责发送。

Async模式:使用了基于事件的I/O多路复用模式。是目前网络通信中广泛采用的方式,但是在ceph中,还实验阶段??

XIO:使用了开源的网络通信库accelio来实现。实验阶段??

1.1 相关的类

1.1 .1 message

类Message: src/msg/Message.h  Message.cc

是所有消息的基类,任何要发送的消息都要继承该类。数据格式如图所示:

header user_data

footer

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)
 
  ...
};

在消息内容可以分成3个部分

  • header
  • user data
  • footer。

user data 当中可以分成3个部分

  • payload
  • middle
  • data

ceph_msg_header 是消息头,定义了消息传输相关的元数据;

ceph_msg_footer为消息的尾部,附加了一些crc校验数据和消息结束标记。

消息带的数据user data分别保存在payload,middle,data这三个bufferlist中。

payload一般保存ceph操作相关的元数据;

middle目前没有使用到;

data一般为读写的数据。

1.1.2 connection

src/msg/connection.h

是端(port)对端的socket的链接的封装。其最重要的接口是可以发送消息。

 1.1.3 messenger

是整个网络抽象模块,(架构上采用 Publish/subscribe(发布/订阅) 的设计模式),定义了网络模块的基本api接口。

该类作为消息的发布者, 各个 Dispatcher 子类作为消息的订阅者。Messenger 收到消息之后,通过 Pipe 读取消息,然后转给 Dispatcher 处理

SimpleMessenger 
Messenger 接口的实现

1.1.4 dispatcher

src/msg/dispatcher.h

dispatcher是消息分发的接口。

server端注册dispatcher类用于把接收到的message请求分发给具体处理的应用层;client需要实现一个dispatcher函数用于处理接收到的ACK应对消息。

dispatcher类是订阅者的基类,具体的订阅后端(Monitor, osd等)继承该类,初始化的时候通过 Messenger::add_dispatcher_tail/head 注册到 Messenger::dispatchers,(Messenger?)收到消息后,通知该类处理。(观察者模式?)Monitor, osd等都是继承自dispatcher。

1.1.5 Accepter 

监听 peer 的请求, 有新请求时, 调用 SimpleMessenger::add_accept_pipe() 创建新的 Pipe 到 SimpleMessenger::pipes 来处理该请求

1.1.6 Pipe

用于消息的读取和发送,该类主要有两个组件,Pipe::Reader 和 Pipe::Writer, 分别用来处理 消息的读取和发送. 这两个类都是 class Thread 的子类,意味着每次处理消息都会有两个线程被分别创建.

消息被 Pipe::Reader 读取后,该线程会通知 注册到 Messenger::dispatchers 中的某一个 Dispatcher(如 Monitor) 处理, 处理完成之后将回复的消息放到 SimpleMessenger::Pipe::out_q 中,供 Pipe::Writer 来处理发送

1.1.7 DispatchQueue

该类用来缓存收到的消息, 然后唤醒 DispatchQueue::dispatch_thread 线程找到后端的 Dispatch 处理消息。

1.2 详细过程

数据流向/流程分析:https://blog.51cto.com/wendashuai/2497104

实例

网络模块的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值