基于Golong的分布式存储开发

一、分布式存储的主要组成部分

1>KSERVER: 与应用服务器就近部署,用于文件调度、后台同步、定时服务等。
2>KNODE: 文件的上传下载、存储集群的代理。

3>kserver定时向所有knode发送心跳请求,knode在响应时将自身的状态上报给kserver。如果请求时被拒绝或超时没有收到响应,kserver认为knode处于异常状态,将该knode状态改为不可用,不提供文件上传下载服务,直到心跳请求正常为止。
4>Knode能感知底层文件系统的工作状态,当底层文件系统异常时,knode拒绝响应心跳请求。

二、存储服务模块(KDFS)

1>KServer:用户接口服务层,实现后端服务节点的路由功能
2>KNode:对底层的混合存储提供了统一抽象和访问接口
3>KPlugin:提供文件预览、缩略图,快照,打包下载等功能
4>KSearch:提供全文检索服务
5>KSync:不同数据节点同步,实现跨 IDC 数据同步

三、文件同步

      文件同步由kserver发起。Kserver启动完成以后,会有文件同步的守护进程处理待同步的文件,检查目标节点和源节点的状态,如果都正常,就将文件信息发送为目标节点。目标节点根据文件信息从源节点下载文件,完成后上报kserver,并开始新一轮同步。目标节点下载失败也会上报kserver。Kserver会重试一次,如果仍然失败,kserver会记录这个文件,并跳过。

四、插件

1>插件是为满足用户使用文件时提出的功能要求的集合。包括图片缩略、office文档转pdf、pdf转图片和批量文件打包压缩。插件可以独立运行,但是依赖Knode里的文件。
2>容器化:基于docker的容器化部署,解决文件处理需要的大量依赖问题
3>可扩展性: 插件服务去单点化,可以很好的进行水平扩展

五、文件分块上传


基于Golong的分布式存储开发
文件系统最重要的功能点,文件的就近上传,分块上传以及断点续传的功能实现
   
 1.就近上传
      Kserver内置ip定位数据库,客户端上传或下载时首先请求kserver,kserver根据参数
      client_ip确定客户端的地理位置,然后根据规则返回最近的可用的knode节点接口。

 2.分块上传
      KDFS支持分块上传,除了最后一块,用户上传的文件块大小必须为4M。文件块上传到knode后,会被缓存到临时目录。用户按顺序上传16块后,knode将这16个文件块合并后持久化到存储系统。

      两步上传文件,支持断点续传,秒传
    第一步是请求上传,应用向云盘发起上传请求,云盘向KServer查询最优上传节点的地址、事务ID和待上传的文件块编号(number)等信息;
    第二步是向节点分块上传文件(整个文件可以为一块),并返回该文件块的MD5值用于校验。KNode按一定策略向
 存储系统持久化文件(例如达到64M持久化一次)。所有文件块上传并持久化完成后将信息写入KServer中,并通知Knode,KNode通过回调将文件信息返回给云盘。上传完成。

六、插件的交互机制

       文件的扩展处理,例如文件的预览,缩略图,快照,打包下载都是属于插件机制,而插件是依托于文件本身来实现的,所以每个KNODE的节点上都有自身的KPLUGIN,这样才能够更好地服务于文件本身,提供增值的服务

文件的插件实现也是分成两步走:
   第一步:查询最佳的文件节点,先通过KSERVER获取到合适的KNODE
   第二步:从第一步获取到的地址中直接请求响应的插件服务