Eine flexible Storage-Lösung wird in der heutigen Zeit immer wichtiger. Ich möchte euch in einem Quick-Guide die einfache Installation von Ceph unter Debian Wheezy vorstellen.
CephFS ist ein verteiltes Dateisystem, welches Teil der Software Ceph ist. Zusammen mit RADOS (englisch reliable autonomic distributed object store) handelt es sich um einen über beliebig viele Server redundant verteilbaren Objektspeicher (object store). Objekte sind beispielsweise Binärdateien, die Ceph zu einem über mehrere Geräte verteilten Blockgerät zusammenfassen kann.
Die Objekte werden repliziert gespeichert. Ceph kann den Ausfall von jeder Komponente auffangen und sich selbst heilen, das heißt, zerstörte Daten aus Replikaten auf anderen Speichermedien wiederherstellen.
Punkt 1: Vorbereitung der Umgebung
In diesem Tutorial verwende ich 3 virtuelle KVM Maschinen, wobei /dev/vda für das Betriebssystem und /dev/vdb für Ceph vorgesehen wird.
Die drei VM’s erhalten die Namen test1, test2 und test3. Dies hinterlegen wir zuallererst in der /etc/hosts.
1 2 3 |
10.10.20.11 test1.DOMAIN.de test1 10.10.20.12 test2.DOMAIN.de test2 10.10.20.13 test3.DOMAIN.de test3 |
Nun installieren wir den NTP Dienst auf allen Nodes, damit das Cluster synchron in der Zeit läuft.
1 2 3 4 |
apt-get install ntp /etc/init.d/ntp restart [ ok ] Stopping NTP server: ntpd. [ ok ] Starting NTP server: ntpd. |
Um im nachfolgenden Schritt mit ceph-deploy arbeiten zu können, erstellen wir einen SSH-Key ohne Passphrase und verteilen diesen auf allen Nodes.
WICHTIG: Ceph-Deploy wird immer von einer Administrator Node und einem Ordner aus installiert und verwaltet. In meinem Fall ist es die Node test1 und der Ordner /root/.
1 2 3 4 |
ssh-keygen cat .ssh/id_rsa.pub >> .ssh/authorized_keys rsync -r .ssh/ root@test2:.ssh/ rsync -r .ssh/ root@test3:.ssh/ |
Ich hatte mich der Aktualität halber mit Ceph Version 0.88 beschäftigt. Damit wir CephFS und RBD später einwandfrei nutzen können, brauchen wir mindestens den Linux Kernel 3.15. Diesen installieren wir über die Debian-Backports.
1 2 3 |
[..] deb http://ftp.debian.org/debian/ wheezy-backports main contrib non-free deb-src http://ftp.debian.org/debian/ wheezy-backports main contrib non-free |
Installieren den Kernel und rebooten alle Nodes.
1 2 3 |
apt-get update apt-get install -t wheezy-backports linux-image-amd64 linux-headers-amd64 reboot |
Punkt 2: Installation von ceph-deploy
Nun sind alle 3 Nodes vorbereitet und per SSH untereinander ohne Passwortabfrage erreichbar. Die Installation von dem Ceph Admin-Tool kann beginnen.
1 2 |
wget http://ceph.com/debian-testing/pool/main/c/ceph-deploy/ceph-deploy_1.5.20~bpo70+1_all.deb dpkg -i ceph-deploy_1.5.20~bpo70+1_all.deb |
Punkt 3: Ceph Cluster anlegen
Auf unserer ersten Node test1 im Ordner /root/ beginnen wir nun mit der Erstellung unseres Ceph-Clusters.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
test1:~# ceph-deploy new test1 [ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf [ceph_deploy.cli][INFO ] Invoked (1.5.20): /usr/bin/ceph-deploy new test1 [ceph_deploy.new][DEBUG ] Creating new cluster named ceph [ceph_deploy.new][INFO ] making sure passwordless SSH succeeds [test1][DEBUG ] connected to host: test1 [test1][DEBUG ] detect platform information from remote host [test1][DEBUG ] detect machine type [test1][DEBUG ] find the location of an executable [test1][INFO ] Running command: /bin/ip link show [test1][INFO ] Running command: /bin/ip addr show [test1][DEBUG ] IP addresses found: ['10.10.20.11'] [ceph_deploy.new][DEBUG ] Resolving host test1 [ceph_deploy.new][DEBUG ] Monitor test1 at 10.10.20.11 [ceph_deploy.new][DEBUG ] Monitor initial members are ['test1'] [ceph_deploy.new][DEBUG ] Monitor addrs are ['10.10.20.11'] [ceph_deploy.new][DEBUG ] Creating a random mon key... [ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring... [ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf... |
Es befindet sich nun die Master Konfigurationsdatei ceph.conf im Ordner /root/, die wir auch gleich um folgende Zeilen erweitern.
1 2 3 4 5 6 |
public_network = 10.10.20.0/24 cluster_network = 10.10.20.0/24 osd pool default size = 3 osd pool default min size = 1 osd pool default pg num = 128 osd pool default pgp num = 128 |
Das public_network ist für den Traffic vom Clienten zu den OSD’s und zurück, in meinem Fall das interne Netz 10.10.20.0/24. Das cluster_network ist alleine für die Kommunikation unter den OSD’s, MON’s und MDS’s zuständig. In diesem Tutorial ebenfalls das selbe interne Netz. Mehr könnt ihr in der offiziellen Dokumantion nachlesen.
Die osd pool default size von 3 bestimmt die Anzahl der Replicas, also wie oft ein Object in einem Cluster vorhanden sein soll. Default ist 3.
Die osd pool default min_size von 1 bestimmt die Anzahl von minimalen Rplicas die im Cluster vorhanden sein müssen. Sollte dieser Wert erreicht sein ist der Storage im Schutzmodus und nicht mehr beschreibbar. Default ist 2.
Die Kalkulation von Placement Groups ist ein etwas längeres Thema, wird hier jedoch gut beschrieben. Da wir ein Cluster von 3 OSD’s (je Node eine Festplatte = eine OSD) haben, stellen wir den pg_num Wert default auf 128.
Punkt 4: Ceph Installation
Jetzt kann Ceph auf allen 3 Nodes installiert werden, wieder über die Admin-Node test1.
1 |
test1:~# ceph-deploy install --testing test1 test2 test3 |
Der Zusatz –testing damit wir auf Version 0.88 kommen – ACHTUNG das könnte bei eurem Versuch eine andere Version sein.
1 2 |
test1:~# ceph -v ceph version 0.88 (4be687bf4480474117f56c387febc75c904036be) |
Punkt 5: MON Installation
In einem Rutsch installieren wir den MON Dienst auf allen 3 Nodes.
1 |
test1:~# ceph-deploy mon create-initial test1 test2 test3 |
Fügen die zwei IP-Adressen der Nodes test2 und test3 der /root/ceph.conf hinzu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
test1:~# cat ceph.conf [global] fsid = bf734b34-cc3b-4d58-92ce-fd094341d9ca mon_initial_members = test1 mon_host = 10.10.20.11,10.10.20.12,10.10.20.13 auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx filestore_xattr_use_omap = true public_network = 10.10.20.0/24 cluster_network = 10.10.20.0/24 osd pool default size = 3 osd pool default min size = 1 osd pool default pg num = 128 osd pool default pgp num = 128 |
Und verteilen die Konfiguration auf allen 3 Nodes.
1 |
test1:~# ceph-deploy --overwrite-conf admin test1 test2 test3 |
Punkt 6: OSD erstellen
Jetzt geht es an die Festplatten. Dies übernimmt praktischerweise auch ceph-deploy vollautomatisch für uns.
ACHTUNG: Es werden alle Daten auf /dev/vdb gelöscht!
1 |
test1:~# ceph-deploy osd --zap-disk create test1:/dev/vdb test2:/dev/vdb test3:/dev/vdb |
Auf allen 3 Nodes sollten nun jeweils ein MON und ein OSD Dienst laufen.
1 2 |
root 4054 0.3 2.1 201700 21932 pts/0 Sl 14:17 0:00 /usr/bin/ceph-mon -i test1 --pid-file /var/run/ceph/mon.test1.pid -c /etc/ceph/ceph.conf --cluster ceph root 4947 1.1 2.9 677984 30616 ? Ssl 14:19 0:01 /usr/bin/ceph-osd -i 0 --pid-file /var/run/ceph/osd.0.pid -c /etc/ceph/ceph.conf --cluster ceph |
Der Cluster Status sollte ebenfalls OK sein.
1 2 3 4 5 6 7 8 9 |
test1:~# ceph -s cluster 5ba3e91d-2954-4ddf-bbb5-f213778cdb10 health HEALTH_OK monmap e3: 3 mons at {test1=10.10.20.11:6789/0,test2=10.10.20.12:6789/0,test3=10.10.20.13:6789/0} election epoch 6, quorum 0,1,2 test1,test2,test3 osdmap e13: 3 osds: 3 up, 3 in pgmap v22: 64 pgs, 1 pools, 0 bytes data, 0 objects 100 MB used, 66421 MB / 66521 MB avail 64 active+clean |
Punkt 7: MDS installieren, CephFS mounten
Um CephFS nutzen zu können, benötigen wir einen MDS Dienst in unserem Cluster. Wir nehmen unsere Admin-Node test1 für diese Zwecke.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
test1:~# ceph-deploy mds create test1 [ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf [ceph_deploy.cli][INFO ] Invoked (1.5.20): /usr/bin/ceph-deploy mds create test1 [ceph_deploy.mds][DEBUG ] Deploying mds, cluster ceph hosts test1:test1 [test1][DEBUG ] connected to host: test1 [test1][DEBUG ] detect platform information from remote host [test1][DEBUG ] detect machine type [ceph_deploy.mds][INFO ] Distro info: debian 7.7 wheezy [ceph_deploy.mds][DEBUG ] remote host will use sysvinit [ceph_deploy.mds][DEBUG ] deploying mds bootstrap to test1 [test1][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf [test1][DEBUG ] create path if it doesn't exist [test1][INFO ] Running command: ceph --cluster ceph --name client.bootstrap-mds --keyring /var/lib/ceph/bootstrap-mds/ceph.keyring auth get-or-create mds.test1 osd allow rwx mds allow mon allow profile mds -o /var/lib/ceph/mds/ceph-test1/keyring [test1][INFO ] Running command: service ceph start mds.test1 [test1][DEBUG ] === mds.test1 === [test1][DEBUG ] Starting Ceph mds.test1 on test1... [test1][DEBUG ] starting mds.test1 at :/0 |
Das Filesystem benötigt ebenfalls einen Pool und eine kleine Vorbereitung. Das erledigen wir mit diesen wenigen Befehlen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
test1:~# ceph osd pool create cephfs_data 128 pool 'cephfs_data' created test1:~# ceph osd pool create cephfs_metadata 128 pool 'cephfs_metadata' created test1:~# ceph fs new cephfs cephfs_metadata cephfs_data new fs with metadata pool 2 and data pool 1 test1:~# ceph fs ls name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ] test1:~# ceph df GLOBAL: SIZE AVAIL RAW USED %RAW USED 66521M 66413M 108M 0.16 POOLS: NAME ID USED %USED MAX AVAIL OBJECTS rbd 0 0 0 21291M 0 cephfs_data 1 0 0 21291M 0 cephfs_metadata 2 1902 0 21291M 20 |
Wir benötigen den Admin Key um das Filesystem mounten zu können. Alles nach ‚key =‚ wird benötigt.
1 2 3 |
test1:~# cat /etc/ceph/ceph.client.admin.keyring [client.admin] key = AQBvanxUwiMEDRAA08/jUyiCPZ3D+QqfQl7MyA== |
Wir erstellen das Verzeichnis /cephfs …
1 |
mkdir /cephfs |
… und editieren unsere /etc/fstab. Die IP-Adresse muss eine der 3 Monitoring Server sein, in diesem Beispiel ist es test1.
1 |
10.10.20.11:6789:/ /cephfs ceph name=admin,secret=AQBvanxUwiMEDRAA08/jUyiCPZ3D+QqfQl7MyA==,noatime 0 2 |
Zu guter Letzt mounten wir unser CephFS, die Fehlermeldung kann dabei ignoriert werden.
1 2 |
test1:~# mount /cephfs/ mount: error writing /etc/mtab: Invalid argument |
Webinterface und Sonstiges
Als kleines Schmankerl könnt ihr ein kleines Webinterface namens Kraken installieren. Dies bietet eine kleine visuelle Darstellung eures Ceph Clusters.
https://github.com/krakendash/krakendash
Folgende Unterseiten der Dokumentation von Ceph könnten euch interessieren.
Alles über die Placement Groups: http://ceph.com/docs/master/rados/operations/placement-groups/
RBD Block Device erstellen: http://ceph.com/docs/master/start/quick-rbd/
Deinstallation
Wer Ceph entfernen möchte kann wie folgt vorgehen.
1 2 3 4 |
test1:~# ceph-deploy uninstall test1 test2 test3 test1:~# ceph-deploy purgedata test1 test2 test3 test1:~# ceph-deploy forgetkeys test1:~# ceph-deploy purge test1 test2 test3 |
Ceph auf nur einer Node
Damit Ceph auf einer Node agieren kann müssen wir den folgenden Wert vor Cluster-Erstellung in der ceph.conf hinzufügen.
1 |
osd crush chooseleaf type = 0 |
Dieser Wert bewirkt, dass Ceph zwischen den OSD’s der lokalen Node repliziert und nicht auf remote Nodes.
1