Intern:IT:HowTo:Ceph

Aus PILARKTO.ORG Open Laboratory e.V.
Wechseln zu: Navigation, Suche

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.

Ceph-Pilot100


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/