首页 > 技术文章 > fastDFS异常的处理(四)

lydms 2019-09-21 17:30 原文

fastDFS简介(一)
fastDFS服务器的安装(二)
spring boot集成fastDFS以及入门小Demo(三)
fastDFS异常的处理(四)


一、创建连接方式对性能影响

在公司并发测试的时候遇到的问题,开始并发量只能达到10的并发量,不满足设计要求(PS:要求20),(因为受到别的服务的影响,并发不高,和fastDFS没有关系)。我的这个服务只涉及到从fastDFS进行上传和下载,没有进行处理,不应该会这么低的并发。后来发现问题在于注册服务上;

上传文件

	//获取上传对象
	@Autowired
    private FastDFSClient fastDFSClient;
	//上传文件
		String[] upload_file = fastDFSClient.uploadFile(bytes, extFilename, null);

创建fastDFS连接

	public FastDFSClient() throws Exception {
    //调用PropertieUtil工具类获取配置文件中trackerServer内容
		String trackerServer=PropertieUtil.getProperty("application.properties", "trackerServer").replace("\"", "");
	//注册fastDFS服务
		ClientGlobal.initByTrackers(trackerServer);
		trackerClient = new TrackerClient();
		trackerServer = trackerClient.getConnection();
		storageServer = null;
    	storageClient = new StorageClient1(trackerServer, storageServer);
    }

封装的获取配置文件的工具类

public class PropertieUtil {
	public static String getProperty(String properties, String key) {	
		Properties pro = new Properties();
	//反向代理获取配置文件
		InputStream in = PropertieUtil.class.getClassLoader().getResourceAsStream(properties);

		try {
	//将配置文件转为properties类型
			pro.load(in);
		} catch (IOException e) {
			e.printStackTrace();
		}
	//获取需要的配置信息
		String property = pro.getProperty(key);

		return property;
	}

上面这种方式,在上传的时候,只需要进行上传服务就可以用,不再需要每次进行new注册服务。但是,这种服务会再去调用一个方法,通过反射的方式获取代码的方式,性能降低。将注册方式改为new类型注册以后,并发问题得到了解决。

上传文件

	//注入fastDF地址
    @Value(value = "${tracker_server}")
    private String tracker_server;
	//new获取上传连接对象
	FastDFSClient fast = new FastDFSClient(trackerServer);
	//上传文件
		String[] upload_file = fast.uploadFile(bytes, extFilename, null);

创建fastDFS连接

	public FastDFSClient(@Value(value = "${tracker_server}") String tracker_server) throws Exception {
	//注册fastDFS服务
        ClientGlobal.initByTrackers(tracker_server);
        trackerClient = new TrackerClient();
        trackerServer = trackerClient.getConnection();
        storageServer = null;
        storageClient = new StorageClient1(trackerServer, storageServer);
    }

二、getStoreStorage fail, errno code:28

引起错误的原因是,在我们配置tracker的时候,里面有一个配置项:

# reserved storage space for system or other applications.
# if the free(available) space of any stoarge server in
# a group <= reserved_storage_space,
# no file can be uploaded to this group.
# bytes unit can be one of follows:
### G or g for gigabyte(GB)
### M or m for megabyte(MB)
### K or k for kilobyte(KB)
### no unit for byte(B)
### XX.XX% as ratio such as reserved_storage_space = 10%
reserved_storage_space = 10%

该配置项是配置storage服务预留磁盘空间的大小的比值,默认是10%,即当磁盘空间不足10%时,则tracker拒绝上传文件。

解决方法:

  1. 删除不用的文件,最好调用DFS的删除API删除,因为DFS会维护一个索引文件,调用API删除时会连同索引文件都会删除。这种方式谨慎使用。
  2. 如果文件不允许删除,则需要扩展磁盘。

推荐阅读