FastDFS分布文件系统

转载 2015年11月19日 16:54:01
FastDFS是为互联网应用量身定做的一套分布式文件存储系统,非常适合用来存储用户图片、视频、文档等文件。对于互联网应用,和其他分布式文件系统相比,优势非常明显。
</pre><pre name="code" class="java">
</pre><pre name="code" class="java">
import java.io.File;
import java.io.FileInputStream;

import org.apache.log4j.Logger;
import org.csource.common.IniFileReader;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.ServerInfo;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;




public class FastDFSUtils
{
	
	private static Logger log = Logger.getLogger(FastDFSUtils.class);
	

	public static String getFileName(String filePath)
	{
		String fileName = null;
		if (filePath != null)
		{
			int index = filePath.replace("\\", "/").lastIndexOf("/");
			fileName = filePath.substring(index);
		}
		return fileName;
	}
	

	public static String getFileFormat(String fileName)
	{
		String fileFormat = null;
		if (fileName != null && fileName.contains("."))
		{
			String[] arry = fileName.split("[.]");
			fileFormat = arry[1];
		}
		return fileFormat;
	}
	

	public static FileVO upload(String filePath, String configRootPath,
			String oldFileName, String fileFormat)
		throws Exception
	{
		File file = new File(filePath);
		FileVO fileVo = upload(file, configRootPath, oldFileName, fileFormat);
		return fileVo;
	}
	
	
	public static FileVO upload(File file, String configRootPath,
			String oldFileName, String fileFormat)
		throws Exception
	{
		boolean isOK = false;
		long uploadTime = 0;
		String groupName = null;
		String newFileName = null;
		long fileSize = 0;
		
		String classPath = configRootPath == null ? new File(FastDFSUtils.class
				.getResource("/").getFile()).getCanonicalPath()
				: configRootPath;
		String configFilePath = classPath + File.separator + "fdfs_client.conf";
		if (new File(configFilePath.replace("%20", " ")).exists())
		{
			System.out.println("配置文件:" + configFilePath);
			
			ClientGlobal.init(configFilePath.replace("%20", " "));
			IniFileReader iniReader = new IniFileReader(configFilePath.replace(
					"%20", " "));
			groupName = iniReader.getStrValue("groupName");
			TrackerClient trackerClient = new TrackerClient();
			TrackerServer trackerServer = trackerClient.getConnection();
			
			StorageServer storageServer = null;
			StorageClient storageClient = new StorageClient(trackerServer,
					storageServer);
			
			NameValuePair[] meta_list = new NameValuePair[3];
			meta_list[0] = new NameValuePair("width", "120");
			meta_list[1] = new NameValuePair("heigth", "120");
			meta_list[2] = new NameValuePair("author", "gary");
			FileInputStream fis = new FileInputStream(file);
			byte[] file_buff = null;
			if (fis != null)
			{
				int len = fis.available();
				file_buff = new byte[len];
				fis.read(file_buff);
			}
			log.info("file length: " + file_buff.length);
			
			StorageServer[] storageServers = trackerClient.getStoreStorages(
					trackerServer, groupName);
			if (storageServers == null)
			{
				log.error("get store storage servers fail, error code: "
						+ storageClient.getErrorCode());
			}
			else
			{
				log.info("store storage servers count: "
						+ storageServers.length);
				for (int k = 0; k < storageServers.length; k++)
				{
					log.info(k
							+ 1
							+ ". "
							+ storageServers[k].getInetSocketAddress()
									.getAddress().getHostAddress()
							+ ":"
							+ storageServers[k].getInetSocketAddress()
									.getPort());
				}
				
			}
			
			long startTime = System.currentTimeMillis();
			/*
			 * String[] results = storageClient.upload_file(file_buff,
			 * fileFormat, meta_list);
			 */
			String[] results = storageClient.upload_file(groupName, file_buff,
					fileFormat, meta_list);
			uploadTime = System.currentTimeMillis() - startTime;
			log.info("upload_file time used: " + uploadTime + " ms");
			
			fis.close();
			
			if (results == null)
			{
				log.error("upload file fail, error code: "
						+ storageClient.getErrorCode());
				
				throw new Exception("upload file fail, error code: "
						+ storageClient.getErrorCode());
			}
			
			isOK = true;
			// groupName = results[0];
			newFileName = results[1];
			log.info("group_name: " + groupName + ", remote_filename: "
					+ newFileName);
			log.info(storageClient.get_file_info(groupName, newFileName));
			
			ServerInfo[] servers = trackerClient.getFetchStorages(
					trackerServer, groupName, newFileName);
			if (servers == null)
			{
				log.error("get storage servers fail, error code: "
						+ trackerClient.getErrorCode());
			}
			else
			{
				log.info("storage servers count: " + servers.length);
				for (int k = 0; k < servers.length; k++)
				{
					log.info(k + 1 + ". " + servers[k].getIpAddr() + ":"
							+ servers[k].getPort());
				}
				
			}
		}
		else
		{
			log.error("配置文件不存在!" + configFilePath);
			throw new Exception("配置文件不存在!");
		}
		
		FileVO fileVo = new FileVO(isOK, groupName, oldFileName, newFileName,
				fileSize, uploadTime, fileFormat);
		return fileVo;
	}
	
	
	public static byte[] download(String groupName, String fileName,
			String configRootPath)
		throws Exception
	{
		String classPath = configRootPath == null ? new File(FastDFSUtils.class
				.getResource("/").getFile()).getCanonicalPath()
				: configRootPath;
		String configFilePath = classPath + File.separator + "fdfs_client.conf";
		ClientGlobal
				.init(configFilePath.replace("%20", " ").replace("\\", "/"));
		TrackerClient trackerClient = new TrackerClient();
		TrackerServer trackerServer = trackerClient.getConnection();
		StorageServer storageServer = null;
		StorageClient storageClient = new StorageClient(trackerServer,
				storageServer);
		byte[] bytes = null;
		bytes = storageClient.download_file(groupName, fileName);
		return bytes;
		
	}
}

分布式文件系统FastDFS架构剖析

文/余庆   FastDFS是一款类Google FS的开源分布式文件系统,它用纯C语言实现,支持Linux、FreeBSD、AIX等UNIX系统。它只能通过专有API对文件进行存取访问,不支持...
  • weiyuefei
  • weiyuefei
  • 2016年08月19日 14:00
  • 592

分布式文件系统FastDFS架构剖析

文/余庆 FastDFS是一款类Google FS的开源分布式文件系统,它用纯C语言实现,支持Linux、FreeBSD、AIX等UNIX系统。它只能通过专有API对文件进行存取访问,不支持POSI...
  • xiaofei0859
  • xiaofei0859
  • 2015年07月28日 14:58
  • 2128

一、分布式文件系统fastDFS-设计原理

一、分布式文件系统fastDFS-设计原理 FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker server)、存储服务器(storage server)和客户端(cl...
  • u010558660
  • u010558660
  • 2016年08月29日 15:25
  • 2508

Fastdfs分布式文件系统之文件同步机制

在前面几篇文章中我们对fastdfs系统的概述、tracker server、storage server以及文件的上传、下载、删除等功能的介绍, 本文将对同一组的不同storage serve...
  • pzw_0612
  • pzw_0612
  • 2016年09月26日 18:26
  • 728

FastDFS+Nginx轻量级分布式文件系统安装使用

FastDFS的安装使用    一 简介 FastDFS是一个开源的轻量级 分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储...
  • xiaofei0859
  • xiaofei0859
  • 2016年05月18日 11:01
  • 1496

【FastDFS分布式文件系统之二】:FastDFS小文件上传性能测试及Python客户端上传操作

由于要对比swift上传小文件以及fdfs上传小文件的性能,故做性能测试。
  • lavorange
  • lavorange
  • 2016年03月08日 19:29
  • 5412

分布式文件系统FastDFS最佳部署实践

FastDFS安装 FastDFS简介 FastDFS是一个国产开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负...
  • GreatElite
  • GreatElite
  • 2013年09月03日 22:07
  • 3475

FastDFS 分布式文件系统的安装与使用(单节点)

跟踪服务器:192.168.4.121 存储服务器:192.168.4.125 环境:CentOS 6.6 用户:root数据目录:/fastdfs (注:数据目录按你的数据盘挂载路径而定)安...
  • lfdns
  • lfdns
  • 2017年12月14日 10:28
  • 50

FastDFS分布式文件系统集群安装与配置

FastDFS集群规划跟踪服务器负载均衡节点1:192.168.1.206 dfs-nginx-proxy-1 跟踪服务器负载均衡节点2:192.168.1.207 dfs-nginx-prox...
  • xyang81
  • xyang81
  • 2016年10月29日 17:05
  • 12429

分布式文件系统FastDFS设计原理

原文地址:http://blog.chinaunix.net/uid-20196318-id-4058561.html FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker...
  • tanga842428
  • tanga842428
  • 2017年01月11日 13:17
  • 381
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:FastDFS分布文件系统
举报原因:
原因补充:

(最多只允许输入30个字)