pixel
Seite wählen

NETWAYS Blog

Hochverfügbarkeit bei Datenbanken, wofür ist das gut?

Hallo, ich bin Valeria, Junior-Developerin bei NETWAYS und habe mich lange damit beschäftigt, über welches Thema ich in meinem nächsten Blogpost schreiben soll. Vor Kurzem habe ich an einer MySQL-Schulung von NETWAYS teilgenommen und mich anschließend mit dem Thema der Hochverfügbarkeit bei Datenbanken in einem Projekt auseinandergesetzt. Da ich das Thema sehr interessant fand, möchte ich nun mein Wissen gerne mit Euch teilen.

  • Was bedeutet Hochverfügbarkeit?
  • Warum ist es so wichtig, Daten permanent abrufen zu können?
  • Wie kann man Hochverfügbarkeit gewährleisten?
  • Welche Varianten gibt es?
  • Fazit

 

Was bedeutet Hochverfügbarkeit?

In einer Welt, in der Daten für Unternehmen immer wichtiger werden, ist es entscheidend, dass diese Daten immer verfügbar sind. Abhilfe schafft hier Hochverfügbarkeit oder auch HADR (High Availability and Disaster Recovery). Datenbanken sind demnach so eingerichtet, dass sie selbst bei einem Ausfall eines Servers oder einer anderen kritischen Komponente, unabhängig von äußeren Einflüssen wie Hardwareausfällen, Netzwerkausfällen oder Stromausfällen, weiterhin verfügbar sind.

 

Warum ist es so wichtig, Daten permanent abrufen zu können?

Es gibt einige Bereiche, in denen Hochverfügbarkeit von Daten nicht mehr wegzudenken ist. Stell Dir vor, Du betreibst eine große E-Commerce-Plattform, welche für ein paar Stunden nicht abrufbar ist. Was passiert?

Der fehlende Zugriff auf Unternehmensdaten kann einen massiven Umsatzverlust bedeuten. Wenn ein Kunde nicht auf seine Kundendaten zugreifen kann, kann er keine Bestellungen aufgeben, wodurch potenzielle Einnahmen verloren gehen.

Dies führt in der Regel auch zu einer sinkenden Kundenzufriedenheit und/oder möglicherweise sogar zu Kundenverlusten. Wenn ein Unternehmen nicht in der Lage ist, seinen Kunden einen effektiven und reibungslosen Service zu bieten, wird er es schwer haben, neue Kunden zu gewinnen.

Wenn ein Kunde die Webseite nicht aufrufen kann, wird er sich mit großer Wahrscheinlichkeit auf die Suche nach einer anderen Webseite machen, was die Chance diesen Kunden zu gewinnen zunichte macht.

In diesem Beispiel ging es „nur“ um Verluste, die mit einer Minderung des Umsatzes einhergehen. Doch wie sieht es in anderen Bereichen aus?

Wenn Datenbanken im Bereich autonomer Fahrzeuge ausfallen, kann dies schwerwiegende Konsequenzen haben. Zum Beispiel kann es dazu führen, dass die autonomen Fahrzeuge nicht mehr in der Lage sind, ihre Umgebung korrekt wahrzunehmen und somit Unfälle oder andere sicherheitsrelevante Vorfälle verursachen.

Auch könnten wichtige Informationen wie Verkehrsdaten, Wetterinformationen oder Straßenbedingungen nicht mehr verfügbar sein, was die Sicherheit und Zuverlässigkeit der autonomen Fahrzeuge beeinträchtigen würde. Zudem könnten Service- und Wartungsprozesse beeinträchtigt werden, was zu Verzögerungen oder Ausfällen führen könnte.

Auch im Gesundheitswesen, Flugverkehr, Energieversorgung, Finanzdienstleistungen, Sicherheitsbehörden ect. spielt Hochverfügbarkeit eine große Rolle.

 

Wie kann man Hochverfügbarkeit gewährleisten?

  1. Vermeidung eines Single Point of Failure (SPoF). Dies beschreibt eine Komponente in einem System, bei deren Ausfall das gesamte System ausfallen würde. Ein Beispiel hierfür wäre ein Server, auf dem eine Anwendung läuft. Wenn dieser Server ausfällt, ist die Anwendung nicht mehr verfügbar.
  2. Redundanz integrieren. Dadurch wird sichergestellt, dass eine Backup-Komponente einspringen kann, falls eine Komponente ausfällt. Es ist dabei wichtig, dass ein zuverlässiges Crossover oder Failover gewährleistet ist, um einen Wechsel von der ausgefallenen Komponente zur Backup-Komponente ohne Datenverlust oder Leistungseinbußen zu ermöglichen.
  3. Monitoring. Um die Erkennbarkeit von Ausfällen zu gewährleisten, sollten Systeme über Mechanismen verfügen, um Fehler automatisch zu erkennen und zu beheben. Es sollten auch eingebaute Mechanismen zur Vermeidung von Fehlern mit gemeinsamer Ursache vorhanden sein, bei denen mehrere Komponenten gleichzeitig ausfallen können. Dadurch kann sichergestellt werden, dass Ausfälle schnell erkannt und behoben werden können, um eine schnelle Wiederherstellung des Systems zu gewährleisten.

 

Welche Varianten für Hochverfügbarkeitslösungen bei Datenbanken gibt es?

Ein häufig verwendetes Konzept ist die Verwendung von Redundanz und Replikation. Dabei werden die Daten auf mehreren Servern repliziert. Im Falle eines Serverausfalls kann ein anderer Server sofort einspringen und die Daten bereitstellen.

Es gibt zwei Arten von Replikationen: Master-Slave- und Multi-Master-Replikationen.

Bei einer Master-Slave-Replikation wird der Master-Server als Hauptserver betrachtet welcher alle Zugriffsverhältnisse beherrscht. Der Slave-Server stellt nur Lese-Zugriff zur Verfügung. Das bedeutet, dass die Suchlast auf den Slave-Servern verteilt werden kann.

Kommt es jedoch zu einem Ausfall des Master-Servers, kann dies zu einer Unterbrechung des Schreibzugriffs führen, da kein Knoten als neuer Masterknoten fungieren kann, bis der ursprüngliche Masterknoten wieder verfügbar ist. Infolgedessen ist der Masterknoten ein Single Point of Failure, der das gesamte System beeinträchtigen kann.

Bei einer Master-Slave-Kombination sollte insbesondere sichergestellt werden, das der Master-Server die indizierende Datenmenge auch bewältigen kann. Wenn große Datenmengen zu indizieren sind, empfiehlt es sich dann die Indizes aufzuteilen und mehrere Master-Server einzusetzen.

Bei einer Multi-Master-Replikation sind alle Server gleichwertig und replizieren Daten untereinander. Wenn ein Server ausfällt, übernehmen die verbleibenden Server seine Aufgaben. Doch hier wird es kniffelig. Wenn alle Server gleiches Stimmrecht haben, was passiert wenn mehrere Server an der selben Datei zeitgleich eine Änderung vornehmen?

Es kann zu einem „Split-Brain“ kommen. Jeder Knoten glaubt, dass er der Hauptknoten ist, was zu Inkonsistenzen und Datenverlust führen kann. Diese müssen manuell aufgelöst werden, bevor die Änderungen an alle Knoten weitergeleitet werden und sich der Cluster abschaltet.

Um dies zu vermeiden wird immer eine ungerade Anzahl an Knoten empfohlen, damit ein Quorum (eine Mehrheit der verfügbaren Knoten) bestimmt werden kann. Wenn beispielsweise ein Cluster aus fünf Knoten besteht, würde das Quorum aus mindestens drei Knoten bestehen. Wenn das Quorum unterschritten wird, kann es zu einem Ausfall des Clusters kommen.

Ein Quorum stellt somit sicher, dass immer eine ausreichende Anzahl von Knoten verfügbar ist, um eine Abstimmung über Datenänderungen durchzuführen.

Zudem sind Multi-Master-Systeme in der Regel etwas komplexer als Master-Slave-Systeme und erfordern mehr Konfiguration und Wartung, was zu höheren Betriebskosten führen kann.

Welche der Varianten genutzt wird, hängt letztendlich von den spezifischen Anforderungen und Bedürfnissen des Datenbanksystems ab. Wenn die Anwendung eine hohe Schreiblast aufweist und eine hohe Verfügbarkeit erfordert, kann eine Multi-Master-Replikation bevorzugt werden, da sie eine effiziente Lastverteilung und eine schnelle Wiederherstellung nach einem Ausfall ermöglicht. Wenn jedoch die Schreiblast nicht so hoch ist und die Konsistenz der Daten wichtiger ist als die Verfügbarkeit, kann eine Master-Slave-Replikation bevorzugt werden, da sie eine strengere Konsistenz der Daten gewährleistet.

Fazit:

Die Bedeutung von Hochverfügbarkeit nimmt in der heutigen Zeit immer mehr zu, da die Abhängigkeit von Daten und Systemen in allen Bereichen des Lebens und der Wirtschaft zunimmt. Unternehmen müssen in der Lage sein, ihre Daten und Anwendungen rund um die Uhr zu nutzen, um wettbewerbsfähig zu bleiben und Kundenbedürfnisse zu erfüllen. Dies gilt nicht nur für große Unternehmen, sondern auch für kleine und mittelständische Unternehmen, die auf stabile und verlässliche IT-Infrastrukturen angewiesen sind. Zudem wird die Verfügbarkeit von Daten auch in immer mehr Bereichen des täglichen Lebens wichtiger, beispielsweise im Gesundheitswesen oder in der öffentlichen Verwaltung.

Valeria Thiele
Valeria Thiele
Junior Developer

Valeria unterstützt seit September 2022 das NETWAYS Managed Services Team. Als Auszubildende Fachinformatikerin für Anwendungsentwicklung packt sie stets der Ehrgeiz, etwas zu programmieren. Sie ist aber auch sehr gespannt und neugierig, was sie in ihrer Ausbildung noch alles erwarten wird. In ihrer Freizeit findet man sie nahezu überall: auf dem Bike in den Bergen, am Piano spielend, nächtelang Zocken oder Netflixen, auf Wanderwegen, in Museen interessante Dinge entdecken oder auf dem Wasser im Kajak. Sie ist einfach immer wieder auf der Suche nach neuen Entdeckungen und Abenteuern, digital wie analog, offline wie auch online.

Kubernetes 101: Aufbau eines K8s-Cluster und die Möglichkeiten der API

This entry is part 2 of 4 in the series Alles rund um Kubernetes

Hi! Ich bin Daniel, Open Source IT Consultant und großer Kubernetes-Fan. In der NETWAYS Blogserie “Alles rund um Kubernetes” nehme ich Dich mit auf eine Reise in die Welt der Container-Orchestrierung. Unter dem Überbegriff “Kubernetes 101” gebe ich dir regelmäßig Tipps, Hilfestellungen und meine Einschätzungen zur Arbeit mit K8s und wie du damit am besten umgehen kannst.
Angefangen bei einer Vorstellung des Tools selbst und der dahinterstehenden Ideologie über die Installation auf unterschiedlichen Betriebssystemen in verschiedensten Umgebungen bis hin zum Betrieb und der Absicherung eines Clusters werde ich auf viele Szenarien und Gesichtspunkte eingehen.

Heute geht es um die Architektur und die API eines Kubernetes Clusters. „Welche Teile des Clusters greifen wie ineinander?“,  „Was sind grundlegende API-Ressourcen, die ich im Alltag brauche?“ Und  „Wie greife ich auf sie zu?“
Und nun viel Spaß bei deinem Einstieg in die Container-Orchestrierung!

 

In meinem ersten Blogpost ging es zuerst einmal darum zu klären, was Kubernetes denn eigentlich ist. Jetzt, wo wir ergründet haben, welche Ansätze und Ideen Kubernetes verfolgt und warum diese sinnvoll sein können, gehen wir einen Schritt weiter, und schauen uns an, wie diese umgesetzt werden. Dafür wollen wir zwei Aspekte betrachten: Zum Einen der Aufbau eines Kubernetes-Clusters selbst, inklusive aller Teilbausteine, die für den reibungslosen Betrieb benötigt werden. Zum Anderen die im letzten Blogpost bereits mehrfach erwähnte API, wir als Schnittstelle nutzen und die uns eine ganze Bandbreite an API-Ressourcen anbietet, mit denen wir auf Kubernetes arbeiten können. Let’s get going!

Aufbau eines Kubernetes-Clusters

Beginnen wir mit einem sog. „Ten-Thousand Foot View„, um uns den groben Aufbau eines Clusters auf Infrastrukturebene vor Augen zu führen:

Überblick eines Clusteraufbaus, bestehend aus Dataplane, Workernodes und Loadbalancer

Wir sehen hier ein Cluster bestehend aus 8 Nodes – drei sog. Leader-Nodes und fünf Follower-Nodes. Die Leader-Nodes bilden zusammen die sog. Controlplane des Clusters und stellen Dienste wie clusterinternes DNS und die Kubernetes-API bereit. Um die API und damit letzten Endes das Cluster hochverfügbar zu machen, wird der Controlplane ein Loadbalancer vorgelagert. In Cloud-Umgebungen ist dies oft per Default die bereitgestellte Lösung des jeweiligen Providers, in eigenen Rechenzentren oder on-premise kann hierfür auf Lösungen wie HAProxy oder MetalLB zurückgegriffen werden. Best Practices diktieren, dass auf den Leader-Nodes möglichst keine Anwendungen deployed werden sollten, die nicht für den Betrieb des Clusters selbst benötigt werden.

Hierfür sind die fünf Follower-Nodes gedacht, die mit der Kubernetes-API ebenfalls via Loadbalancer interagieren und die für den jeweiligen Node gescheduleten Anwendungen ausführen. Auf diesen Nodes können beliebige Anwendungen entsprechend der jeweils verfügbaren Ressourcen deployed werden. Die API in der Controlplane kümmert sich hierbei um ein passendes Scheduling, damit Ressourcen auf den Follower-Nodes nicht erschöpft werden und angegebene Voraussetzungen wie bspw. spezielle benötigte Hardware (GPU, SSD, etc.) auf dem jeweiligen Node erfüllt werden.
Die letzte im Schaubild dargestellte Komponente stellt eine lokale Terminalsession auf Seiten eines Endnutzers dar. Dieser kommuniziert via kubectl mit der Softwareschnittstelle, dem de-facto Standardtool für Interaktion mit der API von außerhalb des Clusters.

Doch welche Komponenten laufen denn nun auf den jeweiligen Node-Klassen? Gehen wir doch einmal etwas weiter ins Detail:

Wir sehen hier exemplarisch jeweils einen Leader und Follower-Node als VMs in der Detailansicht, mit all den Anwendungen, die auf den jeweiligen Node-Klassen typischerweise installiert sind. Gehen wir die verschiedenen Anwendungen doch einmal durch:

  • etcd – Key/Value-Store für den Zustand und die Historie der Kubernetes-API; Wird normalerweise auf den Leader-Nodes installiert, kann allerdings auch auf externe Maschinen ausgelagert werden
  • kube-apiserver – PI-Server des Kubernetes-Clusters; Wird für Hochverfügbarkeit auf allen Leader-Nodes installiert
  • kube-scheduler – Kümmert sich um das Scheduling der in das Cluster deployten Anwendungen; Wird auf Leader-Nodes installiert
  • kube-controller-manager – Ein Bündel an sog. Kubernetes-Controllern, das sich um die Verwaltung verschiedener Kubernetes-Ressourcen kümmert; Wird auf Leader-Nodes installiert
  • kubeletKommuniziert mit der API und der lokalen Container-Runtime, um Container auf den Nodes auszuführen; Wird auf allen Nodes installiert
  • kube-proxyRoutet Netzwerk-Traffic zu Containern, sobald dieser auf den jeweiligen Nodes ankommt; Wird auf allen Nodes installiert
  • Container Runtime – Im Beispiel containerd; andere Implementierungen sind möglich, bspw. CRI-o; Wird auf allen Nodes installiert

Zu erwähnen ist, dass nicht alle Cluster so aussehen müssen. Beispielsweise ließe sich auch eine Controlplane umsetzen, auf der keinerlei Container ausgeführt werden – in diesem Fall könnte man auf die Installation von kubelet, kube-proxy und containerd auf Leader-Nodes verzichten (für eine Referenzinstallation s. Kubernetes the Hard Way auf GitHub). Auf Clustern in der Cloud wird man außerdem fast immer einen sog. cloud-controller-manager auf Leader-Nodes finden, der gewisse Funktionalitäten im Cloud-Bereich integriert, bspw. automatische Provisionierung benötigter Loadbalancer in der hostenden Cloud.

Auch können sich die genauen Ausprägungen einer Kubernetes-Installation je nach Kubernetes-Distribution unterscheiden – momentan listet die CNCF 59 zertifizierte Distributionen. K3s bspw. bündelt die verschiedenen Komponenten in eine Binary, was den Betrieb im Alltag etwas erleichtern kann und den Ressourcen-Fußabdruck des Clusters senkt.

Die Kubernetes‘ API – endlose Weiten

Haben wir unser Cluster nun wie oben skizziert (oder ganz anders) installiert, möchten wir natürlich mit ihm interagieren – hierfür gibt es verschiedene Möglichkeiten, angefangen bei cURL über das offizielle Kubernetes Dashboard bis zu Wrappern für das lokale Terminal. Letzteres ist der gängigste Weg – fast alle Tutorials und technische Dokumentationen zu Kubernetes und darauf zu installierende Anwendungen erwähnen kubectl, was sich auf jedem gängigen Betriebssystem paketiert installieren lassen sollte. Haben wir kubectl lokal installiert und eingerichtet (wir benötigen eine sog. kubeconfig, die Verbindungsinformationen für unser(e) Cluster enthält), können wir uns zum ersten Mal die API anschauen:

beispielhafter Aufruf von kubectl api-resources mit wordcount nach Zeilen: 70

Je nach Cluster (im Beispiel ein Rancher Desktop Cluster) scheint uns Kubernetes zwischen 60 und 70 verschiedene API-Objekte anzubieten! Wo also anfangen und wo aufhören? Oder gleich alle 70 behandeln? Fangen wir doch einfach mit der kleinsten Einheit an Workload an, die K8s für uns bereit hält – dem Pod. Ein Pod kapselt einen oder mehrere Container in einem Bündel, das sich Netzwerk- und Speicherressourcen teilt.

Daraus folgt, dass alle Container eines Pods immer auf demselben Node gescheduled werden. Ein Pod alleine profitiert allerdings noch nicht von Kubernetes‘ Orchestrierungsmöglichkeiten – ist bspw. der hostende Node nicht erreichbar, können wir auch die in unserem Pod laufenden Anwendungen nicht mehr erreichen.

Wir benötigen also eine weitere Abstraktionsebene, die es uns erlaubt, mehrere identische Pods auf verschiedene Nodes zu schedulen: das sog. Deployment. Ein Deployment definiert ein Pod-Template, sowie eine Anzahl an gewünschten Repliken und weitere Konfiguration, die von Kubernetes zur Orchestrierung des Deployments genutzt wird. Unter der Haube wird dann vom API-Server ein ReplicaSet erzeugt, das die gerenderte Version des Pod-Templates enthält.

Auf diese Weise ermöglicht eine Deployment-Ressource uns nicht nur die Ausführung mehrerer Repliken eines einzelnen Pods, sondern auch eine Versionierung verschiedener ReplicaSets – wieviele genau von der API gespeichert werden, hängt von den Einstellungen des API-Servers zusammen. Hier nochmal ein Schaubild zu den Zusammenhängen:

Ein Überblick der Zusammenhänge zwischen Deployments, ReplicaSets und Pods in Kubernetes

Zu sehen ist ein Deployment mit drei dazugehörigen ReplicaSets, die sich in der Anzahl der definierten Replicas unterscheiden (Kubernetes erstellt bei jeglicher Änderung eines Deployments ein neues ReplicaSet, nicht nur bei Änderung der Replicas). Das momentan aktive ReplicaSet wiederum verwaltet der Konfiguration entsprechend fünf Pods.

Möchte man seine deployten Anwendungen nun untereinander oder für Endnutzer außerhalb des Clusters verfügbar machen, kommen Services ins Spiel. Ein Service ist eine API-Ressource, die einen gewissen Pool an Pods als Endpoints definiert und für diese als Round-Robin Loadbalancer fungiert. Auf diese Weise benötigt man nur eine IP, um zuverlässig einen funktionalen Pod eines Deployments zu erreichen. Kubernetes kümmert sich hierbei automatisch darum, Traffic nur zu funktionalen Pods weiterzuleiten.
Es gibt drei Arten von Services:

  • ClusterIP – der Service erhält eine innerhalb des Clusters erreichbare IP-Adresse, ist von außerhalb des Clusters aber nicht ohne Weiteres zu erreichen
  • NodePort – der Service wird auf jedem Node auf einem zufälligen, hohen Port (ca. 30.000+) verfügbar gemacht
  • Loadbalancer – eine Erweiterung des NodePort-Typs, wobei den Ports ein Loadbalancer vorgelagert wird; funktioniert am reibungslosesten in Public Clouds

Zusätzlich gibt es die Möglichkeit, HTTP-Traffic anstatt mittels Loadbalancer auf L4 mit einem sog. Ingress auf L7 zu routen – die Konfiguration unterscheidet sich hierbei abhängig vom genutzten IngressController.

Weitere nennenswerte, grundlegende API-Ressourcen innerhalb von Clustern wären bspw. Namespaces zur Trennung von anwendungslogisch zusammenhängenden Deployments etc. sowie zur Umsetzung von role-based access control (RBAC), Secrets zur Bereitstellung vertraulicher Daten wie bspw. Passwörtern, Zertifikaten, oder Token, und ConfigMaps für häufig genutzte Konfigurationssnippets. Wer mitgezählt hat wird merken, dass wir gerade erst bei 7 von den oben angezeigten 70 Ressourcentypen angekommen sind – und das ist noch lange nicht das Ende der Fahnenstange, da eine der Stärken der Kubernetes-API schließlich ihre Erweiterung durch sog. CustomResourceDefinitions (CRDs) ist. Für einen ersten Einblick soll der momentane Stand trotzdem fürs Erste genügen.

kubectl – das Schweizer Taschenmesser für Kubernetes

Bereits im letzten Absatz eingangs erwähnt, ist jetzt der Moment für kubectl gekommen, das offizielle Kommandozeilentool für den täglichen Umgang mit Kubernetes und seiner API. Ich könnte an dieser Stelle mehrere 1000 Wörter über den Gebrauch schreiben und trotzdem noch sehr viel unerwähnt lassen, und genau aus diesem Grund folgt nun gemäß dem Motto „Ein Bild sagt mehr als tausend Worte“ lediglich eine Auflistung einiger gängiger und oft genutzter kubectl Kommandos, um einen ersten Eindruck von der Nutzung des Tools zu bekommen.

Screenshot eines Terminals mit mehreren Ausgaben von kubectl

Hier zu sehen sind einige der häufigsten Kommandos, zu denen neben get und create wohl auch noch apply, logs und describe gehören dürften. Neben dem expliziten (imperativen) Erstellen von API-Ressourcen via CLI können mit kubectl auch bestehende Kubernetes-Manifeste (in YAML oder JSON) in das Cluster „gepusht“ werden, was einem deklarativen Ansatz entspricht und in der Praxis der gängigere Weg ist.

Für heute war das aber genug trockene Theorie rund um Architektur, API-Aufbau und Clusterkomponenten – im nächsten Teil der Serie werden wir uns genauer anschauen, wie wir uns denn nun basierend auf der in diesem Artikel erläuterten Architektur unser eigenes Cluster installieren können, entweder auf lokaler Infrastruktur, in der Cloud (z.B. Managed Kubernetes bei NMS), oder auf deinem persönlichen Rechner! Abonniere also gerne auch den RSS-Feed unseres Blogs und sei bereit für den nächsten Artikel der Kubernetes 101 Reihe!

Daniel Bodky
Daniel Bodky
Consultant

Daniel kam nach Abschluss seines Studiums im Oktober 2021 zu NETWAYS und berät nun Kunden zu den Themen Icinga2 und Kubernetes. Nebenher schreibt er in seiner Freizeit kleinere Tools für verschiedenste Einsatzgebiete, nimmt öfters mal ein Buch in die Hand oder widmet sich seinem viel zu großen Berg Lego. In der wärmeren Jahreszeit findet man ihn außerdem oft auf dem Fahrrad oder beim Wandern.

Raycast, ein fast neuer und genialer App Launcher

Wenn es um die Effektivität bei der Arbeit am Mac geht, gibt es viele Werkzeuge, die dir helfen können, produktiver zu sein. Eines der Tools, das ich sehr empfehlen kann, ist Raycast – ein Application Launcher für den Mac. Raycast hilft dir, deine Arbeitsabläufe zu beschleunigen und schnell auf häufig verwendete Anwendungen und Aktionen zuzugreifen. Selbst habe ich über viele Jahre Alfred genutzt, der einen ähnlichen Ansatz verfolgt (bzw. andersrum) und mich über viele Jahre treu begleitet hat. Der Grund etwas Neues zu versuchen war weniger Alfred selbst, sondern eher die Verfügbarkeit an gewünschten Erweiterungen, bei Alfred Workflows genannt.

Vor mehr als einem Jahr bin ich auf Raycast gestossen und habe heute final Alfred von meinem Rechner geworfen. Grundsätzlich macht Raycast einfach das, was von einem App-Launcher erwartet wird. Du musst keine Anwendungen mehr manuell suchen – mit Raycast kannst du einfach den Namen der Anwendung eingeben und sie sofort starten. Außerdem ist Raycast intelligent genug, um zu erkennen, welche Anwendungen du am häufigsten verwendest, und schlägt sie dir vor. Ein weiteres Feature ist die Möglichkeit, schnell auf Dateien zuzugreifen. Wenn du häufig mit bestimmten Dateien arbeitest, kannst du sie einfach in Raycast favorisieren und direkt darauf zugreifen, ohne den Finder öffnen zu müssen. Für Alfred gab es für den File-Workflow noch einen extra Keystroke, den ich ich bisher so in Raycast nicht nachstellen konnte, aber vielleicht weiss ja jemand von Euch wie das geht. Auch die History für einzelne Extensions, wie bspw. den Taschenrechner, finde ich sehr nützlich.

Raycast bietet auch eine große Auswahl an Extensions, mit denen du auf Dienste von Drittanbietern zugreifen kannst. Dabei gibt es natürlich die Klassiker wie Google, GitHub oderJIRA, aber eben auch einen unglaublich großen Pool and Community-Erweiterungen. Sei es eine direkte Einbindung deiner GitLab Installation oder auch die Ansteuerung von Home-Assistant-Entitäten. Letzteres ermöglicht dir einfach per Tastendruck die Garage zu öffnen oder ein Licht an und auszuschalten. Garage, Licht und eine entsprechende Einbindung in Home-Assistant sind da natürlich Voraussetzung, aber das ist hoffentlich klar. Seit geraumer Zeit gibt es auch eine Chat-GPT Extension, welche ohne Umwege den Aufruf ermöglich und sich die wiederkehrende Anmeldung auf der Website erspart.

Kurzum möchte ich auf Raycast nicht verzichten und als „Keyboard-Person“ ist es für mich im Moment das Tool der Wahl. Raycast steht via Download auf der Website zur Verfügung oder kann auch einfach mit homebrew installiert werden.

Bernd Erk
Bernd Erk
CEO

Bernd ist Geschäftsführer der NETWAYS Gruppe und verantwortet die Strategie und das Tagesgeschäft. Bei NETWAYS kümmert er sich eigentlich um alles, was andere nicht machen wollen oder können (meistens eher wollen). Darüber hinaus startete er früher das wöchentliche Lexware-Backup, welches er nun endlich automatisiert hat. So investiert er seine ganze Energie in den Rest der Truppe und versucht für kollektives Glück zu sorgen. In seiner Freizeit macht er mit sinnlosen Ideen seine Frau verrückt und verbündet sich dafür mit seinen beiden Söhnen und seiner Tochter.

Unser Weg von Confluence zu BookStack

Wenn ich auf meine bald 15 Jahre bei NETWAYS zurückblicke, haben wir schon das ein oder andere Tool für Dokumentation verschlissen und verwendet. Die Reise ging von TWiki zu Foswiki, nahm eine kleinen Nebenausflug zu Mediawiki und brachte uns vor vielen Jahren letztendlich zu Confluence.

Die Entscheidung für Confluence fußte damals vor allem auf zwei Argumenten. Zum einen waren wir gerade mal 18 Leute und die Lizenzkosten für eine On-Prem-Installation überschaubar, zum anderen hatte Confluence einen sehr stabilen Eindruck gemacht und wir wollten damals von der „Selbstbeschäftigung“ und Plugin-Hölle der anderen Systeme weg, da wir dafür zu viel Zeit verbraten hatten. Kurzum, eigentlich die klassische „Dann kauf ich halt was“-Geschichte. Es wäre auch unfair zu sagen, dass die Entscheidung für Confluence eine schlechte Entscheidung war. Das Tool hat uns viele Jahre treue Dienste geleistet und obwohl schon einige Zeit nicht mehr aktualisiert, lief es bis zum gestrigen Tag ohne größere Zwischenfälle

Warum etwas Neues?

Die Motivation für ein neues Tool hatte sowohl technische als auch fachliche Gründe. Technisch entsprach die zunehmende Cloud-Only-Strategie von Atlassian, deren Systeme sich in Vergangenheit auch nicht besonders mit Ruhm bekleckert haben, nicht unseren Vorstellungen, da wir das als elementar angesehene System im On-Prem haben wollten. Hinzu sind die Lizenzkosten mit knapp 90 Leuten durchaus ein Argument sich mal etwas anderes anzusehen und ggf. damit einhergehende Aufwände die Berechtigung zu verschaffen.

Auf der anderen Seite hatten wir auch fachliche Argumente, welche für einen Neuaufbau des Systems gesprochen haben. Unser in die Jahre gekommenes Confluence hatte dringend mal einen Frühjahrsputz nötig und gleichzeitig wollten wir mit einem Handbuch gleich alle Unternehmensprozesse und Regelungen fit für ein späteres Audit machen. Persönlich favorisierte ich die Idee alles in ein System zu packen, was mir unsere Heads jedoch in der Diskussion ausredeten. Im Nachhinein klar die richtige Entscheidung, da ein Handbuch schlichtweg andere Anforderungen hat als ein Dokumentationssystem. Somit haben wir jetzt zwei Systeme (Handbook & Docs) mit unterschiedlichen Anforderungen. Das Handbook ist die „Gesetzgebung“ unserer Firma und das für alle verbindliche Regelwerk. Die Docs spiegeln die Arbeitsdokumente der einzelnen Abteilungen wieder und unterscheiden sich somit signifikant von unserem Handbook.

Wieso nun BookStack?

Von Confluence kommend waren die Anforderungen gar nicht so klein. LDAP sollte gehen, individualisierter PDF-Export, Berechtigungen für Extern und Intern, Zeichnungen sollen direkt im Wiki möglich sein, eine API um technische Informationen (bspw. Kunden im NWS-Umfeld) automatisch zu erstellen und natürlich eine gute Suche und Top-Performance. Nach etwas Recherche bin ich immer wieder über zwei Systeme gestolpert, Wiki.js und BookStack. Beide Systeme sind Open Source und machten in ersten Tests mit Docker einen guten Eindruck. Wiki.js war das auf den ersten Blick modernere System und in vielen Punkten sehr ähnlich zu Confluence. Wenn ich ehrlich bin, weiß ich nicht mehr genau, welches Hauptargument gegen den Einsatz von Wiki.js gesprochen hat. Gründe dagegen waren jedoch, dass das ein oder andere Feature für Version 3.0 angekündigt war, deren Milestone immer verschoben wurde und bis heute nicht verfügbar ist. Auch die Tatsache, dass es Confluence sehr ähnlich war, schreckte mich final davor zurück.

Das Hauptargument Wiki.js nicht zu nehmen, war jedoch nicht Wiki.js sondern BookStack. Auf BookStack bin ich bei der Recherche immer wieder gestoßen, hatte es jedoch nie ernsthaft in Betracht gezogen. Mir schienen die Features nicht ausreichend für unsere Bedürfnisse und darüber hinaus hielt ich die feste Struktur von BookStack, welches die Idee hat ein virtuelles Bücherregal darzustellen, für unzureichend. Im Nachhinein hat sich gerade diese Struktur als einer der größten Pluspunkte herausgestellt und daher bin ich bis heute froh, dass wir uns für BookStack entschieden haben. Darüber hinaus hat uns der pragmatische und sehr aufgeräumte Ansatz von BookStack und die permanente Weiterentwicklung überzeugt.

Was macht BookStack aus?

Ziel es Blogposts soll es nicht sein, verschiedene Wiki- und Dokumentationslösungen miteinander zu vergleichen (vielleicht kommt das mal zu einem späteren Zeitpunkt, aber derartige Artikel gibt es sowieso wie Sand am mehr), sondern eher was uns dazu motiviert hat, den Weg mit BookStack zu gehen und wie wir es umgesetzt haben.

Wie bereits oben angesprochen, stellt BookStack ein virtuelles Bücherregal zur Verfügung und ordnet seine eigentlichen Dokumente, bei BookStack Pages genannt, in eine feste Struktur. Es gibt Shelves, Books und Pages, das wars. Bei Bedarf können Pages noch in so genannte Chapter gruppiert werden, was jedoch optional ist. Genau da steckt aus meiner Sicht ein großer Vorteil von BookStack. Das System verbietet einfach endlose Seitenhierarchien aufzubauen, in welchen sich nach kurzer Zeit keiner mehr zurechtfindet. Die flache und vorgegebene Struktur zwingt einen bei Erstellung der Dokumente über den richtigen Ort nachzudenken und gibt dem ganzen System eine solide Grundordnung. Wir repräsentieren heute jeden Unternehmensbereich in einem eigenen Shelf und abstrahieren die fachlichen Strukturen dann in darunter liegenden Books. Darüber hinaus liefert die Suche auch sehr gute Ergebnisse und Dokumente sind im Vergleich zu unserem vorherigen System schnell zu finden. Auch alle anderen genannten Anforderungen hat BookStack erfüllt und neben LDAP, Zeichnungen, PDF-Export und API geht eigentlich alles, was wir so brauchen. Der Editor kann sowohl im WYSIWYG- als auch im Markdown-Modus verwendet werden, was den Bedürfnissen unserer Mitarbeiter:innen entsprechend entgegenkommt.

Wie haben wir den Umzug gemacht?

Den Teil des Handbooks haben wir zu 95% neu geschrieben. Zum einen waren viele Regelungen und Informationen nicht einheitlich bzw. überhaupt nicht vorhanden. Zum anderen war uns wichtig, dass die Dokumente gleich die entsprechenden Vermerke für eine spätere ISO-Zertifizierung beinhalten. Hinzu war entscheidend, dass wir Dinge wie Stellenbeschreibungen, Unternehmensstruktur und Übersicht aller Mitarbeiter:innen automatisch erstellen. Auch die jeweiligen Assets, welche wir in Snipe-IT verwalten, sollten entsprechend ausgelesen und in den Seiten dargestellt werden. Den Teil der dynamischen Generierung haben wir dann mit Python und Verwendung der API realisiert. Das Ganze läuft nun seit gut 6 Monaten ohne größere Schwierigkeiten.

Die API bietet für nahezu alle Bedürfnisse geeignete Endpunkte und ist sehr gut dokumentiert. Unter Verwendung von entsprechenden Tokens werden die Benutzerberechtigungen so an den API-Consumer weitergereicht.

Bei der Dokumentation der einzelnen Bereiche sah das ganze schon anders aus. Auch hier haben wir viele Dokumente neu geschrieben bzw. manuell übernommen. Gerade die ein oder andere Dokumentation, welche bereits vor 10 Jahren erstellt wurde, schien uns als PDF-Export vollkommen ausreichend archiviert und die manuelle Übernahme wäre eher einer Beschäftigungstherapie gleichgekommen.

In Summe haben wir gemeinsam tausende an Dokumenten gesichtet, migriert, gelöscht und neu geschrieben, aber der Aufwand hat sich gelohnt. Der alte Schrott ist weg und wir finden uns in BookStack nun gut zu recht. Die letzten Abteilungen haben ihre Daten noch unter Verwendung von Confluence Exports umgezogen und gestern haben wir das Altsystem in den wohlverdienten Ruhestand geschickt.

Was noch kommt?

Falls Interesse besteht, kann ich zu einem späteren Zeitpunkt gerne noch etwas über unsere Generatoren schreiben. Diese erzeugen nämlich nicht nur die Seiten für Mitarbeiter:innen und Assets, sondern legen auch Übersichtsseiten mit Sozialleistungen und Regelungen an, welche wir auf Basis der Page-Tags generieren. Auch Consulting könnt ihr jederzeit bei uns kaufen. So richtig etabliert haben wir das im Professional Services noch nicht, aber dann komme eben ich vorbei. Noch kenne ich mich aus 🙂

Darüber hinaus werden wir BookStack aller Wahrscheinlichkeit nach in unser NWS-Portfolio übernehmen, da es eine sehr gute Ergänzung zu unseren bestehenden Produkten darstellt. An dieser Stelle auch ein herzlicher Dank an Dan Brown, welcher in Vollzeit an BookStack arbeitet und es als Open Source Software zur Verfügung stellt. Zur Unterstützung des Projekts haben wir einen Supportvertrag abgeschlossen, den wir bisher jedoch noch nie benötigt haben. Auch ein weitergehendes Engagement wird vermutlich bald kommen, aber dazu später mehr.

Fazit

Confluence hat uns einen guten Dienst erwiesen, aber auf Basis von BookStack und dank der Mitarbeit aller haben wir nun eine neue und modulare Basis für unser Handbook und Dokumentation. Jeder manuelle Schritt und die Überarbeitung waren der Qualität zuträglich und haben uns besser gemacht. BookStack hat sich darüber hinaus als unglaublich stabiles und innovatives Produkt erwiesen, welches ich Euch nur ans Herz legen kann. Für mich die Alternative zu Confluence schlechthin.

Bernd Erk
Bernd Erk
CEO

Bernd ist Geschäftsführer der NETWAYS Gruppe und verantwortet die Strategie und das Tagesgeschäft. Bei NETWAYS kümmert er sich eigentlich um alles, was andere nicht machen wollen oder können (meistens eher wollen). Darüber hinaus startete er früher das wöchentliche Lexware-Backup, welches er nun endlich automatisiert hat. So investiert er seine ganze Energie in den Rest der Truppe und versucht für kollektives Glück zu sorgen. In seiner Freizeit macht er mit sinnlosen Ideen seine Frau verrückt und verbündet sich dafür mit seinen beiden Söhnen und seiner Tochter.

Kickstart your Laptop with Linux

Alle paar Jahre bekomme ich einen neuen Laptop bei Netways. Vor zwei Wochen war es wieder so weit und somit eine gute Gelegenheit mal wieder die Betriebssystem-Frage zu stellen. Die alte Frage also: „Welches Linux ist das Beste?“. Also für mich ganz persönlich. Nicht für die weite Welt. Zur Auswahl stehen die rpm Fraktion wie centos, fedora oder rhel; debianoide wie ubuntu, mint, debian und arch Derivate wie Manjaro oder Endeavour.

Entscheidungsmatrix

  • Suse ist raus, fedora ist mir zu unstable, centos/rhel zu altbacken.
  • ubuntu ist mir zu kommerziell, debian zu rock-stable, mint vereinigt irgendwas dazwischen
  • Manjaro finde ich ganz gut, Endeavour ist ein reines Arch mit beigelegtem installer.

Ergebnis

Ich nehme nichts von alledem, sondern Arch-Linux ohne Verpackung, aus folgenden Gründen.

Ein sehr neuer Laptop hat manchmal aktuelle Chipsätze oder ähnliches, die einen aktuellen Kernel oder andere Tools erfordern. Bei Arch Linux bekommt man immer aktuelle Software und muss nicht auf einen neuen Major-Release der Distro warten, da es sich um einen Rolling-Release handelt.
Für die Installation des OS brauche Endeavour oder Manjaro mehr. Das reine Arch Linux bringt mittlerweile einen terminal basierten Installer mit. Bis vor ein paar Jahren musste man die im Arch-Wiki beschriebene Schritt für Schritt Installation durchführen. Jetzt hat sich das mit archinstall aber sehr vereinfacht. Hier hat man nach circa 5 Minuten ein lauffähiges System. In meinem Fall: Eine LUKS verschlüsselte Basis Partition, darauf ein Gnome mit Wayland. Eine Besonderheit ist mir dabei aufgefallen. Per Default wird nicht mehr grub sondern systemd-boot genutzt. Ein letzter Fallstrick: Man sollte bei „Netzwerk“ angeben, dass der NetworkManager die Verbindungen verwaltet, sonst hat man nach dem Neustart der Installation kein Netzwerk mehr. Damit dann nicht zu langweilig wird ist dann natürlich kein NetworkManager installiert und ohne Internet ist das auhch nicht möglich. Da ifconfig(depricated) auch nicht installiert ist landet man dann schnell an dem Punkt, wo man mit dem *ip* command weiterhelfen muss.
Generell ist das Arch-Wiki eine gute Anlaufstation für Hilfe. Obwohl Arch eine viel kleinere Nutzerbasis hat als Ubnutu oder fedora, ist das Wiki mittlerweile so ausführlich, dass ich darin auch Lösungen für Probleme finde die ich mit anderen Distros habe.
Updates: funktionieren einfach. Ich benutze seit circa sieben Jahren Arch Linux und konnte in der Zeit immer problemlos updaten. Ab und zu muss man mal den keyring aktualisieren wenn die Updates lange ignoriert wurden aber die Updates – an und für sich – funktionieren einfach.
Bei Ubuntu oder Fedora kann man das Glück haben das ein Softwarehersteller direkt Pakete baut und anbietet. Bei Arch nicht. Bei Arch gibt es allerdings das Arch User Repository (AUR). Hier werden an zentraler Stelle Pakete von einer großen Community gepflegt. Ein AUR Paket besteht dabei im Prinzip aus einem Pacman-Install-Skript(PKGBUILD), dass entweder vorkompilierte binaries von *irgendwo* laden oder auch mit Quelltext Binaries on-demand kompilieren kann. Allerdings muss man sich bewusst sein, dass die PKGBUILD zwar im AUR von der Community geprüft werden *können*, aber nicht in jedem Fall sicher sind. Ich finde aber das PKGBUILD-Format ist sehr einfach lesbar und man kann genau nachlesen was genau von wo heruntergeladen und wie installiert wird. Wenn man z.B. spotify aus dem AUR installiert kann man nachlesen, dass das debian Paket hierfür genutzt wird und von repository.spotify.com geladen wird. Außerdem kann man hier sehen, wie gpg genutzt wird um den Inhalt zu verifizieren.

[...]
source=('spotify.protocol'
'LICENSE'
"${pkgname}-${pkgver}-x86_64.deb::http://repository.spotify.com/pool/non-free/s/spotify-client/spotify-client_${pkgver}.${_commit}_amd64.deb"
[...]

Um mit AUR Paketen einfach installieren zu können favorisiere ich YAY, dass als pacman replacement fungiert. Eine Installation von eben genanntem Spotify würde man z.B. mit *yay spotify* anstoßen. Und bevor ich es vergesse: die schicken Icons aus dem Screenshot kommen aus dem buuf icon-set und können auch mit yay installiert werden.

To the moon

Für mich ist Arch aktuell das optimale Betriebssystem und wenn alle Anderen ihren Fehler endlich eingesehen haben könnte 2023 das Jahr des Linux-Desktops werden.

Christoph Niemann
Christoph Niemann
Senior Consultant

Christoph hat bei uns im Bereich Managed Service begonnen und sich dort intensiv mit dem internen Monitoring auseinandergesetzt. Seit 2011 ist er nun im Consulting aktiv und unterstützt unsere Kunden vor Ort bei größeren Monitoring-Projekten und PERL-Developer-Hells.