środa, 12 września 2012

Synchronizacja plików pomiędzy dwoma serwerami przy wykorzystaniu lsyncd

This post is available only in polish language.
Tworząc aplikacje webowe często zdarza się, że chcemy uruchamiać je na większej ilości serwerów, czy to w celu redundancji czy rozłożenia obciążenia. O ile z bazami danych sytuacja jest prosta i możemy skorzystać z wbudowanej w MySQL-a replikacji danych, o tyle z plikami zapisywanymi w systemie jest już nieco gorzej. Pierwsze co przychodzi na myśl to rsync, ale musi być on odpalany np. na cronie co zadany interwał, co niepotrzebnie zabiera zasoby systemowe. Skuteczniej było by podejmować akcję synchronizacji, dopiero w momencie jakichkolwiek zmian w plikach z interesujących nas lokalizacji. Taką funkcjonalność zapewnia lsyncd. Działa on jako demon i wykorzystuje system zdarzeń inotify do monitorowania zmian w plikach i podejmowania ewentualnej akcji. Synchronizacja plików może być w ramach tego samego serwera lub mogą być one synchronizowane z systemem zdalnym. Konfiguracja tego oprogramowania jest bardzo prosta i sprowadza się do kilku kroków:


  • zainstalowanie, właściwymi dla systemu poleceniami, pakietu lsyncd w wersji >=2.06
  • wygenerowanie na obu serwerach kluczy ssh
  • dopisanie klucza publicznego przeciwnego serwera do zaufanych w pliku ~/.ssh/authorized_keys2
  • wykonanie połączenia ssh do przeciwnego serwera w celu zaakceptowania kluczy (zostaną dopisane do pliku ~/.ssh/known_hosts)
  • wyedytowania pliku /etc/lsyncd.conf i dopisania do niego zawartości:


sync {
    default.rsync,
    source = "/home/user/files/",
    target = "root@192.168.1.1:files/",
    rsyncOpts = "-ltus",
    delete = false,
    delay = 5,
}

  na drugim serwerze tworzymy taki sam plik tylko z oczywistych względów ustawiamy IP pierwszego serwera w polu "target"


  • uruchomienia na obu serwerach demona lsyncd:


      lsyncd /etc/lsyncd.conf


Należy zwrócić uwagę na parametr "delete" i opcję rsyncOpts. Pierwszy z nich wyłącza usuwanie plików nieistniejących na drugim serwerze. Jest to o tyle ważne, że w przypadku kiedy mamy działający serwer i dostawiamy drugi, konfigurując go od zera, może zaistnieć sytuacja, że na nowym serwerze nie mamy plików w ścieżce synchronizacji, ponieważ są one na bieżąco uploadowane na serwer nr 1. Wtedy odpalenie lsyncd na drugim serwerze spowoduje usunięcie plików na serwerze nr 1. Oczywiście możemy zatroszczyć się o pliki i przegrać je z serwera 1 na 2 i dopiero wtedy odpalić lsyncd - wtedy opcja "delete" nie jest nam potrzebna. Uważam jednak, że taka konfiguracja nie jest bezpieczna. Z kolei parametr "rsyncOpts" ustawia opcję z jakimi będzie odpalony rsync (w podanej konfiguracji jest on wykorzystywany do synchronizacji). Domyślnie ma on wartość "-lts" natomiast dodatkowe "u" powoduje, że pliki z nowszymi czasami modyfikacji nie będą nadpisywane starszymi wersjami. Wspomnę jeszcze parametr "delay" -  odpowiada on za opóźnienie z jakim lsyncd zacznie synchronizować pliki.

Lsyncd może też działać w trybie nie-demona oraz przyjmuje parametry z linii poleceń. Pozwala to na łatwe zdebugowanie problemów. Aby zapoznać się ze szczegółami polecam sięgnąć do dokumentacji.