FastDFS的安装及使用

新增用户及向新用户设置密码

  • 新增用户

      useradd 用户名
    
  • 为新用户设置密码

      passwd 密码
    

FastDFS的简单介绍

  • 什么是分布式文件系统

      分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。 
    
      通俗来讲:
      
      - 传统文件系统管理的文件就存储在本机。
      - 分布式文件系统管理的文件存储在很多机器,这些机器通过网络连接,要被统一管理。无论是上传或者访问文件,都需要通过管理中心来访问
    
  • 什么是FastDFS

      FastDFS是由淘宝的余庆先生所开发的一个轻量级、高性能的开源分布式文件系统。用纯C语言开发,功能丰富:
      
      - 文件存储
      - 文件同步
      - 文件访问(上传、下载)
      - 存取负载均衡
      - 在线扩容
      
      适合有大容量存储需求的应用或系统。同类的分布式文件系统有谷歌的GFS、HDFS(Hadoop)、TFS(淘宝)等。
    

FastDFS的架构图

在这里插入图片描述

  • FastDFS两个主要的角色:Tracker Server 和 Storage Server 。

      - Tracker Server:跟踪服务器,主要负责调度storage节点与client通信,在访问上起负载均衡的作用,和记录storage节点的运行状态,是连接client和storage节点的枢纽。 
      - Storage Server:存储服务器,保存文件和文件的meta data(元数据),每个storage server会启动一个单独的线程主动向Tracker cluster中每个tracker server报告其状态信息,包括磁盘使用情况,文件同步情况及文件上传下载次数统计等信息
      - Group:文件组,多台Storage Server的集群。上传一个文件到同组内的一台机器上后,FastDFS会将该文件即时同步到同组内的其它所有机器上,起到备份的作用。不同组的服务器,保存的数据不同,而且相互独立,不进行通信。 
      - Tracker Cluster:跟踪服务器的集群,有一组Tracker Server(跟踪服务器)组成。
      - Storage Cluster :存储集群,有多个Group组成。
    

上传和下载流程

上传

在这里插入图片描述

	1. Client通过Tracker server查找可用的Storage server。
	2. Tracker server向Client返回一台可用的Storage server的IP地址和端口号。
	3. Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件上传。
	4. 上传完成,Storage server返回Client一个文件ID,文件上传结束。

下载

在这里插入图片描述

1. Client通过Tracker server查找要下载文件所在的的Storage server。
2. Tracker server向Client返回包含指定文件的某个Storage server的IP地址和端口号。
3. Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并指定要下载文件。
4. 下载文件成功。

上传压缩包

  • 目录位置任意放,本作者上传的位置为/home/leyou/fdfs
    在这里插入图片描述

安装必要的依赖

  • FastDFS运行需要一些依赖,在课前资料提供的虚拟中已经安装好了这些依赖,如果大家想要从头学习,可以按下面方式安装

  • 安装GCC依赖

> sudo yum -y install gcc
GCC用来对C语言代码进行编译运行,使用yum命令安装

  • 安装unzip工具

> sudo yum install -y unzip zip
unzip工具可以帮我们对压缩包进行解压

  • 安装libevent

> sudo yum -y install libevent

  • 安装Nginx所需依赖

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

解压、编辑、运行

安装libfastcommon-master

  • 通过命令解压到当前目录,命令如下:

> unzip libfastcommon-master.zip

  • 进入libfastcommon-master解压后的文件夹;
  • 编译并运行,命令如下:

> ./make.sh && ./make.sh install

安装FastDFS

  • 通过命令解压到当前目录,命令如下:

> tar -xvf FastDFS_v5.08.tar.gz

  • 进入解压后的FastDFS解压后的文件夹;
  • 编译并运行,命令如下:

> ./make.sh && ./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 是客户端的配置文件模板

启动tracker和storage

启动tracker

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

我们要启动tracker,就修改刚刚看到的tarcker.conf,并且启动fdfs_trackerd脚本即可。
  • 编辑tracker配置

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

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

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

base_path=/leyou/fdfs/tracker # tracker的数据和日志存放目录

  • 创建目录

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

> sudo mkdir -p /leyou/fdfs/tracker

  • 启动tracker

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

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

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

> sudo chkconfig fdfs_trackerd on

启动storage

我们要启动tracker,就修改刚刚看到的tarcker.conf,并且启动fdfs_trackerd脚本即可。
  • 编辑storage配置

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

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

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

      base_path=/leyou/fdfs/storage # storage的数据和日志存放目录
      store_path0=/leyou/fdfs/storage # storage的上传文件存放路径
      tracker_server=192.168.11.140.101:22122 # tracker的地址,你自己本地或局域网中的tracker的地址
    
  • 创建目录

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

      sudo mkdir -p /leyou/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 查看进程:

在这里插入图片描述

将client.conf.sample进行测试

  • 复制文件并命名:

> cp client.conf.sanple client.conf

  • 利用vim修改其中的配置:

在这里插入图片描述

修改base_path和tracker_server配置

  • 使用命令查看是否能上传成功:

      /usr/bin/fdfs_upload_file client.conf /tmp/zhongyuan.png
    

/usr/bin/fdfs_upload_file fastDFS自带的一个服务器测试包,一个目录;
client.conf 自带的一个上传配置
/tmp/zhongyuan.png 需要上传的文件

安装Nginx及FastDFS模块

FastDFS的Nginx模块

  • 1、解压:

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

  • 2、配置config文件:

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

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

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

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

配置Nginx

  • 进入Nginx的安装目录,执行命令:

      sudo ./configure --prefix=/opt/nginx --sbin-path=/usr/bin/nginx --add-module=/home/leyou/fdfs/fastdfs-nginx-module/src
    
  • 对Nginx进行编译,非编译安装:

> make

将Nginx和fastNginx-module进行整合

  • 停止Nginx;
  • 将/usr/bin目录下的nginx文件更名成nginx_bac;

在这里插入图片描述

  • 将/home/leyou/nginx-1.10.3/objs目录下的Nginx文件复制到/usr/bin目录下;

  • 修改/opt/nginx/conf/nginx.conf文件,增加配置:

       server {
              listen       80;
              server_name  manage.leyou.com;
      
              proxy_set_header X-Forwarded-Host $host;
              proxy_set_header X-Forwarded-Server $host;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      
              location / {
                              proxy_pass http://192.168.11.1:9001;
                              proxy_connect_timeout 600;
                              proxy_read_timeout 600;
              }
          }
      
          server {
              listen       80;
              server_name  api.leyou.com;
      
              proxy_set_header X-Forwarded-Host $host;
              proxy_set_header X-Forwarded-Server $host;
              proxy_set_header X-Forwarded-For 	$proxy_add_x_forwarded_for;
    
      	# 上传路径的映射,跳过网关缓存
      		location /api/upload {	
      			rewrite "^(.*)$" /zuul/$1; 
              }
      
      
      
              location / {
                              proxy_pass http://192.168.11.1:10010;
                              proxy_connect_timeout 600;
                              proxy_read_timeout 600;
              }
          }
      
              server {
              listen       80;
              server_name  image.leyou.com;
      
              location ~/group([0-9])/ {
                              ngx_fastdfs_module;
                      }
      
              error_page   500 502 503 504  /50x.html;
              location = /50x.html {
                  root   html;
              }
          }
    

配置Nginx开机启动

设置nginx开机启动

创建一个开机启动的脚本:

vim /etc/init.d/nginx

添加以下内容:

			#!/bin/sh
			#
			# nginx - this script starts and stops the nginx daemon
			#
			# chkconfig:   - 85 15
			# description:  NGINX is an HTTP(S) server, HTTP(S) reverse \
			#               proxy and IMAP/POP3 proxy server
			# processname: nginx
			# config:      /etc/nginx/nginx.conf
			# config:      /etc/sysconfig/nginx
			# pidfile:     /var/run/nginx.pid
			
			# Source function library.
			. /etc/rc.d/init.d/functions
			
			# Source networking configuration.
			. /etc/sysconfig/network
			
			# Check that networking is up.
			[ "$NETWORKING" = "no" ] && exit 0
			
			nginx="/usr/bin/nginx"
			prog=$(basename $nginx)
			
			NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"
			
			[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
			
			lockfile=/var/lock/subsys/nginx
			
			make_dirs() {
			   # make required directories
			   user=`$nginx -V 2>&1 | grep "configure arguments:.*--user=" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
			   if [ -n "$user" ]; then
			      if [ -z "`grep $user /etc/passwd`" ]; then
			         useradd -M -s /bin/nologin $user
			      fi
			      options=`$nginx -V 2>&1 | grep 'configure arguments:'`
			      for opt in $options; do
			          if [ `echo $opt | grep '.*-temp-path'` ]; then
			              value=`echo $opt | cut -d "=" -f 2`
			              if [ ! -d "$value" ]; then
			                  # echo "creating" $value
			                  mkdir -p $value && chown -R $user $value
			              fi
			          fi
			       done
			    fi
			}
			
			start() {
			    [ -x $nginx ] || exit 5
			    [ -f $NGINX_CONF_FILE ] || exit 6
			    make_dirs
			    echo -n $"Starting $prog: "
			    daemon $nginx -c $NGINX_CONF_FILE
			    retval=$?
			    echo
			    [ $retval -eq 0 ] && touch $lockfile
			    return $retval
			}
			
			stop() {
			    echo -n $"Stopping $prog: "
			    killproc $prog -QUIT
			    retval=$?
			    echo
			    [ $retval -eq 0 ] && rm -f $lockfile
			    return $retval
			}
			
			restart() {
			    configtest || return $?
			    stop
			    sleep 1
			    start
			}
			
			reload() {
			    configtest || return $?
			    echo -n $"Reloading $prog: "
			    killproc $nginx -HUP
			    RETVAL=$?
			    echo
			}
			
			force_reload() {
			    restart
			}
			
			configtest() {
			  $nginx -t -c $NGINX_CONF_FILE
			}
			
			rh_status() {
			    status $prog
			}
			
			rh_status_q() {
			    rh_status >/dev/null 2>&1
			}
			
			case "$1" in
			    start)
			        rh_status_q && exit 0
			        $1
			        ;;
			    stop)
			        rh_status_q || exit 0
			        $1
			        ;;
			    restart|configtest)
			        $1
			        ;;
			    reload)
			        rh_status_q || exit 7
			        $1
			        ;;
			    force-reload)
			        force_reload
			        ;;
			    status)
			        rh_status
			        ;;
			    condrestart|try-restart)
			        rh_status_q || exit 0
			            ;;
			    *)
			        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
			        exit 2
			esac
  • 修改文件权限,并加入服务列表
  •    # 修改权限
      chmod 777 /etc/init.d/nginx 
      添加到服务列表
      chkconfig --add /etc/init.d/nginx 
      - 设置开机启动
      chkconfig nginx on
    

解决上传时的跨域问题

@Configuration
public class GlobalCorsConfig {    
	@Bean    
	public CorsFilter corsFilter() {        
		//1.添加CORS配置信息        
		CorsConfiguration config = new CorsConfiguration();        
		//1) 允许的域,不要写*,否则cookie就无法使用了        						   
		config.addAllowedOrigin("http://manage.leyou.com");        
		//2) 是否发送Cookie信息        
		config.setAllowCredentials(false);        
		//3) 允许的请求方式        
		config.addAllowedMethod("OPTIONS");        
		config.addAllowedMethod("POST");        
		config.addAllowedHeader("*");        
		//2.添加映射路径,我们拦截一切请求        
		UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();        
		configSource.registerCorsConfiguration("/**", config);        
		//3.返回新的CorsFilter.        
		return new CorsFilter(configSource);    
	}
}

java整合fastDFS

  • 在父工程中,我们已经管理了依赖,版本为:

      <fastDFS.client.version>1.26.2</fastDFS.client.version>
    
  • 因此,这里我们直接引入坐标即可:

      <dependency>
          <groupId>com.github.tobato</groupId>
          <artifactId>fastdfs-client</artifactId>
      </dependency>
    

引入配置类

  • 纯java配置:

      @Configuration
      @Import(FdfsClientConfig.class)
      // 解决jmx重复注册bean的问题
      @EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
      public class FastClientImporter {
      }
    
  • fastDFS的yaml配置:

      fdfs:
        so-timeout: 1501
        connect-timeout: 601
        thumb-image: # 缩略图
          width: 60
          height: 60
        tracker-list: # tracker地址
          - 192.168.11.140:22122
    

fastdfs测试

	@RunWith(SpringRunner.class)
	public class FdfsTest {
	
	    @Autowired
	    private FastFileStorageClient storageClient;
	
	    @Autowired
	    private ThumbImageConfig thumbImageConfig;
	
	    @Test
	    public void testUpload() throws FileNotFoundException {
	        File file = new File("D:\\test\\baby.png");
	        // 上传并且生成缩略图
	        StorePath storePath = this.storageClient.uploadFile(
	                new FileInputStream(file), file.length(), "png", null);
	        // 带分组的路径
	        System.out.println(storePath.getFullPath());
	        // 不带分组的路径
	        System.out.println(storePath.getPath());
	    }
	
	    @Test
	    public void testUploadAndCreateThumb() throws FileNotFoundException {
	        File file = new File("D:\\test\\baby.png");
	        // 上传并且生成缩略图
	        StorePath storePath = this.storageClient.uploadImageAndCrtThumbImage(
	                new FileInputStream(file), file.length(), "png", null);
	        // 带分组的路径
	        System.out.println(storePath.getFullPath());
	        // 不带分组的路径
	        System.out.println(storePath.getPath());
	        // 获取缩略图路径
	        String path = thumbImageConfig.getThumbImagePath(storePath.getPath());
	        System.out.println(path);
	    }
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值