CentOS 7搭建FastDFS分布式文件服务器实现文件上传

        好长时间没写博客了,这两天一直在捣鼓FastDFS这个玩意,因为之前接了老师的一个任务,说让我写一个通用的企业网站的模板,我的设计是实现网站图片的统一化管理,前台页面动态生成,所以就研究了一下阿里的FastDFS这个小型的文件管理系统。

FastDFS

        首先来介绍一下这个FastDFS吧。下面还是来一段官方的介绍吧,感觉我自己解释也解释不清楚。
        FastDFS是用c语言编写的一款开源的分布式文件系统,它是由淘宝资深架构师余庆编写并开源。FastDFS专为互联 网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很 容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
        为什么要使用fastDFS呢?
        相比于NFS、GFS这些都是通用的分布式文件系统,通用的分布式文件系统的优点的是开发体验好,但是系统复杂 性高、性能一般,而专用的分布式文件系统虽然开发体验性差,但是系统复杂性低并且性能高。fastDFS非常适合 存储图片等那些小文件,fastDFS不对文件进行分块,所以它就没有分块合并的开销,fastDFS网络通信采用 socket,通信速度很快。

FastDFS的工作原理

        先看一张图吧
在这里插入图片描述
        从图中可以看出,这个FastDFS分为两个部分,一个是tracker服务器集群,另一个是storage服务器集群,客户端在访问时候是先访问tracker服务器,tracker服务器在整个FastDFS系统中起到负载均衡和调度的作用,它的任务是追踪到可以提供文件上传下载的服务器并将这个服务器的地址告知用户。而storage服务器就很好理解了。它就是文件最终存储的地方和提供文件服务的终端。用户在通过tracker服务器获取到可以访问的storage服务器的地址后,会直接通过地址访问storage服务器进行文件的上传和下载。
        另外一个就是,tracker集群和storage集群,tracker集群中的各个服务器之间相互平等的提供相同服务,因此不存在单点故障,客户端在请求tracker服务器时,采用轮询的策略提供服务。storage集群采用了分组存储方式。storage集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量 之和。一个组由一台或台存储服务器组成,组内的Storage server之间是平等关系,不同组的Storage server之 间不会相互通信,同组内的Storage server之间会相互连接进行文件同步,从而保证同组内每个storage上的文件完 全一致的。一个组的存储容量为该组内存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最好是 一致的。

FastDFS文件上传下载流程

在这里插入图片描述
在这里插入图片描述

FastDFS的安装配置(单机)

        首先要准备两台虚拟机并安装上CentOS 7操作系统。从这里开始我就不再截图了,因为配置太多,命令太多,多到我不想再装第二遍,我总结了一份安装流程的文件,里边也整理了一些安装过程中遇到的问题。按照我以下的步骤安装即可。

FastDFS依赖库安装

        这个依赖库两个虚拟机都要安装。
         1.安装C语言编译环境gcc,FastDFS是C语言编写的
         命令:yum install gcc-c++
         2.安装libevent依赖库,FastDFS需要依赖这个库
         命令:yum -y install libevent
         3.安装libfastcommon,这个是FastDFS官方提供的,libfastcommon包含了FastDFS运行所需要的一些基础库。
                 1)将libfastcommon压缩包上传至服务器,然后解压,解压目录为:/usr/local。建议直接上传至/usr/local目录下
                 命令:tar -zxvf libfastcommonV1.0.7.tar.gz
                 2)进入解压后的目录libfastcommon-1.0.7,运行一下两个命令安装libfastcommon
                 命令:./make.sh
                            ./make.sh install
         注意:这里可以会出错,会提示找不到make.sh这样的命令,执行以下命令,安装相关命令即可
                 命令:yum -y install zlib zlib-devel pcre pcre-devel gcc gcc-c++ openssl openssl-devel libevent libevent-devel perl unzip net-tools wget
         4.注意:libfastcommon安装好后会自动将库文件拷贝至/usr/lib64下,
                 由于FastDFS程序引用usr/lib目录所以需要将/usr/lib64下的库文件拷贝至/usr/lib下。
         要拷贝的文件为:libfastcommon.so 注意是文件,不是文件夹

tracker服务器安装配置

         1.将FastDFS压缩包上传至服务器,然后解压,解压目录为:/usr/local/,建议直接上传至/usr/local
                 命令:tar -zxvf FastDFS_v5.05.tar.gz
         2.进入解压后的目录FastDFS,运行一下命令,安装tracker
                 命令:./make.sh
                            ./make.sh install
         3.安装成功将安装目录(FastDFS)下的conf下的所有文件拷贝到/etc/fdfs/下。
         4.然后进入/etc/fdfs,将配置文件tracker.conf.sample复制一份新的tracker.conf。
                 有时候可以已经有了但是建议还是执行一次,覆盖原来的。
                 命令:cp tracker.conf.sample tracker.conf
         5.修改配置文件
                 命令:vi tracker.conf或者 vim tracker.conf
                 注意:这里可能会出现vim命令找不到的问题,执行以下命令安装一下vim命令即可。
         三条命令执行任意一个即可。
                 命令:rpm -qa|grep vim
                            yum -y install vim-enhanced
                            yum -y install vim*
         配置文件需要修改的位置:
                 base_path=/home/yuqing/FastDFS 改为: base_path=/home/FastDFS
                 http.server_port=8080 改为: http.server_port=80
         修改完成后保存退出。
         保存命令为:
                 先按下键盘的esc键–>:wq–>回车
         6.启动tracker
                 进入安装目录FastDFS的conf目录下,运行一下命令启动tracker
                         命令:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
                 注意:这里可能会报错:
                         ERROR - file: process_ctrl.c, line: 189, “/home/FastDFS” can’t be accessed
                 原因是我们刚刚修改了目录为/home/FastDFS,但是我们并没有创建。这里在conf目录下执行命令创建一下即可。
                         命令:mkdir -p /home/FastDFS
                 然后运行之前的命令:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
         这里建议多运行几次,先启动再重启,然后停止,然后再启动确保启动成功。

storage服务器安装配置

         1.将FastDFS压缩包上传至服务器,然后解压,解压目录为:/usr/local/,建议直接上传至/usr/local
                 命令:tar -zxvf FastDFS_v5.05.tar.gz
         2.进入解压后的目录FastDFS,运行一下命令,安装tracker
                 命令:./make.sh
                            ./make.sh install
         3.安装成功将安装目录(FastDFS)下的conf下的所有文件拷贝到/etc/fdfs/下。
         4.然后进入/etc/fdfs,将配置文件storage.conf.sample复制一份新的storage.conf。
                 有时候可以已经有了但是建议还是执行一次,覆盖原来的。
                 命令:cp storage.conf.sample storage.conf
         5.修改配置文件
                 命令:vi storage.conf或者 vim storage.conf
                 注意:这里可能会出现vim命令找不到的问题,执行以下命令安装一下vim命令即可。
         三条命令执行任意一个即可。
                 命令:rpm -qa|grep vim
                            yum -y install vim-enhanced
                            yum -y install vim*
         配置文件需要修改的位置:
                 base_path=/home/yuqing/FastDFS 改为: base_path=/home/FastDFS
                 store_path0=/home/yuqing/FastDFS 改为: store_path0=/home/FastDFS/fdfs_storage
                 http.server_port=8080 改为: http.server_port=80 如果没有就新增配置
        配置tracker服务器
                tracker_server=192.168.101.3:22122 #配置tracker服务器:IP
         修改完成后保存退出。
         保存命令为:
                 先按下键盘的esc键–>:wq–>回车
         6.启动storage
                 进入安装目录FastDFS的conf目录下,运行一下命令启动tracker
                         命令:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
                 注意:这里可能会报错:
                         ERROR - file: process_ctrl.c, line: 189, “/home/FastDFS” can’t be accessed
                 原因是我们刚刚修改了目录为/home/FastDFS,但是我们并没有创建。这里在conf目录下执行命令创建一下即可。
                         命令:mkdir -p /home/FastDFS
                 然后运行之前的命令:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
         这里建议多运行几次,先启动再重启,然后停止,然后再启动确保启动成功。

集群配置

        这里说一下集群配置,我文章的标题是分布式文件服务器,因此,多台服务器之间的分布式部署,肯定是必须的,而多台服务器的配置就在这里说一下吧,只需要在配置文件中增加以下配置即可。
        我们之前在配置storage服务器时,会配置tracker服务器的ip,刚才我是单机配置,所以只配置了一个,如果是多台tracker服务器,复制一行,修改配置多个ip和端口即可。如果是多台storage服务器,因为各storage服务器之间不进行通讯,因此,无需配置。

测试FastDFS

        到这里FastDFS的安装就完成了。但是启动可能还会出错,原因很简单,因为我们是多台服务器,如果端口没有放开的话,tracker和storage是无法连接和通讯的。因此我们需要放开端口,最简单的办法就是关闭防火墙,具体放开端口的方法在这里就不说了,可以百度。之后不出意外的话就可以启动成功。
        然后我们就可以测试FastDFS是否可用。测试命令格式如下:
                /usr/bin/fdfs_test 客户端配置文件地址 upload 上传文件
        比如,我随便照一张图片上传,
                /usr/bin/fdfs_test /etc/fdfs/client.conf upload /home/tomcat.png
        如果出现如下所示的打印,说明上传成功

This is FastDFS client test program v5.05

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.

[2015-05-18 02:07:10] DEBUG - base_path=/home/FastDFS, 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.101.5, port=23000
	server 2. group_name=, ip_addr=192.168.101.6, port=23000

group_name=group1, ip_addr=192.168.101.5, port=23000
storage_upload_by_filename
group_name=group1, remote_filename=M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485.png
source ip address: 192.168.101.5
file timestamp=2015-05-18 02:07:11
file size=5103
file crc32=3979441827
example file url: http://192.168.101.5/group1/M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485.png
storage_upload_slave_by_filename
group_name=group1, remote_filename=M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png
source ip address: 192.168.101.5
file timestamp=2015-05-18 02:07:11
file size=5103
file crc32=3979441827
example file url: http://192.168.101.5/group1/M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png

        http://192.168.101.5/group1/M00/00/00/wKhlBVVY2M-AM_9DAAAT7-0xdqM485_big.png就是文件的下载路径。

Java代码测试 FastDFS文件上传

        这个java代码测试很简单,我是在它放到github上的代码里边拷贝的了,代码很好理解。除了代码之后还有一个配置文件需要配置,直接赋值一下,稍加修改即可。也很好理解。
        先说一下配置文件吧。
在这里插入图片描述
        然后说一下代码,这个有点坑,我也不知道为什么,先看一下吧,我会在图上解释。
在这里插入图片描述
        注意图中我有两种加载配置文件的方式,被我注释掉的就是我遇到的问题,注释掉的方法,死活加载不到配置文件,我也不知道为什么,然后我就用了下面我没有注释掉的方法,这个方法是我在他源码中找到的,它提供了大概四五种加载配置文件的方法。
我们可以看一看。
在这里插入图片描述
        一个5种方法,我使用第三种种传入路径的的方法成功了。具体原因我也不明白。如果出问题了可以多看源码,寻找答案。
        这里,留下一github上的代码示例的地址:FastDFS官方Demo
        下面是我的代码:

package com.fastdfs;

import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;

import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient1;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;

public class TestFastDFS {
	private TestFastDFS() {
	}

	public static void main(String args[]) {

		try {
			//加载客户端配置文件
//			ClientGlobal.init("properties/fastdfs-client.properties");
//			Properties prop=new Properties();
//			prop.load(new FileInputStream(new File("properties/fastdfs-client.properties")));
			ClientGlobal.initByProperties("properties/fastdfs-client.properties");
			System.out.println("network_timeout=" + ClientGlobal.g_network_timeout + "ms");
			System.out.println("charset=" + ClientGlobal.g_charset);
			//构建tracker客户端
			TrackerClient tracker = new TrackerClient();
			TrackerServer trackerServer = tracker.getConnection();
			//构建storage客户端
			StorageServer storageServer = null;
			StorageClient1 client = new StorageClient1(trackerServer, storageServer);

			//文件原始信息
			NameValuePair[] metaList = new NameValuePair[1];
			metaList[0] = new NameValuePair("fileName", "aaa.png");
			//执行上传
			String fileId = client.upload_file1("C:\\Users\\Administrator\\Desktop\\aaa.png", "png", metaList);
			System.out.println("upload success. file id is: " + fileId);

//			int i = 0;
//			while (i++ < 10) {
//				byte[] result = client.download_file1(fileId);
//				System.out.println(i + ", download result is: " + result.length);
//			}
			//关闭tracker服务连接
			trackerServer.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值