потоковая передача быстро меняющихся данных между серверами - PullRequest
0 голосов
/ 21 июля 2011

У меня есть сервер 1, который генерирует большой объем данных, например, есть файлы, которые постоянно обновляются, в масштабе времени в миллисекундах.

Я хотел бы перенести эти файлы на другой сервер,используя C ++ или стандартные методы Linux.

В настоящее время я делаю это, сжимая файлы каждую секунду и используя scp для их передачи и распаковывая на другом сервере.

Однако задержкаиз этого очень высока, и я не могу разбить суб 1 секунду с этим.

Кто-нибудь может предложить методы, которые я могу использовать для перемещения данных с более низкой задержкой?

Ответы [ 3 ]

0 голосов
/ 22 июля 2011

В Linux вы можете использовать DRBD и кластерную файловую систему, такую ​​как GFS2, чтобы прозрачно реплицировать некоторый раздел между двумя серверами.

Другой вариант - использовать rsync.

0 голосов
/ 22 июля 2011

Сценарий Perl, который использует inotify для обнаружения изменений в файловой системе и rsync через SSH для повторной синхронизации удаленных копий:

#!/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 может дать лучшие результаты. Или вы можете сохранить локальную копию последней версии, переданной локально для каждого файла, и отправить только дельты. Если процессор является узким местом, перепишите его на C ++, исключите SSH и т. Д.

И если в любом случае этот подход окажется тупиковым, тогда вы все равно можете ...

  • Сделайте это на уровне ОС, используя DRDB или какой-либо другой механизм прозрачной репликации. Вы даже можете попробовать реализовать это самостоятельно, используя FUSE.

  • Измените ваше основное приложение, чтобы записывать в журнал изменения, которые можно легко передавать на другую сторону.

0 голосов
/ 21 июля 2011

Просто идея, я не знаю, сработает ли она для вашей конкретной ситуации: напишите две программы.Тот, который работает на сервере, на котором обновляются ваши файлы, и отслеживает изменения с помощью inotify .Другая программа работает на втором сервере и поддерживает TCP-соединение с первым.Всякий раз, когда первая программа обнаруживает изменение, она отправляет измененную часть файла второй программе, которая может применить это изменение к своей собственной копии файла.

Кроме того, если первый сервер фактически не генерируетданные для этого файла, но читает его из новой работы, было бы неплохо просто направить поток данных на оба сервера.

...