Skalieren oder skalieren: Wie und warum?

Es gibt zwei Skalierungs-Strategien: Scale-up und Scale-out. Wie unterscheiden sich diese und wann wird welche Variante in der IT eingesetzt? Zwei Beispiele.

«Neun Frauen können ein Kind auch nicht in einem Monat zur Welt bringen»

Autorin: 

Der Begriff «Skalierbarkeit» ist im IT-Bereich in aller Munde und wird oft als Grundanforderung formuliert. Aber wann ist ein skalierbares System tatsächlich notwendig und wie funktioniert die Skalierung überhaupt? Gibt es dafür ein Universalrezept?

In der IT bedeutet Skalierbarkeit die Fähigkeit eines Systems, seine Gesamtleistung unter erhöhter Last (mehr Daten, mehr Nutzeranfragen) proportional zu steigern, durch Hinzufügen von Ressourcen (typischerweise Hardware). Optimal skaliert ein System dann, wenn die Leistung mit den hinzugefügten Ressourcen linear ansteigt – das ist in der Praxis jedoch nur mit einer speziell darauf abgestimmten Software- und Hardwarearchitektur zu erreichen.

Zwei Beispielfälle

Schauen wir uns zwei konkrete Situationen an, die nach einer skalierenden Lösung verlangen:

  1. «Big Data Analytics»: Die Firma Sale Corp. möchte unbedingt verstehen, was ihre Kunden über sie denken, und was man diesen attraktives anbieten könnte. Das sollen kontinuierliche Analysen auf Basis von bspw. Posts in sozialen Medien aufdecken. Dazu benötigt Sale Corp. eine Hochleistungsarchitektur, die mit laufend weiterer Hardware ausgerüstet werden kann, um die Speicherung und die Verarbeitung ständig steigender Datenmengen zu bewältigen.
  2. «Video Analysis»: Die Firma Sauber AG verwendet eine optische Sortierungsstrecke für die Mülltrennung. Durch die Analyse der Videodaten vom Mülltransportband entscheidet eine Sortierungsanlage in Echtzeit ob ein Abfallteil ausgefiltert wird, oder nicht. Nun möchte die Sauber AG ihre Sortierungsanlage so aufrüsten, dass mehr Müll noch schneller sortiert werden kann.

Wie können die beiden Unternehmen ihre Systeme am besten skalieren? Und was entscheidet darüber, wie eine gut skalierende Lösung aussehen muss?

Skalierungsstrategien

Es lassen sich generell zwei Arten von Skalierungsstrategien unterscheiden: Die horizontale Skalierung (scaling-out) und die vertikale Skalierung (scaling-up).

Scale-up.jpg
Das Grundprinzip der Skalierungsstrategien «Scale-up» und «Scale-out». Quelle: Ryan Strehlke, Turbonomic

Scaling-up (vertikale Skalierung)

Scaling-up bezeichnet das Hinzufügen von Ressourcen innerhalb einer logischen Einheit.

Beispiele hierfür sind: Das Einsetzen eines leistungsfähigeren Speichers (z.B. Flash Storage), das Hinzufügen von CPUs oder GPUs zu einem existierenden Server, oder das Aufrüstung des Arbeitsspeichers.

Die Software, um Multi-Core-Architekturen im Kontext einer einzigen Anwendung zu nutzen wird in der Regel durch Parallel-Programmierung realisiert, z.B. durch Multithreading und Interprozesskommunikation. Hierfür stehen verschiedene Libraries und Compiler-Erweiterungen zur Verfügung, wie z.B. OpenMP, CUDA und OpenCL, etc.

Typische Anwendungsbeispiele vertikaler Skalierung sind Echtzeit-Anwendungen für Visualisierung oder Bildverarbeitung wie z.B. Virtual Reality, Computerspiele, Sortieranlagen oder Inline-Qualitätsprüfung am Produktionsband. Das Berechnungsergebnis z.B. bei interaktiven Anwendungen muss häufig in Echtzeit feststehen und wird in der Regel aus Teilergebnissen zusammengesetzt, die auch voneinander abhängig sein können. Die Teilergebnisse werden zur optimalen Skalierung auf eigenen Threads berechnet, was häufig eine Synchronisierung von Daten zwischen mehreren Threads verlangt. Diese brauchen deshalb alle Zugriff auf den gleichen, schnellen Speicher (z.B. den Hauptspeicher oder den GPU-Speicher).

Scaling-out (horizontale Skalierung)

Scaling-out bezeichnet das Hinzufügen mehrerer logischer Ressourcen-Einheiten (Nodes) zu einem System, die miteinander verbunden werden. Mit dem Ziel, dass sie wie eine logische leistungsstarke Einheit funktionieren.

Beispiele hierfür sind: Das Erhöhen der Anzahl verfügbaren Server eines Rechenzentrums (wobei z.B. ein Server als Proxy oder Lastverteiler dient), oder Cloud-Architekturen, die über Cluster mit virtuellen Nodes verfügen.

Für den Betrieb eines solchen verteilten Systems sind spezielle Softwaretools für verteilte Programmierung notwendig. Typische Implementierungsmuster hierfür sind MapReduce, Worker/Master Schema oderBlackBoard.

Eingesetzt wird die horizontale Skalierung üblicherweise für«Big Data»-Anwendungen, die riesige Datenmengen in Clouds speichern und auswerten um z.B. Echtzeit-Statistiken in sozialen Medien zu berechnen, Echtzeitanfragen von Benutzern zu bedienen (Google Suche), Ausbrüche von Krankheiten vorherzusagen, oder um Konsumverhalten zu analysieren.

Die elementaren Berechnungen innerhalb verteilter Anwendungen weisen in der Regel eine geringe bis mittlere Komplexität auf. Die darin produzierten Teilergebnisse werden in Volumen und Dimensionen bereits stark reduziert, bevor sie zu einem vollständigen Ergebnis kombiniert werden. Ein Beispiel hierfür ist die Berechnung der Anzahl von Erwähnungen relevanter Begriffe in sozialen Medien, um Trends zu bestimmen.

Vor- und Nachteile

Beide Skalierungsarten habe ihre Vor- und Nachteile.

Bedeutsame Vorteile der vertikalen Skalierung sind die einfachere Realisierung und Unterhaltung. Sowohl Arbeitsspeicher als auch Datenspeicher bleiben in einer logischen Einheit. Das macht den Datenaustausch durch die Übergabe von Speicherreferenzen und durch Caches in vielen Fällen sehr effizient. Auch müssen an der Software im Allgemeinen keine Änderungen vorgenommen werden, um vom Leistungszuwachs zu profitieren.
Die vertikale Skalierung ist jedoch durch die maximale Hardwareausstattung des Rechners nach oben beschränkt. So ist es z.B. nicht möglich, beliebig viel Arbeitsspeicher in einen Rechner einzubauen. Leistungsfähigere Hardware wird außerdem schnell sehr teuer.

Das Hinzufügen von Standardhardware zu einem Cluster ist wesentlich günstiger und nicht auf die Kapazität einer einzelnen Einheit beschränkt. Das Fehlen eines (schnellen) gemeinsamen Speichers bei der horizontalen Skalierung erschwert jedoch die Kommunikation und den Datenaustausch innerhalb des Clusters und macht die gemeinsame Nutzung, Weitergabe und Aktualisierung von Daten wesentlich komplexer. Nur mit speziellen Softwarearchitekturen und Maintenance-Tools kann dies effizient und fehlerrobust implementiert werden.

Ist es möglich, sich beliebig für Scale-up oder Scale-out zu entscheiden?

Nein, in vielen Fällen ist das durch das vorliegende Skalierungsproblem bereits vorbestimmt. Mit Blick auf die beiden Firmen, Sale Corp. und Sauber AG, lässt sich dies genauer begründen:

  • Wenn die Firma Sale Corp. die Entscheidung trifft, eine sehr leistungsstarke Maschine zu beschaffen, würde dies eine sehr teure Investition bedeuten. Bei weiterer Laststeigerung kann diese trotzdem schnell an ihre Hardwaregrenzen stoßen. In diesem Fall stellt sich eine vertikale Skalierung eher als ungünstig dar.
  • Wenn die Firma Sauber AG das Transportband doppelt so schnell laufen lassen möchte, werden auch zwei einzelne optische Sortierungsanlagen nicht helfen, die Mülltrennung richtig einzuhalten. Beide Anlagen werden den zu sortierenden Müll verpassen, bevor die Entscheidung für oder gegen das Aussortieren getroffen wurde. Ein zweites Transportband (scale-out) wäre jedoch viel teurer als eine schnellere Sortieranlage (scale-up). In diesem Fall ist also nur eine vertikale Skalierung sinnvoll.

Bei der Entscheidung, ob Scale-out oder Scale-up, oder ob gar beide Ansätze gleichzeitig erforderlich sind, spielen die Art der jeweiligen Problemstellung und die Eigenschaften der Daten eine entscheidende Rolle:

Wird eine Echtzeit-Antwort vom System erwartet und ist das endgültige Berechnungsergebnis nur mittels häufiger Synchronisation von Zwischenergebnissen zu bestimmen, ist eine vertikale Skalierung generell von Vorteil. Handelt es sich um sehr viele kleine Datensätze, die sich gut partitionieren lassen, kann hingegen die horizontale Skalierung große Vorteile bieten. Es müssen aber erstmal aufwendige Software-Anpassungen vorgenommen werden, um überhaupt von den zusätzlichen Rechnern profitieren zu können.

Im speziellen Bereich der numerischen Simulation müssen häufig sowohl viele als auch sehr große Datensätze verarbeitet werden. In diesem Fall wird eine Skalierung sowohl in die vertikale, als auch in die horizontale Richtung notwendig. Diese Aufgabe bewältigen üblicherweise Supercomputer.

Vergleich und Use-Cases für Scale-up und Scale-out

In der nachfolgenden Tabelle sind die beiden Skalierungsstrategien und üblichen Use-cases im Vergleich dargestellt.

Scale-up-2.png
Die Skalierungsstrategien «Scale-up» und «Scale-out» in der Gegenüberstellung

Fazit

Skalierbarkeit bezeichnet die Fähigkeit eines Systems zu wachsen, um steigende Anforderungen zu bewältigen. Wie die konkrete Lösung dafür aussieht, kann sehr unterschiedlich sein. An den obigen Beispielen zeigt sich, dass die Entscheidung zwischen Scaling-up und Scaling-out keineswegs trivial und sehr stark vom Analyseproblem, den Daten und von den geforderten Antwortzeiten abhängig ist. Entscheidend sind aber ebenso die Kosten für die jeweilige Lösung. Eine neue Applikation, die künftig substanzielle Leistungssteigerungen erlauben soll, wird am besten so gestaltet, dass sie Scale-out unterstützt.

Für die beiden Firmen, Sale Corp. und Sauber AG, ist es wichtig, eine für sie passende Skalierungsstrategie zu finden um ein gutes Verhältnis von Kosten zur Leistungssteigerung zu erzielen. Für die Sale Corp. stellt sich die Scaling-Out-Strategie als am günstigsten heraus; für die Sauber AG hingegen die Scaling-Up-Strategie.