基于ZeroMQ程序库的分布式存储系统

本文介绍了利用ZeroMQ构建的分布式存储系统,包括master和slave节点的设计,master节点维护slave节点负载信息和文件映射表,客户端通过master请求文件并直接与slave通讯。系统架构类似传统分布式文件系统,主从节点间的消息交互流程详细阐述,同时展示了关键函数的实现。目前,系统已完成基本通讯功能,代码将开源在GitHub上。
摘要由CSDN通过智能技术生成
1.前言

最近在学习ZeroMQ,并准备用ZeroMQ写个简单版的类TFS系统,该系统的主要消息通讯和数据的传输采用ZeroMQ,目前这个的框架基本完成,整体的框架很简单,初步已经完成了master和slave节点的开发,这个版本中,master节点主要包含了两类东西:1>Slave 节点的负载信息,2>文件到salve的映射表,设计思路很简单,而slave节点主要存储文件内容,客户端直接通过指定的端口向master节点发送文件请求(发送文件和接收文件),master节点收到客户端发来的请求后,根据请求的类型,返回指定的slave节点的地址,而后客户端即可跟相应的slave节点通讯,而master节点则会实时地发送心跳信息给slave节点以获取每个slave节点的负载情况,并实时更新负载列表。

2.架构

    本系统所采取的架构类似与传统的分布式文件系统架构,即分为了主节点和从节点,而主节点主要负责收集从节点的基本信息,并且也接收客户端发送的相关请求,架构图如下所示

    

3. 消息交互流程如下:

     

4. 所使用的一些基本结构定义

struct command_t
{
    command_t()
    {
        bzero(command,sizeof(command));
        bzero(filename,sizeof(filename));
        nsize = 0;
    }
    char  command[COMMAND_SIZE];
    char  filename[FILENAME_SIZE];
    size_t nsize;
};

struct file_t
{
    file_t()
    {
        bzero(filename,sizeof(filename));
        nsize = 0;
    }
    char filename[FILENAME_SIZE];
    size_t nsize;
};

struct context_t
{
    context_t()
    {
        context = NULL;
        sender = NULL;
    }
    void* context;
    void* sender;
    //char  server[FILENAME_SIZE];
};

enum responseType
{
    DIST_NONE = 1,
    DIST_GET,
    DIST_ADD,
    DIST_DELETE
};
struct response_t
{
    response_t()
    {
        type = DIST_NONE;
        bzero(server,sizeof(server));
        bzero(filename,sizeof(filename));
    }
    responseType type;
    char server[FILENAME_SIZE];
    char filename[FILENAME_SIZE];
};

struct request_t
{
    request_t()
    {
        type = DIST_NONE;
        bzero(filename,sizeof(filename));
    }
    responseType type;
    char filename[FILENAME_SIZE];
};

enum slaveType_t
{
    SLAVE_NONE = 0,
    SLAVE_ONLINE = 1,
    SLAVE_OFFLINE = 2,
    SLAVE_HEARTBEAT = 3
};
struct slave_t
{
    slave_t()
    {
        type = SLAVE_NONE;
        nsize = 0;
        bzero(server,sizeof(server));
    }
    slaveType_t type;
    size_t nsize;
    char server[FILENAME_SIZE];
};
struct msg_t
{
    msg_t()
    {
        nsize = 0;
        total_size = 0;
        bzero(buffer,sizeof(buffer));
        bzero(server,sizeof(buffer));
    }
    union
    {
        slaveType_t slaveType;
        responseType responType;
    };
    size_t nsize;
    size_t total_size;
    char buffer[BUFFER_SIZE];
    char server[BUFFER_SIZE];
};

5.封装的一些基本函数

   这部分主要是参考ZeroMQ手册上的一些基本函数,并稍作修改,使其支持任意类型结构传输 

std::set<std::string> serverList;
typedef std::set<std::string>::iterator serverList_iter;
std::map<std::string,std::string> fileMap;
typedef std::map<std::string,std::string>::iterator fileMap_iter;
std::map<int,std::string> ser
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值