fastDFS安装2018.3.16

 一、FastDFS介绍

FastDFS开源地址:https://github.com/happyfish100

1、简介

FastDFS 是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。

FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。

  Tracker Server:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。

  Storage Server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。

  Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。

       刚刚开始可能对group分组不太明白,当你配置好nginx后,在运行测试类就清楚了。

二、安装FastDFS环境

0、前言

操作环境:CentOS7 X64,以下操作都是单机环境。集群研究好了在发。在此前有百度过不错的博文,在此推荐

http://blog.mayongfa.cn/192.html 同时自己也对这里面发现的一些小问题进行修改。

一、安装 libfastcommon 和 FastDFS

1.下载安装 libfastcommon ,这里是通过wget下载。

libfastcommon是从 FastDFS 和 FastDHT 中提取出来的公共 C 函数库,基础环境,安装即可 。

如果没有wget :yum install wget
yum install gcc 安装gcc
yum install gcc-c++ 安装c++ 有就不用安装了
 
  1. wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz

tar -zxvf V1.0.7.tar.gz

  1. cd libfastcommon-1.0.7
 
  1. ./make.sh
 
  1. ./make.sh install

显示这样的画面,就是安装 libfastcommon 成功啦。大笑大笑

2.下载安装 FastDFS,这里也是通过wget下载。

 
  1. wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
 
  1. tar -zxvf V5.05.tar.gz
  1. cd fastdfs-5.05
 
  1. ./make.sh
 
  1. ./make.sh install

显示这样的画面,就是安装 FastDFS 成功啦。大笑,版本不同或许会不一样。无所谓啦,只要make没报error就欧克。

二、配置 Tracker 服务

上述安装成功后,在/etc/目录下会有一个fdfs的目录,进入它。会看到三个.sample后缀的文件,这是作者给我们的示例文件,我们需要把其中的tracker.conf.sample文件改为tracker.conf配置文件并修改它。看命令:

  1. cd /etc/fdfs
  2. cp tracker.conf.sample tracker.conf
  3. vi tracker.conf

这里是安装目录,直接复制有可以啦

打开tracker.conf文件,只需要找到你只需要该这两个参数就可以了。

  1. # the base path to store data and log files
  2. base_path=/data/fastdfs //根目录下面如果没有data你得建一个
  3. # HTTP port on this tracker server
  4. http.server_port=80 //这里之所以是80 因为后面配置的nginx默认转发80, 我也是后面才想道。。。。。
    1. //建立软连接
    2. ln -s /usr/bin/fdfs_trackerd /usr/local/bin
    3. ln -s /usr/bin/stop.sh /usr/local/bin
    4. ln -s /usr/bin/restart.sh /usr/local/bin
    有兴趣可以去目录底下瞅瞅,这些文件都是有的。
    1. 启动服务:service fdfs_trackerd start
    2. 查看监听:netstat -unltp|grep fdfs
  5. 看到22122端口正常被监听后,这时候就算 Tracker服务安装成功啦!

    三、配置 Storage 服务

    现在开始配置 Storage 服务,由于我这是单机器测试,你把 Storage 服务放在多台服务器也是可以的,它有 Group(组)的概念,同一组内服务器互备同步,这里不再演示。直接开始配置,依然是进入/etc/fdfs的目录操作,首先进入它。会看到三个.sample后缀的文件,我们需要把其中的storage.conf.sample文件改为storage.conf配置文件并修改它。还看命令:

    1. cd /etc/fdfs
      1. cp storage.conf.sample storage.conf
      2. vi storage.conf
      3. 打开storage.conf文件后,找到这两个参数进行修改:

         
              
        1. # the base path to store data and log files
        2. base_path=/data/fastdfs/storage
        3. # store_path#, based 0, if store_path0 not exists, it's value is base_path
        4. # the paths must be exist
        5. store_path0=/data/fastdfs/storage //这里记得新建文件夹
        6. #store_path1=/home/yuqing/fastdfs2
        7. # tracker_server can ocur more than once, and tracker_server format is
        8. # "host:port", host can be hostname or ip address
        9. tracker_server=192.168.59.129:22122 //这是我虚拟机的ip,不过外网连不到,这里记得开端口,如果自己玩的话,关闭防火墙也可以。哈哈
        开启防火墙(重启后永久生效):chkconfig iptables on

        关闭防火墙(重启后永久生效):chkconfig iptables off

        开启防火墙(即时生效,重启后失效):service iptables start

        关闭防火墙(即时生效,重启后失效):service iptables stop
      4. 附送四条关闭防火墙命令


这里还是使用ln -s 建立软链接:storaged

ln -s /usr/bin/fdfs_storaged /usr/local/bin

执行命令启动服务:

 
  1. service fdfs_storaged start

启动成功,没有错误了。查看一下监听:

 
  1. netstat -unltp|grep fdfs

很好,22122 和 23000端口都在监听了,

应该是完成了。我们安装配置并启动了 Tracker 和 Storage 服务,也没有报错了。那他俩是不是在通信呢?我们可以监视一下:

 
  1. /usr/bin/fdfs_monitor /etc/fdfs/storage.conf

看到我红线处ACTIVE这样就 ok 啦!

已经可以上传文件了,但是我没有上传测试,因为上传成功我看不了,所以,需要配合 Nginx 来进行文件的上传下载,这一篇就安装 Nginx 以及结合 fastdfs-nginx-module 模块使用。

1、安装nginx所需环境

一. gcc 安装
安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:

 
  1. yum install gcc-c++ //刚刚已经安装过了,不过这里在多说一句

二. PCRE pcre-devel 安装
PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:

 
  1. yum install -y pcre pcre-devel

三. zlib 安装
zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。

 
  1. yum install -y zlib zlib-devel

四. OpenSSL 安装
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。

 
  1. yum install -y openssl openssl-devel

2.使用wget命令下载(推荐)。

 
  1. wget -c https://nginx.org/download/nginx-1.10.1.tar.gz

解压

依然是直接命令:

 
  1. tar -zxvf nginx-1.10.1.tar.gz
  2. cd nginx-1.10.1

其实在 nginx-1.10.1 版本中你就不需要去配置相关东西,默认就可以了。当然,如果你要自己配置目录也是可以的。
1.使用默认配置

 
  1. ./configure
  1. make
  2. make install

查找安装路径:

 
  1. whereis nginx

启动、停止nginx

 
  1. cd /usr/local/nginx/sbin/
  2. ./nginx
  3. ./nginx -s stop
  4. ./nginx -s quit
  5. ./nginx -s reload

查询nginx进程:

 
  1. ps aux|grep nginx

开机自启动

即在rc.local增加启动代码就可以了。

 
  1. vi /etc/rc.local
  2. /usr/local/nginx/sbin/nginx


设置执行权限:

 
  1. chmod 755 rc.local

.下载 fastdfs-nginx-module ,这里是通过wget下载(我喜欢这种方式)。

wget https://github.com/happyfish100/fastdfs-nginx-module/archive/5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip

一定要下这一个,我上次下的是另外一个,死活安装不进nginx。弄了我几个小时才弄明白是版本的问题

 解压
 unzip 5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip

重命名
mv fastdfs-nginx-module-5e5f3566bbfa57418b5506aaefbe107a42c9fcb1  fastdfs-nginx-module-master

停掉nginx服务

cd /usr/local/nginx/sbin

./nginx -s stop

 
进入解压包目录
# cd /nginx-1.10.1/

# 添加模块
# ./configure --add-module=../fastdfs-nginx-module/src

重新编译、安装

# make && make install

 ④ 查看Nginx的模块

# /usr/local/nginx/sbin/nginx -V
有下面这个就说明添加模块成功


二、配置 fastdfs-nginx-module 和 Nginx

1.配置mod-fastdfs.conf,并拷贝到/etc/fdfs文件目录下。

 
  1. cd /software/fastdfs-nginx-module-master/src/
  2. vim mod_fastdfs.conf
  3. cp mod_fastdfs.conf /etc/fdfs

修改mod-fastdfs.conf配置只需要修改我标注的这三个地方就行了,其他不需要也不建议改变。

 
  1. # FastDFS tracker_server can ocur more than once, and tracker_server format is
  2. # "host:port", host can be hostname or ip address
  3. # valid only when load_fdfs_parameters_from_tracker is true
  4. tracker_server=192.168.59.129:22122 //老样子,自己的ip
  5. # if the url / uri including the group name
  6. # set to false when uri like /M00/00/00/xxx
  7. # set to true when uri like ${group_name}/M00/00/00/xxx, such as group1/M00/xxx
  8. # default value is false
  9. url_have_group_name = true
  10. # store_path#, based 0, if store_path0 not exists, it's value is base_path
  11. # the paths must be exist
  12. # must same as storage.conf
  13. store_path0=/data/fastdfs/storage

接着我们需要把fastdfs-5.05下面的配置中还没有存在/etc/fdfs中的拷贝进去

 
  1. cd /software/fastdfs-5.05/conf
  2. cp anti-steal.jpg http.conf mime.types /etc/fdfs/

2.配置 Nginx。编辑nginx.conf文件:

 
  1. cd /usr/local/nginx/conf
  2. vi nginx.conf

在配置文件中加入:

 
  1. location /group1/M00 {
  2. root /data/fastdfs/storage/;
  3. ngx_fastdfs_module;
  4. }

由于我们配置了group1/M00的访问,我们需要建立一个group1文件夹,并建立M00到data的软链接。

 
  1. mkdir /data/fastdfs/storage/data/group1
  2. ln -s /data/fastdfs/storage/data /data/fastdfs/storage/data/group1/M00

启动 Nginx ,会打印出fastdfs模块的pid,看看日志是否报错,正常不会报错的

 
  1. /usr/local/nginx/sbin/nginx

配置 client.conf

  1. cd /etc/fdfs
  2. cp client.conf.sample client.conf
  3. vim client.conf

测试上传

    新建一个文件 cd /usr/bin 

        vi test.txt  (内容随意)

运行:

 
  1. /usr/bin/fdfs_test /etc/fdfs/client.conf upload /usr/bin/test.txt


后面的http的返回就是文件地址啦,可直接访问。

五、Java客户端

前面文件系统平台搭建好了,现在就要写客户端代码在系统中实现上传下载,这里只是简单的测试代码。

① 项目中使用maven进行依赖管理,可以在pom.xml中引入如下依赖即可:

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


新建文件

fdfs_client.conf

内容:
connect_timeout = 2


network_timeout = 30


charset = UTF-8


http.tracker_http_port = 9090


http.anti_steal_token = no


http.secret_key = FastDFS1234567890


tracker_server = 192.168.59.129:22122


java 代码 ,直接复制可用,路径需要修改

import java.io.IOException;




import org.junit.Test;




import java.io.FileNotFoundException;
import java.io.FileOutputStream;


import java.util.UUID;


import org.apache.commons.io.IOUtils;
import org.csource.common.MyException;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.FileInfo;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.StorageClient1;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.junit.After;
import org.junit.Before;




public class TestFastDfs {
    
    public String conf_filename = "D:\\dkz_work_home\\my_workspace\\project-parent\\project-admin\\project-admin-web\\src\\main\\resources\\properties\\fdfs_client.conf"; 
    //public String local_filename = "D:\\stsworkspace\\fastdfs-demo\\src\\main\\resources\\fdfs_client.conf";
    
    public String local_filename = "D:\\xinxi\\1.png";


    @Before
    public void setUp() throws Exception {
    }


    @After
    public void tearDown() throws Exception {
    }


    @Test
    public void testUpload() {


        try { 
            ClientGlobal.init(conf_filename);


            TrackerClient tracker = new TrackerClient(); 
            TrackerServer trackerServer = tracker.getConnection(); 
            StorageServer storageServer = null;
            StorageClient1 client = new StorageClient1(trackerServer, storageServer); 
            
            StorageClient storageClient = new StorageClient(trackerServer, storageServer); 
//          NameValuePair nvp = new NameValuePair("age", "18"); 
            NameValuePair nvp [] = new NameValuePair[]{ 
                    new NameValuePair("age", "18"), 
                    new NameValuePair("sex", "male") 
            }; 
            String fileIds[] = storageClient.upload_file(local_filename, "png", nvp);
            
            System.out.println(fileIds.length); 
            System.out.println("组名:" + fileIds[0]); 
            System.out.println("路径: " + fileIds[1]);


        } catch (FileNotFoundException e) { 
            e.printStackTrace(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } catch (MyException e) { 
            e.printStackTrace(); 
        } 
    }


    @Test 
    public void testDownload() {
        try {


            ClientGlobal.init(conf_filename);


            TrackerClient tracker = new TrackerClient(); 
            TrackerServer trackerServer = tracker.getConnection(); 
            StorageServer storageServer = null;


            StorageClient storageClient = new StorageClient(trackerServer, storageServer); 
            byte[] b = storageClient.download_file("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf"); 
            System.out.println(b); 
            IOUtils.write(b, new FileOutputStream("D:/"+UUID.randomUUID().toString()+".conf"));
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    }
    
    @Test 
    public void testGetFileInfo(){ 
        try { 
            ClientGlobal.init(conf_filename);


            TrackerClient tracker = new TrackerClient(); 
            TrackerServer trackerServer = tracker.getConnection(); 
            StorageServer storageServer = null;


            StorageClient storageClient = new StorageClient(trackerServer, storageServer); 
            FileInfo fi = storageClient.get_file_info("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf"); 
            System.out.println(fi.getSourceIpAddr()); 
            System.out.println(fi.getFileSize()); 
            System.out.println(fi.getCreateTimestamp()); 
            System.out.println(fi.getCrc32()); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 
    
    @Test 
    public void testGetFileMate(){ 
        try { 
            ClientGlobal.init(conf_filename);


            TrackerClient tracker = new TrackerClient(); 
            TrackerServer trackerServer = tracker.getConnection(); 
            StorageServer storageServer = null;


            StorageClient storageClient = new StorageClient(trackerServer, 
                    storageServer); 
            NameValuePair nvps [] = storageClient.get_metadata("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.conf"); 
            for(NameValuePair nvp : nvps){ 
                System.out.println(nvp.getName() + ":" + nvp.getValue()); 
            } 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 
    
    @Test 
    public void testDelete(){ 
        try { 
            ClientGlobal.init(conf_filename);


            TrackerClient tracker = new TrackerClient(); 
            TrackerServer trackerServer = tracker.getConnection(); 
            StorageServer storageServer = null;


            StorageClient storageClient = new StorageClient(trackerServer, 
                    storageServer); 
            int i = storageClient.delete_file("group1", "M00/00/00/wKg7gVqqmzKAEXKNAAEZUZ7gwnI949.png"); 
            System.out.println( i==0 ? "删除成功" : "删除失败:"+i); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值