FastDFS安装使用说明

1. 单机版FastDFS安装

1.1 上传

将压缩包上传到linux下的/home/fdfs目录:

1.2 安装依赖

FastDFS运行需要一些依赖,如下:

1.2.1 安装GCC依赖

GCC用来对C语言代码进行编译运行,使用yum命令安装:

sudo yum -y install gcc

1.2.2 安装unzip工具

unzip工具对压缩包进行解压

sudo yum install -y unzip zip

1.2.3 安装libevent

sudo yum -y install libevent

1.2.4 安装Nginx所需依赖

sudo yum -y install pcre pcre-devel zlib zlib-devel openssl openssl-devel

1.2.5 安装libfastcommon-master

这个没有yum包,只能通过编译安装:

  • 解压刚刚上传的libfastcommon-master.zip

    unzip libfastcommon-master.zip 
    
  • 进入解压完成的目录:

    cd libfastcommon-master
    
  • 编译并且安装:

    sudo ./make.sh 
    sudo ./make.sh install
    

到这里为止,所有依赖都已经安装完毕,接下来安装FastDFS:

1.3 安装FastDFS

1.3.1 编译安装

这里采用编译安装,步骤与刚才的编译安装方式一样:

  • 解压

    tar -zxvf FastDFS_v5.08.tar.gz
    
  • 进入目录

    cd FastDFS
    
  • 编译并安装

    sudo ./make.sh 
    sudo ./make.sh install
    
  • 校验安装结果

1)安装完成,应该能在/etc/init.d/目录,通过命令ll /etc/init.d/ | grep fdfs看到FastDFS提供的启动脚本:

其中:

  • fdfs_trackerd 是tracker启动脚本
  • fdfs_storaged 是storage启动脚本

2)可以在 /etc/fdfs目录,通过命令查看到以下配置文件模板:

其中:

  • tarcker.conf.sample 是tracker的配置文件模板
  • storage.conf.sample 是storage的配置文件模板
  • client.conf.sample 是客户端的配置文件模板

1.3.2 启动tracker

FastDFS的tracker和storage在刚刚的安装过程中,都已经被安装了,因此安装这两种角色的方式是一样的。不同的是,两种需要不同的配置文件。

启动tracker,就修改刚刚看到的tarcker.conf,并且启动fdfs_trackerd脚本即可。

  • 编辑tracker配置

首先将模板文件进行赋值和重命名:

sudo cp tracker.conf.sample tracker.conf
sudo vim tracker.conf

打开tracker.conf,修改base_path配置:

base_path=/home/fdfs/tracker # tracker的数据和日志存放目录
  • 创建目录

刚刚配置的目录可能不存在,创建出来

sudo mkdir -p /home/fdfs/tracker
  • 启动tracker

    可以使用 sh /etc/init.d/fdfs_trackerd 启动,不过安装过程中,fdfs已经被设置为系统服务,可以采用熟悉的服务启动方式:

sudo service fdfs_trackerd start # 启动fdfs_trackerd服务,停止用stop

另外,可以通过以下命令,设置tracker开机启动:

sudo chkconfig fdfs_trackerd on

1.3.3 启动storage

启动tracker,就修改刚刚看到的tarcker.conf,并且启动fdfs_trackerd脚本即可。

  • 编辑storage配置

首先将模板文件进行赋值和重命名:

sudo cp storage.conf.sample storage.conf
sudo vim storage.conf

打开storage.conf,修改base_path配置:

base_path=/home/fdfs/storage # storage的数据和日志存放目录
store_path0=/home/fdfs/storage # storage的上传文件存放路径
tracker_server=111.229.237.1:22122 # tracker的地址
  • 创建目录

刚刚配置的目录可能不存在,创建出来

sudo mkdir -p /home/fdfs/storage
  • 启动storage

    使用 sh /etc/init.d/fdfs_storaged 启动,同样可以用服务启动方式:

sudo service fdfs_storaged start  # 启动fdfs_storaged服务,停止用stop

另外,可以通过以下命令,设置tracker开机启动:

sudo chkconfig fdfs_storaged on

最后,通过ps -ef | grep fdfs 查看进程:

1.4 安装Nginx及FastDFS模块

1.4.1 FastDFS的Nginx模块

  • 解压

    tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
    
  • 配置config文件

    # 进入配置目录
    cd /home/home/fdfs/fastdfs-nginx-module/src/
    # 修改配置
    vim config
    # 执行下面命令(将配置中的/usr/local改为/usr):
    :%s+/usr/local/+/usr/+g
    
  • 配置mod_fastdfs.conf

    # 将src目录下的mod_fastdfs.conf复制到 /etc/fdfs目录:
    sudo cp mod_fastdfs.conf /etc/fdfs/
    # 编辑该文件
    sudo vim /etc/fdfs/mod_fastdfs.conf
    
  • 修改一下配置:

    connect_timeout=10                  		# 客户端访问文件连接超时时长(单位:秒)
    tracker_server=47.102.132.1:22122  	# tracker服务IP和端口
    url_have_group_name=true            		# 访问链接前缀加上组名
    store_path0=/home/fdfs/storage        		# 文件存储路径
    
  • 复制 FastDFS的部分配置文件到/etc/fdfs目录

    cd /home/fdfs/FastDFS/conf/
    cp http.conf mime.types /etc/fdfs/
    

1.4.2 安装Nginx

  • 解压

    tar -xvf nginx-1.10.0.tar.gz
    
  • 配置

    sudo ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --add-module=/home/fdfs/fastdfs-nginx-module/src
    

    –conf-path=/etc/nginx/nginx.conf

  • 编译安装

    sudo make && sudo make install
    
    #注意:如果nginx已安装,只编译,不安装
    make
    
    备份之前的nginx
    mv /usr/sbin/nginx /usr/sbin/nginx-bck
    
    cd objs
    cp nginx /usr/sbin  #先拷贝原有文件
    
  • 配置nginx整合fastdfs-module模块

    需要修改nginx配置文件,在/etc/nginx/config/nginx.conf文件中:

    sudo vim  /etc/nginx/conf/nginx.conf
    

    将文件中,原来的server 80{ ...} 部分代码替换为如下代码:

        server {
            listen       80;
            server_name  localhost;
    
        	# 监听域名中带有group的,交给FastDFS模块处理
            location ~/group([0-9])/ {
                ngx_fastdfs_module;
            }
    
            location / {
                root   html;
                index  index.html index.htm;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
            
        }
    
  • 启动

    nginx # 启动
    nginx -s stop # 停止
    nginx -s reload # 重新加载配置
    

2.FastDFS介绍

2.1 简介

FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

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

2.2 角色

FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。

2.3 特性

  • 分组存储,灵活简洁、对等结构,不存在单点
  • 文件ID由FastDFS生成,作为文件访问凭证,FastDFS不需要传统的name server
  • 和流行的web server无缝衔接,FastDFS已提供apache和nginx扩展模块
  • 大、中、小文件均可以很好支持,支持海量小文件存储
  • 支持多块磁盘,支持单盘数据恢复
  • 支持相同文件内容只保存一份,节省存储空间
  • 存储服务器上可以保存文件附加属性
  • 下载文件支持多线程方式,支持断点续传

2.4 同步机制

  • 采用binlog文件记录更新操作,根据binlog进行文件同步
  • 同一组内的storage server之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行;
  • 文件同步只在同组内的storage server之间进行,采用push方式,即源服务器同步给目标服务器;

3.Springboot整合FastDFS

3.1 导入依赖

		<!--fastdfs-->
        <dependency>
            <groupId>com.github.tobato</groupId>
            <artifactId>fastdfs-client</artifactId>
            <version>1.26.1-RELEASE</version>
        </dependency>

3.2 配置config

/**
 * @author yan
 * @Date:2020/3/31
 */
@Configuration
@Import(FdfsClientConfig.class)
//解决jmx重复注册bean的问题
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class FastClientImporter {
}

3.3 yml配置

fdfs:
  so-timeout: 25000
  connect-timeout: 6000
  tracker-list:  
    - ip地址:22122

3.4 FastDFS上传第三方视频资源

/**
 * @author yan
 * @Date:2020/3/31
 */
@Configuration
@Slf4j
public class DownloadUtils {
    @Autowired
    private FastFileStorageClient storageClient;
    public String saveUrlAs(String url) {
        String fn = "";
        String extension = StringUtils.substringAfterLast(url, ".");
        HttpURLConnection conn = null;
        InputStream inputStream = null;
        try {
            // 建立链接
            URL httpUrl = new URL(url);
            conn = (HttpURLConnection) httpUrl.openConnection();
            //以Post方式提交表单,默认get方式
            conn.setRequestMethod("GET");
            conn.setDoInput(true);
            conn.setDoOutput(true);
            // post方式不能使用缓存
            conn.setUseCaches(false);
            //连接指定的资源
            conn.connect();
            //获取网络输入流
            inputStream = conn.getInputStream();
            StorePath storePath = storageClient.uploadFile(inputStream,conn.getContentLength(), extension, null);
            if (storePath != null) {
                fn = storePath.getFullPath();
            }
            conn.disconnect();
        } catch (Exception e) {
            log.error("下载直播视频出错:" + e.getMessage());
        }
        return fn;
    }
}

3.5 测试类

/**
 * @author yan
 * @Date:2020/3/31
 */
@SpringBootTest(classes = {DemoTestApplication.class})
@RunWith(SpringRunner.class)
@Slf4j
class DemoTestApplicationTests {
    @Autowired
    private DownloadUtils downloadUtils;

    @Test
    void contextLoads() throws Exception {
        String url = "http://jdvodyyjqy.vod.126.net/jdvodyyjqpdzy/0-51736678926296-1578878142518-0-mix.mp4";
        String s = downloadUtils.saveUrlAs(url);
        log.info("文件地址回调:"+s);
    }
}

4.FastDFS常用工具类封装

/**
 * @author yan
 * @Date:2020/3/31
 */
@Slf4j
@Configuration
public class FastDFSUtils {

    @Autowired
    private FastFileStorageClient storageClient;
    
    /**
     *文件删除
     * @param fileUrl
     */
    public void deleteFile(String fileUrl) {
        if (StringUtils.isEmpty(fileUrl)) {
            return;
        }
        try {
            StorePath storePath = StorePath.praseFromUrl(fileUrl);
            storageClient.deleteFile(storePath.getGroup(), storePath.getPath());
        } catch (FdfsUnsupportStorePathException e) {
            log.error("文件删除失败:{}",e.getMessage());
        }
    }

    /**
     * 上传文件
     *
     * @param file
     *            文件对象
     * @return 文件访问地址
     * @throws IOException
     */
    public String uploadFile(MultipartFile file) throws IOException {
        StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(),
                FilenameUtils.getExtension(file.getOriginalFilename()), null);

        return storePath.getFullPath();
    }
    
}
发布了2 篇原创文章 · 获赞 2 · 访问量 27

猜你喜欢

转载自blog.csdn.net/weixin_43936312/article/details/105415340