FastDFS是一个轻量级的分布式文件系统,在实际生产环境往往以集群的形式部署,保证了服务的高可用。本文重点阐述FastDFS集群的搭建和项目实战。

工作流程

上传流程图

下载流程图

基本概念可参考作者上篇文章:FastDFS极速入门

底层原理

  • FastDFS不会对文件进行分块存储,直接保存到Storage服务上,这也是不适合超大文件存储的原因,官方建议(4K~500M),优点:简介高效。

  • FastDFS采用分组存储方式,同一组可以包括多个Storage Server,其中一个Storage接收到上传的文件,会同步文件到同组其他Storage Server。

  • 一个组的存储容量为组内Storage Server容量最小的那个。优点:组内服务压力较大时可以增加Storage Server来缓解压力;系统容量不足时增加组来获得更大的存储空间。

  • 文件上传成功返回的文件ID由组名,磁盘目录和文件名构成。

集群服务器规划

  • 系统环境:centos 7.3

  • 跟踪服务器1(Tracker):192.168.72.135

  • 跟踪服务器2(Tracker):192.168.72.136

  • 存储服务器1(Storage):192.168.72.135---(group1)

  • 存储服务器2(Storage):192.168.72.136---(group1)

  • 存储服务器3(Storage):192.168.72.137---(group2)

由于电脑性能有限,但要模拟多group,只虚拟了3个节点,对group1做了两个节点来备份数据,group2为单节点,生产环境要每个组至少两个节点来保证高可用。

安装包

  • fastdfs-5.11.tar.gz

  • fastdfs-nginx-module-master.zip

  • libfastcommon-1.0.36.tar.gz

  • nginx-1.8.1.tar.gz

集群部署

Tracker和Storage部署

  • 1:节点1,节2,节点3分别安装FastDFS,具体安装参考上篇文章:FastDFS极速入门

  • 2:分别关闭三个节点的防火墙,或者配置防火墙开放端口,关闭防火墙: systemctl stop firewalld

  • 3:修改节点1的tracker.conf配置文件:

    >mkdir /data/fdfs-tracker

    >vi /etc/fdfs/tracker.conf

    把base_path修改为:base_path=/data/fdfs-tracker

  • 4:修改节点2的tracker.conf配置文件:同上

  • 5:修改节点1的storage.conf配置文件:

    > mkdir /data/fdfs-storage/base

    > mkdir /data/fdfs-storage/storage0

    >vi /etc/fdfs/storage.conf

    把group_name修改为:group_name=group1

    把base_path修改为:base_path=/data/fdfs-storage/base

    把store_path0修改为:store_path0=/data/fdfs-storage/storage0

    把tracker_server修改两个tracker节点地址:

    tracker_server=192.168.72.135:22122

    tracker_server=192.168.72.136:22122

  • 6:修改节点2的storage.conf配置文件,同步骤5。

  • 7:修改节点3的storage.conf配置文件,

    把group_name修改为:group_name=group2

    其他同步骤5。

  • 8:节点1,节点2上启动tracker服务

    >service fdfs_trackerd start

  • 9:节点1,节点2和节点3上启动storage服务

    >service fdfs_storaged start

Tracker和Storage安装完成,可以使用FastDFS自带的客户端进行上传下载测试,具体操作方法,参考上篇

fastdfs-nginx-module和nginx安装

  • 所有节点安装fastdfs-nginx-module模块

  • fastdfs-nginx-module模块作用:

    文件上传到组内一个storage存储后,storage服务会吧文件同步到组内其他storage,这就存在时间延时问题,如果此时客户端通过nginx访问到还未同步完成的组内其他storage会导致文件不存在无法访问错误,fastdfs-nginx-module可以解决该问题的发生,通过重定向到源storage节点来获取文件。

  • root目录解压fastdfs-nginx-module:

    >unzip fastdfs-nginx-module.zip

  • 安装依赖包:

    >yum install gcc gcc-c++ make automake autoconf libtool pcre* zlib openssl openssl-devel

  • 安装nginx

    >tar -zxvf nginx-1.8.1.tar.gz

    >cd nginx-1.8.1

    >./configure  --prefix=/opt/nginx  --add-module=/roo/fastdfs-nginx-module/src

    >make && make install

  • 复制fastdfs-nginx-module中配置文件到/etc/fdfs目录,并修改配置文件:

    >cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs

    >vi  /etc/fdfs/mod_fastdfs.conf

    tracker_server修改为:

    tracker_server=192.168.72.135:22122

    tracker_server=192.168.72.136:22122

    group_name修改为:

    节点1:group_name=group1

    节点2:group_name=group1

    节点3:group_name=group2

    url_have_group_name修改为:

    url_have_group_name = true

  • 复制FastDFS部分配置文件到/etc/fdfs目录:

    > cd /root/fastdfs-5.1/conf

    >cp http.conf  mime.types  /etc/fdfs/

  • 修改nginx.conf配置文件:

  • 启动nginx:

    >./nginx  -c  conf/nginx.conf

到此FastDFS集群已经搭建完成,文件上传后可以通过任意storage节点上的nginx来获得文件

实战

  • FastDFS提供了C,PHP和java客户端,选用java客户端来进行实战。

    创建maven工程,pom.xml文件添加依赖:

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

添加配置文件

  • src/main/resoureces目录下添加fdfs_clent.conf配置文件,内容如下:

connect_timeout = 60
network_timeout = 60
charset = UTF-8
http.tracker_http_port = 8080
http.anti_steal_token = no
#tracker服务地址
tracker_server = 192.168.72.135:22122
tracker_server = 192.168.72.136:22122

创建FdfsClient类

  • 静态代码块:

    private static StorageClient1 storageClient1 = null;
    private static String trackerServerUrl = null;
    //初始化FastDFS Client
    static{
        try{
            ClientGlobal.init("src/main/resources/fdfs_client.conf");
            TrackerClient trackerClient = new TrackerClient(ClientGlobal.g_tracker_group);
            TrackerServer trackerServer = trackerClient.getConnection();
            if (trackerServer == null){
                System.out.println("getConnect  return null");
            }
            trackerServerUrl = trackerServer.getInetSocketAddress().getHostString();
            System.out.println("trackerServerUrl"  + trackerServerUrl);
            StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
            if (storageServer == null){
                System.out.println("getStoreStorage return null");
            }
            storageClient1 = new StorageClient1(trackerServer,storageServer);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

文件上传

  public static String uploadFile(File file, String fileExt, Map<String,String> metaList) {
        try {
            byte[] buff = FileUtils.getFileByte(file);
            NameValuePair[] nameValuePairs = null;
            if (metaList != null) {
                nameValuePairs = new NameValuePair[metaList.size()];
                int index = 0;
                for (Iterator<Map.Entry<String,String>> iterator = metaList.entrySet().iterator(); iterator.hasNext();) {
                    Map.Entry<String,String> entry = iterator.next();
                    String name = entry.getKey();
                    String value = entry.getValue();
                    nameValuePairs[index++] = new NameValuePair(name,value);
                }
            }
           return "http://"+ trackerServerUrl + "/" + storageClient1.upload_file1(buff, fileExt, nameValuePairs);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

文件下载

    public static int downloadFile(String fileId, String filePath,String fileName) {
        FileOutputStream fos = null;
        try {
            byte[] content = storageClient1.download_file1(fileId);
            FileUtils.getFile(content,  filePath, fileName);
            return 0;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return -1;
    }

获得文件属性

    public static Map<String,String> getFileMetadata(String fileId) {
        try {
            NameValuePair[] metaList = storageClient1.get_metadata1(fileId);
            if (metaList != null) {
                HashMap<String,String> map = new HashMap<String, String>();
                for (NameValuePair metaItem : metaList) {
                    map.put(metaItem.getName(),metaItem.getValue());
                }
                return map;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

文件删除

    public static int deleteFile(String fileId) {
        try {
            return storageClient1.delete_file1(fileId);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return -1;
    }

【开源组件】FastDFS集群搭建与实战的更多相关文章

  1. redis5.0.0集群搭建【实战经历】

    redis集群搭建 作者:陈土锋 时间:2020年6月2日 目录 一.环境介绍... 1 1.机器准备... 1 2.关闭防护墙和selinux. 1 3.时间同步... 1 二.Redis Clus ...

  2. Fastdfs集群搭建

    1.关于集群,网上说最少要三台,其实也没必要,两台就够了 2.实验环境 192.168.2.201 tracker.storage.nginx + fastdfs-nginx-module-maste ...

  3. .NET Core+MongoDB集群搭建与实战

    目录 安装 MongoDB apt 直接安装(方法1) apt 仓库安装(方法2) 方法1.2启动 MongoDB 通过二进制包安装(方法3) 安装依赖 deb 安装 MongoDB tgz 安装 M ...

  4. fastdfs 集群搭建

    1.部署FastDFS及Nginx (本套FastDFS为简化版安装部署,只需解压至普通用户家目录下或者任意目录,解压后修改脚本,执行脚本后即可使用.) 说明:FastDFS分为tracker(默认端 ...

  5. 19.fastDFS集群理解+搭建笔记

    软件架构理解 1FastDFS介绍 1.1什么是FastDFS FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并 ...

  6. fastdfs集群版搭建(一)- storage集群搭建与统一入口访问

    前言 接着上篇博客:详细的最新版fastdfs单机版搭建,今天来讲讲fastdfs的集群搭建,限于篇幅,今天先搭建stoarge集群,并实现统一的http访问方式: 没看我上篇博客的小伙伴,最好先去瞅 ...

  7. 手把手教你搭建FastDFS集群(上)

    手把手教你搭建FastDFS集群(上) 本文链接:https://blog.csdn.net/u012453843/article/details/68957209        FastDFS是一个 ...

  8. FastDFS教程IV-文件服务器集群搭建

    1.简介     本文主要介绍FastDFS文件服务器的集群搭建,在阅读本文之前,您需具备FastDFS文件服务器单节点安装,扩容,迁移等方面的知识.同时,您还需了解Keepalived,nginx方 ...

  9. FastDFS+nginx+keepalived集群搭建

    安装环境 nginx-1.6.2 libfastcommon-master.zip FastDFS_v5.05.tar.gz(http://sourceforge.net/projects/fastd ...

随机推荐

  1. 在MyEclipse中怎么修改Servlet模板

    原Servlet模板实例 package www.csdn.net.servlet; import java.io.IOException; import java.io.PrintWriter; i ...

  2. Get Current LOV Query SQL

    --3 click the lov object activing last query address.  SELECT T.SQL_TEXT    FROM V$SQLTEXT_WITH_NEWL ...

  3. java中的软引用,弱引用,虚引用

    http://zh.wikipedia.org/wiki/%E5%BC%B1%E5%BC%95%E7%94%A8 有些语言包含多种强度的弱引用.例如Java,在java.lang.ref[1]包中定义 ...

  4. PostgreSQL操作数据表

    1.创建表(SysUser) create table "SysUsers"( "UserId" serial, --用户Id,自增 "LoginNa ...

  5. npm 安装less

    npm install less less-loader --save 在style加上lang="less" 就可以直接用了

  6. C++ windows进程间通信

    最近一直在找共享内存同步的操作,恰好这篇文章有讲解.本文转载:https://blog.csdn.net/bing_bing_bing_/article/details/82875302 方便记录,c ...

  7. 开源应用框架BitAdminCore:更新日志20180903

    索引 NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:https://www.bitadmincore.com 框架源码:https://github.com/chenyi ...

  8. 线上日志集中化可视化管理:ELK

    本文来自网易云社区 作者:王贝 为什么推荐ELK: 当线上服务器出了问题,我们要做的最重要的事情是什么?当需要实时监控跟踪服务器的健康情况,我们又要拿什么去分析?大家一定会说,去看日志,去分析日志.是 ...

  9. ubuntu 关闭和开启防火墙

    1.关闭ubuntu的防火墙 ufw disable 2开启防火墙 ufw enable 3.卸载了iptables apt-get remove iptables 4.关闭ubuntu中的防火墙的其 ...

  10. java学习笔记—HttpServletResponse(21)

    public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, ...