分布式文件系统fastDFS

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式文件系统fastDFS相关的知识,希望对你有一定的参考价值。

分布式文件系统fastDFS

 

1、什么是FastDFS

FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务,如相册网站、视频网站等等。在UC基于FastDFS开发向用户提供了:网盘,社区,广告和应用下载等业务的存储服务。

 

2、FastDFS架构和原理

FastDFS服务端有三个角色:跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)。

tracker server:跟踪服务器,主要做调度工作,起负载均衡的作用。在内存中记录集群中所有存储组和存储服务器的状态信息,是客户端和数据服务器交互的枢纽。相比GFS中的master更为精简,不记录文件索引信息,占用的内存量很少。

storage server:存储服务器(又称:存储节点或数据服务器),文件和文件属性(meta data)都保存到存储服务器上。Storage server直接利用OS的文件系统调用管理文件。

client:客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。

技术分享

 

Tracker相当于FastDFS的大脑,不论是上传还是下载都是通过tracker来分配资源;客户端一般可以使用ngnix等静态服务器来调用或者做一部分的缓存;存储服务器内部分为卷(或者叫做组),卷于卷之间是平行的关系,可以根据资源的时候情况随时增加,卷内服务器文件相互同步备份,以达到容灾的目的

 

上传机制

首先客户端请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求上传文件,存储服务器接收到请求后,生产文件file_id并且将文件内容写入磁盘返回给客户端file_id和路径信息、文件名,客户端保存相关信息上传完毕

技术分享

下载机制

客户端带上文件名信息请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求下载文件,存储服务器接收到请求后返回文件给客户端。

 技术分享

 

3、如何搭建fastDFS

请参考以下文章

FastDFS + nginx 反向代理缓存 安装与配置

地址:http://www.linux178.com/storage/fastdfs-nginx-cache.html

 

4、使用java调用fastDFS

以下代码是一个spring mvc中一个完整的上传请求

    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    @ResponseBody
    public Object upload(@RequestParam MultipartFile file) {
        UploadResponse res = new UploadResponse();
        try {
            if(file.isEmpty()){
                res.setRet_code(UserCodeEnum.ERR_FILE_NULL.getCode());
                res.setRet_msg(UserCodeEnum.ERR_FILE_NULL.getDesc());
            }else{
                logger.info("UserController-upload-request-file=" + file.getOriginalFilename());
                
                String tempFileName = file.getOriginalFilename();
                //fastDFS方式
                ClassPathResource cpr = new ClassPathResource("fdfs_client.conf");
                ClientGlobal.init(cpr.getClassLoader().getResource("fdfs_client.conf").getPath());
                byte[] fileBuff = file.getBytes();
                String fileId = "";
                String fileExtName = tempFileName.substring(tempFileName.lastIndexOf("."));
                
                //建立连接
                TrackerClient tracker = new TrackerClient();
                TrackerServer trackerServer = tracker.getConnection();
                StorageServer storageServer = null;
                StorageClient1 client = new StorageClient1(trackerServer, storageServer);
                
                //设置元信息
                NameValuePair[] metaList = new NameValuePair[3];
                metaList[0] = new NameValuePair("fileName", tempFileName);
                metaList[1] = new NameValuePair("fileExtName", fileExtName);
                metaList[2] = new NameValuePair("fileLength", String.valueOf(file.getSize()));
                
                //上传文件
                fileId = client.upload_file1(fileBuff, fileExtName, metaList);
                
                res.setHead_img(UserConstants.FILE_IMG_URL+fileId);
                
                res.setRet_code(UserCodeEnum.SUCCESS.getCode());
                res.setRet_msg(UserCodeEnum.SUCCESS.getDesc());
            }
            
            logger.info("UserController-upload-response-" + JsonUtils.o2j(res));
        } catch (Exception e) {
            res.setRet_code(UserCodeEnum.ERR_UNKNOWN.getCode());
            res.setRet_msg(UserCodeEnum.ERR_UNKNOWN.getDesc());
            logger.error("UserController-upload-error", e);
        }
        return res;
    }

fastDFS java客户端配置文件fdfs_client.conf配置如下:

connect_timeout = 30
network_timeout = 60
charset = ISO8859-1
http.tracker_http_port = 8090
http.anti_steal_token = no
http.secret_key = 123456

tracker_server = 192.168.11.***:22122

 

参考:

http://blog.chinaunix.net/uid-20196318-id-4058561.html

http://tech.uc.cn/?p=221

 

以上是关于分布式文件系统fastDFS的主要内容,如果未能解决你的问题,请参考以下文章

FASTDFS调研报告(V1.0)

FastDFS分布式文件系统

FastDFS分布式文件系统

FastDFS(分布式文件系统)使用介绍

FastDFS(分布式文件系统)使用介绍

FastDFS(分布式文件系统)使用介绍