Wir stellen ein!

How To: Server mit rsync synchronisieren / spiegeln (+SSH)

Nader Cserny

How To: Server mit rsync synchronisieren / spiegeln (+SSH)

06. August 2010 von Nader Cserny 0

Um einen Server (SERVER A) mit einem anderen (SERVER B) zu synchronisieren gibt es mehrere Möglichkeiten. Wir konzentrieren uns bei diesem Tutorial auf rsync, ein Netzwerkprotokoll und unter der GPL stehendes Programm zur Synchronisation von Daten. Und damit das ganze auch sicher abläuft, verwenden wir SSH zur Übertragung. 

Das Tutorial besteht aus einem parametrisierten Shell Skript "sync.sh" und einem Cronjob, der das Skript zu gewünschten Zeitpunkten aufruft. Wir verwenden den Port 22, es sollte aber ein anderer gewählt werden, um die typischen Attacken zu vermeiden. 

Im Gegensatz zum gängigen Einsatz von rsync zur Synchronisierung zwischen zwei unix Benutzer Accounts, werden wir hier ein einfaches kopieren von mehreren Zugänge durchführen, ohne dabei Tür und Tor von ssh öffnen zu müssen. Die Daten werden hierbei von Server A auf Sever B (push statt pull) via rsync und ssh übertragen.

Der root Benutzer auf Server A führt rsync direkt aus, während auf Server B der mirror user via sudo die entsprechende Berechtigungen bekommt um die Daten zu schreiben. Die rsync option --rsync-path="sudo rsync" sorgt beim kopieren dafür, dass auf Server B rsync mit sudo ausgeführt wird.

Server Setup

Server A (Master) Server B (Slave)
  • Master-Server; enthält alle Daten
  • rsync wird jede Stunde per cronjob ausgeführt
  • synchronisiert Daten über SSH
  • AuthKey muss angelegt sein, um eine Anmeldung ohne Passwort beim anderen Server zu ermöglichen
  • Slave Daten
  • Mirror-User mit Root-Rechten anlegen
  • Authkey anlegen

Synchronisation

# Server B: User anlegen und Passwort festlegen 
useradd -m mirror
passwd mirror

# Server B: User "mirror" zu den Sudoers hinzufügen und Zugriff auf rsync ermöglichen
vi /etc/sudoers
> mirror ALL= NOPASSWD:/usr/bin/rsync

# Server B: User wechseln und SSH Key generieren
su - mirror
ssh-keygen -t rsa -b 2048 (keine passphrase erstellen)

# Server A: Per SCP den Key auf Server B kopieren
scp -P SERVER_PORT ~/.ssh/id_rsa.pub SERVER_B:.ssh/authorized_keys

# Server A: Cronjob einrichten
# Beispiel Cronjob, jede Stunde synchronisieren:
# * */1 * * * sync.sh mirror /home/ www2.compuccino.com 22 /home/ ".svn logs/"
* */1 * * * sync.sh mirror LOCAL_DIR DESTINATION_SERVER PORT DESTINATION_DIR "EXCLUDE_DIR"

Um den korrekten Ablauf der Synchronisierung zu testen oder wenn ihr die Server nur on-demand und nicht jede Stunde synchronisieren wollt, könnt ihr den Prozess mit folgenden Skript-Aufruf starten:

sync.sh USER LOCAL_DIR DESTINATION_SERVER PORT DESTINATION_DIR "EXCLUDE_DIR"

Shell Skript "sync.sh"

Das unten stehende Skript muss in eine Datei namens "sync.sh" kopiert und diese anschließend mit "chmod 755 sync.sh" executable gemacht werden. Vorsicht! Der rsync Befehl kopiert Daten von A nach B und überschreibt dabei bestehende Daten auf Server B.

#!/bin/sh 
#############################################################
# compuccino - Server Synchronisierung
#############################################################

# User festlegen, mit dem synchronisiert werden soll
# Muss die entsprechenden Rechte am Ziel-Server haben
# Beispiel: User "mirror"
USER=$1

# Lokales Verzeichnis festlegen, dass synchronisiert werden soll
# Beispiel: "/home/compuccino/"
LOCAL_DIR=$2

# Ziel-Server festlegen
# Beispiel: "www2.compuccino.com"
DESTINATION_SERVER=$3

# Port des Ziel-Servers festlegen
# Beispiel: 22 
PORT=$4

# Ziel-Verzeichnis festlegen
# Beispiel: "/home/compuccino/"
DESTINATION_DIR=$5

# Verzeichnisse angeben, die von der Synchronisierung ausgeschlossen werden sollen
# Beispiel: ".ssh/" und ".bash_history)
EXCLUDE_DIR=$6

# Mit einer For-Schleife alle Verzeichnisse durchgehen, die ausgeschlossen werden sollen
for DIR in $EXCLUDE_DIR
do
    EXCLUDE_DIRS="$EXCLUDE_DIRS --exclude=$DIR"
done

# Ausgabe
echo "1. User: $USER"
echo "2. Local Dir: $LOCAL_DIR"
echo "3. Destination Server: $DESTINATION_SERVER"
echo "4. Destination Dir: $DESTINATION_DIR"
echo "5. Exclude Dirs: $EXCLUDE_DIRS"
echo "---------------------------------------------"

# Das eigentliche rsync Kommando
rsync -e "/usr/bin/ssh -p$PORT -l $USER -i /home/$USER/.ssh/id_rsa" -a --progress --stats
\ --rsync-path="sudo rsync" $EXCLUDE_DIRS --delete -l -z -v -r -p -o -g -H
\ $LOCAL_DIR $USER@$DESTINATION_SERVER:$DESTINATION_DIR

exit 0

rsync Optionen

  • -o behält Besitzrechte bei (nur root)
  • -r kopiert Unterverzeichnisse
  • -l kopiert symbolische Links
  • -p behält Rechte bei
  • -t behält Zeiten bei
  • -g behält Gruppenrechte bei

 

Kommentare

Kommentar hinzufügen

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.
Mollom CAPTCHA
Geben Sie die Zeichen ein, die in den oben gezeigten Bild zusehen sind. Wenn die Zeichen unlesbar sind, senden Sie das Formular ab und ein neues Bild wird generiert.