Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
software:ceph-storage-cluster [2018/07/13 20:42]
st
software:ceph-storage-cluster [2018/09/06 13:19] (aktuell)
st [Zabbix-Integration in Luminous]
Zeile 1: Zeile 1:
 ====== ceph storage cluster ====== ====== ceph storage cluster ======
  
-Ceph ist eine in "die Breite"​ skalierende software-basierte Storagelösung. Es können ​Einzeöfestplatten ​in handelsüblichen ​Computer ​zu einem ausfallsicheren Cluster vereint.+Ceph ist eine in "die Breite"​ skalierende software-basierte Storagelösung. Es können ​Einzelfestplatten ​in handelsüblichen ​Computern ​zu einem ausfallsicheren Cluster vereint ​werden. 
 +Alle folgenden Zugriffsmethoden werden intern auf Objekte abgebildet.
  
 +  * **librados**:​ Direktzugriff für Anwendungen,​ Binding for div. Sprachen.
 +  * **RadosGW**:​ bucket-basiertes REST-Gateway,​ S3 und Swift-kompatibel. Die [[http://​docs.ceph.com/​docs/​giant/​radosgw/​s3/​|meisten Amazon S3 features werden unterstützt]] -> [[http://​docs.ceph.com/​docs/​master/​radosgw/​s3/​|unterstützte S3 Operationen]],​ die fehlende S3 Bucket Notification lässt sich mit ggf. mit [[https://​github.com/​spreadshirt/​s3gw-haproxy|s3gw-haproxy]] nachrüsten
 +  * **RDB**: "​verteiltes"​ Blockgerät (Linux-Kernelmodul ab 2.6.39 möglich und/oder Quemu/​KVM-Treiber) zum Exklusivmount von Clients, oder mit extra Aufwand (NFS, Clusterfähiges FS, iSCSI bei nicht *nix-Betriebssystemen wie Windows oder Vmware) multi-userfähig
 +  * **Ceph FS**: Posix-kompatibles Dateisystem (FUSE) für Multisystemzugriff,​ langsamer bei FUSE
 +
 +
 +Mit [[http://​www.sebastien-han.fr/​blog/​2018/​08/​31/​mountpoint-presentation-of-Ceph-Nano/​|Ceph Nano]] existiert eine auf [[server:​Docker]] basierende und einzeln läuffähige Demo-Instanz von Ceph.
  
 ===== Links ===== ===== Links =====
Zeile 41: Zeile 49:
     * **Ceph Metadata Server (MDS)**     * **Ceph Metadata Server (MDS)**
     * **manager daemon mgr** (ceph luminous+ builds >= v12.x)     * **manager daemon mgr** (ceph luminous+ builds >= v12.x)
- 
-===== Zugriffsmethoden ===== 
- 
-  * librados: Direktzugriff für Anwendungen,​ Binding for div. Sprachen. 
-  * RadosGW: bucket-basiertes REST-Gateway,​ S3 und Swift-kompatibel -> [[http://​docs.ceph.com/​docs/​master/​radosgw/​s3/​|unterstützte S3 Operationen]],​ die fehlende S3 Bucket Notification lässt sich mit ggf. mit [[https://​github.com/​spreadshirt/​s3gw-haproxy|s3gw-haproxy]] nachrüsten 
-  * RDB: "​verteiltes"​ Blockgerät (Linux-Kernelmodul ab 2.6.39 möglich und/oder Quemu/​KVM-Treiber) zum Exklusivmount von Clients, oder mit extra Aufwand (NFS, Clusterfähiges FS, iSCSI bei nicht *nix-Betriebssystemen wie Windows oder Vmware) multi-userfähig 
-  * Ceph FS: Posix-kompatibles Dateisystem (FUSE) für Multisystemzugriff,​ langsamer bei FUSE 
  
  
Zeile 68: Zeile 69:
 osd scrub end hour = 8 osd scrub end hour = 8
 </​file>​ </​file>​
-  * kleine Cluster (wenige Node, wenige Datenträger -> OSDs) sind etwas ungünstig in manchen Szenarien (man landet schneller bei full spezielle ​wenn die Kapazitäten ungleich verteilt sind)+  * kleine Cluster (wenige Node, wenige Datenträger -> OSDs) sind etwas ungünstig in manchen Szenarien (man landet schneller bei "full", ​ besonders ​wenn die Kapazitäten ungleich verteilt sind)
   * es gibt keine asynchrone Replikation (mit Ausnahme von [[http://​docs.ceph.com/​docs/​jewel/​rbd/​rbd-mirroring/​|rbd-mirroring]]),​ d.h. erst die Daten es in der geforderten Replikation in den Journalen angekommen sind, wird die I/O-Aktion erfolgreich   * es gibt keine asynchrone Replikation (mit Ausnahme von [[http://​docs.ceph.com/​docs/​jewel/​rbd/​rbd-mirroring/​|rbd-mirroring]]),​ d.h. erst die Daten es in der geforderten Replikation in den Journalen angekommen sind, wird die I/O-Aktion erfolgreich
   * über CRUSH-Rule kann die geforderte örtliche Verteilung (Datenzentren,​ Brandabschnitte) eingestellt werden, dazu müssen die Verbindung performant genug sein   * über CRUSH-Rule kann die geforderte örtliche Verteilung (Datenzentren,​ Brandabschnitte) eingestellt werden, dazu müssen die Verbindung performant genug sein
Zeile 125: Zeile 126:
 **Ausschalten**:​ **Ausschalten**:​
 <code bash>​ceph osd unset noout</​code>​ <code bash>​ceph osd unset noout</​code>​
 +
 +==== Dienste verwalten ====
 +
 +[[http://​docs.ceph.com/​docs/​master/​rados/​operations/​operating/​|Operating a Cluster - Running Ceph with systemd]]
 +
 +<code bash>
 +sudo systemctl start ceph.target
 +
 +# nach Typ:
 +sudo systemctl restart ceph-osd.target
 +sudo systemctl restart ceph-mon.target
 +sudo systemctl restart ceph-mds.target
 +</​code>​
  
 ==== scrubbing temporär deaktivieren ==== ==== scrubbing temporär deaktivieren ====
Zeile 161: Zeile 175:
   * iostat -x <list of /​dev/​disks>​ 1   * iostat -x <list of /​dev/​disks>​ 1
  
 +==== ceph exporter ====
  
 +[[https://​github.com/​digitalocean/​ceph_exporter|ceph exporter]] exportiert Metriken z.B. nach Prometheus.
 ==== Zabbix-Integration in Luminous ==== ==== Zabbix-Integration in Luminous ====
  
 https://​ceph.com/​community/​new-luminous-zabbix/​ https://​ceph.com/​community/​new-luminous-zabbix/​
 [[https://​www.openattic.org/​posts/​ceph-manager-dashboard-v2/​|Ceph Manager Dashboard v2]] [[https://​www.openattic.org/​posts/​ceph-manager-dashboard-v2/​|Ceph Manager Dashboard v2]]
 +
 +Konfiguration (gilt global und wird vom MGR ausgeführt):​
 +
 +<​code>​
 +ceph mgr module enable zabbix
 +# statt 60s alle 10s Daten senden:
 +ceph zabbix config-set interval 10
 +ceph zabbix config-set identifier HOSTNAME-VON-CEPH-IN-ZABBIX
 +ceph zabbix config-set zabbix_host IP-ODER-FQDN-VOM-ZABBIX-SERVER
 +</​code>​
 +
 +Testen: <code bash>​ceph zabbix send</​code>​
 +Logs: <code bash>​grep -i zabbix /​var/​log/​ceph/​ceph-mgr.ceph1.log</​code>​
 +
 +==== Nagios/​Icinga ====
 +
 +[[http://​crapworks.de/​post/​ceph-monitoring/​|Blogpost mit Überlegungen zum ceph-Monitoring und Vorstellung der eigenen Tools]]:
 +  * [[https://​github.com/​Crapworks/​ceph-dash|ceph-dash - a free ceph dashboard / monitoring api]]
 +  * [[https://​github.com/​Crapworks/​check_ceph_dash|]]
 +
 +[[https://​github.com/​ceph/​ceph-nagios-plugins|Nagios plugins for Ceph - A collection of nagios plugins to monitor a Ceph cluster.]]
 +
 +[[https://​github.com/​khrpcek/​check_ceph|check_ceph.py]]
  
  
Zeile 172: Zeile 210:
  
 ==== object-backup ==== ==== object-backup ====
 +
 +**Methode 1: rados cppool** (readonly-Zugriff für Client notwendig):
 +
 +<code bash>
 +rados cppool $pool $pool.new
 +ceph osd pool rename $pool $pool.old
 +ceph osd pool rename $pool.new $pool
 +</​code>​
 +
 +**Methode 2: Rados Export/​Import**
 +
 +<code bash>​rados export --create testpool tmp_dir</​code>​
 +<code bash>​rados import tmp_dir newpool</​code>​
 +
 +<code bash>
 +# Stop All IO
 +# And redo a sync of modified objects
 +rados export --workers 5 testpool tmp_dir
 +rados import --workers 5 tmp_dir newpool
 +</​code>​
 +
 +**Methode 3: [[https://​ceph.com/​geen-categorie/​ceph-pool-migration/​|Cache Tier drüberlegen und Objekte in neuen pool migrieren]]**
  
 ==== export/​import rados images ==== ==== export/​import rados images ====
Zeile 187: Zeile 247:
   * rbd Snapshots: http://​docs.ceph.com/​docs/​luminous/​rbd/​rbd-snapshot/​   * rbd Snapshots: http://​docs.ceph.com/​docs/​luminous/​rbd/​rbd-snapshot/​
   * fsfreeze   * fsfreeze
-  * bareos 15.2 hat einen "​prototype of a CEPHFS storage backend"​ ( https://​github.com/​bareos/​bareos/​blob/​bareos-15.2/​README.md )+
  
 ===== Installation ===== ===== Installation =====
Zeile 194: Zeile 254:
  
   * Ceph Client → public network   * Ceph Client → public network
-  * public network (eigene Netzwerkkarte empfohlen):+  ​* **public network** (eigene Netzwerkkarte empfohlen):
 Description:​ The IP address and netmask of the public (front-side) network (e.g., 192.168.0.0/​24). Set in . You may specify comma-delimited subnets. Description:​ The IP address and netmask of the public (front-side) network (e.g., 192.168.0.0/​24). Set in . You may specify comma-delimited subnets.
 <​file>​[global] <​file>​[global]
 public network = ip-address}/​{netmask} [, {ip-address}/​{netmask}] public network = ip-address}/​{netmask} [, {ip-address}/​{netmask}]
 </​file>​ </​file>​
-  ​* Monitors: 6789 TCP +    ​* Monitors: 6789 TCP 
-  * OSDs Kummunikation:​ range 6800:7300 TCP +    * OSDs Kummunikation:​ range 6800:7300 TCP 
-  * cluster netzwerk (eigene Netzwerkkarte empfohlen; sollte nicht vom public network oder Internet erreichbar sein)<​file>​[global]+  ​* **cluster netzwerk** (eigene Netzwerkkarte empfohlen; sollte nicht vom public network oder Internet erreichbar sein)<​file>​[global]
 cluster network = ip-address}/​{netmask} [, {ip-address}/​{netmask}] cluster network = ip-address}/​{netmask} [, {ip-address}/​{netmask}]
 </​file>​ </​file>​
Zeile 271: Zeile 331:
  
  
-==== Erste Installation auf dem admin-Rechner: ​==== +==== Ceph Installation auf admin-Rechnern und Nodes ====
  
 +[[http://​docs.ceph.com/​docs/​master/​install/​get-packages/​|Ceph packages]]
  
 <code bash>​wget -q -O- '​https://​download.ceph.com/​keys/​release.asc'​ | sudo apt-key add -</​code> ​ <code bash>​wget -q -O- '​https://​download.ceph.com/​keys/​release.asc'​ | sudo apt-key add -</​code> ​
  
-(debian minimal: ​ce-certificates vorher installieren)+(debianminimal-system: 
 +  * ca-certificates vorher installieren
 +  * <code bash>​sudo apt-get install apt-transport-https</​code>​ sonst "''​method driver /​usr/​lib/​apt/​methods/​https could not be found''"​)
  
 +benötigte Pakete:
   * Debian Jessie+: <code bash>​sudo apt-get install software-properties-common</​code> ​   * Debian Jessie+: <code bash>​sudo apt-get install software-properties-common</​code> ​
   * Debian Wheezy und vorher: <code bash>​sudo apt-get install python-software-properties</​code> ​   * Debian Wheezy und vorher: <code bash>​sudo apt-get install python-software-properties</​code> ​
- 
- 
-(debian minimal: <code bash>​sudo apt-get install apt-transport-https</​code>​ sonst "''​method driver /​usr/​lib/​apt/​methods/​https could not be found''"​) 
- 
   * Debian stretch: <code bash>​sudo apt-add-repository 'deb https://​download.ceph.com/​debian-luminous/​ stretch main'</​code>​   * Debian stretch: <code bash>​sudo apt-add-repository 'deb https://​download.ceph.com/​debian-luminous/​ stretch main'</​code>​
-  * Ubuntu 16.04: <code bash>​sudo apt-add-repository 'deb https://​download.ceph.com/​debian-luminous/​ xenial main'</​code>​ +  * Ubuntu 16.04: <code bash>​sudo apt-add-repository 'deb https://​download.ceph.com/​debian-luminous/​ xenial main'</​code>​ Das resultiert auf xenial in: <​file>​
- +
-Das resultiert auf xenial in: +
-<​file>​+
 deb http://​security.ubuntu.com/​ubuntu xenial-security main restricted deb http://​security.ubuntu.com/​ubuntu xenial-security main restricted
 # deb-src http://​security.ubuntu.com/​ubuntu xenial-security main restricted # deb-src http://​security.ubuntu.com/​ubuntu xenial-security main restricted
Zeile 298: Zeile 354:
 deb https://​download.ceph.com/​debian-luminous/​ xenial main deb https://​download.ceph.com/​debian-luminous/​ xenial main
 # deb-src https://​download.ceph.com/​debian-luminous/​ xenial main # deb-src https://​download.ceph.com/​debian-luminous/​ xenial main
 +</​file>​
 +  * Ubuntu 18.04: <code bash>​sudo apt-add-repository 'deb https://​download.ceph.com/​debian-luminous/​ bionic main'</​code>​ Das resultiert auf bionic in: <​file>​deb http://​security.ubuntu.com/​ubuntu bionic-security main restricted
 +# deb-src http://​security.ubuntu.com/​ubuntu bionic-security main restricted
 +deb http://​security.ubuntu.com/​ubuntu bionic-security universe
 +# deb-src http://​security.ubuntu.com/​ubuntu bionic-security universe
 +deb http://​security.ubuntu.com/​ubuntu bionic-security multiverse
 +# deb-src http://​security.ubuntu.com/​ubuntu bionic-security multiverse
 +deb http://​archive.canonical.com/​ bionic partner
 +# deb-src http://​archive.canonical.com/​ bionic partner
 +deb https://​download.ceph.com/​debian-luminous/​ bionic main
 +# deb-src https://​download.ceph.com/​debian-luminous/​ bionic main
 </​file>​ </​file>​
  
Zeile 310: Zeile 377:
   * Debian stretch: wget -q https://​download.ceph.com/​debian-luminous/​pool/​main/​c/​ceph/​ceph_12.2.2-1strech_amd64.deb   * Debian stretch: wget -q https://​download.ceph.com/​debian-luminous/​pool/​main/​c/​ceph/​ceph_12.2.2-1strech_amd64.deb
  
 +**ceph installieren**:​ <code bash>​sudo apt install ceph</​code>​
  
-==== Cluster erstellen ====+==== Cluster erstellen ​(Admin-Rechner) ​====
  
 ceph-deploy installieren:​ <code bash>​sudo apt install ceph-deploy</​code>​ ceph-deploy installieren:​ <code bash>​sudo apt install ceph-deploy</​code>​
Zeile 318: Zeile 386:
 === Projektdirectory anlegen === === Projektdirectory anlegen ===
  
 +<code bash>
 mkdir ceph-cluster1 mkdir ceph-cluster1
 cd ceph-cluster1 cd ceph-cluster1
 +</​code>​
  
 <code bash>​ssh-keygen -f ./sshkey -b 3072</​code>​ <code bash>​ssh-keygen -f ./sshkey -b 3072</​code>​
Zeile 368: Zeile 437:
  
 :!: auf jedem node muss mindestens ein Blockdevice frei sein. Das sollten einfache/​unabhängige Festplatten sein (kein remote-storage oder raid!) :!: auf jedem node muss mindestens ein Blockdevice frei sein. Das sollten einfache/​unabhängige Festplatten sein (kein remote-storage oder raid!)
-Zusätzlich ​sollte pro Node ein Gerät (SSD) für die journale der OSDs partitioniert werden, ​daher hier die Daten zuerst ​landen.+Wenn kein bluestore benutzt wird dann sollte ​zusätzlich ​pro Node ein Gerät (SSD) für die journale der OSDs partitioniert werden, ​da dort die Daten zuerst ​geschrieben werden.
  
-== Test mit loop-devices ==+== Variante 1: Test mit loop-devices ==
  
 Besonderheit:​ überleben den reboot nicht, hier kein journal (daher NICHT für produktiv-Cluster benutzen, eher für einen ersten Test in vServern). Besonderheit:​ überleben den reboot nicht, hier kein journal (daher NICHT für produktiv-Cluster benutzen, eher für einen ersten Test in vServern).
Zeile 381: Zeile 450:
 <code bash>​ceph-deploy osd create node1:loop0 node2:loop0 node3:​loop0</​code>​ <code bash>​ceph-deploy osd create node1:loop0 node2:loop0 node3:​loop0</​code>​
  
-== filestore ==+== Variante 2: filestore ==
  
 Reale devices per /​dev/​by-uuid oder lvm volumes (empfohlen) einbinden, siehe auch: http://​docs.ceph.com/​docs/​master/​ceph-volume/#​migrating . Reale devices per /​dev/​by-uuid oder lvm volumes (empfohlen) einbinden, siehe auch: http://​docs.ceph.com/​docs/​master/​ceph-volume/#​migrating .
Zeile 404: Zeile 473:
 <code bash>​ceph-deploy osd create node1:​vg_OSDs/​lv_OSD_A:​vg_journal/​lv_journal_A</​code>​ <code bash>​ceph-deploy osd create node1:​vg_OSDs/​lv_OSD_A:​vg_journal/​lv_journal_A</​code>​
  
-== bluestore ==+== Variante 3: bluestore ==
  
 bluestore ist ab luminous möglich und empfohlen: bluestore ist ab luminous möglich und empfohlen:
Zeile 424: Zeile 493:
 </​file>​ </​file>​
  
-<code bash>​ceph-volume lvm create --bluestore --data /​dev/​sdd1</​code>​+ 
 +<code bash>​ceph-deploy osd create --data /dev/sdd1 node1</​code>​ 
 + 
 + 
 +manuell auf Host: <code bash>​ceph-volume lvm create --bluestore --data /​dev/​sdd1</​code>​
  
  
Zeile 616: Zeile 689:
  
 **resize**: **resize**:
-  * mehr: <code bash>rbd resize --size 3072 pool1/​image1</​code>​ +  * mehr (3072 MB): <code bash>rbd resize --size 3072 pool1/​image1</​code>​ 
-  * weniger: <code bash>rbd resize --size ​2048 pool1/​image1 --allow-shrink</​code>​+  * weniger ​(1024 MB): <code bash>rbd resize --size ​1024 pool1/​image1 --allow-shrink</​code>​
 **löschen**:​ **löschen**:​
   * sofort: <code bash>rbd rm pool1/​image1</​code>​   * sofort: <code bash>rbd rm pool1/​image1</​code>​
Zeile 671: Zeile 744:
  
 Möglicherweise müssen features abgeschaltet werden, die der Client nicht unterstützt:​ Möglicherweise müssen features abgeschaltet werden, die der Client nicht unterstützt:​
-<​file>​rbd: ​<code bash>image share: image uses unsupported features: 0x38</​file>​+<​file>​rbd:​ image share: image uses unsupported features: 0x38</​file>​
  
 (hier deep-flatten/​layering,​ siehe rbd info): <code bash>rbd feature disable pool1/rbd1 deep-flatten</​code>​ (hier deep-flatten/​layering,​ siehe rbd info): <code bash>rbd feature disable pool1/rbd1 deep-flatten</​code>​
Zeile 763: Zeile 836:
  
 <code bash>​fusermount -u /​media/​rdb</​code>​ <code bash>​fusermount -u /​media/​rdb</​code>​
 +
 +
 +===== Sicherheitskonzept =====
 +
 +Aktuell ist ceph nicht für den Betrieb im "​freien"​ Internet geeignet, es müssen Maßnahmen getroffen werden um ceph abzusichern:​
 +
 +<​file>​
 +At the moment, none of the Ceph authentication protocols provide secrecy for messages in transit. Thus, an eavesdropper on the wire can hear and understand all data sent between clients and servers in Ceph, even if it cannot create or alter them. Further, Ceph does not include options to encrypt user data in the object store. Users can hand-encrypt and store their own data in the Ceph object store, of course, but Ceph provides no features to perform object encryption itself. Those storing sensitive data in Ceph should consider encrypting their data before providing it to the Ceph system.</​file>​
 +Quelle: http://​docs.ceph.com/​docs/​mimic/​rados/​operations/​user-management/​
 +
 +auth_cluster_required = cephx
 +auth_service_required = cephx
 +auth_client_required = cephx
 +
 +
 +Darüber hinaus können wenigstens [[http://​docs.ceph.com/​docs/​luminous/​rados/​configuration/​auth-config-ref/#​signatures|Signaturen]] aktiviert werden:
 +<​file>​
 +# http://​docs.ceph.com/​docs/​luminous/​rados/​configuration/​auth-config-ref/#​signatures
 +cephx require signatures = true
 + # -> this needs: Kernel 3.19 AND ceph Version at least v0.54 (Argonaut is too old)
 +cephx cluster require signatures = true
 +cephx service require signatures = true
 +</​file>​
 +==== Client Rechte beschränken ====
 +
 +
 +
 +
 +=== server seite ===
 +
 +Client "​CLIENT1"​ anlegen und Rechte vergeben:
 +<code bash>​ceph auth get-or-create client.CLIENT1 mds 'allow r' mon 'allow r' osd 'allow rw pool=TESTPOOL'</​code>​
 +(ob mds 'allow r' nötig ist muss ich noch testen)
 +
 +Beispiel für eine sichere RDB-ACL (Quelle: http://​tracker.ceph.com/​issues/​9733):​
 +<code bash>​ceph auth caps client.CLIENT1 mon 'allow r' osd 'allow x pool=TESTPOOL object_prefix rbd_children,​ allow rwx pool=TESTPOOL object_prefix rbd_header.,​ allow rwx pool=TESTPOOL object_prefix rbd_id., allow rw pool=TESTPOOL object_prefix rbd_data.'</​code>​
 +
 +=== client seite ===
 +
 +Erstens ceph installiert sein und eine config vorhanden sein ''/​etc/​ceph/​ceph.conf'':​
 +<​file> ​
 +[global]
 +fsid = f8ebdabe-2170-2562-97f2-85bb62efcbfd
 +mon_host = node1, node2, node3
 +auth_cluster_required = cephx
 +auth_service_required = cephx
 +auth_client_required = cephx
 +</​file>​
 +Dann muss ein keyring für den Zugriff angelegt worden sein: 
 +<code bash>​ceph auth print-key client.CLIENT1 > /​etc/​ceph/​client.CLIENT1.keyring</​code>​
 +
 +**Client ​ Connect** (hier mit RBD):
 +
 +<code bash>rbd map TESTPOOL/​image1 --id CLIENT1 --keyfile /​etc/​ceph/​client.CLIENT1.keyring</​code>​
 +
 +<​nowiki>​--</​nowiki>​id ​ und <​nowiki>​--</​nowiki>​keyfile können auch in eine Umgebungsvariable CEPH_ARGS exportiert werden:
 +
 +<code bash>
 +CEPH_ARGS="​--id CLIENT1 --keyfile /​etc/​ceph/​client.CLIENT1.keyring"​
 +export CEPH_ARGS
 +echo $CEPH_ARGS
 +</​code>​
 +
 +=== Rechte verändern ===
 +
 +Rechte müssen (absolut) neu gesetzt werden:
 +<code bash>​ceph auth caps client.CLIENT1 mds 'allow r' mon 'allow r' osd 'allow rw pool=TESTPOOL'</​code>​
 +Bei Erfolg Meldung "​updated caps for client.CLIENT1"​.