dfs分布式文件系统

一:概念

DFS:Distributed file system 分布式文件系统

文件分布系统 (Dfs) 是一个网络服务器组件,它能够使你更容易地在网络上查询和管理数据。分布式文件系统是将分布于不同电脑上的文件组合为单一的名称空间,并使得在网络上建立一个单一的、层次化多重文件服务器和服务器共享的工作更为方便的途径。

常用的分布式文件系统:TFES GFS HDFS FastDFS OSS

FastDFS是一款类似Google FS的开源分布式文件系统,是纯C语言开发的。
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。

特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

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

  • FastDfs的两个组件

跟踪器:tracker(类似于包工头)

主要任务:主要做调度工作,在访问上起负载均衡的作用。

1: 接受客户端请求

2: 分配任务给storage

3: 管理和维护系统的元数据(记录文件及其存储位置的属性信息)

存储节点:storage(类似于建筑工人)

主要任务:负责文件的上传和下载和管理

1: 处理客户端请求

2: 文件的存储,维护,管理

二:安装FastDFS(只在master上安装)

安装依赖

  • 安装:gcc libevent libevent-devel
yum install gcc libevent libevent-devel -y

安装libcomment

  • 安装wget 实现在线下载
yum install -y wget
  • 在线下载libcomment的安装包
[root@java34master soft]#  wget https://github.com/happyfish100/libfastcommon/archive/V1.0.38.tar.gz
...
[root@java34master soft]# ll
...
-rw-r--r--  1 root root    444656 6月  10 14:43 V1.0.38.tar.gz
  • 解压缩到当前文件夹下
[root@java34master soft]# tar -zxvf V1.0.38.tar.gz 
...
[root@java34master soft]# ll
...
drwxrwxr-x  5 root root       135 6月  29 2018 libfastcommon-1.0.38
-rw-r--r--  1 root root    444656 6月  10 14:43 V1.0.38.tar.gz
[root@java34master soft]# 
  • 进入libfastcommon-1.0.38文件夹中执行make.sh文件 进行编译
[root@java34master libfastcommon-1.0.38]# pwd
/usr/soft/libfastcommon-1.0.38
[root@java34master libfastcommon-1.0.38]# ./make.sh
  • 进入libfastcommon-1.0.38文件夹中执行make.sh install文件 进行安装
[root@java34master libfastcommon-1.0.38]# pwd
/usr/soft/libfastcommon-1.0.38
[root@java34master libfastcommon-1.0.38]# ./make.sh install

安装FastDFS

  • 在线下载压缩文件 并解压缩
[root@java34master soft]# pwd
/usr/soft
[root@java34master soft]#  wget https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz    
...
[root@java34master soft]# ll
...
-rw-r--r--  1 root root    336939 6月  10 14:53 V5.11.tar.gz
[root@java34master soft]# tar -zxvf V5.11.tar.gz   #解压缩
...
[root@java34master soft]# ll
...
drwxrwxr-x  10 root root       258 6月   3 2017 fastdfs-5.11
...
-rw-r--r--   1 root root    336939 6月  10 14:53 V5.11.tar.gz
  • 进入文件夹fastdfs-5.11 执行编译和安装命令
[root@java34master fastdfs-5.11]# pwd
/usr/soft/fastdfs-5.11
[root@java34master fastdfs-5.11]# ./make.sh   #编译
...
[root@java34master fastdfs-5.11]# ./make.sh install   #安装
...
  • 进入/usr/bin下有多个fastdfs相关的程序
[root@java34master fastdfs-5.11]# cd /usr/bin
[root@java34master bin]# ll

image-20210610150510120

  • 拷贝/usr/soft/fastdfs-xxx/conf下的http.conf和mime.types到/etc/fdfs下
[root@java34master conf]# cp /usr/soft/fastdfs-5.11/conf/http.conf  /etc/fdfs/
[root@java34master conf]# cp /usr/soft/fastdfs-5.11/conf/mime.types  /etc/fdfs/
  • 把/etc/fdfs下的 storage.conf.sample和tracker.conf.sample 文件名后面的simple删除
[root@java34master fdfs]# mv /etc/fdfs/storage.conf.sample  /etc/fdfs/storage.conf
[root@java34master fdfs]# mv /etc/fdfs/tracker.conf.sample  /etc/fdfs/tracker.conf
  • 更改 tracker.conf中的base_path 并记忆其端口
[root@java34master fdfs]# vim /etc/fdfs/tracker.conf
...
# the tracker server port
# 记住tracker的端口为22122
port=22122

# connect timeout in seconds
# default value is 30s
connect_timeout=30

# network timeout in seconds
# default value is 30s
network_timeout=60

# the base path to store data and log files
# 记录元数据存储位置
base_path=/usr/soft/fastdfs-5.11-file/tracker
...
  • 更改 storage.conf中的base_path,store_path0,tracker_server 并记忆其端口
[root@java34master fdfs]# vim /etc/fdfs/storage.conf
[root@java34master fdfs]# cat /etc/fdfs/storage.conf
...
#记住storage的端口
port=23000
...
# 更改基础路径
base_path=/usr/soft/fastdfs-5.11-file/storage
...
# 设置文件存储路径
store_path0=/usr/soft/fastdfs-5.11-file/storage/files
#store_path1=/home/yuqing/fastdfs2
...
#指定tracker的位置
tracker_server=192.168.254.128:22122
...
  • 创建刚才配置的两个文件夹
[root@java34master tracker]# mkdir -p /usr/soft/fastdfs-5.11-file/tracker
[root@java34master tracker]# mkdir -p /usr/soft/fastdfs-5.11-file/storage/files
  • 先启动tracker:::执行/usr/bin/fdfs_trackerd (/usr/bin已经设置了PATH环境变量)
[root@java34master bin]# fdfs_trackerd      #输入命令 获取命令的提示信息
Usage: fdfs_trackerd <config_file> [start | stop | restart]
[root@java34master bin]# fdfs_trackerd /etc/fdfs/tracker.conf start
  • 再启动storage:::执行/usr/bin/fdfs_storaged
[root@java34master bin]# fdfs_storaged
Usage: fdfs_storaged <config_file> [start | stop | restart]
[root@java34master bin]# fdfs_storaged /etc/fdfs/storage.conf start
  • 查看进程:
[root@java34master bin]# ps -ef | grep fdfs
root       5568      1  0 15:43 ?        00:00:00 fdfs_trackerd /etc/fdfs/tracker.conf start
root       5585      1 21 15:44 ?        00:00:04 fdfs_storaged /etc/fdfs/storage.conf start
root       5600   2390  0 15:44 pts/2    00:00:00 grep --color=auto fdfs

执行fdfs_test

  • 把/etc/fdfs/client.conf.simple的.simple删除
[root@java34master fdfs]# mv  /etc/fdfs/client.conf.sample  /etc/fdfs/client.conf
  • 进入client.conf::修改base_path和tracker_server
[root@java34master fdfs]# vim /etc/fdfs/client.conf 
[root@java34master fdfs]# cat /etc/fdfs/client.conf 
....
# 设置基础目录
base_path=/usr/soft/fastdfs-5.11-file/client

# tracker_server can ocur more than once, and tracker_server format is
# 设置tracker的位置
tracker_server=192.168.254.128:22122
...
  • 创建base_path文件夹
[root@java34master fdfs]# mkdir -p /usr/soft/fastdfs-5.11-file/client
  • 创建一个文件
[root@java34master ~]# pwd
/root
[root@java34master ~]# echo 1+1=2 > 11.txt
  • 保证fastdfs的tracker和storage开启状态
[root@java34master ~]# ps -ef | grep fdfs
root       5568      1  0 15:43 ?        00:00:00 fdfs_trackerd /etc/fdfs/tracker.conf start
root       5585      1  0 15:44 ?        00:00:04 fdfs_storaged /etc/fdfs/storage.conf start
root       6608   2390  0 16:57 pts/2    00:00:00 grep --color=auto fdfs

执行/usr/bin下的fdfs_test命令 实现文件上传

[root@java34master ~]# fdfs_test    #执行命令  获取命令的参数提示
...
Usage: fdfs_test <config_file> <operation>
	operation: upload, download, getmeta, setmeta, delete and query_servers
	
[root@java34master ~]# fdfs_test /etc/fdfs/client.conf upload /root/11.txt   #上传文件
This is FastDFS client test program v5.11

Copyright (C) 2008, Happy Fish / YuQing

FastDFS may be copied only under the terms of the GNU General
Public License V3, which may be found in the FastDFS source kit.
Please visit the FastDFS Home Page http://www.csource.org/ 
for more detail.

[2021-06-10 16:59:12] DEBUG - base_path=/usr/soft/fastdfs-5.11-file/client, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0

tracker_query_storage_store_list_without_group: 
	server 1. group_name=, ip_addr=192.168.254.132, port=23000

group_name=group1, ip_addr=192.168.254.132, port=23000
storage_upload_by_filename
group_name=group1, remote_filename=M00/00/00/wKj-hGDB1GCACiweAAAABuCt0tY922.txt
source ip address: 192.168.254.132
file timestamp=2021-06-10 16:59:12
file size=6
file crc32=3769488086
example file url: http://192.168.254.132/group1/M00/00/00/wKj-hGDB1GCACiweAAAABuCt0tY922.txt
storage_upload_slave_by_filename
group_name=group1, remote_filename=M00/00/00/wKj-hGDB1GCACiweAAAABuCt0tY922_big.txt
source ip address: 192.168.254.132
file timestamp=2021-06-10 16:59:12
file size=6
file crc32=3769488086
example file url: http://192.168.254.132/group1/M00/00/00/wKj-hGDB1GCACiweAAAABuCt0tY922_big.txt
分析:
目的文件的位置:M00/00/00/wKj-hGDB1GCACiweAAAABuCt0tY922.txt
进入目的文件夹:
[root@java34master 00]# pwd
/usr/soft/fastdfs-5.11-file/storage/files/data/00/00
[root@java34master 00]# ll
总用量 16
#备份文件
-rw-r--r-- 1 root root  6 6月  10 16:59 wKj-hGDB1GCACiweAAAABuCt0tY922_big.txt
#备份文件的元数据:
-rw-r--r-- 1 root root 49 6月  10 16:59 wKj-hGDB1GCACiweAAAABuCt0tY922_big.txt-m
#目的文件
-rw-r--r-- 1 root root  6 6月  10 16:59 wKj-hGDB1GCACiweAAAABuCt0tY922.txt
#目的文件的元数据
-rw-r--r-- 1 root root 49 6月  10 16:59 wKj-hGDB1GCACiweAAAABuCt0tY922.txt-m

执行/usr/bin下的fdfs_test命令 实现文件下载

[root@java34master ~]# fdfs_test /etc/fdfs/client.conf download group1 M00/00/00/wKj-hGDB1GCACiweAAAABuCt0tY922.txt
# 命令中的group1 是当前storage的组名::当storage多的时候  tracker对storage进行分组
...
download file success, file size=6, file save to wKj-hGDB1GCACiweAAAABuCt0tY922.txt
[root@java34master ~]# ll
...
-rw-r--r--  1 root root    6 6月  10 17:12 wKj-hGDB1GCACiweAAAABuCt0tY922.txt
[root@java34master ~]# cat wKj-hGDB1GCACiweAAAABuCt0tY922.txt 
1+1=2

执行/usr/bin下的fdfs_test命令 实现文件删除

[root@java34master ~]# fdfs_test /etc/fdfs/client.conf delete group1 M00/00/00/wKj-hGDB1GCACiweAAAABuCt0tY922.txt
...
delete file success
[root@java34master ~]# cd /usr/soft/fastdfs-5.11-file/storage/files/data/00/00
[root@java34master 00]# ll
总用量 8
-rw-r--r-- 1 root root  6 6月  10 16:59 wKj-hGDB1GCACiweAAAABuCt0tY922_big.txt
-rw-r--r-- 1 root root 49 6月  10 16:59 wKj-hGDB1GCACiweAAAABuCt0tY922_big.txt-m

1 卸载yum安装的nginx

  • 保存 nginx的配置 /etc/nginx/conf.d/cloud34.conf保存下来

image-20210615104111739

  • 关闭服务
[root@java34master conf.d]# systemctl status nginx   #查看nginx的状态
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: http://nginx.org/en/docs/
[root@java34master conf.d]# systemctl stop nginx   #关闭nginx服务
[root@java34master conf.d]# chkconfig nginx off    #取消nginx开机启动
注意:正在将请求转发到“systemctl disable nginx.service”。
  • 卸载nginx
[root@java34master conf.d]# whereis nginx  #查找nginx相关的安装位置
nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz
[root@java34master conf.d]# rm -rf /usr/sbin/nginx   #逐个删除
[root@java34master conf.d]# rm -rf /usr/lib64/nginx
[root@java34master conf.d]# rm -rf /etc/nginx
[root@java34master conf.d]# rm -rf /usr/share/nginx
[root@java34master conf.d]# rm -rf /usr/share/man/man8/nginx.8.gz
  • yum清理nginx
nginx:[root@java34master /]# yum remove nginx -y
  • 删除nginx残留的文件
[root@java34master /]# find / -name "nginx"  # 从跟目录下找  文件名包含nginx的所有文件
/var/log/nginx
/var/cache/nginx
[root@java34master /]# rm -rf /var/log/nginx  #逐个删除
[root@java34master /]# rm -rf /var/cache/nginx
  • 重启
reboot

2 通过压缩包安装nginx

  • 在nginx官网下载压缩包

image-20210615105603022

  • 上传到/usr/soft下

    image-20210615105545868*

  • 解压缩

[root@java34master soft]# pwd
/usr/soft
[root@java34master soft]# tar -zxvf nginx-1.14.2.tar.gz
...
[root@java34master soft]# ll
...
drwxr-xr-x   8 1001 1001       158 12月  4 2018 nginx-1.14.2
-rw-r--r--   1 root root   1015384 6月  15 10:54 nginx-1.14.2.tar.gz
...
  • 在线下载:fdfs的nginx插件
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip
  • 解压缩插件
[root@java34master soft]# yum install zip unzip -y
[root@java34master soft]# unzip 5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip 

[root@java34master soft]# ll
总用量 196136
-rw-r--r--   1 root root     21051 6月  15 10:58 5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip
...
drwxr-xr-x   3 root root        47 4月  14 2017 fastdfs-nginx-module-5e5f3566bbfa57418b5506aaefbe107a42c9fcb1
...
  • 重命名
[root@java34master soft]# mv fastdfs-nginx-module-5e5f3566bbfa57418b5506aaefbe107a42c9fcb1 fastdfs-nginx-module
[root@java34master soft]# ll
...
drwxr-xr-x   3 root root        47 4月  14 2017 fastdfs-nginx-module
...
  • 测试安装环境
[root@java34master soft]# cd /usr/soft/nginx-1.14.2  #进入nginx的目录
[root@java34master nginx-1.14.2]# ./configure --prefix=/usr/soft/nginx_fdfs --add-module=/usr/soft/fastdfs-nginx-module/src
# 指定nginx的安装位置为/usr/soft/nginx_fdfs  
# 指定插件位置为/usr/soft/fastdfs-nginx-module/src
  • 编译
[root@java34master nginx-1.14.2]# mkdir /usr/soft/nginx_fdfs   #创建nginx的安装目录
[root@java34master nginx-1.14.2]# make    #必须在nginx的目录下执行
  • 编译报错处理方式
#如果编译报错:
[root@java37master nginx-1.14.2]# make
make: *** 没有规则可以创建“default”需要的目标“build”。 停止。
#执行一下命令:安装nginx的依赖
[root@java37master nginx-1.14.2]# yum -y install gcc openssl spenssl-devel pcre-devel zlib zlib-devel
[root@java37master nginx-1.14.2]# yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel gcc
#再次测试环境
[root@java37master nginx-1.14.2]# ./configure --prefix=/usr/soft/nginx_fdfs --add-module=/usr/soft/fastdfs-nginx-module/src
#继续编译
[root@java34master nginx-1.14.2]# make    #必须在nginx的目录下执行
  • 安装
[root@java34master nginx-1.14.2]# make install    #必须在nginx的目录下执行
  • 查看版本
[root@java34master nginx-1.14.2]# /usr/soft/nginx-1.14.2/objs/nginx -v
nginx version: nginx/1.14.2
  • 创建配置文件1:/etc/fdfs/mod_fastdfs.conf
[root@java34master src]# cp /usr/soft/fastdfs-nginx-module/src/mod_fastdfs.conf  /etc/fdfs   #复制fastdfs-nginx-module/src/mod_fastdfs.conf 到 /etc/fdfs下

[root@java34master src]#  vim /etc/fdfs/mod_fastdfs.conf   #:set number 可以显示行数
# 40行指定tracker的位置
tracker_server=192.168.254.128:22122

# 53行 指定文件上传下载时 需要指定group
url_have_group_name = true

#60行指定storage存放文件的位置
store_path0=/usr/soft/fastdfs-5.11-file/storage/files
  • 修改配置文件2:/usr/soft/nginx_fdfs/conf/nginx.conf
[root@java34master conf]# pwd
/usr/soft/nginx_fdfs/conf
[root@java34master conf]# vim nginx.conf
user  root;  #指定用户  #第一行
...
http {
    ...
    server {
        ...
        #添加fdfs的配置
         location /group1/M00 {
                   root /usr/soft/fastdfs-5.11-file/storage/files/data;
                   ngx_fastdfs_module;
         } 
        # 如果请求的url目录中有/group1/M00 就把此目录转换为 
        # /usr/soft/fastdfs-5.11-file/storage/files/data
    }
    ...
}
  • 开启nginx

[root@java34master sbin]# pwd
/usr/soft/nginx_fdfs/sbin
[root@java34master sbin]# ./nginx   #开启nginx
[root@java34master sbin]# ps -ef | grep "nginx"   #查看nginx相关进程
root       9118      1  0 11:48 ?        00:00:00 nginx: master process ./nginx
nobody     9119   9118  0 11:48 ?        00:00:00 nginx: worker process
root       9121   1215  0 11:49 pts/0    00:00:00 grep --color=auto nginx
[root@java34master sbin]# ./nginx -s reload  #重启nginx
[root@java34master sbin]# ./nginx -s stop    #关闭nginx
  • 开启fdfs的两个节点:tracker+storage
[root@java26master sbin]# fdfs_trackerd /etc/fdfs/tracker.conf start #开启tracker
[root@java26master sbin]# fdfs_storaged /etc/fdfs/storage.conf start #开启storage
[root@java26master sbin]# ps -ef | grep fdfs   #查看进程
root       4027      1  0 10:46 ?        00:00:05 fdfs_trackerd /etc/fdfs/tracker.conf start
root       4046      1  0 10:51 ?        00:00:07 fdfs_storaged /etc/fdfs/storage.conf start
root       8499   2154  0 17:53 pts/0    00:00:00 grep --color=auto fdfs
  • 测试文件上传
[root@java26master sbin] cd ~   #切换到跟目录
[root@java26master ~] echo 3+3=6 > 3.txt  #创建文件
[root@java26master ~]#  fdfs_test /etc/fdfs/client.conf upload /root/3.txt  #上传文件
...
example file url: http://192.168.2.128/group1/M00/00/00/wKgCgF-IHJmAG6MMAAAACs7qhLU501.txt
...

image-20210615130715069

  • 修改1: 启动nginx时 最好指定配置文件
[root@java34master sbin]# pwd
/usr/soft/nginx_fdfs/sbin
[root@java34master sbin]# ./nginx -c /usr/soft/nginx_fdfs/conf/nginx.conf -s reload 
  • 修改2: /usr/soft/nginx_fdfs/conf/nginx.conf
[root@java34master conf]# pwd
/usr/soft/nginx_fdfs/conf
[root@java34master conf]# vim nginx.conf
user  root;  #指定用户  #第一行
...
http {
    ...
    server {
        ...
        #添加fdfs的配置
         location /group1/M00 {
                   #root /usr/soft/fastdfs-5.11-file/storage/files/data;
                   #不需要再指定具体目录  只需要通过ngx_fastdfs_module
                   # 此请求交给nginx_fdfs的插件取处理   
                   #在插件的配置文件中指定了storage的存放文件的目录
                   ngx_fastdfs_module;
         } 
        # 如果请求的url目录中有/group1/M00 就把此目录转换为 
        # /usr/soft/fastdfs-5.11-file/storage/files/data
    }
    ...
}

3 通过javaAPI操作fdfs实现文件删除/下载/修改

  • 下载fdfs的客户端压缩包
fastdfs-client-java-master.zip
  • 解压缩

image-20210615144314601

  • 使用maven打包此项目

image-20210615144521965

  • 查看jar 存放的位置

image-20210615144702369

  • 在云盘项目中添加依赖
<!--引入fdfs的客户端-->
<dependency>
    <groupId>org.csource</groupId>
    <artifactId>fastdfs-client-java</artifactId>
    <version>1.29-SNAPSHOT</version>
</dependency>
  • 创建配置文件 指定tracker的位置

image-20210615145338770

  • 创建fdfs的工具类
package com.zhiyou100.util;
import org.csource.fastdfs.*;
import java.util.Arrays;
public class FdfsUtil {
    static{
         ClientGlobal.init("tracker.conf");
    }
    public static void main(String[] args)throws Exception{
        //upload("d:/imgs/00.jpg");
        download("group1","M00/00/00/wKj-gGDIUMmAK7HjAAA9JxdpQHI14..jpg","d:/");
    }
    //文件删除:返回0成功  返回其他失败
    public static  int delete(String groupName,String fileName)throws Exception{
        //获取tracker的客户端
        TrackerClient tc=new TrackerClient();
        //获取tracker的服务器端
        TrackerServer ts=tc.getTrackerServer();
        //获取storage的客户端
        StorageClient sc=new StorageClient(ts);
        //调用stroage客户端的方法 进行文件操作
        //参数1:组名
        //参数2:文件名:  如M00/00/00/wKgCgF-JA5uAGSfAAAA9JxdpQHI55..jpg
        int result=sc.delete_file(groupName,fileName);
        System.out.println(result);
        //关闭连接
        sc.close();
        return result;
    }
    //文件下载:返回0成功  返回其他失败 使用于java项目
    public static  int download(String groupName,String fileName,String muDiPath)throws Exception{
       
        TrackerClient tc=new TrackerClient();
        TrackerServer ts=tc.getTrackerServer();
        StorageClient sc=new StorageClient(ts);
        //参数1:组名
        //参数2:文件名:  如M00/00/00/wKgCgF-JA5uAGSfAAAA9JxdpQHI55..jpg
        //参数3: 目的文件的名字  后缀名需要和源文件一致
        int result=sc.download_file(groupName,fileName,muDiPath+"/"+(fileName.substring(fileName.lastIndexOf("/"))));
        System.out.println(result);
        sc.close();
        return result;
    }
    //文件下载:返回字节数组 适用于web项目
    public static  byte[] download(String groupName,String fileName)throws Exception{
        TrackerClient tc=new TrackerClient();
        TrackerServer ts=tc.getTrackerServer();
        StorageClient sc=new StorageClient(ts);
        //参数1:组名
        //参数2:文件名:  如M00/00/00/wKgCgF-JA5uAGSfAAAA9JxdpQHI55..jpg
        byte[] arr=sc.download_file(groupName,fileName);
        System.out.println(arr.length+":::;");
        sc.close();
        return arr;
    }
    //文件上传 适用于java项目
    public static  String[] upload(String fileName)throws Exception{
        TrackerClient tc=new TrackerClient();
        TrackerServer ts=tc.getTrackerServer();
        StorageClient sc=new StorageClient(ts);
        //获取文件后缀名
        String hzm=fileName.substring(fileName.lastIndexOf('.'));
        //第一个参数 文件对应的字节数组
        //第二个参数 文件的后缀名
        //第三个参数  文件的属性信息  可以不用设置
        String[] arr=sc.upload_file(fileName,hzm,null);
        System.out.println(Arrays.toString(arr));
        sc.close();
        return arr;
    }
    //文件上传 适用于web项目
    public static  String[] upload(byte[] bytes,String fileName)throws Exception{
        TrackerClient tc=new TrackerClient();
        TrackerServer ts=tc.getTrackerServer();
        StorageClient sc=new StorageClient(ts);
        //获取文件后缀名
        String hzm=fileName.substring(fileName.lastIndexOf('.'));
        //第一个参数 文件对应的字节数组
        //第二个参数 文件的后缀名
        //第三个参数  文件的属性信息  可以不用设置
        String[] arr=sc.upload_file(bytes,hzm,null);
        System.out.println(Arrays.toString(arr));
        sc.close();
        return arr;
    }
}
  • 测试上传

image-20210615150923227

  • 测试下载

image-20210615151013635

4 修改cloud云盘项目 master单机测试

  • 注意只需要nginx对文件上传和下载的url进行转换
#添加fdfs的配置
location /group1/M00 {
        #root /usr/soft/fastdfs-5.11-file/storage/files/data;
        #不需要再指定具体目录  只需要通过ngx_fastdfs_module
        # 此请求交给nginx_fdfs的插件取处理   
        #在插件的配置文件中指定了storage的存放文件的目录
        ngx_fastdfs_module;
} 

1 更改MyFileController:文件上传

//1 文件上传
@RequestMapping(value="/upload.action",method = RequestMethod.POST)
public ResponseVO<String> uploadMethod(MyDirectory myDirectory, @RequestParam("dfile")MultipartFile file, HttpServletRequest req)throws Exception{
    //由文件获取md5
    String fileMd5=DigestUtils.md5DigestAsHex(file.getBytes());
    //查询数据库  如果数据库中存在此md5  说明相同内容的文件已经存在
    MyFile myFile=myFileService.getOneByFmd5(fileMd5);
    if(myFile==null){
        //上传
        String fileName=file.getOriginalFilename();
        //            String path=req.getSession().getServletContext().getRealPath("/imgs");
        //            File muDi=new File(path,System.currentTimeMillis()+"_"+fileName);
        //            file.transferTo(muDi);

        //上传文件到fdfs上
        String[] arr=FdfsUtil.upload(file.getBytes(),fileName);
        //arr:::[group1, M00/00/00/wKg4gGHJZl6AMEBOAABpCgmw5e038..jpg]
        myFile=new MyFile();
        myFile.setFmd5(fileMd5);
        myFile.setFsize((int)(file.getSize()/1024));//数据库存储的文件大小以kb为单位
        myFile.setFurl(arr[0]+"-"+arr[1]);
        myFileService.addOne(myFile);
    }
    myFile=myFileService.getOneByFmd5(fileMd5);
    //创建mydirectory
    myDirectory.setDtype(1);//文件类型
    myDirectory.setDtime(new Date());
    myDirectory.setDsize(myFile.getFsize());
    myDirectory.setDprivate(0);
    myDirectory.setDfid(myFile.getFid());
    myDirectoryService.addOne(myDirectory);
    return new ResponseVO<String>(200,"文件上传成功!",null);
}

2 更改MyFileController:文件下载

//2 文件下载
@RequestMapping(value="/download.action",method = RequestMethod.GET)
public ResponseEntity<byte[]> downloadMethod(int fid,HttpServletRequest req)throws Exception{
    MyFile myFile=myFileService.getOneByFid(fid);
    //获取文件的类型
    String type=req.getSession().getServletContext().getMimeType(myFile.getFurl());
    //获取真实路径
    //       String path=req.getSession().getServletContext().getRealPath("/imgs");
    //        File yuanFile=new File(path,myFile.getFurl());
    //        byte[] arr= FileUtils.readFileToByteArray(yuanFile);

    //fdfs文件下载
    String url=myFile.getFurl();
    String fileGroup=url.substring(0,url.indexOf("-"));
    String fileName=url.substring(url.indexOf("-")+1);
    byte[] arr=FdfsUtil.download(fileGroup,fileName);
    //创建heander对象  响应头
    HttpHeaders headers=new HttpHeaders();
    headers.set("Content-Type", type);
    headers.set("Content-Disposition", "attachment;filename="+ URLEncoder.encode(myFile.getFurl(), "utf-8"));
    //获取源文件
    //context.get
    ResponseEntity<byte[]>  entity=new ResponseEntity<byte[]>(arr,headers, HttpStatus.OK);
    return entity;
}

3 修改页面:index.jsp

<c:url  value="/" var="path" scope="page"/>
<!--1.1 引入min.css-->
<link type="text/css" rel="stylesheet" href="${pageScope.path}/bootstrap-3.3.7-dist/css/bootstrap.min.css"/>
...
<!--1.3 引入jquery-->
<script type="text/javascript" src="${pageScope.path}/js/jquery-3.3.1.min.js"></script>
<!--0:定义全局变量-->
<script type="text/javascript">
    var uid;
    var dfu="0";
    var path="${pageScope.path}/";
</script>
...
<div class="form-group">
    <label class="control-label">验&nbsp;证&nbsp;码:</label>
    <img src="${pageScope.path}/user/yzmImg.action"  id="img_yzm" />
    <input type="text" class="form-control"  name="uyzm" value="1234">
</div>
...
//更改验证码
<script type="text/javascript">
    $("#img_yzm").bind("click",function(){
         $("#img_yzm").attr("src","${pageScope.path}/user/yzmImg.action?n="+Math.random());
    });
</script>

4 打包项目 到master上

  • 删除master的tomcat/webapps下所有cloud的文件
[root@java34master webapps]# pwd
/usr/soft/tomcat9.0/webapps
[root@java34master webapps]# rm -rf test05*
  • 上传
[root@java34master webapps]# ll
总用量 17740
...
-rw-r--r--   1 root root 18160870 6月  15 15:37 test05_cloud.war

5 开启redis

  • 开启redis的服务器端
[root@java34master ~]# cd /usr/soft/redis/bin
[root@java34master bin]# ./redis-server redis.conf
  • 开启redis的客户端
[root@java34master ~]# cd /usr/soft/redis/bin
[root@java34master bin]# ./redis-cli
  • 验证登录密码
127.0.0.1:6379> config set requirepass 123456  #如果永久设置成功 此命令不需要再执行
OK
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> keys *
1) "name1"
127.0.0.1:6379> 

6 开启master上的tomcat和日志监控

[root@java34master ~]# cd /usr/soft/tomcat9.0/bin
[root@java34master bin]# startup.sh
...  
Tomcat started.
[root@java34master bin]# tail -f /usr/soft/tomcat9.0/logs/catalina.out

7 开启nginx

[root@java34master sbin]# pwd
/usr/soft/nginx_fdfs/sbin
[root@java34master sbin]# ./nginx -c /usr/soft/nginx_fdfs/conf/nginx.conf -s reload
ngx_http_fastdfs_set pid=11512

8 通过浏览器访问

image-20210615155604269

  • tomcat打印的信息
JDBC Connection [com.mysql.jdbc.JDBC4Connection@7d1af994] will not be managed by Spring
==>  Preparing: select * from tab_my_file where fid=? 
==> Parameters: 209(Integer)
<==    Columns: fid, fsize, furl, fmd5
<==        Row: 209, <<BLOB>>, group1/M00/00/00/wKj-gGDIXH2AeXlVAAFdayjJ2sY74..jpg, c97c85de53887055f4f7ad1e2c7f803e
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1973bf12]

  • 在storage中查看

image-20210615155654100

5 集群实现:

5.1 更改项目:需要动静分离 使用index.html 而不是index.jsp

  • 所有的url都更改为http://192.168.56.128:80/cloud37
<link type="text/css" rel="stylesheet" href="http://192.168.56.128:80/cloud37/bootstrap-3.3.7-dist/css/bootstrap.min.css"/>

var path = "http://192.168.56.128:80/cloud37/";

<img src="http://192.168.56.128:80/cloud37/user/yzmImg.action" id="img_yzm"/>

$("#img_yzm").attr("src", "http://192.168.56.128:80/cloud37/user/yzmImg.action?n=" + Math.random());

5.2 在master上创建文件夹 /usr/share/nginx

5.3 把所有的静态资源文件夹cloud37上传到/usr/share/nginx下

[root@java37master cloud37]# pwd
/usr/share/nginx/cloud37
[root@java37master cloud37]# ll
总用量 44
drwxr-xr-x 6 root root    51 12月 27 16:09 bootstrap-3.3.7-dist
drwxr-xr-x 2 root root     6 12月 27 16:09 css
drwxr-xr-x 2 root root   249 12月 27 16:09 imgs
-rw-r--r-- 1 root root 20318 12月 27 16:09 index.html
-rw-r--r-- 1 root root 22377 12月 27 16:09 index.jsp
drwxr-xr-x 2 root root    68 12月 27 16:09 js

5.4 更改nginx的配置文件: /usr/soft/nginx_fdfs/conf/nginx.conf

[root@java37master nginx]# cd /usr/soft/nginx_fdfs/conf/
[root@java37master conf]# cat nginx.conf
user root; #指定用户名

worker_processes  1;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;
	
	#为三台服务器对应的集群 起个名字
	upstream cloudserver
	{
	   #1轮训  默认
	   #2权重
	   #  #weight:指定比例
	   #    #fail_timeout:指定最大等待时间
	   #server 192.168.56.128:8080 weight=1 fail_timeout=10s;
	   #server 192.168.56.129:8080 weight=1 fail_timeout=10s;
	   #server 192.168.56.130:8080 weight=4 fail_timeout=10s;
	   
	   #3ip_hash
	   #ip_hash;
	   #server 192.168.56.128:8080 fail_timeout=10s;
	   #server 192.168.56.129:8080 fail_timeout=10s;
	   #server 192.168.56.130:8080 fail_timeout=10s;
	   #
	   
	   #4 fair
	   #server 192.168.56.128:8080;
	   #server 192.168.56.129:8080;
	   #server 192.168.56.130:8080;
	   #fair;
	   #
	   
	   #5 url_hash
	   #server 192.168.56.128:8080 fail_timeout=10s;
	   #server 192.168.56.129:8080 fail_timeout=10s;
	   #server 192.168.56.130:8080 fail_timeout=10s;
	   #hash $request_uri;

	   server 192.168.56.128:8080;
	   server 192.168.56.129:8080;
	   server 192.168.56.130:8080;
	}

    server {
        listen       80;
        #指定nginx的主机的ip地址 master的ip
        server_name  192.168.56.128;
		# 图片上传下载请求url的转换
        location /group1/M00 {
               #root /usr/soft/fastdfs-5.11-file/storage/files/data;
               ngx_fastdfs_module;
        }
		 #动静分离
	    location ~ .*\.(html|css|js|eot|svg|ttf|woff|woff2)$
	    {
			   root  /usr/share/nginx;
	    }

	    #指定url的转换规则
	    location  /cloud37{
		    proxy_pass  http://cloudserver/java37_08_cloud;
		    #设置rsids的session共享:需要指定/cloud34和/test05_cloud是同一个目录
		    proxy_cookie_path  /java37_08_cloud /cloud37;
	    }
	   #浏览器请求:http://192.168.56.128:80/cloud37 时 会被nginx解析为
	   #http://192.168.56.128:8080/java37_08_cloud
	   #http://192.168.56.129:8080/java37_08_cloud
	   #http://192.168.56.130:8080/java37_08_cloud
	   
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
}

5.5 重启nginx

[root@java37master sbin]# pwd
/usr/soft/nginx_fdfs/sbin
[root@java37master sbin]#  ./nginx -c /usr/soft/nginx_fdfs/conf/nginx.conf -s reload

5.6 启动redis

[root@java34master ~]# cd /usr/soft/redis/bin
[root@java34master bin]# ./redis-server redis.conf
[root@java34master bin]# ./redis-cli

5.7 关闭三个服务器上的tomcat

5.8 清空三个服务器的webapps下的所有java*文件夹

5.9 把war添加到三台服务器的webapps下 并启动tomcat 并开启日志监控

5.10 浏览器访问

posted @ 2022-01-03 22:07  RenVei  阅读(675)  评论(0编辑  收藏  举报