FastDFS搭建及java整合代码

来源:互联网 发布:im即时通讯源码 购买 编辑:程序博客网 时间:2024/06/15 15:00

FastDFS软件介绍


1.什么是FastDFS

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

2.FastDFS架构

FastDFS架构包括 Tracker server和Storage server。客户端请求Tracker server进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载。Tracker server作用是负载均衡和调度,通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。可以将tracker称为追踪服务器或调度服务器。Storage server作用是文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将storage称为存储服务器。 
这里写图片描述

2.2.1Tracker集群

FastDFS集群中的Tracker server可以有多台,Tracker server之间是相互平等关系同时提供服务,Tracker server不存在单点故障。客户端请求Tracker server采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker。

2.2.2Storage集群

Storage集群采用了分组存储方式。storage集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量之和。一个组由一台或多台存储服务器组成,组内的Storage server之间是平等关系,不同组的Storage server之间不会相互通信,同组内的Storage server之间会相互连接进行文件同步,从而保证同组内每个storage上的文件完全一致的。一个组的存储容量为该组内存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最好是一致的。采用分组存储方式的好处是灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到的组也可以由tracker进行调度选择。一个分组的存储服务器访问压力较大时,可以在该组增加存储服务器来扩充服务能力(纵向扩容)。当系统容量不足时,可以增加组来扩充存储容量(横向扩容)。

2.2.3Storage状态收集

Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。

2.2.4文件上传流程

客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。示例:group1/M00/02/44/sdfgsinsdfsdf.jpg

2.2.5文件下载流程

tracker根据请求的文件路径即文件ID 来快速定义文件。 
比如请求下边的文件: 
group1/M00/00/10/agIBmlee7fOATa1MAAFw6fBcZXY841.png 
这里写图片描述

1.通过组名tracker能够很快的定位到客户端需要访问的存储服务器组是group1,并选择合适的存储服务器提供客户端访问。 
2.存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。

个人理解


  1. FastDFS是一个文件存储服务,无论是什么类型的文件都可以存储,不仅仅是可以用作图片服务器的。

  2. 上传文件的流程就是通过nginx进行http访问,nginx找到trackerServer,给了trackerServer一个文件,trackerServer拿到这个文件之后,根据自己的规则存储到指定的storageServer的相应路径下。 
    同时,trackerServer会生成文件在服务器上的存储路径,通过nginx返回给客户端,客户端拿到这个路径,在前面加上服务器地址就可以访问这个文件了。

  3. 不难看出,在服务器上需要安装三个部分:分模块一步一步安装就不容易出错了

    3.1 trackerServer

    3.2 storageServer

    3.3 nginx和fastDFS整合

安装准备


  1. 下面用到的软件到相关网站下载就可以了

  2. 安装libevent工具包

    yum -y install libevent

  3. 安装libfastcommonv1.0.7工具包

    • 解压缩
    • ./make.sh
    • ./make.sh install

安装步骤

本示例为单trackerServer和storageServer,没有介绍集群


安装trackerServer

  1. 解压缩fastDFS_v5.05.tar.gz(tracker和storage在同一个包内,所以只需要解压一次)

    • .make.sh
    • .make.sh install

    安装完成后在/usr/bin/目录下有以fdfs开头的文件都是编译出来的。配置文件都放到/etc/fdfs文件夹。

  2. 把解压目录目录下的conf文件夹下的文件都复制到/etc/fdfs下

    cp /root/FastDFS/conf /etc/fdfs

  3. 配置tracker服务。修改/etc/fdfs/tracker.conf文件

    base_path=/home/yuqing/fastdfs

    将该路径改为自己定义的路径,该路径必须存在,用于存放数据和日志文件。

  4. 启动tracker

    启动:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf

    重启:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

  5. 设置开机自动启动

    编辑配置:vim /etc/rc.d/rc.local

    添加命令:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

安装storageServer

  1. 如果和trackerServer不是安装在同一台服务器,需要重复执行上个步骤中的1和2两个步骤。

  2. 配置storage服务。修改/etc/fdfs/storage.conf文件

    base_path=/home/yuqing/fastdfs:storage服务日志存放路径,该路径必须存在

    store_path0=/home/yuqing/fastdfs:图片的保存路径,该路径必须存在

    tracker_server=192.168.25.133:22122:指定tracker服务器的ip和端口

  3. 启动storageServer

    启动:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf

    重启:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

  4. 设置开机自启动

    编辑 vim /etc/rc.d/rc.local

    添加 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

  5. 修改防火墙设置,添加如下规则

    修改防火墙命令:vim /etc/sysconfig/iptables

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT 
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT 
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT 
    重启防火墙:service iptables restart

接下来就可以测试我们是否搭建成功了

完成测试


使用自带的client进行测试

  1. 配置客户端

    vim /etc/fdfs/client.conf:修改配置文件

    base_path=/home/fastdfs/client:客户端日志文件保存路径

    tracker_server=192.168.25.133:22122:指定tracker的ip和端口

  2. 测试

    /usr/bin/fdfs_test /etc/fdfs/client.conf upload /root/test.jpg:在linux内部进行图片上传

  3. 结果

    当出现如下画面时,说明配置成功了,其中的地址即为该文件的访问地址。但是此时我们还不可以通过外网访问,因为还没有配置http服务,接下来,安装Nginx。 
    这里写图片描述

搭建Nginx提供Http外网访问

使用官方提供的nginx插件fastdfs-nginx-module_v1.16.tar.gz,对nginx重新编译。

  1. 解压插件压缩包 (本例为root目录下)

    tar -zxvf fastdfs-nginx-module_v1.16.tar.gz

  2. 修改解压缩包文件下的/root/fastdfs-nginx-module/src/config文件

    把其中的local去掉,如下图: 
    这里写图片描述

  3. 解压缩nginx,并进入该目录

    tar -zxf nginx-1.8.0.tar.gz

  4. 对nginx进行config

    ./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

    注意:

    最后一行--add-module=/root/fastdfs-nginx-module/src其中的/root/fastdfs-nginx-module/src 
    为fastdfs-nginx-module_v1.16.tar.gz的解压路径。

    上边将临时文件目录指定为/var/temp/nginx,需要在/var下创建temp及nginx目录

  5. 安装nginx

    make

    make install

  6. 复制并修改nginx和fasts整合的配置文件

    cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs

    vim /etc/fdfs/mod_fastdfs.conf

    base_path=/tmp 日志存放位置

    tracker_server=192.168.25.133:22122 tracerServer的服务器地址

    url_have_group_name = true 是否包含组名group

    store_path0=/home/fastdfs/storage 图片保存路径,就是包含data的那个路径,这个别弄错了

  7. 复制文件

    cp /usr/lib64/libfdfsclient.so /usr/lib/ 32位软件

  8. 修改nginx访问配置

    server {    listen       80;    server_name  192.168.25.133;    location /group1/M00/{        #root /home/FastDFS/fdfs_storage/data;        ngx_fastdfs_module;`    }}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  9. 设置nginx自启动

    ① 首先编写脚本文件

    vi /etc/init.d/nginx

        nginxd=/usr/local/nginx/sbin/nginx        nginx_config=/usr/local/nginx/conf/nginx.conf        nginx_pid=/var/run/nginx.pid        RETVAL=0        prog="nginx"        . /etc/rc.d/init.d/functions        . /etc/sysconfig/network        [ ${NETWORKING} = "no" ] && exit 0        [ -x $nginxd ] || exit 0        start() {        if [ -e $nginx_pid ];then        echo "nginx already running...."        exit 1        fi        echo -n $"Starting $prog: "        daemon $nginxd -c ${nginx_config}        RETVAL=$?        echo        [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx        return $RETVAL        }        stop() {            echo -n $"Stopping $prog: "            killproc $nginxd            RETVAL=$?            echo            [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid        }        reload() {            echo -n $"Reloading $prog: "            killproc $nginxd -HUP            RETVAL=$?            echo        }        case "$1" in        start)            start            ;;        stop)            stop            ;;        reload)            reload            ;;        restart)            stop            start            ;;        status)            status $prog            RETVAL=$?            ;;        *)        echo $"Usage: $prog {start|stop|restart|reload|status|help}"        exit 1        esac        exit $RETVAL
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

wq保存退出

② 设置文件的访问权限

    `chmod a+x /etc/init.d/nginx`    (a+x ==> all user can execute  所有用户可执行)
  • 1
  • 2
  • 3

③ nginx状态、启动、重启、停止

`/etc/init.d/nginx status` 查看状态`/etc/init.d/nginx start` 启动`/etc/init.d/nginx stop` 停止`/etc/init.d/nginx restart` 重启
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

④加入到rc.local文件中

`vim /etc/rc.local``/etc/init.d/nginx start` 下次系统重启后,nginx会自启动
  • 1
  • 2
  • 3
  • 4
  1. 现在就可以用外网访问已经上传的图片了

    我们可以用内部测试test工具来进行上传图片(返回本文档第一部分查看),将返回的结果复制到浏览器,就可以访问上传的文件了。图片的话会直接在浏览器打开。

    终于搭建好了,不过还没完,还要和java进行结合,才能利用起来。

Java整合+工具类


官方提供了jar包,下载下来,放到项目中去,接下来就看具体的java代码流程了。

  1. 使用java基础代码操作的流程
        @Test        public void testUpload() throws Exception {            // 1、把FastDFS提供的jar包添加到工程中            // 2、初始化全局配置。加载一个配置文件。            ClientGlobal.init("D:\\workspaces-itcast\\JaveEE18\\taotao- manager\\taotao-manager-web\\src\\main\\resources\\properties\\client.conf");            // 3、创建一个TrackerClient对象。            TrackerClient trackerClient = new TrackerClient();            // 4、创建一个TrackerServer对象。            TrackerServer trackerServer = trackerClient.getConnection();            // 5、声明一个StorageServer对象,null。            StorageServer storageServer = null;            // 6、获得StorageClient对象。            StorageClient storageClient = new StorageClient(trackerServer,  storageServer);            // 7、直接调用StorageClient对象方法上传文件即可。            String[] strings = storageClient.upload_file("D:\\Documents\    \Pictures\\images\\2f2eb938943d.jpg", "jpg", null);            for (String string : strings) {                System.out.println(string);            }        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
配置文件Client.conf
  • 1
  • 2
    tracker_server=192.168.25.133:22122
  • 1
  1. 使用工具类上传

    测试方法

        @Test        public void testFastDfsClient() throws Exception {            FastDFSClient client = new FastDFSClient("D:\\workspaces-itcast\\JaveEE18\\taotao-manager\\taotao-manager-web\\src\\main\\resources\\properties\\client.conf");            String uploadFile = client.uploadFile("D:\\Documents\\Pictures\\images\\200811281555127886.jpg", "jpg");            System.out.println(uploadFile);//返回的是文件的        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

工具类代码

        package com.maxrocky.tools;        import java.io.File;        import java.util.HashMap;        import java.util.Map;        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);         }        }
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 iphonex读不出卡怎么办 iphone有锁怎么办 p20屏幕发黄怎么办 手机屏幕有白点怎么办 曲面屏膜进灰尘怎么办 全面屏贴膜白边怎么办 s8贴膜后不灵敏怎么办 蓝光膜屏幕发黄怎么办 硅胶套顶钢化膜怎么办 手机壳翘钢化膜怎么办 小米8钢化膜白边怎么办 水凝膜里沾灰了怎么办 去白边液进屏幕怎么办 贴膜有个角浮起怎么办 钢化膜贴不到边怎么办 手机触屏摔失灵怎么办 华为mate9死机怎么办 蓄电池电量不足怎么办 电量不足怎么办 电脑暗屏怎么办 iwatch锁住了怎么办 华为备份丢失怎么办 mate10丢失怎么办? 华为手环丢了怎么办 运动手环丢了怎么办 捡到mate10怎么办 手机被偷后关机怎么办 华为p10丢失怎么办 mate10老重启怎么办 眼镜架掉漆怎么办 金属手机摔掉漆怎么办 手机屏幕有刮痕怎么办 三星s8中框掉漆怎么办 水凝膜上的划痕怎么办 手机水凝膜有味怎么办 荣耀9贴膜有白边怎么办 荣耀9钢化膜白边怎么办 钢化膜沾指纹怎么办 贴水凝膜有气泡怎么办 充电器充头烧了怎么办 华为nate8手机卡怎么办