Csync2 - Konfigurationsdaten-Synchronsation

Allgemeine Infos

Csync2 ist ein Cluster-Synchronisations-Tool. Es dient zum synchron halten von Dateien auf unterschiedlichen Hosts in einem Cluster. Dabei kommt csync2 auch mit komplexen Setups mit mehr als 2 Hosts zurecht, kann Dateilöschungen handhaben und Konflikte erkennen. Csync2 ist fuer HA-cluster, HPC-Cluster COWs sowie Serverfarmen geeignet.

Normalerweise wird die Aufgabe die csync2 erledigt als relativ trivial angesehen und daher meist mit simplem Shellscripts und Tools wie zum Beispiel rsync oder scp bewältigt. Aber diese Lösungen behandeln nicht die wirklich heiklen Problemkreise der Dateisynchronisation:

1. Konflikte erkennen

Der triviale rsync-basierende Ansatz zur Synchronisation erkennt keine Konflikte. D.h. wenn eine Datei auf mehreren Hosts verädert wurde, dann wird einfach die zuletzt geänderte Version auf die anderen Hosts kopiert. Solche Lösungen können meistens auch nicht unterscheiden, ob eine Datei auf einem Host gelöscht oder dem anderen erstellt wurde.

2. Komplexe Setups

Das Szenario mit einem Cluster mit zwei Nodes ist zwar sehr simpel, aber nicht sehr realistisch. Meistens findet man Umgebungen mit mehreren sich überlappenden Servergruppen, wobei manche Dateien über alle Server, andere jedoch nur über eine kleinere Liste von Servern synchronisiert werden sollen.

3. Auf Updates reagieren

In vielen Fällen ist es nicht ausreichend einfach nur Dateien zu replizieren. Statt dessen kann es notwendig sein, als Reaktion auf Updates von Dateien deren Dateinamen konfigurierbaren Mustern entsprechend spezielle Kommandos auszuführen. Zum Beispiel sollte in einem Webservercluster nach einem Update der Apache-Konfigurationsdateien das Kommando 'apachectl graceful' ausgeführt werden, damit der Webserver die neue Konfiguration auch verwendet.

Csync2 ist im Hinblick auf diese (und viele andere) Anforderungen entwickelt worden und stellt eine wichtige Basistechnologie für professionelles Linux-Clustering zur Verfügung.

Clifford Wolf hat csync2 als Gegenstück zu DRBD (das ebenfalls bei LINBIT Information Technologies GmbH entwickelt wurde) konzipiert. Während DRBD in Echtzeit Block-Devices zwischen zwei Hosts replizieren kann und so in Fail-Over-Clustern beispielsweise das Spiegeln von Datenbanken erlaubt, kann csync2 zur asynchronen Replikation von Dateien zwischen vielen Hosts in allen möglichen Arten von Clustern zur Anwendung kommen und wird meist für Konfigurationsdateien sowie Applikationsimages benutzt.

Installation und Einrichtung

1. Installation notwendiger Pakete

Dieser Installationsschritt ist auf beiden Clusterknoten durchzuführen.

# aptitude update && aptitude install csync2 sqlite3 openssl xinetd

csync2 speichert seine Daten in einer SQLite-DB: /var/lib/csync2/hostname.db

2. Generierung von SSL Keys und Zertifikaten zur Kommunikation der Clusterknoten

Dieser Schritt ist auf einem Clusterknoten durchzuführen. Die erzeugten Daten sind im Anschluss auf die weiteren Knoten zu übertragen.

# openssl genrsa -out /etc/csync2_ssl_key.pem 1024
# openssl req -new -key /etc/csync2_ssl_key.pem -out /etc/csync2_ssl_cert.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Hessen
Locality Name (eg, city) []:Stadt
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Ich
Organizational Unit Name (eg, section) []:Abteilung
Common Name (eg, YOUR name) []:Hostname
Email Address []:ich@hostname
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
# openssl x509 -req -days 3650 -in /etc/csync2_ssl_cert.csr -signkey /etc/csync2_ssl_key.pem -out /etc/csync2_ssl_cert.pem

Die Ausführung des folgenden Befehls kann durchaus einige Minuten in Anspruch nehmen. Durch diese Ausführung wird aus dem erstellten SSL Zertifikat das eigentliche Keyfile für die Kommunikation generiert. Um die Ausführung des csync2 -k zu beschleunigen kann im Hintergrund ein dd ausgeführt werden. Da csync2 den Key anhand der gerade laufenden „Transaktionen“ berechnet, kann diese Ausführung auf einem System welches nichts zu tun hat sehr lange dauern.

# csync2 -k /etc/csync2_ssl_cert.key

zweite Shell

# dd if=/dev/urandom of=/tmp/tmp_random.dat bs=1M count=500; rm /tmp/tmp_random.dat

Die erstellten Dateien sind nun auf alle weiteren Cluster zu kopieren.

  • /etc/csync2_ssl_cert.csr
  • /etc/csync2_ssl_cert.key
  • /etc/csync2_ssl_cert.pem
  • /etc/csync2_ssl_key.pem
# scp /etc/csync2_ssl* <<Cluster02>>:/etc/
# scp /etc/csync2_ssl* <<Cluster03>>:/etc/
...

3. Konfiguration von Csync2

Die Konfiguration des Dienstes wird in der Datei /etc/csync2.cfg vorgenommen.

# vi /etc/csync2.cfg
group Loadbalancer   # group name, we can have multiple groups
{
host rechner01;    # master server
host rechner02;    # slave server
# Die Angabe der einzelnen Clusterknoten kann auch durch Leerzeichen getrennt angegeben werden.
# host rechner01 rechner02 ...;
# Key zur Verschlüsselten Kommunikation
key /etc/csync2_ssl_cert.key;
# Die zu überwachenden Dateien werden hier angegeben.
# Es können auch komplette Verzeichnisse angegeben werden.
include /etc/hosts;
include /etc/ha.d/ha.cf;
include /etc/ha.d/haresources;
include /etc/ha.d/ldirectord.cf;
include /etc/ha.d/resource.d;
# Ebenso ist das Ausschließen definierter Daten und Pfade möglich
# exclude %homedir%/bob/temp;
# exclude *~ .*;
# Diese Ausführung von externen Befehlen/Scripts ist ebenso möglich
# action # an action section (see 3.4.5)
#   {
#    pattern /etc/apache/httpd.conf;
#    pattern /etc/apache/sites-available/*;
#    exec "/usr/sbin/apache2ctl graceful";
#    logfile "/var/log/csync2_action.log";
#    do-local;
#   }
# Definition des Backupverzeichnisses und der aufzubewahrenden Revisionen
backup-directory /var/backups/csync2;
backup-generations 10;
# Konfliktbehandlung
# Default none
# Mögliche Optionen sind: first, younger, older, bigger, smaller, left oder right
auto none; # no automatic sync
}

Auch diese Datei muss nun auf alle Clusterknoten übertragen werden. Ebenfalls sollte auf allen Servern das definierte Backupverzeichnis angelegt werden, in diesem Fall durch:

Sicherheitskopie von allen Dateien anlegen, die von csync2 überwacht werden:

# tar czf csync2_dateien.tgz $(awk '/^[ \t]*include/ {sub(";","");print $2}' /etc/csync2.cfg)
# mkdir -p /var/backups/csync2

4. Einrichtung des csync2 "Receivers"

Diese Schritte sind auf allen Clusterknoten durchzuführen.

# echo "csync2          30865/tcp" >> /etc/services
# vi /etc/xinetd.d/csync2
service csync2
{
disable = no
protocol = tcp
socket_type = stream
wait = no
user = root
server = /usr/sbin/csync2
server_args = -i
}
# /etc/init.d/xinetd restart

5. Erster Sync / Dirty Files anzeigen

Durch Aufruf von csync2 -xv kann nun der erste Sync gestartet werden. Übertragene Dateien und Problem werden im Verbosemode ausgegeben. Bei fehlerfreier Ausführung kann eine autoamtischer Sync in die Cron aufgenommen werden.

Falls Konflikte gemeldet werden, kann mit dem Befehl…

# csync2 -M
  chary   store01 store02 /etc/exports
  chary   store01 store02 /etc/fstab
  chary   store01 store02 /etc/ha.d/resource.d/drbddisk
  chary   store01 store02 /etc/ha.d/resource.d/mac
  chary   store01 store02 /etc/ha.d/resource.d/mount_all_dev
  chary   store01 store02 /etc/ha.d/resource.d/mydrbd
  chary   store01 store02 /etc/ha.d/resource.d/vblade_stop

… eine Liste der Dateien mit Konflikten ausgegeben werden.

Die Konflikte lassen sich auf dem Cluster-Knoten, welcher die „aktuellen/richtigen“ Daten enthält mit folgendem Befehl lösen:

# csync2 -f [Dateiname]

Jetzt kann wieder sauber synchronisiert werden:

# csync2 -xv

Test

Wenn alles synchron ist, bekommen wir bei einem Aufruf keine Rückmeldungen mehr:

# csync2 -xv
Rechner01

Wenn wir jetzt eine Änderung vornehmen, gibt der Befehl nur mit -v eine Rückmeldung:

# vi /etc/ha.d/resource.d/killpid
# csync2 -xv
Marking file as dirty: /etc/ha.d/resource.d/killpid
Connecting to host openqrm02 (SSL) ...
Updating /etc/ha.d/resource.d/killpid on openqrm02 ...
Finished with 0 errors.
Rechner02

Auf diesem Rechner sollte letzt ein Backup liegen:

# ls -la /var/backups/csync2/
total 24
drwxr-xr-x 2 root root   32 2010-12-10 12:14 .
drwxr-xr-x 3 root root 8192 2010-12-10 11:39 ..
-rw------- 1 root root  581 2010-12-10 12:14 etc_ha.d_resource.d_killpid.0

6. Automatischer Sync per Cron

Auf jedem Knoten durchzuführen. Bitte den kompletten Pfad der csync2 nutzen, da sonst die Binary nicht ordnungsgemäß ausgeführt wird.

# echo "*/2 * * * * root /usr/sbin/csync2 -x" >> /etc/cron.d/csync2

7. Heartbeat

# echo "/usr/sbin/csync2 -xv" > /etc/ha.d/resource.d/csync2
# chmod 0755 /etc/ha.d/resource.d/csync2

Probleme

Identification failed!

In diesem Fall liegt das Problem meistens in der Namensauflösung.

Wenn zum Beispiel in der /etc/hosts auf dem einen Rechner dieses steht:

127.0.0.1       localhost
127.0.1.1       rechner01

und auf der anderen Seite dieses:

127.0.0.1       localhost
192.168.3.4     rechner01.domain.net rechner01
192.168.3.5     rechner02.domain.net rechner02

dann gibt es diesen Fehler.

Automatische Backups/Revisionen

Csync2 legt bei jeder festgestellten Änderung an Konfigurationsdaten eine Revision im angegebenen Backuppfad an. Beispiel:

root@rblb02:~# ls -la /var/backups/csync2/
insgesamt 40
  drwxr-xr-x 2 root root   96 2010-10-18 19:24 .
  drwxr-xr-x 3 root root 4096 2010-10-19 08:07 ..
  -rw------- 1 root root  467 2010-10-18 19:24 etc_csync2.cfg.0
  -rw------- 1 root root  440 2010-10-18 19:22 etc_csync2.cfg.1
  -rw------- 1 root root  121 2010-10-18 19:06 etc_ha.d_haresources.0
  -rw------- 1 root root  109 2010-10-18 18:51 etc_ha.d_haresources.1
  -rw------- 1 root root  109 2010-10-18 18:33 etc_ha.d_haresources.2
  -rw------- 1 root root 1106 2010-10-18 19:10 etc_ha.d_resource.d_192_up.0
  -rw------- 1 root root 1089 2010-10-18 19:08 etc_ha.d_resource.d_192_up.1

csync2 Parameter

csync2 1.34 - cluster synchronization tool, 2nd generation
LINBIT Information Technologies GmbH <http://www.linbit.com>
Copyright (C) 2004, 2005  Clifford Wolf <clifford@clifford.at>
This program is free software under the terms of the GNU GPL.
Usage: csync2 [-v..] [-C config-name] \
                [-D database-dir] [-N hostname] [-p port] ..
With file parameters:
      -h [-r] file..          Add (recursive) hints for check to db
      -c [-r] file..          Check files and maybe add to dirty db
      -u [-d] [-r] file..     Updates files if listed in dirty db
      -o [-r] file..          Create list of files in compare-mode
      -f [-r] file..          Force this file in sync (resolve conflict)
      -m file..               Mark files in database as dirty
Simple mode:
      -x [-d] [[-r] file..]   Run checks for all given files and update
                              remote hosts.
Without file parameters:
      -c      Check all hints in db and eventually mark files as dirty
      -u [-d] Update (transfer dirty files to peers and mark as clear)
      -H      List all pending hints from status db
      -L      List all file-entries from status db
      -M      List all dirty files from status db
      -S myname peername      List file-entries from status db for this
                              synchronization pair.
      -T                      Test if everything is in sync with all peers.
      -T filename             Test if this file is in sync with all peers.
      -T myname peername      Test if this synchronization pair is in sync.
      -T myname peer file     Test only this file in this sync pair.
      -TT     As -T, but print the unified diffs.
      The modes -H, -L, -M and -S return 2 if the requested db is empty.
      The mode -T returns 2 if both hosts are in sync.
      -i      Run in inetd server mode.
      -ii     Run in stand-alone server mode.
      -iii    Run in stand-alone server mode (one connect only).
      -R      Remove files from database which do not match config entries.
Modifiers:
      -r      Recursive operation over subdirectories
      -d      Dry-run on all remote update operations
      -B      Do not block everything into big SQL transactions. This
              slows down csync2 but allows multiple csync2 processes to
              access the database at the same time. Use e.g. when slow
              lines are used or huge files are transferred.
      -A      Open database in asynchronous mode. This will cause data
              corruption if the operating system crashes or the computer
              loses power.
      -I      Init-run. Use with care and read the documentation first!
              You usually do not need this option unless you are
              initializing groups with really large file lists.
      -X      Also add removals to dirty db when doing a -TI run.
      -U      Don't mark all other peers as dirty when doing a -TI run.
      -G Group1,Group2,Group3,...
              Only use this groups from config-file.
      -P peer1,peer1,...
              Only update this peers (still mark all as dirty).
              Only show files for this peers in -o (compare) mode.
      -F      Add new entries to dirty database with force flag set.
      -t      Print timestamps to debug output (e.g. for profiling).
      -s filename
              Print timestamps also to this file.
      -W fd   Write a list of directories in which relevant files can be
              found to the specified file descriptor (when doing a -c run).
              The directory names in this output are zero-terminated.
Creating key file:
      csync2 -k filename
Csync2 will refuse to do anything when a /etc/csync2.lock file is found.

Quellenangabe

 
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht:GNU Free Documentation License 1.2
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki