JavaEE进阶——FastDFS实现分布式文件系统

FastDFS

FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。
存储节点存储文件,完成文件管理的所有功能:就是这样的存储、同步和提供存取接口,FastDFS同时对文件的metadata进行管理。所谓文件的meta data就是文件的相关属性,以键值对(key value)方式表示,如:width=1024,其中的key为width,value为1024。文件metadata是文件属性列表,可以包含多个键值对。
跟踪器和存储节点都可以由一台或多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。
为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。
当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可。

上传交互过程

  1. client询问tracker上传到的storage,不需要附加参数;
  2. tracker返回一台可用的storage;
  3. client直接和storage通讯完成文件上传。

下载交互过程

搭建环境文件下载列表

  1. FastDFS_v5.05.tar.gz
  2. nginx-1.14.0.tar.gz
  3. fastdfs-nginx-module_v1.16.tar.gz
  4. fastdfs_client_v1.20.jar
  5. libfastcommonV1.0.7.tar.gz

搭建FastDFS环境

1.上传所有下载的压缩源码包

选择CentOS6.4系统,具体安装见JavaEE进阶——CentOS开发环境搭建

2.安装FastDFS之前,先安装libevent工具包

yum -y install libevent

3.安装libfastcommon工具包。

tar -zxvf libfastcommonV1.0.7.tar.gz
cd libfastcommon1.0.7 
./make.sh
./make.sh install
cp /usr/lib64/libfastcommon.so /usr/lib/
ll |grep libfast* # 查看lib下是否存在libfastcommon.so

4.安装Tracker服务

tar -zxvf FastDFS_v5.05.tar.gz
cd FastDFS
./make.sh
./make.sh install  
cd /usr/bin/
ll fdfs_*  # 查看编译结果是否产生fdfs相关文件
cp FastDFS/conf/* /etc/fdfs/  # 拷贝配置文件到/etc/fdfs/目录下

修改配置文件:

vim /etc/fdfs/tracker.conf

启动tracker:

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf # 启动Tracker服务
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart # 重启Tracker服务

5.安装Storage服务

如果是在不同的服务器安装,需要在新的机器编译FastDFS_v5.05.tar.gz源码包,不需要配置Tracker服务而已。
修改配置文件:

vim /etc/fdfs/storage.conf

启动storage服务:

/usr/bin/fdfs_storaged /etc/fdfs/storage.conf # 启动Storage服务
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart # 重启Storage服务

测试服务

1、修改配置文件/etc/fdfs/client.conf


2、启动测试

/usr/bin/fdfs_test /etc/fdfs/client.conf upload anti-steal.jpg

搭建nginx提供http服务

  1. 解压插件压缩包fastdfs-nginx-module_v1.16.tar.gz
  2. 修改/root/fastdfs-nginx-module/src/config文件,把其中的local去掉。


  3. 对nginx重新config,添加Fastdfs-nginx-module:
    mkdir -p /var/temp/nginx
    
    ./configure \
    --prefix=/usr/local/nginx \
    --pid-path=/var/run/nginx/nginx.pid \
    --lock-path=/var/lock/nginx.lock \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --with-http_gzip_static_module \
    --http-client-body-temp-path=/var/temp/nginx/client \
    --http-proxy-temp-path=/var/temp/nginx/proxy \
    --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
    --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
    --http-scgi-temp-path=/var/temp/nginx/scgi \
    --add-module=/root/fastdfs-nginx-module/src # 指定自己的路径
    
    make
    make install
    
  4. 把/root/fastdfs-nginx-module/src/mod_fastdfs.conf文件复制到/etc/fdfs目录下,进行编辑:





  5. nginx的配置
    server {
            listen       80;
            server_name  192.168.101.3;
    
            location /group1/M00/{
                    ngx_fastdfs_module;
            }
    }
    
  6. 将libfdfsclient.so拷贝至/usr/lib下:
    cp /usr/lib64/libfdfsclient.so /usr/lib/
    
  7. 启动nginx。


测试http服务是否成功

  1. 上传图片:
    /usr/bin/fdfs_test /etc/fdfs/client.conf upload /root/anti-steal.jpg
    
2018-06-16-14-18-13.jpg
  1. 访问命令行输出网址:http://192.168.74.129/group1/M00/00/00/wKhKgVslH5GAKcLdAAB1_3EXRGc833_big.png
  2. 如果不行,检查22122和23000端口防火墙是否关闭,或者临时关闭防火墙:
    service iptables stop  # 临时关闭防火墙
    

Java使用FastDFS

官方提供一个jar包:fastdfs_client_v1.20.jar。如果使用maven管理,可以添加:

<!-- https://mvnrepository.com/artifact/net.oschina.zcx7878/fastdfs-client-java -->
<dependency>
    <groupId>net.oschina.zcx7878</groupId>
    <artifactId>fastdfs-client-java</artifactId>
    <version>1.27.0.0</version>
</dependency>

使用方法:

  1. 把FastDFS提供的jar包添加到工程中
  2. 初始化全局配置。加载一个配置文件。
  3. 创建一个TrackerClient对象。
  4. 通过TrackerClient获得一个TrackerServer对象。
  5. 声明一个StorageServer对象,null。
  6. 通过TrackerServer对象和StorageServer对象获得一个StorageClient对象。
  7. 直接调用StorageClient对象方法上传文件即可。
    创建配置文件client.conf:
tracker_server=192.168.74.129:22122

测试Java代码:

public class FastdfsTest {

    @Test
    public void testUpload() throws IOException, MyException {
        ClientGlobal.init("E:\\Intelljidea\\taotao\\taotao-manager\\taotao-manager-web\\src\\main\\resources\\properties\\client.conf");

        TrackerClient trackerClient = new TrackerClient();
        TrackerServer trackerServer = trackerClient.getConnection();

        StorageServer storageServer = null;
        StorageClient storageClient = new StorageClient(trackerServer, storageServer);

        String[] strings = storageClient.upload_file("C:\\Users\\os\\Pictures\\十分妹子.jpg", "jpg", null);
        for (String string : strings) {
            System.out.println(string);
        }
    }
}

测试结果:



FastDFS工具类:FastDFSClient.java

import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient1;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;

public class FastDFSClient {

    private TrackerClient trackerClient = null;
    private TrackerServer trackerServer = null;
    private StorageServer storageServer = null;
    private StorageClient1 storageClient = null;
    
    public FastDFSClient(String conf) throws Exception {
        if (conf.contains("classpath:")) {
            conf = conf.replace("classpath:", this.getClass().getResource("/").getPath());
        }
        ClientGlobal.init(conf);
        trackerClient = new TrackerClient();
        trackerServer = trackerClient.getConnection();
        storageServer = null;
        storageClient = new StorageClient1(trackerServer, storageServer);
    }
    
    /**
     * 上传文件方法
     * <p>Title: uploadFile</p>
     * <p>Description: </p>
     * @param fileName 文件全路径
     * @param extName 文件扩展名,不包含(.)
     * @param metas 文件扩展信息
     * @return
     * @throws Exception
     */
    public String uploadFile(String fileName, String extName, NameValuePair[] metas) throws Exception {
        String result = storageClient.upload_file1(fileName, extName, metas);
        return result;
    }
    
    public String uploadFile(String fileName) throws Exception {
        return uploadFile(fileName, null, null);
    }
    
    public String uploadFile(String fileName, String extName) throws Exception {
        return uploadFile(fileName, extName, null);
    }
    
    /**
     * 上传文件方法
     * <p>Title: uploadFile</p>
     * <p>Description: </p>
     * @param fileContent 文件的内容,字节数组
     * @param extName 文件扩展名
     * @param metas 文件扩展信息
     * @return
     * @throws Exception
     */
    public String uploadFile(byte[] fileContent, String extName, NameValuePair[] metas) throws Exception {
        
        String result = storageClient.upload_file1(fileContent, extName, metas);
        return result;
    }
    
    public String uploadFile(byte[] fileContent) throws Exception {
        return uploadFile(fileContent, null, null);
    }
    
    public String uploadFile(byte[] fileContent, String extName) throws Exception {
        return uploadFile(fileContent, extName, null);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,063评论 6 510
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,805评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,403评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,110评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,130评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,877评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,533评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,429评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,947评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,078评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,204评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,894评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,546评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,086评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,195评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,519评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,198评论 2 357

推荐阅读更多精彩内容

  • FastDFS是用C语言编写的一款开源的轻量级分布式文件系统。它对文件进行管理,功能包括:文件存储、文件同步、文件...
    欢醉阅读 4,049评论 3 12
  • 详细配置fastdfds分布式文件服务器的方法: 跟踪服务器:192.168.4.121 (edu-dfs-tra...
    Tsinyong阅读 2,610评论 2 7
  • 1 众里寻他千百度,能转几度是几度。 2 众里看她一双眼,千年情缘永相忘。 3 众里大鹅路上飞,一跃而起独霸天。 ...
    飞云潇潇阅读 139评论 1 0
  • 隼击鹰扬。古关冷、幽燕北望苍茫。 黄河衮衮,胡笳悲切,金戈铁马何方。 战旗黄。鼓角鸣、血色残阳。 辽虏心惊,万民安...
    杨一潇阅读 457评论 0 2