save the upload files in DB, DB is more easy to get balance

解决方案 »

  1.   

    To:SeanChen(Sean)   往更深层想一下,关键是同步,如何保证同步的时候,某一个文件读取的次数最少,比如现在有5台文件服务器上没有某一个文件,同时去向某一台有这个文件的文件服务器去取,可能一般的设计就需要读5次这个文件,我希望是有这个文件的文件服务器能最少的工作量就能把自己的文件给每一个没有这个文件的文件服务器传过去
      

  2.   

    数据库的最大字段可以达到4G,而FAT32格式最大也支持2G,所以,放在数据库中,是一个比较合适的办法,兄弟。
      

  3.   

    nga96() ,你好,这样的文件估计有8000个左右,而且文件都是经常使用的,有程序在不停的读取这些文件
      

  4.   

    To:SeanChen(Sean)   往更深层想一下,关键是同步,如何保证同步的时候,某一个文件读取的次数最少,比如现在有5台文件服务器上没有某一个文件,同时去向某一台有这个文件的文件服务器去取,可能一般的设计就需要读5次这个文件,我希望是有这个文件的文件服务器能最少的工作量就能把自己的文件给每一个没有这个文件的文件服务器传过去----------------------------------------
    这样的话,我采用的算法如下。
    1、将5索引文件读入。
    2、以本机的索引文件为主,做循环,依次和其他的四个所一个文件比对,找出本机有的,而其他机器没有的文件。
    3、将该文件读取出来,依次写入到相应的没有的的机器上去。
    注意:该方法有个前提,需要在每台机器都提供一个可以远程向该机器写文件的服务。
    --
    这样的话就可以保证每个文件读取一次就同步完成,不用读取多次。
      

  5.   

    to  SeanChen(Sean);
    那么有文件的这台机器是不是太累了,同时向5个接点写数据,这台机器的网络就太累了吧,我希望把负担平分开来
      

  6.   

    to  SeanChen(Sean);
    那么有文件的这台机器是不是太累了,同时向5个接点写数据,这台机器的网络就太累了吧,我希望把负担平分开来----------------
    搂主提出的这个也是,如果5台机器的上传得数据量差不多,而上传的繁忙时间也差不多的话,这个方法是比较简便的解决方法。不过这个也是一个权衡。
    如果上传得数据量和上传得繁忙的时间差异比较大的话,就在这台机向一个节点写数据完成后,同时触发下一个节点向别的没有的节点写。但是这样就会增加读文件的工作量,和各写数据的线程的互斥的问题。你觉得呢?
      

  7.   

    我的意思是你做一个单独的向外服务的接口,所有的上传和下载首先请求该接口,获取具体的实际的server的地址,然后再提供相应的服务。1、该接口实现访问那台server的调度算法(分散负载)。
    2、该接口实现多服务器文件同步的问题。这样的话,你的server可以用多网卡,将5个server在内网绑在同一个局域网中,然后采用广播的方式,每新的发送的分数据广播一下,没有的就接收,有的就算了。发送过后的就标记起来。----------
    但是这样的话,是不是太复杂了。
    建议看看win2003的server集群的概念。
      

  8.   

    汗,做好了就是另外一个BitTorrent了
    http://bittorrent.com/introduction.html
      

  9.   

    SeanChen(Sean) :广播我也是想过的,不过数据的完整性就成了问题,不能保证数据的正确
    数据的读取是有统一的调度,这个已经做好了。
    现在关键添加文件,如何才能高效的
      

  10.   

    1. 建立文件的索引信息,并且一定要有关于这些文件的大小、修改日期等信息。
    2. 使用这个索引来判断文件是否需要更新。
    3. 不同服务器之间的索引文件之间有逻辑判断哪个为最新。存在索引需合并的可能。
    4. 每个文件服务器上需要有一个服务来支配本机文件更新,同时查询同网这其它服务器的更新情况。
    5. 同网中的文件服务器列表的查询存在集中和分散两种方法,具体使用看需要。
    6. 一定时间内需要有机制来保证有且仅有一个服务器作为主服务器协调文件的更新工作。
    7. 每个文件服务器上的程序是Server也是Client,双重身份。这些服务器之间的通讯设计可以是广播也可以是集中(数据库等),看利弊权衡取舍。
    8. 同步文件的过程是向提供者发送请求,提供者回复内容的交互过程。可以加入压缩等手段减少数据流量以上思路,仅供参考。
    实际工作中我编写过一个类似的程序,但需求等方面不一样。
      

  11.   

    andywongz(小恐龙) 
    你好,你说的甚是!我先在的问题就在“如果服务器数量非常多,就要考虑设计负载平衡问题,否则最先上传文件的那个服务器将不堪重负。”
    很头疼
      

  12.   

    可以做一个小程序或给原来的程序增加一个小功能,在每次分发文件之前去每台Server指定的Folder里面去获取已经存在的文件信息,返回一份清单,内容可包含文件类型、大小、文件名称等.
    然后主Server再分析所有返回的清单,再根据清单的情况动态分发文件至需要的Server即可!
      

  13.   

    TO:dingtongsheng(汗!编程两年才开始面向对象) 关键问题是在增加文件的机器的负荷,和本地的网络流量,如果20台server同时向增加文件的机器要某一个文件,那不是糗大了吗。
      

  14.   

    提个方案,你可参考一下。建立一个服务程序在每台机器上。当然专用客户端,客户端使用Udp协议,采用广播的方式向所有的服务器发送即可。具体方案如下:
    1。客户端需要上传文件,首先检测网络中有多少的服务器。
    2。检测到服务器之后,选择随机(也可根据配置固定选择或者采用某个负载均衡算法选择)其中一个服务器作为主控服务器,记录所有的服务器索引。觉得一台不保险的话,可以选两台。或者每台都记录。
    3。客户端采用Udp的广播方式向各服务器发送文件。
    4。当客户端传送完毕之后向主控服务器发送一个完毕确认。
    5。主控服务器接到消息之后根据服务器索引向每个服务器发送询问接收到的文件大小,并且记录响应的服务器以及其大小。对比大小,做差异控制。对于没有响应的服务器,记录,可以打印报表,人为控制。如果没有问题,删除记录。如果有问题,可以要求重新执行。
    6。只要服务启动之后,不管是由于死机重启还是新的机器。首先向所有文件发送是否有无响应记录,如果有进行处理之后请求删除,如果没有不管,接下来向所有的服务器获取文件索引。采用多线程的方式从不同的机器下载不同的文件。完成之后做文件索引对比。记得服务器之间的传递最好不要和客户端的端口相同。
    这是一个大致的思路,仅供参考
      

  15.   

    提供一个方案,应该可以减小负荷。可以采用TCP链接的方式传递文件
    1。客户端上传到按照特定算法(可以随机,可以均衡,也可以指定)找到的某台服务器。
    2。每台服务器都有一个待传文件索引。
    3。当客户端传输完毕之后,由接收的服务器向每台服务器发送某个特定文件上传的消息。
    4。每台服务器建立该文件的索引,并且该文件的指向初始服务器。每台服务器都由一个专门的线程用于从其它文件服务器下载文件。
    5。索引建立完毕之后,初始服务器作为调度服务器。每台服务器根据自己的情况,在比较空闲的时候可以向服务器请求下载该文件。初始服务器首先只选定一台服务器进行响应。传输完毕之后,记录下新的服务器。下面可以接收两个服务器的请求,一个连到第一台服务器,一个定向到新的有文件的服务器。以此类推,可以接收4台,到8台到更多的服务器传递文件。除了初始服务器,接收到文件的服务器在索引中删除该记录。初始服务器直到所有的服务器下载完成后才删除记录。
    6。所有的服务器之间的数据传递,用特定的线程在服务器比较空闲(可以不用考虑是否空闲,使用指定线程就可以了)的时候下载。对于客户端下载请求,如果该服务器上还没有的话,可以通过索引文件定向到有文件的服务器。
    7。对于新的机器,那么只有对比各服务器的目录了。当然也可以采用上面的一些老兄说的那样,建立一个文件索引服务器,保险起见可以找两台相对稳定和快速的服务器来同时做这件事情。
      

  16.   

    To:wuyueyoumu(五月游牧) ( ) 信誉:100 
    谢谢,你的方法到是不错,我再细细思考一下。我自己也想了个办法,就是文件服务器之间形成一个环,从某台文件服务器开始向它的下一台文件服务器发出请求文件的消息,它要是没有就把消息传递给下一台,知道有这个文件的那一台,这台文件服务器就向下一台文件服务器传递文件数据,下一台如果有这个文件就传给下一台,没有的话,自己保留一份,还要在往下一台传一份,这样,经过n圈的传送,每一台就同步了
      

  17.   

    我把回贴重头看到尾,各位大虾,小鸟的的主意也出了不少,我还是不明白你要做什么,你的要求目的
    是什么,一个群集服务器组的内部做文件同步(?)就需求来说实现本地文件的与组内其他计算机双向文件同步是比较复杂且代价高昂,如果只是在公司内部使用即使你实现了我估计整个群集的资源也耗得
    差不多了。值不值得开发去开发呢?写程序的不写代码的苦力,如果你的要求就只有你的帖子上的那写
    的那些(并且只跑Windows),那我有一个稍微简单的建议你可以考虑架台无盘站。可能还有更好的解决方法,我看到你的这股闯劲还是很高兴的,特别是看到大家如此的踊跃的互相帮助我很是感动。
      

  18.   

    TO: kld_cl(酾酒临风) 
       哪来的群集服务器组啊,其实我的这套是一个点歌系统,这些文件服务器上放每台要放10000首左右的dvd歌源,要求这些文件服务器上的dvd歌源文件要一样多,我不希望在以后添加歌曲的时候不要一台机器一台机器的添加,我只希望我把dvd歌源文件添加到一台上,其他的机器能和这台同步。现在该看懂我的意思了吧。
    如果你有什么高招的话,真希望你能指教一下
    谢谢!