• 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

  • 相关阅读:
    Codeforces Gym 100015F Fighting for Triangles 状压DP
    Codeforces Gym 100015B Ball Painting 找规律
    Codeforces Gym 100015A Another Rock-Paper-Scissors Problem 找规律
    Codeforces Gym 100231G Voracious Steve 记忆化搜索
    Codeforces Gym 100231F Solitaire 折半搜索
    Codeforces Gym 100231L Intervals 数位DP
    Codeforces Gym 100231B Intervals 线段树+二分+贪心
    Codeforces Round #339 (Div. 1) A. Peter and Snow Blower 计算几何
    Codeforces Round #339 (Div. 2) B. Gena's Code 水题
    Codeforces Round #339 (Div. 2) A. Link/Cut Tree 水题
  • 原文地址:https://www.cnblogs.com/chinacloud/p/1938870.html
Copyright © 2020-2023  润新知