FastDFS注意事项
>>1.除了在storage.conf里的tracker_server增加tracker的ip和端口,其他地方要注意什么?
恩,tracker server ip和端口,肯定是要正确设置的。支持多tracker server,每行设置一个tracker。
另外,base_path也要正确设置。
其余参数,通常采用缺省配置即可。你可以看一下配置说明那个帖子。
>>每台tracker和storage的启动有没有先后关系?
正常情况下,应该先启动tracker。
FastDFS不会有这样的要求,你要启动storage也是没有任何问题的。
>>2.想要把fastDFS产生的记录清空,再重新搭建一次,应该删除哪些文件?
停止storage server和tracker server,删除base_path下的data子目录即可。
注意:storage 的data目录下保存了上传文件,删除时请慎重。
>>>>[2010-12-15 15:51:35] ERROR - file:
../common/pthread_func.c, line: 163, create thread failed, startup
threads: 2173, errno: 11, error info: Resource temporarily unavailable
最后这一行已经说明问题了,创建的线程太多,使用的资源已经达到系统上限。
解决方法:继续使用现有版本,调小max_connections这个参数,比如调整为1024。
另外一个方法,升级到2.x,比如2.05。2.x采用异步IO模型,可以使用有限的几个线程,支持大量的并发连接。
比如,线程数可以配置为4,支持的最大连接数可以配置为1024或者更高。
昨天看了代码发现程序会在启动服务的时候,会创建设置的连接数,用来检验服务器是否能够支持使用者设置的最大连接。
>>>>程序中要访问,比如上传文件,可以使用FastDFS提供的java API。
客户端通过HTTP下载文件时,可以走web server,如apache、nginx等。
>>>>请问通过http下载文件时,能否让下载的文件名称自动变成原文件名称?
可以使用文件附加属性来存储该文件的原文件名。在apache或nginx扩展模块中,可以在HTTP Header中输出原文件名。
>>1、简单看了下Java client的代码,看到可以通过client api获取上传文件的group name and filename,请问能否直接通过API获取http访问地址?
A: 生成http访问地址,没有提供现成的方法,但提供了示例代码,在TestClient1.java和TestClient.java中均有。摘录一下TestClient.java中的代码如下:
int ts;
String token;
String file_url;
InetSocketAddress inetSockAddr;
System.err.println("file_id: " + file_id);
inetSockAddr = trackerServer.getInetSocketAddress();
file_url = "http://" + inetSockAddr.getAddress().getHostAddress();
if (ClientGlobal.g_tracker_http_port != 80)
{
file_url += ":" + ClientGlobal.g_tracker_http_port;
}
file_url += "/" + file_id;
if (ClientGlobal.g_anti_steal_token)
{
ts = (int)(System.currentTimeMillis() / 1000);
token = ProtoCommon.getToken(file_id, ts, ClientGlobal.g_secret_key);
file_url += "?token=" + token + "&ts=" + ts;
}
System.err.println("file url: " + file_url);
>>2、还有一个问题,每一个group是否存储了所有的上传文件;还是说group A存储一部分,group B存储一部分,同一个group中的storage server存储的文件都相同。
A: 答案为后者。即:group A存储一部分,group B存储一部分,同一个group中的storage server存储的文件都相同。
FastDFS存储服务器的硬盘可以做RAID,比如RAID5等等,这样系统中的mount point只有一个。
也可以单个硬盘直接mount使用,这样系统中的mount point就是多个(多个硬盘的情况下)。
RAID5并不能充分发挥各个磁盘的最大吞吐量,出于磁盘IO效率考虑,建议采用第二种做法,这样磁盘整体IO吞吐量最理想的情况下,为各个硬盘IO吞吐量之和。
采用多个mount point的情况下,如果有一块硬盘损坏,可以有两种修复方法:
1. 更换掉坏掉的硬盘,在服务停止的情况下,手工复制已有服务器上该路径的文件到该mount point,然后启动FastDFS服务程序fdfs_storaged;
2. 更换一台同样配置的新服务器,或者更换掉坏的硬盘后,重做系统,然后启动FastDFS服务fdfs_storaged即可。
只要${base_path}这个路径所在硬盘没有坏,也就是系统数据文件(如${base_path}/data/sync/*)都在的情况下,文件自动同步是没有任何问题的。
重新启动:
root@ubuntu:/# /usr/local/bin/restart.sh /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf
FastDFS系统中的文件ID与用户存储进去的逻辑文件是不同的,由于没有索引服务器,那么这种文件名映射关系不是要需要由用户自己来保存?
的确如此,目前的确需要由应用端来保存。
FastDFS系统中的文件ID与用户存储进去的逻辑文件是不同的,我有一个客户端,想通过文件名进行操作,不知该怎样实现?也就是说,文件名到ID的转换,我自己写的客户端该怎么转换呢?
像你这样的应用场合,再加一层好了,实现文件名到文件ID的转换。比如可以基于数据库来做,或者通过分布式kv系统,如TT、FastDHT等等来做。
>>这些Track Server的内容是对等的,还是分组,每个Track Server负责一部分Storage Server?
对等的。
>>Client是绑定一个Track Server,还是可以绑定多个或全部?
在一个集群中,应该绑定全部。
>>Storage Server也是同样的问题,是绑定一个Track Server,还是可以多个或者全部?
在一个集群中,应该绑定全部。
>>如果没有绑定全部Tracker Sever,那么Tracker Sever之间可能会出现不一致的情况。我看到文档说Tracker Sever之间不进行数据同步,这种问题如何解决呢?
应该绑定所有Tracker server啊。
万一有个别storage server没有绑定所有tracker server,也不会出现问题。
正确的做法是绑定所有tracker server。
定位问题首先要看日志文件。出现问题时,先检查返回的错误号和错误信息。然后查看服务器端日志,相信可以定位到问题所在。
1. FastDFS需要的编译和运行环境是怎样的?
FastDFS Server仅支持unix系统,在Linux和FreeBSD测试通过。在Solaris系统下网络通信方面有些问题。
编译需要的其他库文件有pthread和libevent。
pthread使用系统自带的即可。
对libevent的版本要求为1.4.x,建议使用最新的stable版本,如1.4.14b。
注意,千万不要使用libevent 2.0及以上版本。
2. 有人在生产环境中使用FastDFS吗?
答案是肯定的。据我所知,至少有20家公司在使用FastDFS,其中有好几家是做网盘的公司。
3. 启动storage server时,一直处于僵死状态。
A:启动storage server,storage将连接tracker server,如果连不上,将一直重试。直到连接成功,启动才算真正完成。
出现这样情况,请检查连接不上tracker server的原因。
4. 执行fdfs_test或fdfs_test1上传文件时,服务器返回错误号2
错误号表示没有ACTIVE状态的storage server。可以执行fdfs_monitor查看服务器状态。
5. 如何让server进程退出运行?
直接kill即可让server进程正常退出,可以使用killall命令,例如:
killall fdfs_trackerd
killall fdfs_storaged
也可以使用FastDFS自带的stop.sh脚本,如:
/usr/local/bin/stop.sh /usr/local/bin/fdfs_storaged /etc/fdfs/storage.conf
stop.sh只会停止命令行(包括参数)完全相同的进程。
千万不要使用-9参数强杀,否则可能会导致binlog数据丢失的问题。
6. 如何重启server进程?
可以kill掉server进程后,执行启动命令行。如:
killall fdfs_trackerd
/usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf
或者直接使用FastDFS自带的restart.sh脚本,如:
/usr/local/bin/restart.sh /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf
7. 跨运营商通信异常问题
比如电信和网通机房相互通信,可能会存在异常,有两种表现:
1)不能建立连接,这个比较直接,肯定是网络连接的问题
2)可以正常建立连接,但接收和发送数据失败,这个问题比较隐蔽,正常网络环境下,不应该出现此类问题。
还有人碰到过从一个方向建立连接可以正常通信,但从另外一个方向就不能正常通信的情况。
解决办法:
尝试将服务端口改小,建议将端口修改为1024以下。比如将storage服务端口由23000修改为873等,也可以试试修改为8080
如果问题还不能解决,请联系你的网络(机房)服务商。
8. fdfs_test和fdfs_test1是做什么用的?
这两个是FastDFS自带的测试程序,会对一个文件上传两次,分别作为主文件和从文件。返回的文件ID也是两个。
并且会上传文件附加属性,storage server上会生成4个文件。
这两个程序仅用于测试目的,请不要用作实际用途。
V2.05提供了比较正式的三个小工具:
上传文件:/usr/local/bin/fdfs_upload_file <config_file> <local_filename>
下载文件:/usr/local/bin/fdfs_download_file <config_file> <file_id> [local_filename]
删除文件:/usr/local/bin/fdfs_delete_file <config_file> <file_id>
在FastDFS的服务器端配置文件中,bind_addr
这个参数用于需要绑定本机IP地址的场合。只有这个参数和主机特征相关,其余参数都是可以统一配置的。在不需要绑定本机的情况下,为了便于管理和维护,建
议所有tracker server的配置文件相同,同组内的所有storage server的配置文件相同。
tracker server的配置文件中没有出现storage server,而storage
server的配置文件中会列举出所有的tracker server。这就决定了storage server和tracker
server之间的连接由storage server主动发起,storage server为每个tracker
server启动一个线程进行连接和通讯,这部分的通信协议请参阅《FastDFS HOWTO -- Protocol》中的“2. storage
server to tracker server command”。
tracker server会在内存中
保存storage分组及各个组下的storage server,并将连接过自己的storage
server及其分组保存到文件中,以便下次重启服务时能直接从本地磁盘中获得storage相关信息。storage
server会在内存中记录本组的所有服务器,并将服务器信息记录到文件中。tracker server和storage
server之间相互同步storage server列表:
1. 如果一个组内增加了新的storage server或者storage server的状态发生了改变,tracker
server都会将storage server列表同步给该组内的所有storage server。以新增storage
server为例,因为新加入的storage server主动连接tracker server,tracker
server发现有新的storage server加入,就会将该组内所有的storage server返回给新加入的storage
server,并重新将该组的storage server列表返回给该组内的其他storage server;
2. 如果新增加一台tracker server,storage server连接该tracker server,发现该tracker
server返回的本组storage server列表比本机记录的要少,就会将该tracker server上没有的storage
server同步给该tracker server。
同一组内的storage server之间是对等的,文件上传、删除等操作可以在任意一台storage
server上进行。文件同步只在同组内的storage
server之间进行,采用push方式,即源服务器同步给目标服务器。以文件上传为例,假设一个组内有3台storage server
A、B和C,文件F上传到服务器B,由B将文件F同步到其余的两台服务器A和C。我们不妨把文件F上传到服务器B的操作为源头操作,在服务器B上的F文件
为源头数据;文件F被同步到服务器A和C的操作为备份操作,在A和C上的F文件为备份数据。同步规则总结如下:
1. 只在本组内的storage server之间进行同步;
2. 源头数据才需要同步,备份数据不需要再次同步,否则就构成环路了;
3. 上述第二条规则有个例外,就是新增加一台storage server时,由已有的一台storage server将已有的所有数据(包括源头数据和备份数据)同步给该新增服务器。
storage server有7个状态,如下:
# FDFS_STORAGE_STATUS_INIT :初始化,尚未得到同步已有数据的源服务器
# FDFS_STORAGE_STATUS_WAIT_SYNC :等待同步,已得到同步已有数据的源服务器
# FDFS_STORAGE_STATUS_SYNCING :同步中
# FDFS_STORAGE_STATUS_DELETED :已删除,该服务器从本组中摘除(注:本状态的功能尚未实现)
# FDFS_STORAGE_STATUS_OFFLINE :离线
# FDFS_STORAGE_STATUS_ONLINE :在线,尚不能提供服务
# FDFS_STORAGE_STATUS_ACTIVE :在线,可以提供服务
当storage server的状态为FDFS_STORAGE_STATUS_ONLINE时,当该storage server向tracker
server发起一次heart beat时,tracker server将其状态更改为FDFS_STORAGE_STATUS_ACTIVE。
组内新增加一台storage server A时,由系统自动完成已有数据同步,处理逻辑如下:
1. storage server A连接tracker server,tracker server将storage server
A的状态设置为FDFS_STORAGE_STATUS_INIT。storage server
A询问追加同步的源服务器和追加同步截至时间点,如果该组内只有storage server
A或该组内已成功上传的文件数为0,则没有数据需要同步,storage server
A就可以提供在线服务,此时tracker将其状态设置为FDFS_STORAGE_STATUS_ONLINE,否则tracker
server将其状态设置为FDFS_STORAGE_STATUS_WAIT_SYNC,进入第二步的处理;
2. 假设tracker server分配向storage server A同步已有数据的源storage
server为B。同组的storage server和tracker server通讯得知新增了storage server
A,将启动同步线程,并向tracker server询问向storage server A追加同步的源服务器和截至时间点。storage
server B将把截至时间点之前的所有数据同步给storage server A;而其余的storage
server从截至时间点之后进行正常同步,只把源头数据同步给storage server A。到了截至时间点之后,storage server
B对storage server A的同步将由追加同步切换为正常同步,只同步源头数据;
3. storage server B向storage server A同步完所有数据,暂时没有数据要同步时,storage server
B请求tracker server将storage server A的状态设置为FDFS_STORAGE_STATUS_ONLINE;
4 当storage server A向tracker server发起heart beat时,tracker server将其状态更改为FDFS_STORAGE_STATUS_ACTIVE。
http://blogold.chinaunix.net/u2/74846/index.html