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

posted @ 2011-01-19 10:11 chinacloud 阅读(...) 评论(...) 编辑 收藏