欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

海创软件组-20200816-分布式文件系统FastDFS的安装与配置

程序员文章站 2024-03-25 22:37:58
...

传统的Web应用的文件管理方式,例如,图片和视频文件的上传和使用等,大多数是将文件存储在服务器本地,这种方式已经不能适用微服务应用的使用.一方面,微服务应用发布在分布式环境中,随时随地的都可以进行多副本的部署,所以他的媒体文件的存放必须有一个统一的地方;另一方面,建立一个独立而高效的文件系统,也是高可用和高性能的应用平台一个有机组成方面
我们将使用开源的FastDFS这个轻量级的分布式文件系统,搭建一个高可用并且可以持续扩展的分布式文件系统

FastDFS安装

FastDFS分为服务端和客户端API两个部分,服务端又称之为跟踪器(Tracker)和存储节点(Storage)两个角色.跟踪器主要负责服务调度,起着负载均衡的作用.存储节点主要负责文件的存储,读取和同步等功能.客户端API提供了文件上传,下载和删除等操作方法.典型的FastDFS服务器的网络拓扑结构如图所示,客户端链接追踪器服务器集群,跟踪器管理存储节点集群,为客户端提供可用的存储节点.
海创软件组-20200816-分布式文件系统FastDFS的安装与配置

FastDFS支持动态扩展,当资源将要耗尽的时候,可以通过增加新卷或者新组的方式增加更多的存储节点
存储节点的文件使用了分卷或者分组的组织方式,所以一个文件的标识由卷名或者组名,路径和文件名组成
为了演示使用FastDFS我们使用一个Linxu系统.
配置是centos7, 作为TrackerServer,StorageServer

下面将按照步骤说明安装的过程,由于使用Nginx提供文件的浏览访问功能,同时也需要安装Nginx服务,对于文件的组织方式使用了分组的方法,并且建立了一个分组:group1

  • 下载FastDFS5.0.1
    下载地址:https://github.com/happyfish100
  • 下载Nginx1.7.0
    wget http://nginx.org/download/nginx-1.7.0.tar.gz
  • 下载fastdfs-nginx-module_v1.16
    https://github.com/happyfish100/fastdfs-nginx-module

安装FastDFS

在一台服务器上安装FastDFS和Nginx,其中FastDFS使用默认的安装配置,Nginx使用了自定义的安装配置
要执行安装指令,系统中必须具备编译环境,如果系统中没有编译环境,可以使用一下指令增加编译环境

  • yum -y install gcc gcc+ gcc-c++ openssl eopnssl-devel pcre pcre-deve
  • 下载最新版本的各个安装包
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/master.zip
 wget https://github.com/happyfish100/libshmcache/archive/master.zip
wget https://github.com/happyfish100/libfastcommon/archive/master.zip
wget https://github.com/happyfish100/fastdfs/archive/master.zip

然后分别使用unzip解压
海创软件组-20200816-分布式文件系统FastDFS的安装与配置

  • make.sh
  • make.sh install
  • 配置文件复制 cp conf/* /etc/fdfs/

配置启动trackerd

  • 修改trackerd.conf, 将base_path改为/data/fastdfs
  • 新建数据,日志目录 mkdir -p /data/fastdfs
  • 启动tracker /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
  • 查看进程
[aaa@qq.com ~]$ sudo netstat -anp | grep tracker
[sudo] password for lidengyin: 
tcp        0      0 0.0.0.0:22122           0.0.0.0:*               LISTEN      25401/fdfs_trackerd 
tcp        0      0 192.168.0.52:22122      121.36.145.230:48668    ESTABLISHED 25401/fdfs_trackerd 

配置并启动storaged

  • cp storage.conf.sample storage.conf
  • 修改storage,conf ,将base_path修改为/data/fastdfs/storage
  • 修改storage.conf,将tracker_server修改为xxx.xxx.xxx.xxx:22122
  • 创建storaged数据以及日志目录, mkdir -p /data/fastdfs/storage
  • 启动storage, /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
  • 查看启动状态
[aaa@qq.com ~]$ sudo netstat -anp | grep storage
tcp        0      0 0.0.0.0:23000           0.0.0.0:*               LISTEN      4267/fdfs_storaged  
tcp        0      0 192.168.0.52:48668      121.36.145.230:22122    ESTABLISHED 4267/fdfs_storaged  

上传文件测试

[aaa@qq.com ~]$ fdfs_upload_file /etc/fdfs/client.conf ~/time.image 
group1/M00/00/00/eSSR5l9BS2-ALceJAACIK0j0AKw7.image
[aaa@qq.com ~]$ 

在fdfs安装时的错误

  • 问题1: …/common/fdfs_global.c:20:31: fatal error: fastcommon/logger.h: No such file or directory
    #include “fastcommon/logger.h”
  • 解决方法1:
    先安装libfastcommon重复./make ./make install

安装Nginx

配置FastDFS-nginx-module模块

  • 解压安装
  • 拷贝配置文件 cp mod_fastdfs.conf /etc/fdfs/
  • 编辑配置文件将追踪服务器tracker_Server设置为tracker_server=xxx.xxx.x.xxx:22122
  • 编辑配置文件,将url_have_group_name=false改为true,url中使用group名称
  • 编辑配置文件,将存储路径store_path0改为store_path0=/data/fastdfs/storage/

Nginx安装

  • Nginx解压
  • 安装Nginx并且添加fastdfs模块: ./configure --prefix=/usr/local/nginx --add-module=/usr/local/software/fastdfs-nginx-module/src
  • make
  • make install
  • 版本: nginx -V
[aaa@qq.com ~]$ nginx -V
nginx version: nginx/1.9.9
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
configure arguments: --add-module=/usr/local/software/fastdfs-nginx-module-master/src/

配置nginx

  • 打开配置文件 sudo vim /usr/local/nginx/conf/nginx.conf
  • 完整配置文件如下
http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       8888;
        server_name  121.36.145.230;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location /group1/M00 {
            root /data/fastdfs/storage;
            ngx_fastdfs_module;
        }

注意这里的8888是和storage服务器一致的

使用module后无法访问nginx的问题

复制 fdfs/conf/http.conf 以及 fdfs/conf/mime.types到/etc/fdfs才可以

客户端配置

maven依赖

        <dependency>
            <groupId>net.oschina.zcx7878</groupId>
            <artifactId>fastdfs-client-java</artifactId>
            <version>1.27.0.0</version>
        </dependency>

配置文件

connect_timeout = 2
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 80
http.anti_steal_token = no
http.secret_key = FastDFS1234567890

tracker_server = 121.36.145.xx:22122
tracker_server = 121.36.145.xx:22122

上传代码

    @ApiOperation(value = "测试上传方法")
    @PostMapping(value = "/upload/file/mine")
    @CrossOrigin(origins = "*", allowedHeaders = "*", methods ={RequestMethod.POST,RequestMethod.GET,RequestMethod.PUT,RequestMethod.DELETE,RequestMethod.OPTIONS} )
    @ResponseBody
    public ServerResponse fileUpload(MultipartFile file){
        String conf_filename="fdfs_client.conf";
        try {
            ClientGlobal.init(conf_filename);
            TrackerClient trackerClient = new TrackerClient();
            TrackerServer trackerServer = trackerClient.getConnection();
            StorageServer storageServer = null;
            StorageClient storageClient = new StorageClient(trackerServer, storageServer);
//            NameValuePair nvp[] = new NameValuePair[]{
//
//            }
            String fileName = ResourceUtils.getURL("").getPath()+UUID.randomUUID().toString()+file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
            System.out.println("file: "+fileName);
            File upload_temp_file= new File(fileName);
            file.transferTo(upload_temp_file);


            String fileIds[] = storageClient.upload_file(upload_temp_file.getAbsolutePath() ,null, null);
            String path = PropertiesUtil.getProperty("fastdfs.tracker_servers")+"/"+fileIds[0]+"/"+fileIds[1];

            return ServerResponse.createBySuccess(path);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MyException e) {
            e.printStackTrace();
        }
        return ServerResponse.createByError("文件存储失败");
    }

相关标签: 海创软件组