Ceph Cluster für Dovecot MDBOX und Postfix

Abstract

Alle Welt spricht von Ceph, das hat mich neugierig gemacht und darum habe ich einen Test-Storage mit drei Ceph-Servern auf Virtual Box durchgeführt. In diesem Artikel schildere ich, wie ich vorgegangen bin und was ich dabei alles erlebt habe.

Alle Welt spricht von Ceph, das hat mich neugierig gemacht und darum habe ich einen Test-Storage mit drei Ceph-Servern auf Virtual Box durchgeführt. Anschließend habe ich ein RADOS Block Device auf zwei weiteren Servern erstellt und es mit OCFS2 formatiert.

Zuletzt habe ich Dovecot installiert, um konkurrierende Zugriffe auf den Storage zu testen. Als Testsystem kam Ubuntu Raring Server i386 zum Einsatz, das Hostsystem war ein Ubuntu Precise.

Note

In diesem Artikel schildere ich, wie ich vorgegangen bin und was ich dabei alles erlebt habe. Mein Artikel ist keine Anleitung für ein produktives Setup.

Zunächst habe ich virtuelle Maschinen angelegt und sie auch gleich aufgesetzt: 1GB RAM, Standardinstallation mit SSH-Server, eine zusätzliche, fixe Festplatte mit 20 GB /dev/sdb und zwei Netzwerkkarten – eine im Bridged Mode, die andere nur für das interne Netzwerk 192.168.123.0/24.

Mit diesen Test-Maschinen bin ich an den Start gegangen:

ceph1 192.168.123.101
ceph2 192.168.123.102
ceph3 192.168.123.103
ceph-client-1 192.168.123.201
ceph-client-2 192.168.123.202

Festplatten

Als erstes habe ich, Empfehlungen folgend, die (zusätzlichen) Festplatten auf ceph1, ceph2 und ceph3 mit XFS formatiert.

% fdisk /dev/sdb
% mkfs.xfs -f /dev/sdb1

Danach erledigte ich das Einpflegen des aktuellen Ceph Repositorys auf allen Maschinen, außerdem war es günstig, auch gleich die /etc/hosts aller Maschinen zu bearbeiten und mit ntpdate einen Zeitabgleich durchzuführen.

% wget -q -O- 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc' | \
sudo apt-key add - echo deb http://ceph.com/debian/ $(lsb_release -sc) main | \
sudo tee /etc/apt/sources.list.d/ceph.list
% sudo apt-get update && sudo apt-get install ceph

Die dann installierte Ceph-Version war 0.61.3. Nach der Lektüre der Kurzanleitung von Ceph und ein wenig Online-Recherche habe ich dann auf ceph[1,2,3] folgende Konfiguration erstellt.

; Ceph conf file!
; use semi-colon to put a comment!
[global]
auth cluster required = none
auth service required = none
auth client required = none
[mds.1]
      host = ceph1
[mds.2]
      host = ceph2
[mds.3]
      host = ceph3
[osd]
  osd journal size = 1000
  keyring = /etc/ceph/keyring.$name
  filestore xattr use omap = true
  osd mkfs type = xfs
  osd mkfs options xfs = -f
  osd mount options xfs = rw,noatime
[osd.0]
  host = ceph1
  devs = /dev/sdb1
[osd.1]
  host = ceph2
  devs = /dev/sdb1
[osd.2]
  host = ceph3
  devs = /dev/sdb1
[mon.0]
  host = ceph1
  mon addr = 192.168.123.101:6789
[mon.1]
  host = ceph2
  mon addr = 192.168.123.102:6789
[mon.2]
  host = ceph3
  mon addr = 192.168.123.103:6789

Note

Ich empfehle für das tiefere Verständnis der Konfiguration die wirklich gelungene Dokumentation von Ceph zu lesen. Für meinen Teil musste ich mich erst einmal an die Begrifflichkeiten und die verschiedenen Betriebsmodi gewöhnen.

Ich beschreibe hier die Verwendung eines Daten-Cluster-Storage, der gleichzeitige Zugriffe auf Daten ermöglicht. Dieses Setup kann am ehesten mit einem DRBD-Master-Master Setup vergleichen. Das hat allerdings derzeit den Nachteil, dass es nur mit 2 Servern funktioniert. Mit Ceph entfällt eine solche Beschränkung, um hier mal nur einen Vorteil von Ceph gegenüber DRBD zu nennen.

Dann habe ich – Faulheit lass' nach – den root SSH Key von ceph1 auf ceph2 und ceph3 übertragen. In einem Referenz-Setup bei Kunden mit Sicherheit undenkbar, aber hier im Test-Setup einfach einfach.

Danach habe ich die ceph.conf per scp auf ceph[1,2,3] kopiert und, der Anleitung folgend, hostübergreifend eine Verzeichniskette erstellt. Auf ceph1 war das /var/lib/ceph/osd/ceph-0, auf ceph2 dann /var/lib/ceph/osd/ceph-1 und auf der letzten Test-VM ceph3 dann /var/lib/ceph/osd/ceph-2.

Note

Die Anleitung sagt, es muss zur Sicherheit mindestens ein Verzeichnis angelegt werden. Dies geschieht, damit man sich nicht sein root-System zerstört. Alle weiteren benötigten Verzeichnisse wurden von Ubuntu automatisch erstellt.

Initialisierung des Clusters

Damit waren allen Grundvoraussetzungen gegeben, und ich konnte den Ceph-Cluster mit folgendem Befehl initiieren:

% mkcephfs -a -c /etc/ceph/ceph.conf --mkfs

Dabei erschien folgende Meldung:

WARNING: mkcephfs is now deprecated in favour of ceph-deploy.
Please see:  http://github.com/ceph/ceph-deploy

ceph-deploy ist das neue Administrationsprogramm von Ceph. Man kann es nachinstallieren mit:

% apt-get install ceph-deploy

Danach habe ich auf ceph[1,2,3] alle Vorbereitungen erledigt, wie z.B. einen Key erzeugt, Verzeichnisse angelegt usw. Den auf ceph1 erzeugten Key in /etc/ceph/keyring kopierte ich per scp auf ceph2 und ceph3 und sorgte mit chmod 0644 für die ausreichende Berechtigungen.

Start des Ceph Clusters

Der Start des Ceph-Clusters war wenig spektakulär:

% /etc/init.d/ceph -a start

Ich rief tail -f /var/log/ceph/ceph.log auf und konnte zusehen, wie der Cluster sich ordnet – der Vorgang ähnelt der Initialisierung eines RAID. Anders als bei einem RAID musste ich mit der Nutzung allerdings warten, bis Ceph sich geordnet hatte; vorher war es nicht zu gebrauchen. Ich überprüfte den Status regelmäßig mit ceph health, und als das ein HEALTH_OK ausgab, konnte ich weitermachen.

Mounten von cephfs

Jetzt, da die Ceph-Server bereit waren, wollte ich das cephfs mounten. Von den Test-Clients ceph-client-[1,2] aus ging das wie folgt:

% mount -t ceph 192.168.123.101:6789,192.168.123.102:6789,192.168.123.103:6789:/ /mnt/

Das funkionierte auf Anhieb, und ein ein kurzer Test mit touch /mnt/test.file mit anschließender Existenzkontrolle auf ceph-client-[1,2] war erfolgreich. Das File habe ich anschließend wieder gelöscht.

Ein wenig irritierend war der Test mit dem df-Kommando:

% df -h
...
240M     13M  228M    6% /mnt

Meine Recherche ergab, dass dies auf einen Fehler in df zurückzuführen war.

Note

Um den Test fortzusetzen, habe ich mich für ein klassisches Setup entschieden, bei dem man auf ceph-client-[1,2] ein Block Device erstellt. Das ist vergleichbar mit einer eingebauten Festplatte, um dies dann mit dem Cluster Filesystem OCFS zu formatieren, analog zu einem DRBD Master/Master Setup mit OCFS2, das ich mehrfach seit langer Zeit erfolgreich als Maildir Storage nutze.

RADOS Block Device

Zunnächst habe ich auf ceph-client-[1,2] die /mnt wieder umounted und danach auf ceph1 mit ein 1 GB Device im Ceph-Cluster bekannt gegeben.

% rbd create test --size 1024

Für den weiteren Verlauf brauchte man außerdem die Ausgabe von ceph-authtool -l /etc/ceph/keyring. Dann wechselte ich auf ceph-client-[1,2] und führte ein modprobe rbd durch, um das Ceph-Kernel-Modul sicher zu laden.

Erstellung des rbd Block Device

Auf ceph-client-1,2 setzte ich nun folgenden Befehl ab:

% echo "192.168.123.101,192.168.123.102,192.168.123.103 name=client.admin,secret=AQBvCLFRkIjMHxAArIm15AJVpKqhJ9HLizsEtg== rbd test" > /sys/bus/rbd/add

Den Erfolg des Kommandos konnte ich mit ls überprüfen.

% ls /sys/bus/rbd/devices
 1

Ein rdb-Device wird umgekehrt so gelöscht:

% echo 1 > /sys/bus/rbd/remove
% ls /sys/bus/rbd/devices

Installation OCFS2 auf /dev/rbd1

Um OCFS2 auf ceph-client-[1,2] zu installieren, genügte ein Aufruf:

% apt-get install ocfs2-tools

Anschließend habe ich die /etc/ocfs2/cluster.conf auf ceph-client-[1,2] erstellt:

node:
     ip_port = 7777
     ip_address = 192.168.123.201
     number = 0
     name = ceph-client-1
     cluster = ocfs2
node:
     ip_port = 7777
     ip_address = 192.168.123.202
     number = 1
     name = ceph-client-2
     cluster = ocfs2
cluster:
     node_count = 2
     name = ocfs2

Mit einem abschließenden dpkg-reconfigure ocfs2-tools war die Installation von OCFS2 dann erledigt. Es folgte nur auf ceph-client-1 die Formatierung des rdb Device mit: mkfs.ocfs2 -T mail -L ocfs2 /dev/rbd1 Danach konnte man auf ceph-client-1,2 mit mount -t ocfs2 /dev/rbd1 /mnt den Storage problemlos einhängen.

Dovecot install

Um für den Test nicht einen kompletten Dovecot konfigurieren zu müssen, habe ich ein Script genutzt, das Dovecot in /home/sys4/dovecot automatisch mit einer Standardkonfiguration in Betrieb nimmt.

Vorher war noch noch ein apt-get install postfix build-essential durchzuführen. Postfix habe ich für die Tests einfach als local-only Mailserver angelegt.

#/bin/sh
VERSION=2.2.2
CURRENT=`pwd`
########################################
# get and compile dovecot
mkdir $CURRENT/bin
wget http://dovecot.org/releases/2.2/dovecot-$VERSION.tar.gz
tar zxvof ./dovecot-$VERSION.tar.gz &&
     cd dovecot-$VERSION &&
     ./configure --prefix=$CURRENT/bin &&
     make &&
     make install
#########################################
# add needed user
adduser --system --group --no-create-home --disabled-login --force-badname dovenull
adduser --system --group --no-create-home --disabled-login --force-badname dovecot
adduser --no-create-home --disabled-login --gecos vmail vmail
########################################
# create a default conf with urgent needed minimum parameters
$CURRENT/bin/bin/doveconf -d > $CURRENT/bin/etc/dovecot/dovecot.conf
#
echo "login_trusted_networks = 127.0.0.1" >> $CURRENT/bin/etc/dovecot/dovecot.conf
echo "passdb {" >> $CURRENT/bin/etc/dovecot/dovecot.conf
echo "driver = passwd-file" >> $CURRENT/bin/etc/dovecot/dovecot.conf
echo "args = scheme=plain-md5 username_format=%n $CURRENT/bin/etc/dovecot/imap.passwd" >> $CURRENT/bin/etc/dovecot/dovecot.conf
echo "}" >> $CURRENT/bin/etc/dovecot/dovecot.conf
echo "userdb {" >> $CURRENT/bin/etc/dovecot/dovecot.conf
echo "driver = passwd-file" >> $CURRENT/bin/etc/dovecot/dovecot.conf
echo "args = username_format=%n $CURRENT/bin/etc/dovecot/imap.passwd" >> $CURRENT/bin/etc/dovecot/dovecot.conf
echo "default_fields = local_port=%a" >> $CURRENT/bin/etc/dovecot/dovecot.conf
echo "}" >> $CURRENT/bin/etc/dovecot/dovecot.conf
############################################

Einige Änderungen waren aber dann doch noch gemäß Dovecot Wiki Empfehlungen für Clusterfilesystem auf beiden Test-Clients durchzuführen. Dazu habe ich in /home/sys4/dovecot/bin/etc/dovecot/dovecot.conf folgende Parameter aktiviert:

mail_fsync = always
mail_nfs_storage = yes
mail_nfs_index = yes
mmap_disable = yes
login_trusted_networks = 127.0.0.1, 10.0.0.0/24

Dann habe ich den Server gestartet:

% /home/sys4/dovecot/bin/sbin/dovecot -c /home/sys4/dovecot/bin/etc/dovecot/dovecot.conf

Anlegen der User und Mailboxen

Ich habe also mit mkdir /mnt/user1 eine Mailbox angelegt und diese mit chown -R vmail:vmail /mnt/user1 dem vmail System User übereignet.

Danach war noch auf beiden Dovecots eine Passwortdatei /home/sys4/dovecot/bin/etc/dovecot/imap.passwd anzulegen mit diesem Inhalt:

user1:{plain}pass:vmail:vmail::/mnt/user1::userdb_mail=mdbox:~/mdbox

Einliefern von Test Mails

Am einfachsten war es, dafür smtp-source aus Postfix zu nutzen, z.B wie folgt:

% smtp-source -L -s 1 -l 10120 -m 100 -c -f sender@example.com -t user1 unix:./bin/var/run/dovecot/lmtp

Dies erzeugte in der Mailbox user1 100 relativ kleine Testmails.

Testen mit Thunderbird

Nun konnte man sich auf die Bridged Netzwerkadressen von ceph-client-[1,2] mit zwei externen Thunderbirds verbinden. Dann konnte ich weiter testen, Ordner erstellen, verschieben, Mails in die Ordner verschieben, Mails löschen usw. mit beiden Thunderbirds.

Ich konnte keine Fehler erzeugen, es zeigte sich jedoch, dass es ratsam war, die IMAP-Offlinesync-Funktion auszuschalten sowie Expunge beim Verlassen der Inbox einzuschalten, um sich rein optisch nicht verwirren zu lassen. Außerdem kontrollierte ich währenddessen die Log-Daten aller Beteiligten mit einem tail -f.

Dieser Funktionstest zeigte mir: Ceph eignet sich grundsätzlich als Storage für Dovecot. Das hier gezeigte Setup würde ich aber so nicht in Betrieb nehmen.

Außerdem war beträchtlicher Zeitaufwand nötig, weil ich oft warten musste wegen der Virtualisierung der Test-Maschinen. Ceph selbst zeigte sich zwar als komplex, sollte aber auch zukünftig die hohen Erwartungen erfüllen. Allerdings scheint die Entwicklung noch hier und da im Fluss zu sein, besonders CEPHFS wird noch nicht für den produktiven Einsatz empfohlen.

Mir persönlich fehlt es derzeit noch am Ceph-Detailwissen, und es fehlen für den Einsatz als Mailstorage auch noch ausführliche Performance-Tests. Meine Cluster-Kollegen werden sich weiter damit beschäftigen und demnächst an dieser Stelle über ihre Erfahrungen ausführlicher berichten.

Robert Schetterer, 06. June 2013