分布式文件系统

分布式文件系统可以有效解决数据的存储和管理难题:

将固定于某个地点的某个文件系统,扩展到任意多个地点/多个文件系统,众多的节点组成一个文件系统网络。

每个节点可以分布在不同的地点,通过网络进行节点间的通信和数据传输。

人们在使用分布式文件系统时,无需关心数据是存储在哪个节点上、或者是从哪个节点从获取的,只需要像使用本地文件系统一样管理和存储文件系统中的数据。

 

 

 

FastDFS:

FastDFS是一个开源的分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务, 如相册网站,视频网站等等。FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度的工作,在访问上起负载均衡的作用。存储节点存储文件,完成文件管理的所有功能:

  存储、同步、和提供存取接口,FastDFS同时对文件的meta data进行管理。所谓文件的meta data就是文件的相关属性,以键值对(key value pair)方式表示,如:width=1024,其中的key为width,value为1024。文件meta data是文件属性列表,可以包含多个键值树。

  开发语言c/c++,运行在linux系统下。

 

1.什么是FastDFS

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

FastDFS架构包括 Tracker server和Storage server。客户端请求Tracker server进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载。Tracker server作用是负载均衡和调度,通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。可以将tracker称为追踪服务器或调度服务器。Storage server作用是文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将storage称为存储服务器。

2.2.1Tracker集群

FastDFS集群中的Tracker server可以有多台,Tracker server之间是相互平等关系同时提供服务,Tracker server不存在单点故障。客户端请求Tracker server采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker。
2.2.2Storage集群

Storage集群采用了分组存储方式。storage集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量之和。一个组由一台或多台存储服务器组成,组内的Storage server之间是平等关系,不同组的Storage server之间不会相互通信,同组内的Storage server之间会相互连接进行文件同步,从而保证同组内每个storage上的文件完全一致的。一个组的存储容量为该组内存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最好是一致的。采用分组存储方式的好处是灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到的组也可以由tracker进行调度选择。一个分组的存储服务器访问压力较大时,可以在该组增加存储服务器来扩充服务能力(纵向扩容)。当系统容量不足时,可以增加组来扩充存储容量(横向扩容)。
2.2.3Storage状态收集

Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。
2.2.4文件上传流程

客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。示例:group1/M00/02/44/sdfgsinsdfsdf.jpg

2.2.5文件下载流程

tracker根据请求的文件路径即文件ID 来快速定义文件。
比如请求下边的文件:
group1/M00/00/10/agIBmlee7fOATa1MAAFw6fBcZXY841.png

1.通过组名tracker能够很快的定位到客户端需要访问的存储服务器组是group1,并选择合适的存储服务器提供客户端访问。
2.存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。
个人理解

1.FastDFS是一个文件存储服务,无论是什么类型的文件都可以存储,不仅仅是可以用作图片服务器的。

2.上传文件的流程就是通过nginx进行http访问,nginx找到trackerServer,给了trackerServer一个文件,trackerServer拿到这个文件之后,根据自己的规则存储到指定的storageServer的相应路径下。
同时,trackerServer会生成文件在服务器上的存储路径,通过nginx返回给客户端,客户端拿到这个路径,在前面加上服务器地址就可以访问这个文件了。

3.不难看出,在服务器上需要安装三个部分:分模块一步一步安装就不容易出错了

3.1 trackerServer

3.2 storageServer

3.3 nginx和fastDFS整合
安装准备

下面用到的软件到相关网站下载就可以了

安装libevent工具包

yum -y install libevent

安装libfastcommonv1.0.7工具包

解压缩
./make.sh
./make.sh install
安装步骤

本示例为单trackerServer和storageServer,集群不做说明

安装trackerServer

解压缩fastDFS_v5.05.tar.gz(tracker和storage在同一个包内,所以只需要解压一次)

.make.sh
.make.sh install
安装完成后在/usr/bin/目录下有以fdfs开头的文件都是编译出来的。配置文件都放到/etc/fdfs文件夹。

把解压目录目录下的conf文件夹下的文件都复制到/etc/fdfs下

cp /root/FastDFS/conf /etc/fdfs

配置tracker服务。修改/etc/fdfs/tracker.conf文件

base_path=/home/yuqing/fastdfs

将该路径改为自己定义的路径,该路径必须存在,用于存放数据和日志文件。

启动tracker

启动:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf

重启:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

设置开机自动启动

编辑配置:vim /etc/rc.d/rc.local

添加命令:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart

安装storageServer

如果和trackerServer不是安装在同一台服务器,需要重复执行上个步骤中的1和2两个步骤。

配置storage服务。修改/etc/fdfs/storage.conf文件

base_path=/home/yuqing/fastdfs:storage服务日志存放路径,该路径必须存在

store_path0=/home/yuqing/fastdfs:图片的保存路径,该路径必须存在

tracker_server=192.168.25.133:22122:指定tracker服务器的ip和端口

启动storageServer

启动:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf

重启:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

设置开机自启动

编辑 vim /etc/rc.d/rc.local

添加 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

修改防火墙设置,添加如下规则

修改防火墙命令:vim /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT
重启防火墙:service iptables restart

接下来就可以测试我们是否搭建成功了
完成测试

使用自带的test进行测试

配置客户端

vim /etc/fdfs/client.conf:修改配置文件

base_path=/home/fastdfs/client:客户端日志文件保存路径

tracker_server=192.168.25.133:22122:指定tracker的ip和端口

测试

/usr/bin/fdfs_test /etc/fdfs/client.conf upload /root/test.jpg:在Linux内部进行图片上传

结果

当出现如下画面时,说明配置成功了,其中的地址即为该文件的访问地址。但是此时我们还不可以通过外网访问,因为还没有配置http服务,接下来,安装Nginx。
成功示例

搭建Nginx提供Http外网访问

使用官方提供的nginx插件fastdfs-nginx-module_v1.16.tar.gz,对nginx重新编译。
解压插件压缩包 (本例为root目录下)

tar -zxvf fastdfs-nginx-module_v1.16.tar.gz

修改解压缩包文件下的/root/fastdfs-nginx-module/src/config文件

把其中的local去掉,如下图:
示例

解压缩nginx,并进入该目录

tar -zxf nginx-1.8.0.tar.gz

对nginx进行config

./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=/root/fastdfs-nginx-module/src

注意:

最后一行--add-module=/root/fastdfs-nginx-module/src其中的/root/fastdfs-nginx-module/src
为fastdfs-nginx-module_v1.16.tar.gz的解压路径。

上边将临时文件目录指定为/var/temp/nginx,需要在/var下创建temp及nginx目录
安装nginx

make

make install

复制并修改nginx和fasts整合的配置文件

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

vim /etc/fdfs/mod_fastdfs.conf

base_path=/tmp 日志存放位置

tracker_server=192.168.25.133:22122 tracerServer的服务器地址

url_have_group_name = true 是否包含组名group

store_path0=/home/fastdfs/storage 图片保存路径,就是包含data的那个路径,这个别弄错了

复制文件

cp /usr/lib64/libfdfsclient.so /usr/lib/ 32位软件

修改nginx访问配置

server {
listen 80;
server_name 192.168.25.133;
location /group1/M00/{
#root /home/FastDFS/fdfs_storage/data;
ngx_fastdfs_module;`
}
}
设置nginx自启动

① 首先编写脚本文件

vi /etc/init.d/nginx

nginxd=/usr/local/nginx/sbin/nginx
nginx_config=/usr/local/nginx/conf/nginx.conf
nginx_pid=/var/run/nginx.pid
RETVAL=0
prog="nginx"

. /etc/rc.d/init.d/functions

. /etc/sysconfig/network

[ ${NETWORKING} = "no" ] && exit 0
[ -x $nginxd ] || exit 0

start() {
if [ -e $nginx_pid ];then
echo "nginx already running...."
exit 1
fi
echo -n $"Starting $prog: "
daemon $nginxd -c ${nginx_config}
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
return $RETVAL
}

stop() {
echo -n $"Stopping $prog: "
killproc $nginxd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid
}

reload() {
echo -n $"Reloading $prog: "
killproc $nginxd -HUP
RETVAL=$?
echo
}

case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
stop
start
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|reload|status|help}"
exit 1
esac
exit $RETVAL
wq保存退出

② 设置文件的访问权限

`chmod a+x /etc/init.d/nginx`
(a+x ==> all user can execute 所有用户可执行)
③ nginx状态、启动、重启、停止

/etc/init.d/nginx status 查看状态

/etc/init.d/nginx start 启动

/etc/init.d/nginx stop 停止

/etc/init.d/nginx restart 重启

④加入到rc.local文件中

vim /etc/rc.local

/etc/init.d/nginx start 下次系统重启后,nginx会自启动

现在就可以用外网访问已经上传的图片了

我们可以用内部测试test工具来进行上传图片(返回本文档第一部分查看),将返回的结果复制到浏览器,就可以访问上传的文件了。图片的话会直接在浏览器打开。

终于搭建好了,不过还没完,还要和Java进行结合,才能利用起来。

Java整合+工具类

官方提供了jar包,已经在教程开始的文件中了,下载下来,放到项目中去,接下来就看具体的java代码流程了。
编写了工具类的word使用说明书,更加详细,下载地址如下
http://106.2.1.154/group1/M00/00/10/agIBmlefHwaAePorAAG2DpjKZy840.docx

使用java基础代码操作的流程

java

@Test
public void testUpload() throws Exception {
// 1、把FastDFS提供的jar包添加到工程中
// 2、初始化全局配置。加载一个配置文件。
ClientGlobal.init("D:\\workspaces-itcast\\JaveEE18\\taotao- manager\\taotao-manager-web\\src\\main\\resources\\properties\\client.conf");
// 3、创建一个TrackerClient对象。
TrackerClient trackerClient = new TrackerClient();
// 4、创建一个TrackerServer对象。
TrackerServer trackerServer = trackerClient.getConnection();
// 5、声明一个StorageServer对象,null。
StorageServer storageServer = null;
// 6、获得StorageClient对象。
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
// 7、直接调用StorageClient对象方法上传文件即可。
String[] strings = storageClient.upload_file("D:\\Documents\ \Pictures\\images\\2f2eb938943d.jpg", "jpg", null);
for (String string : strings) {
System.out.println(string);
}
}
配置文件Client.conf

tracker_server=192.168.25.133:22122

使用工具类上传

测试方法

@Test
public void testFastDfsClient() throws Exception {
FastDFSClient client = new FastDFSClient("D:\\workspaces-itcast\\JaveEE18\\taotao-manager\\taotao-manager-web\\src\\main\\resources\\properties\\client.conf");
String uploadFile = client.uploadFile("D:\\Documents\\Pictures\\images\\200811281555127886.jpg", "jpg");
System.out.println(uploadFile);//返回的是文件的
}
工具类代码

package com.maxrocky.tools;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

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 FastDFSClient {

private TrackerClient trackerClient = null;
private TrackerServer trackerServer = null;
private StorageServer storageServer = null;
private StorageClient1 storageClient = null;

public FastDFSClient(String conf) throws Exception {
if (conf.contains("classpath:")) {
conf = conf.replace("classpath:", this.getClass().getResource("/").getPath());
}
ClientGlobal.init(conf);
trackerClient = new TrackerClient();
trackerServer = trackerClient.getConnection();
storageServer = null;
storageClient = new StorageClient1(trackerServer, storageServer);
}

/**
* 上传文件方法
* <p>Title: uploadFile</p>
* <p>Description: </p>
* @param fileName 文件全路径
* @param extName 文件扩展名,不包含(.)
* @param metas 文件扩展信息
* @return
* @throws Exception
*/
public String uploadFile(String fileName, String extName, NameValuePair[] metas) throws Exception {
String result = storageClient.upload_file1(fileName, extName, metas);
return result;
}


public String uploadFile(String fileName) throws Exception {
return uploadFile(fileName, null, null);
}

public String uploadFile(String fileName, String extName) throws Exception {
return uploadFile(fileName, extName, null);
}

/**
* 上传文件方法
* <p>Title: uploadFile</p>
* <p>Description: </p>
* @param fileContent 文件的内容,字节数组
* @param extName 文件扩展名
* @param metas 文件扩展信息
* @return
* @throws Exception
*/
public String uploadFile(byte[] fileContent, String extName, NameValuePair[] metas) throws Exception {
String result = storageClient.upload_file1(fileContent, extName, metas);
return result;
}

public String uploadFile(byte[] fileContent) throws Exception {
return uploadFile(fileContent, null, null);
}

public String uploadFile(byte[] fileContent, String extName) throws Exception {
return uploadFile(fileContent, extName, null);
}
}

 

posted @ 2017-03-21 14:45  malcome  阅读(258)  评论(0)    收藏  举报