在服务器之间流式传输快速变化

时间:2011-07-21 18:48:06

标签: c++ linux ssh streaming scp

我有服务器1生成大量数据,例如,有些文件经常以毫秒为单位进行更新。

我想使用C ++或标准Linux方法将这些文件放到另一台服务器上。

目前,我一直这样做是通过每秒压缩一次文件并使用scp传输它们,然后在另一台服务器上解压缩。

然而,这种情况的延迟非常高,而且我不能用它来破坏次数。

有人可以建议我可以使用的方法以较低的延迟移动数据吗?

3 个答案:

答案 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:回答您的问题:

可能有也可能没有,有太多未知数:

  • 实际更改了多少个文件
  • 他们的大小
  • 相对于完整文件大小的更改有多大
  • 网络带宽和延迟
  • 双方可用的CPU功率

但尝试它很便宜,所以我建议你这样做,如果还不够,那么你可以尝试找出瓶颈并尝试消除它们。

例如,rsync是一种有说服力的协议,对网络延迟非常敏感,因此,如果您的文件很小,scp可能会产生更好的结果。或者,您可以保留本地为每个文件传输的最新版本的本地副本,并仅发送增量。如果CPU是瓶颈,用C ++重写它,取消SSH等等。

如果无论如何,那种方法变成了死胡同,那么,你仍然可以......

  • 使用DRDB或其他透明复制机制在操作系统级别执行此操作。您甚至可以尝试使用FUSE自己实现它。

  • 修改您的主应用程序,以便编写可以轻松传输到另一方的更改日志。