Intern:IT:HowTo:Ceph
Inhaltsverzeichnis |
Allgemein
Zur allgemeinen Einführung gibt es von ceph ein Getting Started.
Ceph besteht aus drei Teilen:
OSDs: Object Storage Daemons (OSDs), speichert die Daten Monitors: Beinhaltet die Maps, wo was gespeichert ist (Vorzugsweise als SSD ausgelegt) MDSs: Metadata Servers (MDSs) Metadaten des CephFS
Installation (Server)
Ceph
Debian
Das Hinzufügen der Pakete in das Paketmanagement-System APT ist auf ceph.com gut beschieben, auch wenn dort sudo verwendet wird.
Hier die Befehle ohne sudo für den Europa-Mirror
wget -q -O- 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc' | apt-key add - echo deb http://eu.ceph.com/debian-bobtail/ $(lsb_release -sc) main | tee /etc/apt/sources.list.d/ceph.list apt-get update && apt-get install ceph google-perftools
Gentoo (Falkland)
emerge -v ceph google-perftools sudo gptfdisk parted
Ceph-Management Tool
Bis zur Version 0.5 wird mkcephfs unterstützt. Ab der Version 0.6 wird das ceph-deploy empfohlen.
Unter gentoo funktioniert ceph-deploy allerdings noch nicht (Stand Dez. 2013).
Daher wird weiter hinten auch erklärt, wie man mit zwei Storage-Servern und 4 Disks "manuell" einen ceph-cluster installiert/einrichtet.
Debian
Unter Debian ist dies direkt aus den Repositories von Ceph zu beziehen. http://ceph.com/wiki/Debian
Gentoo
ceph-deploy für Gentoo wird momentan noch nicht unterstützt. Es gibt aber - auch durch uns - Ambitionen, dies zu ändern:
https://github.com/MikaelCluseau/ceph-deploy/tree/wip-gentoo-support
https://github.com/nextoo/portage-overlay/tree/master/sys-cluster/ceph
XFS
Für den Einsatz von XFS muss natürlich auch auf jeder Machine die Tools installiert sein:
Debian
apt-get install xfsprogs
Gentoo
emerge -v sys-fs/xfsprogs
Nur einem Storage-Server
In Anlehnung an dieses Howto
Die hier beschrieben Konfiguration kann manifestiert werden. Dies führt dazu, dass Ceph auch nur mit einem Knoten startet, was hier immer der Fall ist. Der Pool ist im Standardfall "rbd".
ceph osd pool set <poolname> min_size 1
Siehe dazu http://wiki.skytech.dk/index.php/Ceph_-_howto,_rbd,_lvm,_cluster
Vorbereitungen
Auf dem Storage-Server läuft bereits ein Debian Wheezy, das eine fest IP und einen hostname hat.
Zudem gibt muss Ceph auf ein vorhandenes FS initialisiert werden. Empfohlen wird aktuell XFS, auch wenn in Zukunft BTRFS den Vorzug bekommen wird.(http://ceph.com/docs/master/rados/configuration/filesystem-recommendations/)
Man sollte das Betreibssystem nicht auf die gleiche Festplatten installieren, wie die Daten.
Es gibt auch für die Anbindung der Daten-Festplatten zwei Möglichkeiten:
1. Ein Hardware- oder Software-RAID bündelt alle OSDs 2. Man läßt ceph selber die Platten verwalten, was im Falle von btrfs sinnvoll erscheint
In unserem Fall ist der hostname = datapool1 und wir verwenden XFS und das Software-RAID Tool mdadm.
Zur Vorbereitung muss ein RAID aus den vorhandenn Platten erstellt werden. Dazu gibt es aber im Internet genügend Anleitungen. Z.B. hier
Am Ende sollte der RAID mdX in der /proc/mdstat aufgelistet werden, hat aber noch kein Dateisystem.
Dies muss nun noch gesetzt werden und die notwendigen Ordner erstellt werden:
Nicht Mounten bzw. mkfs hier für den Daten-RAID - das macht das Skript nachher auf den passenden osd.X Ordner
mkdir -p /srv/ceph/{osd,mon,mds}
Die Log- und Run-Ordner legt die Installation-Routine von Debian für uns an.
Quorum
Es müssen für das automatische Failover min. 3 Ceph-Mon existieren, um beim Ausfall eines Server im Zweifelsfall eine Mehrheit zu haben.
Konfiguration
Da nun alles vorbereitet ist, kann die Konfigurations-Datei /etc/ceph/ceph.conf editiert werden.
[global] log file = /var/log/ceph/$name.log pid file = /var/run/ceph/$name.pid [mon] mon data = /srv/ceph/mon/$name [mon.datapool1] host = datapool1 mon addr = DATAPOOL1_FESTE_IP:6789 [mds] [mds.datapool1] host = datapool1 [osd] osd data = /srv/ceph/osd/$name osd journal = /srv/ceph/osd/$name/journal osd journal size = 1000 ; journal size, in megabytes [osd.0] host = datapool1 devs = /dev/md2 ## Das kann auch bei [osd] hin, wenn es fuer alle OSDs gilt. osd mkfs type = xfs osd mkfs options xfs = -f osd mount options xfs = rw,noatime
Gestartet wird der Dienst mit
/etc/init.d/ceph start
Das sollte aber erst nach der korrekten Initialisierung von cephfs o.ä. geschehen.
Prüfen kann man den Dienst z.B. mit
ceph -s
Das Ergebnis kann z.B. so aus sehen:
root@datapool1:/etc/ceph# ceph -s health HEALTH_WARN 384 pgs degraded; 384 pgs stuck unclean; recovery 21/42 degraded (50.000%) monmap e1: 1 mons at {datapool1=10.14.0.81:6789/0}, election epoch 2, quorum 0 datapool1 osdmap e3: 1 osds: 1 up, 1 in pgmap v11: 384 pgs: 384 active+degraded; 8699 bytes data, 1036 MB used, 2791 GB / 2792 GB avail; 0B/s rd, 3072B/s wr, 3op/s; 21/42 degraded (50.000%) mdsmap e4: 1/1/1 up {0=datapool1=up:active}
CephFS
Danach kann man das CephFS initialisieren:
mkcephfs
mkcephfs -a -c /etc/ceph/ceph.conf --mkfs --no-copy-conf
Die manpage hat folgende Infos zu den Optionen:
-a, --allhosts Performs the necessary initialization steps on all hosts in the cluster, executing commands via SSH. -c ceph.conf, --conf=ceph.conf Use the given conf file instead of the default /etc/ceph/ceph.conf. -k /path/to/keyring When -a is used, we can specify a location to copy the client.admin keyring, which is used to administer the cluster. The default is /etc/ceph/keyring (or whatever is specified in the config file). --mkfs Create and mount any file systems specified in the ceph.conf for OSD data storage using mkfs.*. The "devs" and (if it differs from "osd data") "fs path" options must be defined. NOTE Btrfs is still considered experimental. This option can ease some configuration pain, but the use of this option is not required when osd data directories are mounted manually by the adminstrator. --no-copy-conf By default, mkcephfs with -a will copy the new configuration to /etc/ceph/ceph.conf on each node in the cluster. This option disables that behavior.
Wenn alles glatt gelaufen ist, sollte in etwa dieser Output kommen:
root@datapool1:/etc/ceph# /sbin/mkcephfs -a -c /etc/ceph/ceph.conf --mkfs --no-copy-conf temp dir is /tmp/mkcephfs.Hb5T5ecGIu preparing monmap in /tmp/mkcephfs.Hb5T5ecGIu/monmap /usr/bin/monmaptool --create --clobber --add datapool1 10.14.0.81:6789 --print /tmp/mkcephfs.Hb5T5ecGIu/monmap /usr/bin/monmaptool: monmap file /tmp/mkcephfs.Hb5T5ecGIu/monmap /usr/bin/monmaptool: generated fsid 8d235971-e4b0-4e49-8780-f75b6f6b3d11 epoch 0 fsid 8d235971-e4b0-4e49-8780-f75b6f6b3d11 last_changed 2013-04-28 15:04:43.403213 created 2013-04-28 15:04:43.403213 0: 10.14.0.81:6789/0 mon.datapool1 /usr/bin/monmaptool: writing epoch 0 to /tmp/mkcephfs.Hb5T5ecGIu/monmap (1 monitors) === osd.0 === umount: /srv/ceph/osd/osd.0: not mounted umount: /dev/md2: not mounted Protokoll-Stripe-Einheit (524288 Bytes) ist zu groà (Maximum ist 256KiB) Protokoll-Stripe-Einheit angepasst auf 32KiB meta-data=/dev/md2 isize=256 agcount=32, agsize=22889728 blks = sectsz=512 attr=2, projid32bit=0 data = bsize=4096 blocks=732471296, imaxpct=5 = sunit=128 swidth=384 blks naming =version 2 bsize=4096 ascii-ci=0 log =Internes Protokoll bsize=4096 blocks=357656, version=2 = sectsz=512 sunit=8 blks, lazy-count=1 realtime =keine extsz=4096 blocks=0, rtextents=0 2013-04-28 15:05:42.313521 7f33c3b2c780 -1 filestore(/srv/ceph/osd/osd.0) could not find 23c2fcde/osd_superblock/0//-1 in index: (2) No such file or directory 2013-04-28 15:05:44.060864 7f33c3b2c780 -1 created object store /srv/ceph/osd/osd.0 journal /srv/ceph/osd/osd.0/journal for osd.0 fsid 8d235971-e4b0-4e49-8780-f75b6f6b3d11 2013-04-28 15:05:44.060970 7f33c3b2c780 -1 auth: error reading file: /srv/ceph/osd/osd.0/keyring: can't open /srv/ceph/osd/osd.0/keyring: (2) No such file or directory 2013-04-28 15:05:44.061147 7f33c3b2c780 -1 created new key in keyring /srv/ceph/osd/osd.0/keyring === mds.datapool1 === creating private key for mds.datapool1 keyring /var/lib/ceph/mds/ceph-datapool1/keyring creating /var/lib/ceph/mds/ceph-datapool1/keyring Building generic osdmap from /tmp/mkcephfs.Hb5T5ecGIu/conf /usr/bin/osdmaptool: osdmap file '/tmp/mkcephfs.Hb5T5ecGIu/osdmap' /usr/bin/osdmaptool: writing epoch 1 to /tmp/mkcephfs.Hb5T5ecGIu/osdmap Generating admin key at /tmp/mkcephfs.Hb5T5ecGIu/keyring.admin creating /tmp/mkcephfs.Hb5T5ecGIu/keyring.admin Building initial monitor keyring added entity mds.datapool1 auth auth(auid = 18446744073709551615 key=AQCoHn1RWCOTChAARWhtpkd9GEKEkZv9MhINYA== with 0 caps) added entity osd.0 auth auth(auid = 18446744073709551615 key=AQCoHn1RsGOiAxAAGNzFrObRI+ck40Zk9ZPlWw== with 0 caps) === mon.datapool1 === /usr/bin/ceph-mon: created monfs at /srv/ceph/mon/mon.datapool1 for mon.datapool1 placing client.admin keyring in /etc/ceph/keyring
Ceph Starten
(s.o.)
/etc/init.d/ceph start
Prüfen
Zum Überprüfen der Einrichtung gibt es verschiedne Möglichkeiten:
Mount
mount ... /dev/md2 on /srv/ceph/osd/osd.0 type xfs (rw,noatime,attr2,delaylog,sunit=1024,swidth=3072,noquota)
Ceph-CLI
ceph osd tree # id weight type name up/down reweight -1 1 root default -3 1 rack unknownrack -2 1 host datapool1 0 1 osd.0 up 1
Mount
apt-get update && apt-get install ceph-common
Das geht auf einem Client oder auch auf dem Server selbst.
Um das CephFS von einem entfernten Rechner zu mounten, benötigt man den Befehl:
mount -t ceph DATAPOOL1_FESTE_IP:6789:/ /mnt/
Da im restlichen Howto davon ausgegenagen wird, dass "auth cephx" konfiguriert ist, muss der "name" und das "secret" mit angegeben werden (diese sind nur exemplarisch)
mount -t ceph DATAPOOL1_FESTE_IP:6789:/ /mnt/ -o name=admin,secret=AQATSKdNGBnwLhAAnNDKnH65FmVKpXZJVasUeQ==
RBD
Installation
Zunächst muss auf dem Client ein paar Pakete nachinstalliert werden. Um CephFS zu nutzen reicht das Paket ceph-common.
Für RBD kommt noch dazu:
apt-get install ceph modprobe rbd
Auf dem Server ist nur eine Aktion nötig, um die Nutzung von RBD auf dem Client möglich zu machen:
scp datapool1:/etc/ceph/keyring CLIENT:/etc/ceph/
Danach muss noch die Client-config für Ceph erstellt werden in der Datei /etc/eph/ceph.conf auf dem CLIENT. Diese hat aber nur folgenden Inhalt:
[mon.datapool1] host = datapool1 mon addr = DATAPOOL1_FESTE_IP:6789
Zum Testen kann folgender Befehl die bereits erstellen Images auflisten:
rbd list
das Gleiche nur auf Pools bezogen - hier der default Pool "rbd":
rbd ls rbd
Direktes Einbinden
Um es als einfaches Gerät einzubinden, ist folgendes nötig:
rbd map DAS_ANGELEGTE_RBD-Image --pool rbd --name client.admin ls -l /dev/rbd/rbd/DAS_ANGELEGTE_RBD-Image mkfs.ext4 -m0 /dev/rbd/rbd/DAS_ANGELEGTE_RBD-Image #-m0 steht für keine Reservierten Blöcke mount /dev/rbd/rbd/DAS_ANGELEGTE_RBD-Image
QEMU/LIBVIRT
Leider unterstützt Debian Wheezys qemu-img noch keine rbd. Bei Ubuntu 12.04 geht es angeblich.
http://ceph.com/docs/master/rbd/qemu-rbd/ http://ceph.com/docs/master/rbd/libvirt/
Zwei Storage-Server
Im einfachsten Fall darf davon ausgegangen werden, dass sich zwei Server mit jeweils einer "Ceph-dedizierten Platte" vorliegen. Dies ist im ersten Teil (mkcephfs) beschrieben.
Im zweiten Teil (manual) wird dann auf eine erweiterte Konfiguration eingegangen.
mkcephfs (bis ceph Version 0.5xx)
Zunächst ist wichtig, dass man ssh-Zugriff vom Server, von dem man aus mkcephfs startet, auf den zweiten Server hat. Anonsten muss man sehr oft das root-SSH-Passwort eingeben. Das geht z.B. über "authorized keys". Die Vorrausetzungen für ein mkcephfs aus dem Troubleshooting gelten auch hier.
Ein gelungenes mkcephfs auf zwei Servern kann so in etwa aussehen:
datapool1 ~ # mkcephfs -a -c /etc/ceph/ceph.conf -k /etc/ceph/keyring-ceph --mkfstemp dir is /tmp/mkcephfs.5YeU9kuGot preparing monmap in /tmp/mkcephfs.5YeU9kuGot/monmap /usr/bin/monmaptool --create --clobber --add datapool1 10.2.0.253:6789 --add datapool2 10.2.0.252:6789 --print /tmp/mkcephfs.5YeU9kuGot/monmap /usr/bin/monmaptool: monmap file /tmp/mkcephfs.5YeU9kuGot/monmap /usr/bin/monmaptool: generated fsid 0ece4a40-4b8e-4dc4-b112-b8c3aa588708 epoch 0 fsid 0ece4a40-4b8e-4dc4-b112-b8c3aa588708 last_changed 2013-08-18 09:58:03.227827 created 2013-08-18 09:58:03.227827 0: 10.2.0.252:6789/0 mon.datapool2 1: 10.2.0.253:6789/0 mon.datapool1 /usr/bin/monmaptool: writing epoch 0 to /tmp/mkcephfs.5YeU9kuGot/monmap (2 monitors) === osd.0 === pushing conf and monmap to datapool2:/tmp/mkfs.ceph.3373 umount: /srv/ceph/osd/osd.0: not mounted umount: /dev/sdb1: not mounted meta-data=/dev/sdb1 isize=256 agcount=4, agsize=15262410 blks = sectsz=512 attr=2, projid32bit=0 data = bsize=4096 blocks=61049638, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal log bsize=4096 blocks=29809, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 2013-08-18 08:03:02.248997 7f5dee171780 -1 filestore(/srv/ceph/osd/osd.0) could not find 23c2fcde/osd_superblock/0//-1 in index: (2) No such file or directory 2013-08-18 08:03:02.360775 7f5dee171780 -1 created object store /srv/ceph/osd/osd.0 journal /srv/ceph/osd/osd.0/journal for osd.0 fsid 0ece4a40-4b8e-4dc4-b112-b8c3aa588708 2013-08-18 08:03:02.361173 7f5dee171780 -1 created new key in keyring /etc/ceph/keyring-ceph collecting osd.0 key === osd.1 === umount: /srv/ceph/osd/osd.1: not mounted umount: /dev/sdb1: not mounted meta-data=/dev/sdb1 isize=256 agcount=4, agsize=15628630 blks = sectsz=512 attr=2, projid32bit=0 data = bsize=4096 blocks=62514518, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal log bsize=4096 blocks=30524, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 2013-08-18 09:58:19.949408 7f5d3a7d2780 -1 filestore(/srv/ceph/osd/osd.1) could not find 23c2fcde/osd_superblock/0//-1 in index: (2) No such file or directory 2013-08-18 09:58:19.988210 7f5d3a7d2780 -1 created object store /srv/ceph/osd/osd.1 journal /srv/ceph/osd/osd.1/journal for osd.1 fsid 0ece4a40-4b8e-4dc4-b112-b8c3aa588708 2013-08-18 09:58:19.988720 7f5d3a7d2780 -1 created new key in keyring /etc/ceph/keyring-ceph === mds.datapool1 === creating private key for mds.datapool1 keyring /etc/ceph/keyring-ceph creating /etc/ceph/keyring-ceph === mds.datapool2 === pushing conf and monmap to datapool2:/tmp/mkfs.ceph.3373 creating private key for mds.datapool2 keyring /etc/ceph/keyring-ceph creating /etc/ceph/keyring-ceph collecting mds.datapool2 key Building generic osdmap from /tmp/mkcephfs.5YeU9kuGot/conf /usr/bin/osdmaptool: osdmap file '/tmp/mkcephfs.5YeU9kuGot/osdmap' /usr/bin/osdmaptool: writing epoch 1 to /tmp/mkcephfs.5YeU9kuGot/osdmap Generating admin key at /tmp/mkcephfs.5YeU9kuGot/keyring.admin creating /tmp/mkcephfs.5YeU9kuGot/keyring.admin Building initial monitor keyring added entity mds.datapool1 auth auth(auid = 18446744073709551615 key=AQC8mhBSMIvkChAAkuV7MU6Cp8CmIRmhWVDNDQ== with 0 caps) added entity mds.datapool2 auth auth(auid = 18446744073709551615 key=AQDGfxBS4HVoBRAAVJiPK/af8FEKsEJZs3H5lQ== with 0 caps) added entity osd.0 auth auth(auid = 18446744073709551615 key=AQC2fxBScOGEFRAAFlEkkDU5wIU55kmmMIGjdA== with 0 caps) added entity osd.1 auth auth(auid = 18446744073709551615 key=AQC7mhBSiJLrOhAAiI2EDRzIv+AJ4fQniAYOxQ== with 0 caps) === mon.datapool1 === /usr/bin/ceph-mon: created monfs at /srv/ceph/mon/mon.datapool1 for mon.datapool1 === mon.datapool2 === pushing everything to datapool2 /usr/bin/ceph-mon: created monfs at /srv/ceph/mon/mon.datapool2 for mon.datapool2 placing client.admin keyring in /etc/ceph/keyring-ceph
Danach kann man auf beiden Server ceph starten (etc/init.d) und zum testen "ceph -s" oder "ceph health" eingeben.
Manuell (ab ceph Version 0.6xx)
An Anlehnung an diese Anleitung. Danke an Aaron Ten Clay.
Getestet mit 0.67.0 und 0.67.9 und einem und mehreren OSDs und Cluster auf einem Server
Die prinzipielle Beschreibung des Test-Setups für das Pilot100/SRI-Projekt ist im Nachfolgenden abgebildet.
Daran orientiert sich dieser Teil des Howtos.
Der Einfachheithalber ohne keyrings:
Config erstellen
nano /etc/ceph/CLUSTER.conf
Da einige Howtos im Internet nicht deutlich genug auf den Spezialfall eingehen, dass man mehr als einen "Cluster" an Ceph-Pools hat. Hier ein paar Worte:
Grundsätzlich muss man an jeder Stelle die nicht default config (-c CLUSTER.conf) bei diversen Befehlen z.B: bei "ceph health" o.ä. anbgeben. Auch bei den hier beschriebenen Befehlen, muss immer der Cluster angegeben sein.
Auch hier sein an Aron verwiesen, der das in sein Howto einfließen hat lassen.
[global] # alle drei Optionen sind per default cephx ab Version 0.51 # http://ceph.com/docs/master/rados/configuration/auth-config-ref/ auth cluster required = none auth service required = none auth client required = none # fuer abwaertskompatibilitaet auth supported = none fsid = FSID AUS DER MONMAP-INIT
[mon.CLUSTER-datapool1] host = datapool1 mon addr = DATAPOOL1_FESTE_IP:6789 mon data = /var/lib/ceph/mon/ceph-datapool1 [mon.CLUSTER-datapool2] host = datapool2 mon addr = DATAPOOL1_FESTE_IP:6789 mon data = /var/lib/ceph/mon/ceph-datapool2 [osd.0] host = datapool1 devs = /dev/sdb1 osd_mkfs_type = xfs osd data = /var/lib/ceph/osd/ceph-0 [osd.1] host = datapool2 devs = /dev/sdb1 osd_mkfs_type = xfs osd data = /var/lib/ceph/osd/ceph-1
Zum Schluss noch die Exports für die leichtere verwendung der Befehle (auf jedem der beteiligten Hosts):
export cluster=CLUSTER export node=datapoolX export osdnum=OSDNUMMER
Wobei die OSDNUMMER immer pro Cluster von 0 anfängt zu zählen. Bei mehr als einem Cluster kann es pro Config auch ein osd.0 etc geben, die sich dann anhang des Cluster-namen unterscheiden.
Und auch die Config auf alle Hosts verteilen, die einen Ceph-Dienst starten sollen (MON, MDS, OSD)
scp /etc/ceph/${cluster}.conf ANDERE-MON-HOSTS:/etc/ceph/
monmap erstellen
Hier wird die Struktur der MON-Knoten festgelegt.
monmaptool --create --generate -c /etc/ceph/${cluster}.conf /etc/ceph/${cluster}-monmap
Für ein automatisches Failover beim Ausfall eines Knoten, muss ein Quorum von mehr als 2 Knoten vorhanden sein.
Einfacher ausgedrückt, dafür müssen es mindestens 3 sein.
scp /etc/ceph/${cluster}-monmap ANDERE-MON-HOSTS:/etc/ceph/
MON init
Dann den Mon erstellen (jeweils auf den mon-hosts - hier "datapool1 und datapool2)
mkdir -p /var/lib/ceph/mon/ceph-${cluster}-${node}
Obwohl wir keinen keyring verwenden wollen, muss trotzdem die File existieren, deshalb muss der (leere) Keyring angelegt sein. (Achtung: Wenn es das Verzeichnis noch nicht gibt, muss es vom "ceph-mon ... mkfs.." Befehl erstellt werden - also nicht manuell mit "mkdir" ! )
touch /var/lib/ceph/mon/ceph-${cluster}-${node}/keyring
Den Monitor selber anlegen
ceph-mon -c /etc/ceph/${cluster}.conf --mkfs -i ${cluster}-${node} --monmap /etc/ceph/${cluster}-monmap --keyring /var/lib/ceph/mon/ceph-${cluster}-${node}/keyring
Danach die drei Dateien auf bei Nodes verteilen. DIe nachfolgenden Kommandos müssen mit den jeweilgen Namen und Nummern jeweils auf den Nodes eingegeben werden.
MON start
Ob das bisher erstelle funktioniert, kann man mit dem Start des MON tesen
ceph-mon --cluster ${cluster} -c /etc/ceph/${cluster}.conf -i ${cluster}-${node} -f -d
Die Parameter bedeuten hier
-f : Foreground -d : Debug
MDS init
Anlegen des Verzeichnisses (jeweils auf den beiden hosts)
mkdir -p /var/lib/ceph/mds/ceph-${cluster}-${node}
Leere Schlüsseldatei anlegen (jeweils auf den beiden hosts)
touch /var/lib/ceph/mds/ceph-${cluster}-${node}/keyring
MDS start
Der ceph-mon Dienst muss natürlich dafür laufen (jeweils auf den hosts)
ceph-mds --cluster ${cluster} -c /etc/ceph/${cluster}.conf -i ${cluster}-${node} -f -d
Die Parameter bedeuten hier
-f : Foreground -d : Debug
OSD init
In der Version 0.61 sind noch einige deploy-Tools enthalten. In 0.67 sind die aktuell unter /usr/usr/sbin/...
ceph-disk-prepare --cluster ${cluster} --zap-disk /dev/XXX # XXX z.B. sdb
Dies legt die Partitionen an (zwei) und bereitet die PLatte vor.
Zum Prüfen kann man ceph-disk verwenden
ceph-disk list
Das Ergebnis muss ungefähr so aussehen:
... /dev/sdb : /dev/sdb1 ceph data, active, cluster ceph, osd.1, journal /dev/sdb2 /dev/sdb2 ceph journal, for /dev/sdb1 ...
Bei der Verwendung der "Cluster"-Variable wird die OSD entsprechend in /var/lib/ceph/osd/$[cluster}-${osdnum} eingehängt. Wenn diese nicht verwendet wird heißt der cluster "ceph"
mkdir /var/lib/ceph/osd/${cluster}-${osdnum}
Fuer den Fall, dass es noch vom prepare gemountet ist
umount /dev/XXX#
Nun muss noch das device gemounted werden (wobei XXX# z.B. sdb1 ist).
mount /dev/XXX# /var/lib/ceph/osd/${cluster}-${osdnum}
und der ceph-osd command für die Formatierung und Journal ausgeführt werden
ceph-osd -i ${osdnum} --cluster=${cluster} -c /etc/ceph/${cluster}.conf --mkfs --mkjournal
OSD start
Jeweils auf beiden hosts starten
ceph-osd -f -d -i ${osdnum} --cluster=${cluster} -c /etc/ceph/${cluster}.conf
Die Parameter bedeuten hier wieder
-f : Foreground -d : Debug
Zusätzliche OSD anlegen, ist hier ebenfalls beschrieben.
Dauerhaft einrichten
Mount dauerhaft einrichten (/etc/fstab)
Angenommen es wird xfs verwendet
nano /etc/fstab
Für SSDs
echo "/dev/disk/by-uuid/UUID-DISKPARTITION /var/lib/ceph/osd/${cluster}-${osdnum} xfs rw,noexec,nodev,noatime,nodiratime,discard 0 0" >> /etc/fstab
ceph Start-Skript
Bei Gentoo kann man dafür /etc/local.d/ verwenden
nano /etc/local.d/ceph-CLUSTER.start
#! /bin/sh ##DEBUG #set -x ## Bugfix fuer nicht erstellen /dev/disk/... /etc/init.d/udev restart export cluster=CLUSTER export node=NODE-Name export osdnum=OSDNUMMER echo "Ceph - Starting Cluster ${cluster}" #MON echo ".. Start Monitor" ceph-mon --cluster ${cluster} -c /etc/ceph/${cluster}.conf -i ${cluster}-${node} ## bei reinem RBD nicht noetig #MDS echo "..... Start MDS " ceph-mds --cluster ${cluster} -c /etc/ceph/${cluster}.conf -i ${cluster}-${node} #OSD echo "... Mount OSD" mount /var/lib/ceph/osd/${cluster}-${osdnum} echo ".... Start OSD-0 Daemon" ceph-osd -i ${osdnum} --cluster ${cluster} -c /etc/ceph/${cluster}.conf
Weiterführendes
CRUSH Map
http://ceph.com/docs/master/rados/operations/crush-map/#editing-a-crush-map
Debug
Um einen genaueren Blick zu werden können die Dienste (mon, mds, osd) auch einzelnd von Hand gestartet werden. Für die genauen Bezeichnungen der id, hilft ein Blick in die config-Datei (z.B. ceph.conf -> eckige Klammern)
ceph-cluster
ceph-mon -d -f -i NAME_DES_SERVERS
ceph-mds -d -f -i NAME_DES_SERVERS
ceph-osd -d -f -i NUMMER_DES_OSD
mkcephfs
The sub-commands performed during cluster setup can be run individually with
--prepare-monmap -d dir -c ceph.conf Create an initial monmap with a random fsid/uuid and store it and the ceph.conf in dir.
--init-local-daemons type -d dir Initialize any daemons of type type on the local host using the monmap in dir. For types osd and mds, the resulting authentica- tion keys will be placed in dir. For type mon, the initial data files generated by --prepare-mon (below) are expected in dir.
--prepare-mon -d dir Prepare the initial monitor data based on the monmap, OSD, and MDS authentication keys collected in dir, and put the result in dir.
Troubleshoting
mkcephfs Probleme
Wenn die Ausführung von mkcephfs mit Fehlern abgebrochen wird (z.B. OSD init failed oder mon_data directory is not empty etc.) müssen verschiede Vorraussetzungen (wieder) geschaffen werden, damit ein neuer Lauf funktionieren kann (Annahme ceph-Daten liegen unter /srv/ceph):
1. Ceph-Dienst stoppen
/etc/init.d/ceph stop
2. Alle OSD umounten
umount /srv/ceph/osd...
3. Das Monitoring-Data-Verzeichnis löschen
rm -rf /srv/ceph/mon/*
mkcephfs - Manuell durchführen
Die "-k" Option sollte nicht verwendet werden (Version 0.67) da sie ignoriert wird und stattdessen den (schon vorhandenen) Keyring überschreibt. Der Wert kann der global Wert oder ein Eintrag zum jeweiligen Dienst in der /etc/ceph/cephXXX.conf sein.
Unabhängig davon wird eine Kopie in /tmp/cephXXX/key... abgelegt
Das XXX in den Befehlen kann ein Pool, eine Speicherverbund etc sein. Im einfachsten Fall fällt das XXX weg.
MON
mkcephfs -c /etc/ceph/cephXXX.conf --prepare-monmap -d /tmp/cephXXX
MDS
mkcephfs -c /etc/ceph/cephXXX.conf --init-local-daemons mds -d /tmp/cephXXX
OSD
Ohne dass die entsprechenden "/dev" gemounted sind:
mkdir /srv/ceph/osd/osd.1 #und so weiter, je nach cephXXX.conf mkfs.xfs /dev/sdXx # je nach ceph.conf mkcephfs -c /etc/ceph/cephXXX.conf --init-local-daemons osd -d /tmp/cephXXX
unexpected key
Wenn im "mon" der Fehler "unexpected key" auftaucht, fehlen auth. Informationen:
/etc/ceph/ceph.conf
auth supported = cephx keyring = /etc/ceph/keyring-ceph
/etc/ceph/keyring
[mds.datapool2] key = Axxxxxxxxx [osd.0] key = Axxxxxxxxx [client.admin] key = Axxxxxxxxx
Allerdings kann es auch sein, dass die keyring-Dateien einzelnd angelegt wurden. Dann müssen Sie zusammenführt werden, um die globale Anweisung umzusetzten.
Diese sind entweder in
/etc/ceph/keyring...
oder unter
/tmp/cephXXX/kering...
libtcmalloc
Der Fehler "/usr/bin/ceph-mon: error while loading shared libraries: libtcmalloc.so.0: cannot open shared object file: No such file or directory" weist auf eine fehlende Bibliothek hin.
Diese Bibliothek wird vom Paket "google-perftools" bereitgestellt:
apt-get install google-perftools
Oder unter gentoo
emerge -av dev-util/google-perftools
Danach in das Verzeichnis, dass die libs enthält:
cd /usr/lib64 # fuer 64bit Systeme ln -s libtcmalloc.so libtcmalloc.so.0
Backup
Es empfiehlt sich zudem für RBD-basierte VMs ein Backup zu machen:
rbd export POOL/UUID-DISK server-backup.img
oder das Tool: http://grigory.info/BackupRBD.About.html
Updates
Für Ceph-Updates müssen die VMs auf ein anderes Storage, das nicht vom Update betroffen ist, verschoben werden. Alternativ kann auch das disk_template geändert werden: http://wiki.open-laboratory.de/Intern:IT:HowTo:Ganeti#Disk-Template_converting
Weiterführendes gibt es dazu von Inktank: http://ceph.com/docs/master/install/upgrading-ceph/