FastDFS使用中的几个常见问题

Posted Huazie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FastDFS使用中的几个常见问题相关的知识,希望对你有一定的参考价值。

FastDFS使用中的几个常见问题

本篇文章转载于FastDFS作者 余庆 大佬的 FastDFS分享与交流 公众号。

1. FastDFS适用的场景以及不适用的场景

FastDFS 是为互联网应用量身定做的一套分布式文件存储系统,非常适合用来存储图片、音频、视频、文档等文件。对于互联网应用,简洁高效的 FastDFS 和其他分布式文件系统相比,优势非常明显。具体情况大家可以查阅相关介绍文档,如:FastDFS架构设计文档等等。

出于简洁考虑,FastDFS 没有对文件做分块存储,因此不太适合分布式计算场景。

2. 服务器时间必须保持一致

因为 FastDFS 的精巧设计不需要存储文件索引,FastDFS 通过比较时间戳来判断文件是否同步完成。因此集群内的服务器时间要保持一致,各台服务器的时间差值不要超过 1 秒。建议采用 NTP 对时服务。

3. too many open files 错误解决方法

日志中报打开文件过多的错误,是因为系统允许一个进程打开的文件数设置太小了。Linux环境下的解决办法,修改文件 /etc/security/limits.conf,在文件尾部添加如下代码(如果已经存在则修改相应数值):

root soft nofile 65535

root hard nofile 65535

 * soft nofile 65535

 * hard nofile 65535

注: 只配置最后两行不就可以了吗,为啥还要单独为 root 用户配置呢?查了网上资料,说是*这样的通配符对 root 用户无效,所以 root 需要单独配置(嗯,阿里云ECS就配置了上面这4行)。

4. FastDFS服务启停

FastDFS server 程序自带 startstoprestart 指令,命令行示例如下:

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf  [start | stop | restart]

/usr/bin/fdfs_storaged /etc/fdfs/storage.conf  [start | stop | restart]

可以使用 kill 或者 killall 正常杀掉 fdfs_trackerdfdfs_storaged 进程,但千万不要加上 -9 参数强杀,否则可能会导致 binlog 数据丢失等问题。

5. FastDFS支持断点续传吗?

上传和下载文件均可支持。

5.1 文件上传

对于文件上传,需要先上传 appender 类型的文件,然后使用 apend 方法。

如果要上传超过 1GB 的大文件,建议采用 append 方式分多次上传,比如每次上传 64MB。需要先创建 appender 类型的文件,可以创建空的 appender 文件。

对于超大文件,如果想支持多线程上传以加快上传速度,可以采用如下3个步骤实现:

(1)上传 appender 类型的文件;
(2)调用 truncate 方法将该 appender 文件设置为最终文件大小;
(3)调用 modify 方法并发上传文件分片。

5.2 文件下载

对于文件下载,FastDFS可以指定文件偏移量和获取的文件内容大小。利用这个特性,文件下载可以实现断点续传以及多线程下载。

6. Java SDK非线程安全

FastDFS 提供的 Java SDK 是非线程安全的,有人已经踩过这个坑了。包括负责与 tracker server 交互的 TrackerClient、与 storage server 直接通信的StorageClientStorageClient1 这三个类均是非线程安全的。

为啥会出现两个 StorageClient 字样的类名呢?二者实现功能完全一样, StorageClientgroupfilename 分离的用法,StorageClient1groupfilename 合体用法(文件ID)。通常使用 StorageClient1 就好。

总结

大家在部署和使用 FastDFS 的过程中有任何疑问,欢迎在FastDFS QQ群或微信公众号交流。我可以根据大家的反馈和交流结果,继续整理 FastDFS 常见问题。

以上是关于FastDFS使用中的几个常见问题的主要内容,如果未能解决你的问题,请参考以下文章

片段问题中的 NullPointerException

使 PHP 代码更加简洁的几个小技巧

最近项目中巧遇的几个好工具,分享一下

一个NIB中的几个自定义UITableViewCells - 如何在代码中引用?

片段之间的静态 ArrayList

zoho在线文档使用小技巧