Summer:想使用fastdfs做照片存储,请教一下
Summer:
先前没接触过类似的东西,没什么概念,如果问的问题很白痴,请不要见笑。
看了php api之后有一个疑问,我想获取一张照片显示在html页面中,使用 storage_download_file_to_buff 将照片数据获取出来然后发送到浏览器吗?
那么这个 buff 是不是web服务器的内存?
比如我的这个页面 http://www.groops.cn/photos/view/192/
如何用php api 将照片显示出来。
最后,非常感谢happyfishman的工作。
happy_fish100:
可以这么做。
>> 那么这个 buff 是不是web服务器的内存?
是的,的确如此。
也可以直接在storage server上架设web server,不使用FastDFS的API,直接访问文件,输出文件内容即可。
Summer:尝试了一下,没成功
刚才在一台redhat as4 上尝试了一下,没成功,是不是无法在一台机器上同时跑 storage server 和 tracker?我将ip写成127.0.0.1,运行test upload,log提示不允许127.0.0.1,换成 61.218... 的ip也不行,说没有找到目录或文件。
这个东西很让我兴奋
happy_fish100:
一台机器上可以同时运行tracker server和storage server。IP地址不能使用127.0.0.1,必须写成实际的IP地址。你需要指定base_path,并确保该路径已经存在。
Summer:还是出错
happyfishman 大哥麻烦你真实不好意思,我希望在我的网站能用上,然后帮你推广一下。
按照你的提示我又测试了几次,还是出错:
执行:
/usr/local/bin/fdfs_test /www/software/FastDFS/conf/storage.conf upload /www/software/php-5.2.6.tar.gz
提示:
tracker_query_storage fail, error no: 2, error info: No such file or directory
实际上 php-5.2.6.tar.gz 这个文件存在,base_path 定义的 /home/fastdfs/ 目录也存在.
用php api测试也失败,提示:
storage_upload_by_filename fail, result=2
Warning: unpack() [function.unpack]: Type N: not enough input, need 4, have 0 in /www/htdocs/zonezhi/htdocs/beta/fastdfs/fdfs_common.php on line 286
storage_upload_by_filename fail, result=22tracker_query_storage_fetch fail, errno: 5storage_download_file_to_file fail, errno: 5storage_download_file_to_buff fail, errno: 5set metadata result: 5storage_get_metadata fail, errno: 5delete file result: 5
happy_fish100:
可能有两种情况导致出现你说所的错误:
1. storage server没有正确配置或没有启动
2. 硬盘剩余空间不足
具体出错信息可以看一下日志文件/home/fastdfs/logs/storage.log和/home/fastdfs/logs/tracker.log。
另外,可以通过运行 fdfs_monitor来查看服务器状态。
/usr/local/bin/fdfs_monitor /www/software/FastDFS/conf/storage.conf
通过上面的方法,应该可以解决你的问题。
Summer:
成功了!!!
之前可能配置文件的几个细节没有搞清楚。
非常感谢老大!!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
heming96:
group_name=group1, remote_filename=52/D8/SQu61QAAR1ZHRhyx group_name=group1, remote_filename=0A/BE/SQu61QAAR1YxlmqN storage server 192.168.1.212:23000
Warning: fopen(ttt.dat) [function.fopen]: failed to open stream: Permission denied in /usr/local/FastDFS/fdfs_common.php on line 169
storage_download_file_to_file fail, errno: 5 download file to buff success, file size: 18262, buff size:18262
Warning: file_put_contents(0A_BE_SQu61QAAR1YxlmqN) [function.file-put-contents]: failed to open stream: Permission denied in /usr/local/FastDFS/fdfs_test.php on line 132
happy_fish100:
估计原因有如下两种情况:
1. 当前用户对当前目录没有写权限;
2. 当前路径不在PHP的open_base路径中。
请检查确认一下。
heming96:新加节点时无法自动同步旧的数据
确实是权限问题,apache是用daemon用户启动的,需要将 /usr/local/FastDFS/ 目录执行 chown daemon /usr/local/FastDFS/ -R ,这样下载文件才能正常写。
目前文件存放只能放在 256*256个目录中, 能否在创建的时候区分日期,另外新加节点时无法自动同步旧的数据 能否留个MSN 方便联系。
happy_fish100:
>>目前文件存放只能放在 256*256个目录中, 能否在创建的时候区分日期,另外新加节点时无法自动同步旧的数据 能否留个MSN 方便联系。
的确如此,文件在服务器上是两级目录存放的。文件名中包含了文件创建时间,可以通过文件名得到文件创建时间。调用方不用关心文件是怎么保存的,只要根据返回的文件ID对文件进行访问就可以了。
新加节点应该可以自动同步旧的数据的,如果的确存在这个问题,重启一下新节点上的fdfs_storaged试试。我的MSN:happy_fish100@hotmail.com,保持联系。
heming96:自动同步是不是应该单独分出来一个日志文件
我是希望在文件名或目录包含日期,这样我可以跟踪或删除某天的数据,自动同步是不是应该单独分出来一个日志文件,方面管理员跟踪同步进程。 分布式文件系统最重要的是新加节点时能自动同步,而且同步结果让管理员放心 这样管理员用起来就不会如履薄冰 呵呵 !
happy_fish100:FastDFS设计和实现已经做到了自动同步。如果自动同步有问题,请按我说的方法试试。自动同步功能我也会进一步测试一下。
happy_fish100:新增服务器自动同步的确存在一点问题,在即将发布的V1.12中已经修复。谢谢大家的大力支持!
olgeer:
打听一下,你的1.12什么时候会发布?
最近在找分布式文件存储的方案,这里提到的自动同步的问题比较关键。
happy_fish100:
V1.12正在紧张的测试过程中,预计下周可以发布。
V1.12修复了文件同步的几个问题,支持从服务器列表中删除已经下线或无效的存储服务器。
另外几个重大改进如下:
1. 对于下载一个已经存在的文件,当客户端询问tracker server时,tracker server将返回一个有效的storage server,保证该文件在该storage server上的确存在。这样就修正了文件同步延迟导致其他服务器上新文件尚未存在的问题。
2. 对于删除文件和修改meta data,提供了query storage server for update的函数,保证对一个文件的后续更新操作都在同一台storage server上完成,这样就有效地解决了时序问题。
3. 支持客户端指定文件后缀,便于在storage server上部署web server,配合web server通过文件后缀完成文件类型识别。
4. 磁盘IO优化:binlog记录采用cache方式,而不是每条记录都fsync到硬盘;写文件时,按目录顺序存储的效果比按目录分散(随机)存储要好。
5. 一台storage server支持多个目录(mount point)。为了提高硬盘IO,建议将多块硬盘分别mount成独立的目录,然后交给FastDFS管理。
6. 提供了将服务器返回的两个字段group name和filename合并为一个字段file_id的API
7. 为了支持流处理,客户端文件下载函数支持callback
olgeer:再次请教
已经下载1.12试用中,想请教一下,是否同一个group的服务器,相互之间的内容就会备份呢? 像Raid1一样。
另外,现有结构,应该是支持多个Tracker同时存在的,那Tracker之间会互相通信保证索引信息一致吗? 就是说应用分布通过不同的Tracker存取文件,结果是否一致?
再次感谢你的工作为我们带来的帮助。
happy_fish100:
>> 是否同一个group的服务器,相互之间的内容就会备份呢? 像Raid1一样。
的确如此。一个group可以包含一台或多台服务器,同一个group内的服务器上的文件是完全相同的。如果一个group内有两台服务器,那相当于是RAID1。
>> 另外,现有结构,应该是支持多个Tracker同时存在的,那Tracker之间会互相通信保证索引信息一致吗? 就是说应用分布通过不同的Tracker存取文件,结果是否一致?
tracker server之间并不会相互通信,storage server会定期向所有tracker server报告自己的状态,包括硬盘空间、上传下载次数等统计信息。tracker server上只在内存中记录了各个storage server的状态和统计信息,并不会记录文件的索引信息。tracker server返回给应用(调用方)的信息仅包含storage server的IP和端口,然后由应用直接和storage server通信完成文件上传或下载。在多台tracker server的情况下,各台tracker server上的信息都是一致的。存取文件是应用直接和storage server通信完成的,tracker server只起到了引导或调度的作用。