FastDFS

FastDFS

分布式文件系统



前言

分布式文件系统 (Distributed File System) 是一个软件/软件服务器,这个软件可以用来管理文件。但这个软件所管理的文件通常不是在一个服务器节点上,而是在多个服务器节点上,这些服务器节点通过网络相连构成一个庞大的文件存储服务器集群,这些服务器都用于存储文件资源,通过分布式文件系统来管理这些服务器上的文件。 常见的分布式文件系统有:FastDFS、GFS、HDFS、Lustre 、Ceph 、GridFS 、mogileFS、TFS等。

一、FastDFS是什么?

FastDFS是一个开源的轻量级分布式文件系统,为互联网应用量身定做,简单、灵活、高效,采用C语言开发,由阿里巴巴开发并开源。
FastDFS对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载、文件删除)等,解决了大容量文件存储的问题,特别适合以文件为载体的在线服务,如相册网站、文档网站、图片网站、视频网站等等。
FastDFS充分考虑了冗余备份、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

二、FastDFS整体架构

FastDFS文件系统由两大部分构成,一个是客户端,一个是服务端客户端通常指我们的程序,比如我们的Java程序去连接FastDFS、操作FastDFS,那我们的Java程序就是一个客户端,FastDFS提供专有API访问,目前提供了C、Java和PHP几种编程语言的API,用来访问FastDFS文件系统。服务端由两个部分构成:一个是跟踪器(tracker),一个是存储节点(storage)
跟踪器(tracker)主要做调度工作,在内存中记录集群中存储节点storage的状态信息,是前端Client和后端存储节点storage的枢纽。因为相关信息全部在内存中,Tracker server的性能非常高,一个较大的集群(比如上百个group)中有3台就足够了。
存储节点(storage)用于存储文件,包括文件和文件属性(meta data)都保存到存储服务器磁盘上,完成文件管理的所有功能:文件存储、文件同步和提供文件访问等。

三、FastDFS搭建

搭建手册  https://gitee.com/fastdfs100/fastdfs/wikis/Home

使用的系统软件

项目Value
libfastcommonlibfastcommon FastDFS分离出的一些公用函数包
FastDFSFastDFS本体
fastdfs-nginx-moduleFastDFS和nginx的关联模块
nginxnginx1.15.4

1、编译环境

因为是C写的
yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y

2、安装

libfastcommon 安装
克隆深度最后一次提交 depth 1  
gitee  https://gitee.com/fastdfs100/libfastcommon.git

git clone https://github.com/happyfish100/libfastcommon.git --depth 1
 cd libfastcommon/ #编译安装 ./make.sh && ./make.sh install
FastDFS 安装
gitee  https://gitee.com/fastdfs100/fastdfs.git

git clone https://github.com/happyfish100/fastdfs.git --depth 1 
cd fastdfs/ 
./make.sh && ./make.sh install 
#编译安装 #供nginx访问使用 
cp /usr/local/soft/fastdfs/conf/http.conf /etc/fdfs/ 
cp /usr/local/soft/fastdfs/conf/mime.types /etc/fdfs/
fastdfs-nginx-module 安装
gitee   https://gitee.com/fastdfs100/fastdfs-nginx-module.git

git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1 
cp /usr/local/soft/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs
nginx 安装
wget http://nginx.org/download/nginx-1.15.4.tar.gz #下载nginx压缩包 
tar -zxvf nginx-1.15.4.tar.gz #解压 
cd nginx-1.15.4/ 
#添加fastdfs-nginx-module模块
./configure --add-module=/usr/local/soft/fastdfs-nginx-module/src/ 
 make && make install #编译安装

3、单机部署

服务器ip: 192.168.56.40
# /etc/hosts 
192.168.56.40 fastdfs40.com

tracker配置

mkdir -p /data/fastdfs 
vim /etc/fdfs/tracker.conf 
#需要修改的内容如下 
port=22122 # tracker服务器端口(默认22122,一般不修改) 
base_path=/data/fastdfs # 存储日志和数据的根目录

storage配置

vim /etc/fdfs/storage.conf 
#需要修改的内容如下 
port=23000 # storage服务端口(默认23000,一般不修改) 
base_path=/data/fastdfs # 数据和日志文件存储根目录 
store_path0=/data/fastdfs # 第一个存储目录 
tracker_server=fastdfs40.com:22122 
# tracker服务器IP和端口 
http.server_port=8888 # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)

启动服务

# 永久关闭防火墙 
systemctl disable firewalld.service 
#启动tracker 
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf 
#启动storage 
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf 
# 重启storage 
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

client测试

vim /etc/fdfs/client.conf 
#需要修改的内容如下 
base_path=/data/fastdfs 
tracker_server=fastdfs40.com:22122 
#tracker服务器IP和端口 #保存后测试,返回ID表示成功 如:group1/M00/00/00/wKg4KGGSfOiAJyxUAAAXpJogFso885.jpg
# 上传文件 
fdfs_upload_file /etc/fdfs/client.conf /usr/local/soft/fox.jpg 
# 删除文件 
fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKg4KGGSfOiAJyxUAAAXpJogFso885.jpg

配置nginx访问(client)

vim /etc/fdfs/mod_fastdfs.conf 
#需要修改的内容如下 
tracker_server=fastdfs.com:22122 
#tracker服务器IP和端口 
url_have_group_name=true 
store_path0=/data/fastdfs 


#配置nginx.config 
vim /usr/local/nginx/conf/nginx.conf 
#添加如下配置 
server { 
	  listen 8888; ## 该端口为storage.conf中的http.server_port相同
      server_name localhost; 
      location ~/group[0-9]/ { 
          ngx_fastdfs_module; 
      }
      error_page 500 502 503 504 /50x.html; 
      location = /50x.html { 
           root html; 
           } 
      }
/usr/local/nginx/sbin/nginx #启动nginx
/usr/local/nginx/sbin/nginx -s reload #重启nginx
/usr/local/nginx/sbin/nginx -s stop #停止nginx

测试

http://fastdfs40.com:8888/group1/M00/00/00/wKg4KGGSfOiAJyxUAAAXpJogFso885.jpg

四、SpringBoot集成

<dependency>
            <groupId>com.github.tobato</groupId>
            <artifactId>fastdfs-client</artifactId>
            <version>1.26.2</version>
</dependency>
如果和日志框架jar包冲突加上
            <exclusions>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                </exclusion>
            </exclusions>
配置文件    如果并发大,导致图片混淆,加大timeout
fdfs.soTimeout=1501
fdfs.connectTimeout=601
fdfs.thumbImage.width=80
fdfs.thumbImage.height=80
fdfs.trackerList[0]=192.168.56.40:22122
/**
 * 导入FastDFS-Client组件
 * 
 * @author tobato
 *
 */
@Configuration
@Import(FdfsClientConfig.class)
// 解决jmx重复注册bean的问题
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class FastdfsImporter {
    // 导入依赖组件
}
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.Charset;

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import com.github.tobato.fastdfs.domain.StorePath;
import com.github.tobato.fastdfs.exception.FdfsUnsupportStorePathException;
import com.github.tobato.fastdfs.service.FastFileStorageClient;

@Component
public class FastDFSClient {

	@Autowired
	private FastFileStorageClient storageClient;


	/**
	 * 上传文件
	 * @param file
	 *            文件对象
	 * @return 文件访问地址
	 * @throws IOException
	 */
	public String uploadFile(MultipartFile file) throws IOException {
		StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(),
				FilenameUtils.getExtension(file.getOriginalFilename()), null);

		return storePath.getFullPath();
	}

	public String uploadFile2AndThumbImage(MultipartFile file) throws IOException {
		StorePath storePath = storageClient.uploadImageAndCrtThumbImage(file.getInputStream(), file.getSize(),
				FilenameUtils.getExtension(file.getOriginalFilename()), null);

		return storePath.getFullPath();
	}

	public String uploadQRCode(MultipartFile file) throws IOException {
		StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(),
				"png", null);

		return storePath.getPath();
	}

	public String uploadFace(MultipartFile file) throws IOException {
		StorePath storePath = storageClient.uploadImageAndCrtThumbImage(file.getInputStream(), file.getSize(),
				"png", null);

		return storePath.getPath();
	}

	public String uploadBase64(MultipartFile file) throws IOException {
		StorePath storePath = storageClient.uploadImageAndCrtThumbImage(file.getInputStream(), file.getSize(),
				"png", null);

		return storePath.getPath();
	}

	/**
	 * 将一段字符串生成一个文件上传
	 *
	 * @param content
	 *            文件内容
	 * @param fileExtension
	 * @return
	 */
	public String uploadFile(String content, String fileExtension) {
		byte[] buff = content.getBytes(Charset.forName("UTF-8"));
		ByteArrayInputStream stream = new ByteArrayInputStream(buff);
		StorePath storePath = storageClient.uploadFile(stream, buff.length, fileExtension, null);
		return storePath.getPath();
	}


	/**
	 * 删除文件
	 *
	 * @param fileUrl
	 *            文件访问地址
	 * @return
	 */
	public void deleteFile(String fileUrl) {
		if (StringUtils.isEmpty(fileUrl)) {
			return;
		}
		try {
			StorePath storePath = StorePath.praseFromUrl(fileUrl);
			storageClient.deleteFile(storePath.getGroup(), storePath.getPath());
		} catch (FdfsUnsupportStorePathException e) {
			e.getMessage();
		}
	}
}

五、原理

client只和tracker通信,tracker负责调度,查看storage的状态,和文件同步情况, 

六、问题

1.不用rm命令删除文件,删除文件要用fastdfs的命令去删除,,否则不会产生文件同步(binlog日志没有记录)

总结

提示:这里对文章进行总结:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值