两台服务器同步,服务器上传的图片、文件等要实现实时同步(延时一两分钟没问题),怎么实现? 顶贴又分,不够了再加
刚才那个20的发错了,不好意思

解决方案 »

  1.   

    用java.util.Timer定时执你的任务
      应该就OK了
      

  2.   

    涉及到线程的应用问题.用到synchronized()就行了...
      

  3.   

    在多服务器的服务系统中,常常需要配置多台(十几台甚至几十台)软件环境基本相同的服务器。当这样的服务器群配置好后,后期的管理任务变得十分的繁重,一个小小的修改,例如修改一个JSP文件,那么需要将此修改同步到所有的服务器上面,这里总结(仅仅是总结,没有我的任何的创新,hehe)一下一般的做法。 首先,假设有这样一些服务器:Client,ServerA,ServerB,ServerC...。一般地,要同步所有服务器的某个(些)文件的时候,会首先同步一台服务器,然后,此台服务器将作为Client,在此服务器的上面实施对所有其他服务器的同步。一、最愚蠢但直接的做法:登录每台服务器做相应的修改。毋庸置疑,这种做法有效但绝不可取。二、使用scp。scp提供这样的语法:
    scp localfile username@tohostname:/newfilename
    scp username@tohostname:/remotefile /newlocalfile这样,我们就可以在Client上面,依次执行命令:
    scp /usr/local/program/index.jsp root@ServerA:/usr/local/program/index.jsp
    scp /usr/local/program/index.jsp root@ServerB:/usr/local/program/index.jsp
    ...
    这里,不爽的地方是,每次使用scp命令,都会让你输入对方服务器对应用户的口令。这样,这些机械
    化的动作就不能通过shell来自动的完成,那么配置服务器直接互相信任,既可以解决此问题:
    配置的方法是(下面是一次完整的操作记录):[root@Client root]# ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa): 
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    51:ba:6d:5a:61:52:1d:79:e2:4f:0e:93:d0:72:02:fe root@Client
    [root@Client root]# 
    [root@Client root]# scp /root/.ssh/id_rsa.pub ServerA:/root/.ssh/authorized_keys
    The authenticity of host '210.192.125.55 (210.192.125.55)' can't be established.
    RSA key fingerprint is e9:8e:f3:59:80:08:e7:9b:b8:d8:fb:0e:79:8a:d2:4f.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '210.192.125.55' (RSA) to the list of known hosts.
    [email protected]'s password: 
    id_rsa.pub 100% |************************************************| 223 00:00 
    [root@Client root]# 
    [root@Client root]# ssh ServerA
    Last login: Mon Jul 25 16:55:28 2005 from Client
    [root@ServerA root]# 在你的实际操作中,将Client,ServerA换成你实际的IP或者主机地址。这样,再运行对ServerA的ssh或者scp的时候,ServerA都不会让你输入密码了。(具体的原理这里就不说了,参看问后的参考文章)这样,在对所有的服务器都做了这个操作之后,我们就可以偷懒了,在Client上面编写一个Shell就可以通过这个简单的Shell来同步所有的服务器了。[root@Client root]# vi sync.sh
    #/bin/sh
    scp /usr/local/program/index.jsp root@ServerA:/usr/local/program/index.jsp
    scp /usr/local/program/index.jsp root@ServerB:/usr/local/program/index.jsp
    scp /usr/local/program/index.jsp root@ServerC:/usr/local/program/index.jsp保存
    [root@Client root]# chmod +x sync.sh
    [root@Client root]#./sync.sh敲入上面的字符后,你就可以出去溜达一下,等着回来看同步结果了。三、使用sftp。有的时候,要同步一个文件就可以了,而有的时候,需要同步一大堆的文件,这样使用scp就有点不那么方便了,这时候
    使用sftp, sftp提供这样的语法:
    sftp username@tohostname使用sftp登录到Server上面之后,就可以通过put、get、cd、lcd等命令了。例如要同步下面这些文件:
    [root@Client root]#sftp ServerA
    Last login: Mon Jul 25 17:23:31 2005 from Client
    [root@ServerA root]#cd /usr/local/program/
    [root@ServerA root]#lcd /usr/local/program/
    [root@ServerA root]#put *.jsp
    ....这里是一砣上传记录
    [root@ServerA root]#cd /usr/local/program/conf/
    [root@ServerA root]#lcd /usr/local/program/conf/
    [root@ServerA root]#put server.conf
    ....这里是一砣上传记录
    ....然后,你可以做一大堆的操作,sftp可以通过将命令实现写好,放到一个文件里面,像批处理(DOS时代学会的觉得比较高级的玩意儿)的那样执行。
    [root@ServerA root]#vi sftp_comms.txt
    cd /usr/local/program/
    lcd /usr/local/program/
    put *.jsp
    cd /usr/local/program/conf/
    lcd /usr/local/program/conf/
    put server.confexit保存
    [root@ServerA root]#sftp -b sftp_comms.txt ServerA这时候,如果你没有做(二)中提到的设置两台Server互相信任的操作,这里将会提示你输入ServerA的root密码,否则,这里也是不需要输入密码的。
    利用sftp,也可以编写一个Shell:
    [root@Client root]# vi sftp_sync.sh
    #/bin/sh
    sftp -b sftp_comms.txt ServerA
    sftp -b sftp_comms.txt ServerB
    sftp -b sftp_comms.txt ServerC保存
    [root@Client root]# chmod +x sftp_sync.sh
    [root@Client root]#./sftp_sync.sh敲入上面的字符后,你又可以出去溜达一下,等着回来看同步结果了。:)。这样做还有一个好处是所有的同步的细节都写在 sftp_comms.txt里面,每次同步不同的东西,只要修改这个文件就可以了,当然,用scp的方法,你也可以用参数将需要同步的文件名传进shell里面,不过这样做略显复杂。如果喜欢挑战的话,你可以试一下。参考文章:
    1.http://www.linuxforum.net/doc/ossh-wu.html
    2.http://www.linuxforum.net/docnew/showthreaded.php?Cat=&Board=sys&Number=99
    3.http://www.douzhe.com/docs/linux/RHEL3_U2/rhel-sag-zh_cn-3/s1-openssh-client-config.html
      

  4.   

    lz可以试试服务器同步的软件,比如rysnc
      

  5.   

    http://topic.csdn.net/t/20061113/18/5154768.html以前有讨论,两台服务器,用ftp自动侦测改变的内容,顺便接分o(∩_∩)o...
      

  6.   

    其实没有那么麻烦的了两太服务器同步文件,在linux下,用软连接 连接到一个目录下,这样两太服务器公用一个文件夹这样就直接可以同步如果集群服务器的话就更好了。
      

  7.   

    可以在一个指定位置放一个文件.(为了说明版本号)(或者放在统一的一个数据库里,就更容易管理一点)
    服务器上有更新就要更改版本号.(两台服务器都会存放对方的版本号, 此版本需要保存所对应的图片或者其他文件的文件名)
    然后一台服务器去另一台服务器里读取版本号,如果不同的话就去拿数据.成功的话更改版本号(这样也可以防止中途断线).
    然后拿数据的时候可以在后台开个线程,然后成功后提示一下就可以了.
    具体传输方式的话网上有很多,或者你直接打成byte数组走http丢过去,然后再解.如果要走ftp的话可以用FileZilla等一些ftp工具.
      

  8.   

    使用操作系统的共享服务.一台机器做为共享提供出去.一台机器映射.
    LINUX/UNIX使用NFS服务
    WINDOWS的共享就不用说了吧.
      

  9.   

    我们老师讲过这种配置,他当时是两台sql2000数据库服务器同步,不过后来没有很好的实现同步。我想可以使用服务器的集群技术吧 不过实现起来开销较大,最好找专业的技术人员来实施
      

  10.   

    俺也是来学习滴,一起努力!up^up
      

  11.   

    不知道文件锁可不可以,就像UTC时间同步一样
      

  12.   

    http://blog.csdn.net/msjqd/archive/2006/05/11/724344.aspx这里有邹建关于服务器同步的建议
      

  13.   

    http://www.open-open.com/open217525.htm
    看到一个开源项目,不知道是否有用