基于springboot开发项目架构之FastDFS

fastDSF介绍

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

​ 为什么要使用fastDFS呢?

​ 上边介绍的NFS、GFS都是通用的分布式文件系统,通用的分布式文件系统的优点的是开发体验好,但是系统复杂性高、性能一般,而专用的分布式文件系统虽然开发体验性差,但是系统复杂性低并且性能高。fastDFS非常适合存储图片等那些小文件,fastDFS不对文件进行分块,所以它就没有分块合并的开销,fastDFS网络通信采用socket,通信速度很快。
fastDSF架构

​ FastDFS架构包括 Tracker server追踪服务器和Storage server存储服务器。客户端请求Tracker server进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载。
Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。
在这里插入图片描述文件上传流程
在这里插入图片描述 文件下载流程
在这里插入图片描述1 FastDFS 安装
FastDFS是C语言开发,建议在linux上运行,本教程使用CentOS7作为安装环境。
1.1 安装 VMware 虚拟机
安装 CentOS7 虚拟机。
1.2 FastDFS–tracker 安装
分别在 192.168.101.3 和 192.168.101.4 上安装 tracker。
注:初次安装可只安装一台 tracker,快速体验。
1.2.1 下载
tracker 和 storage 使用相同的安装包,下载地址:
https://github.com/happyfish100/FastDFS
本教程下载:FastDFS_v5.05.tar.gz
1.2.2 FastDFS 安装环境
FastDFS 是 C 语言开发,建议在 linux 上运行,本教程使用 Centos7 作为安
装环境。
安装 FastDFS 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果
没有 gcc 环境,需要安装 gcc:yum install gcc-c++
1.2.3 安装 libevent
FastDFS 依赖 libevent 库,需要安装:
yum -y install libevent
1.2.4 安装 libfastcommon
libfastcommon 是 FastDFS 官方提供的,libfastcommon 包含了 FastDFS 运行所需
要的一些基础库。
将 libfastcommonV1.0.7.tar.gz 拷贝至/usr/local/下
cd /usr/local
tar -zxvf libfastcommonV1.0.7.tar.gz
cd libfastcommon-1.0.7
./make.sh
./make.sh install
注意:libfastcommon 安装好后会自动将库文件拷贝至/usr/lib64 下,由于 FastDFS 程
序引用 usr/lib 目录所以需要将/usr/lib64 下的库文件拷贝至/usr/lib 下。
要拷贝的文件如下:
libfastcommon.so

1.2.5 tracker 编译安装
将 FastDFS_v5.05.tar.gz 拷贝至/usr/local/下
tar -zxvf FastDFS_v5.05.tar.gz
cd FastDFS
./make.sh 编译
./make.sh install 安装
安装成功将安装目录下的 conf 下的文件拷贝到/etc/fdfs/下。
配置
fastDFS的配置文件目录 :/etc/fdfs
主要的配置文件:/etc/fdfs/tracker.conf (tracker配置文件 );storage.conf(storage配置文件)
安装成功后进入/etc/fdfs 目录:
在这里插入图片描述tracker.conf配置内容如下:

端口:port=22122
存储策略:store_lookup=
​ 取值范围:0(轮询向storage存储文件)、1(指定具体的group)、2负载均衡,选择空闲的storage存储

指定具体的group:store_group= 如果store_lookup设置为1则这里必须指定一个具体的group。

tracker 基础目录:base_path=/home/fastdfs,tracker在运行时会向此目录存储storage的管理数据。

启动
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
启动的日志显示先停止 5619 进程(实际环境不是 5619)再启动
在这里插入图片描述注意:如果没有显示上图要注意是否正常停止原有进程。
FastDFS–storage 安装
分别在 192.168.101.5、192.168.101.6、192.168.101.7、192.168.101.8 上安装 storage。
注:初次安装可只安装一台 storage,快速体验
安装 libevent
同 tracker 安装
安装 libfastcommon
同 tracker 安装。
storage 编译安装
同 tracker 编译安装。
配置
storage.conf配置 内容如下:

组名:group_name=group1

端口:port=23000

向tracker心跳间隔(秒):heart_beat_interval=30

storage基础目录:base_path=/home/fastdfs

磁盘存储目录,可定义多个store_path:

store_path0=/home/fastdfs/fdfs_storage 此目录下存储上传的文件,在/home/fastdfs/fdfs_storage/data下

store_path1=…

上报tracker的地址:tracker_server=192.168.101.64:22122

如果有多个tracker则配置多个tracker,比如:

tracker_server=192.168.101.64:22122

tracker_server=192.168.101.65:22122


启动
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
启动的日志显示先停止 8931 进程(实际环境不是 8931)再启动

文件上传下载测试
搭建环境
​ 这里我们使用javaApi测试文件的上传,java版本的fastdfs-client地址在:https://github.com/happyfish100/fastdfs-client-java,参考此工程编写测试用例。

此工程采用SpringBoot创建,导入资料下边的test-fastdfs.zip,下边是一些配置文件介绍:

1)pom.xml

  <dependency>

            <groupId>net.oschina.zcx7878</groupId>

            <artifactId>fastdfs-client-java</artifactId>

            <version>1.27.0.0</version>

        </dependency>

配置 文件

在classpath:config下创建fastdfs-client.properties文件

fastdfs.connect_timeout_in_seconds = 5

fastdfs.network_timeout_in_seconds = 30

fastdfs.charset = UTF-8 

fastdfs.tracker_servers = 192.168.101.65:22122  

fastdfs.connect_timeout_in_seconds: http连接超时时间

fastdfs.network_timeout_in_seconds: tracker与storage网络通信超时时间

fastdfs.charset:字符编码

fastdfs.tracker_servers:tracker服务器地址,多个地址中间用英文逗号分隔

文件上传

 

//上传文件

@Test

public void testUpload() {try {

        ClientGlobal.initByProperties("config/fastdfs-client.properties");

        System.out.println("network_timeout=" + ClientGlobal.g_network_timeout + "ms");

        System.out.println("charset=" + ClientGlobal.g_charset);

        //创建客户端

        TrackerClient tc = new TrackerClient();

        //连接tracker Server

        TrackerServer ts = tc.getConnection();

        if (ts == null) {

            System.out.println("getConnection return null");

            return;

        }

        //获取一个storage server

        StorageServer ss = tc.getStoreStorage(ts);//创建一个storage存储客户端

        StorageClient1 sc1 = new StorageClient1(ts, ss);

        //本地文件路径

        String item = "C:\\Users\\admin\\Desktop\\1.png";

        String fileid;

        fileid = sc1.upload_file1(item, "png", null);

​

        System.out.println("Upload local file " + item + " ok, fileid=" + fileid);

    } catch (Exception ex) {

        ex.printStackTrace();

    }

}

文件查询

//查询文件

@Test

public void testQueryFile() throws IOException, MyException {

    ClientGlobal.initByProperties("config/fastdfs-client.properties");

​

    TrackerClient tracker = new TrackerClient();

    TrackerServer trackerServer = tracker.getConnection();

    StorageServer storageServer = null;

​

    StorageClient storageClient = new StorageClient(trackerServer,

            storageServer);

    FileInfo fileInfo = storageClient.query_file_info("group1", "M00/00/01/wKhlQFrKBSOAW5AWAALcAg10vf4862.png");

    System.out.println(fileInfo);

}

文件下载

 

//下载文件

@Test

public void testDownloadFile() throws IOException, MyException {

    ClientGlobal.initByProperties("config/fastdfs-client.properties");

​

    TrackerClient tracker = new TrackerClient();

    TrackerServer trackerServer = tracker.getConnection();

    StorageServer storageServer = null;

​

    StorageClient1 storageClient1 = new StorageClient1(trackerServer,

            storageServer);

    byte[] result = storageClient1.download_file1("group1/M00/00/01/wKhlQFrKBSOAW5AWAALcAg10vf4862.png");

    File file = new File("d:/1.png");

    FileOutputStream fileOutputStream = new FileOutputStream(file);

    fileOutputStream.write(result);

    fileOutputStream.close();

}

FastDFS 和 nginx 整合
nginx 代理
单独安装 nginx 代理服务,它的作用是代理访问 storage 上的文件,实现负载均衡。
nginx 的安装细节参考 nginx 文档,这里使用单机 nginx,也可以使用两台 nginx 组成高
可用或者采用 lvs+nginx 访问 Storage 上的 nginx。
创建 nginx-fdfs.conf 配置文件:
#storage 群 group1 组
upstream storage_server_group1{
server 192.168.101.5:80 weight=10;
server 192.168.101.6:80 weight=10;
}
#storage 群 group2 组
upstream storage_server_group2{
server 192.168.101.7:80 weight=10;
server 192.168.101.8:80 weight=10;
}
server {
listen 80;
server_name ccc.test.com;
location /group1{
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://storage_server_group1;
}
location /group2{
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://storage_server_group2; } }
在 Storage 上安装 nginx
在 storage server 上安装 nginx 的目的是对外通过 http 访问 storage server 上的文件。
使用 nginx 的模块 FastDFS-nginx-module 的作用是通过 http 方式访问 storage 中的文件,当 storage 本机没有要找的文件时向源 storage 主机代理请求文件。
FastDFS-nginx-module
将 FastDFS-nginx-module_v1.16.tar.gz 传 至 fastDFS 的 storage 服 务 器 的
/usr/local/下,执行如下命令:
cd /usr/local
tar -zxvf FastDFS-nginx-module_v1.16.tar.gz
cd FastDFS-nginx-module/src
修改 config 文件将/usr/local/路径改为/usr/
在这里插入图片描述
将 FastDFS-nginx-module/src 下的 mod_FastDFS.conf 拷贝至/etc/fdfs/下
cp mod_FastDFS.conf /etc/fdfs/
并修改 mod_FastDFS.conf 的内容:
vi /etc/fdfs/mod_FastDFS.conf
base_path=/home/FastDFS
tracker_server=192.168.101.3:22122
tracker_server=192.168.101.4:22122
url_have_group_name=true #url 中包含 group 名称
store_path0=/home/fastdfs/fdfs_storage #指定文件存储路径
…#如果有多个
将 libfdfsclient.so 拷贝至/usr/lib 下
cp /usr/lib64/libfdfsclient.so /usr/lib/
创建 nginx/client 目录
mkdir -p /var/temp/nginx/client
nginx 安装
将 nginx-1.8.0.tar.gz 拷贝到/usr/local 下
解压 nginx-1.8.0.tar.gz
进入 nginx-1.8.0 目录,执行如下配置命令:
下边add部分表示添加 FastDFS-nginx-module 模块
./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=/usr/local/FastDFS-nginx-module/src

make
make install
1.5.2.3 nginx 配置文件
新建一个 nginx 配置文件 nginx-fdfs.conf.
添加虚拟主机:
server {
listen 80;
server_name 192.168.101.65;
location /group1/M00/{
root /home/FastDFS/fdfs_storage/data;
ngx_FastDFS_module;
} }
说明:
server_name 指定本机 ip
location /group1/M00/:group1 为 nginx 服务 FastDFS 的分组名称,M00 是 FastDFS
自动生成编号,对应 store_path0=/home/FastDFS/fdfs_storage,如果 FastDFS 定义
store_path1,这里就是 M01

安装完成启动storage上的nginx:

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx-fdfs.conf

在nginx图片代理服务上配置图片服务器虚拟主机

#图片服务
upstream img_server_pool{
#server 192.168.101.64:80 weight=10;
server 192.168.101.65:80 weight=10;
    }  

#图片服务
server {
    listen       80;
    server_name img.fast.com;

    #个人中心
    location /group1 {  
        proxy_pass http://img_server_pool;  
    } 
}

1.5.3 测试
通过 java 客户端上传文件,使用浏览器 http 访问文件,这里访问上传图片测试的文件:
访问 storage:
http://192.168.101.5/group1/M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png
ip 地址改为 192.168.101.6 也可以访问到文件,因为同一个分组的 storage 文件互相同步。
访问 tracker:
http://192.168.101.3/group1/M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png
ip 地址改为 192.168.101.4 也可以访问到文件。
使用域名访问 (推荐):
nginx 对外由 vip 提供服务,使用域名访问如下:
比如 vip 对应的域名为 img.test.com:
http://img.test.com/group1/M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值