2011-07-21 25 views
0

我有服務器1在毫秒的時間尺度上生成大量數據,例如有不斷更新的文件。在服務器之間流式快速更改數據

我想使用C++或標準的Linux方法將這些文件放到另一臺服務器上。

目前,我一直在通過每秒壓縮文件並使用scp來傳輸它們,並在另一臺服務器上解包來做到這一點。

但是,這個延遲非常高,我不能用這個打破1秒。

任何人都可以建議我可以使用的方法移動數據的延遲更低嗎?

+1

我們在談論什麼大小的大小? kbps,mbps,gbps。差異是可能的,...?老實說,要回答的規格太少了。 – KillianDS

+0

爲什麼選擇C++?一些腳本語言如Perl或Python在這裏會更有成效。 – salva

+0

這是在幾個mbps的範圍內,有幾千個文件需要同時更新(每個文件不到一秒鐘)。 – user788171

回答

0

只是一個想法,我不知道它是否會適合您的具體情況: 編寫兩個程序。一個在正在更新文件的服務器上運行,並用inotify監視更改。另一個程序在第二臺服務器上運行,並與第一臺服務器保持TCP連接。每當第一個程序檢測到更改時,它就會將更改後的文件部分發送給第二個程序,該程序可以將更改應用於其自己的文件副本。另外,如果第一臺服務器實際上並不是爲這些文件生成數據,而是從新網絡中讀取數據,那麼將數據流多播到兩臺服務器將是一個不錯的主意。

+1

在C++中,如何維護兩個程序之間的tcp連接,以及如何通過tcp發送數據?這似乎是一個好主意,但魔鬼可能在細節中。謝謝。 – user788171

+0

只需使用套接字。這裏有一個很好的教程來幫助你開始:http://www.linuxhowtos.org/C_C++/socket.htm – 2011-07-21 20:10:20

+0

AFAIK,inotify告訴你一些文件已經改變,但並沒有說文件內部實際改變了什麼,所以它不能單獨用來創建三角洲。 – salva

0

在Linux上,您可以使用DRBD和羣集文件系統(如GFS2)在兩臺服務器之間透明地複製某些分區。

另一種選擇是使用rsync。它使用的inotify來檢測文件系統和rsync通過SSH變化

0

Perl腳本重新同步遠程拷貝:

#!/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自己實現它。

  • 修改您的主應用程序以編寫可輕鬆流向另一端的更改日誌。

+0

這是一個有趣的解決方案,但rsync實際上足以快速更新下一秒內的文件嗎?如果我想要同時處理數千個文件,這個解決方案是否仍然可行? – user788171

+0

@ user788171:回覆添加到帖子 – salva