我有服務器1在毫秒的時間尺度上生成大量數據,例如有不斷更新的文件。在服務器之間流式快速更改數據
我想使用C++或標準的Linux方法將這些文件放到另一臺服務器上。
目前,我一直在通過每秒壓縮文件並使用scp來傳輸它們,並在另一臺服務器上解包來做到這一點。
但是,這個延遲非常高,我不能用這個打破1秒。
任何人都可以建議我可以使用的方法移動數據的延遲更低嗎?
我有服務器1在毫秒的時間尺度上生成大量數據,例如有不斷更新的文件。在服務器之間流式快速更改數據
我想使用C++或標準的Linux方法將這些文件放到另一臺服務器上。
目前,我一直在通過每秒壓縮文件並使用scp來傳輸它們,並在另一臺服務器上解包來做到這一點。
但是,這個延遲非常高,我不能用這個打破1秒。
任何人都可以建議我可以使用的方法移動數據的延遲更低嗎?
只是一個想法,我不知道它是否會適合您的具體情況: 編寫兩個程序。一個在正在更新文件的服務器上運行,並用inotify監視更改。另一個程序在第二臺服務器上運行,並與第一臺服務器保持TCP連接。每當第一個程序檢測到更改時,它就會將更改後的文件部分發送給第二個程序,該程序可以將更改應用於其自己的文件副本。另外,如果第一臺服務器實際上並不是爲這些文件生成數據,而是從新網絡中讀取數據,那麼將數據流多播到兩臺服務器將是一個不錯的主意。
在C++中,如何維護兩個程序之間的tcp連接,以及如何通過tcp發送數據?這似乎是一個好主意,但魔鬼可能在細節中。謝謝。 – user788171
只需使用套接字。這裏有一個很好的教程來幫助你開始:http://www.linuxhowtos.org/C_C++/socket.htm – 2011-07-21 20:10:20
AFAIK,inotify告訴你一些文件已經改變,但並沒有說文件內部實際改變了什麼,所以它不能單獨用來創建三角洲。 – salva
在Linux上,您可以使用DRBD和羣集文件系統(如GFS2)在兩臺服務器之間透明地複製某些分區。
另一種選擇是使用rsync。它使用的inotify來檢測文件系統和rsync通過SSH變化
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:響應你的問題:
它可能是也可能不是,有太多的未知數:
但想它是如此便宜我建議你這樣做,如果還不夠,那麼你可以嘗試找出瓶頸並嘗試消除它們。
例如,rsync
是一個有說服力的協議,非常適合網絡延遲,所以如果文件很小,scp
可能會產生更好的結果。或者您可以保留每個文件本地傳輸的最新版本的本地副本,並只發送增量。如果CPU是瓶頸,用C++重寫它,消除SSH等。
如果無論如何,這種做法變成是死路一條,那麼,你仍然可以...
做它在操作系統級別,使用DRDB或其他一些透明的複製機制。你甚至可以嘗試使用FUSE自己實現它。
修改您的主應用程序以編寫可輕鬆流向另一端的更改日誌。
這是一個有趣的解決方案,但rsync實際上足以快速更新下一秒內的文件嗎?如果我想要同時處理數千個文件,這個解決方案是否仍然可行? – user788171
@ user788171:回覆添加到帖子 – salva
我們在談論什麼大小的大小? kbps,mbps,gbps。差異是可能的,...?老實說,要回答的規格太少了。 – KillianDS
爲什麼選擇C++?一些腳本語言如Perl或Python在這裏會更有成效。 – salva
這是在幾個mbps的範圍內,有幾千個文件需要同時更新(每個文件不到一秒鐘)。 – user788171