我有服务器1生成大量数据,例如,有些文件经常以毫秒为单位进行更新。
我想使用C ++或标准Linux方法将这些文件放到另一台服务器上。
目前,我一直这样做是通过每秒压缩一次文件并使用scp传输它们,然后在另一台服务器上解压缩。
然而,这种情况的延迟非常高,而且我不能用它来破坏次数。
有人可以建议我可以使用的方法以较低的延迟移动数据吗?
答案 0 :(得分:0)
只是一个想法,我不知道它是否适用于您的特定情况: 写两个程序。一个在您正在更新文件的服务器上运行,并使用inotify监视更改。另一个程序在第二个服务器上运行,并与第一个服务器保持tcp连接。每当第一个程序检测到更改时,它会将文件的已更改部分发送到第二个程序,该程序可以将更改应用于其自己的文件副本。
此外,如果第一台服务器实际上没有为这些文件生成数据,但是正在从newtwork中读取它,那么将数据流多播到两台服务器是个好主意。
答案 1 :(得分:0)
在Linux上,你可以使用DRBD和像GFS2这样的集群文件系统在两台服务器之间透明地复制一些分区。
另一种选择是使用rsync。
答案 2 :(得分:0)
一个Perl脚本,它使用inotify来检测文件系统和rsync上的更改,以重新同步远程副本:
#!/usr/bin/perl
use strict;
use warnings;
use Net::OpenSSH;
use Linux::Inotify2;
use Time::HiRes qw(sleep);
my $usage = "Usage:\n $0 local_dir [user\@]host remote_dir\n\n";
@ARGV == 3 or die $usage;
my ($local, $host, $remote) = @ARGV;
-d $local or die $usage;
my $ssh = Net::OpenSSH->new($host);
$ssh->error and die "unable to connect to remote host: " . $ssh->error;
my $inotify = Linux::Inotify2->new;
$inotify->watch ($local, IN_MODIFY|IN_MOVED_TO);
$ssh->rsync_put({verbose => 1, glob => 1}, "$local/*", $remote);
while (1) {
my @events = $inotify->read or die "read error: $!";
my %changed;
$changed{"$local/$_->{name}"} = 1 for @events;
$ssh->rsync_put({verbose => 1}, keys %changed, $remote);
sleep 0.1;
}
更新:@ user788171:回答您的问题:
可能有也可能没有,有太多未知数:
但尝试它很便宜,所以我建议你这样做,如果还不够,那么你可以尝试找出瓶颈并尝试消除它们。
例如,rsync
是一种有说服力的协议,对网络延迟非常敏感,因此,如果您的文件很小,scp
可能会产生更好的结果。或者,您可以保留本地为每个文件传输的最新版本的本地副本,并仅发送增量。如果CPU是瓶颈,用C ++重写它,取消SSH等等。
如果无论如何,那种方法变成了死胡同,那么,你仍然可以......
使用DRDB或其他透明复制机制在操作系统级别执行此操作。您甚至可以尝试使用FUSE自己实现它。
修改您的主应用程序,以便编写可以轻松传输到另一方的更改日志。