Montag, 29. Oktober 2007

Was ist Skalierbarkeit?

Original: http://www.royans.net/arch/2007/09/22/what-is-scalability/ 22. September 2007 18:14
Autor: Royans Tharakan
Übersetzung: Sebastian Wallroth

Gefragt, was sie denn mit Skalierbarkeit meinen, sprechen die Leute über Verbesserung der Leistung, Einführung von Hochverfügbarkeit oder sogar über spezielle Technologien oder Protokolle. Tja, Skalierbarkeit ist nichts davon. Versteh' mich nicht falsch. Man muss schon alles über Geschwindigkeit, Leistung, Hochverfügbarkeitstechnologie, Anwendungsplattformen, Netzwerk, etc. wissen. Aber das ist nicht die Definition von Skalierbarkeit.

Einfach ausgedrückt bezeichnet Skalierbarkeit die Möglichkeit, dein bisheriges Geschäft in einem größeren Rahmen zu betreiben. Eine Webanwendung zu skalieren bedeutet, mehr Leuten zu ermöglichen, die Anwendung zu benutzen. Wenn Du nicht erklären kannst, wie Du die Leistung verbesserst, wenn Du mehr Rechner einbindest, dann ist das okay. Und so lange Du skalieren kannst, um eine größer werdende Anzahl von Benutzern zu bedienen, ist es auch okay, manche Dinge nicht zu wissen. Alle anderen lesen bitte weiter.

Derzeit werden zwei Hauptarten der Webseitenskalierung angewandt.

  • "Vertikale Skalierung" - Das Hinzufügen von Ressourcen innerhalb einer logischen Einheit, um die Kapazität zu erhöhen. Ein Beispiel könnte das Hinzufügen von CPUs zu einem existierenden Server sein oder die Erweiterung des Speicherplatzes durch das Hinzufügen von Festplatten zu einer existierenden RAID/SAN-Installation.

  • "Horizontale Skalierung" - Das Hinzufügen mehrere logischer Ressourcen-Einheiten, die dazu gebracht werden, wie eine einzige Einheit zu arbeiten. Die meisten Cluster-Lösungen, verteilten Dateisysteme und Lastverteiler dienen der horizontalen Skalierung.
Alle Komponenten, seien es Prozessoren, Server, Speicherlaufwerke oder Lastverteiler, haben in irgend einer Form einen Verwaltungsüberbau. Wenn Du den skalieren willst, musst Du herausfinden, welcher Anteil der Ressource tatsächlich verwendbar ist. Das Ergebnis wird "Skalierbarkeitsfaktor" genannt. Wenn Du jedesmal 5% Prozessorleistung verlierst, wenn Du deinem System eine weitere CPU hinzufügst, dann beträgt dein Skalierbarkeitsfaktor 0,95. Ein Skalierbarkeitsfaktor von 0,9 bedeutet, dass Du nur 90% deiner Ressourcen verwenden können wirst.

Skalierbarkeit kann basierend auf dem Skalierbarkeitsfaktor weiter unterteilt werden.

  • Wenn der Skalierbarkeitsfaktor beim Skalieren konstant bleibt, nennt man das "lineare Skalierbarkeit".
  • Es kann aber sein, das manche Komponenten nicht so gut skalieren wie andere. Ein Skalierbarkeitsfaktor unter 1,0 wird "sub-lineare Skalierbarkeit" genannt.
  • Obgleich selten, ist es möglich eine bessere Leistung (einen besseren Skalierbarkeitfaktor) zu erhalten, indem man einfach mehr Komponenten hinzufügt (I/O zwischen Festplattenspindeln in einem RAID wird besser, wenn man mehr Spindeln hinzufügt). Das nennt man "supra-lineare Skalierbarkeit".
  • Wenn die Anwendung nicht auf Skalierbarkeit ausgelegt wurde, ist es möglich, dass das System sogar schlechter wird, wenn man es skaliert. Das nennt man "negative Skalierbarkeit".
Wenn Du dringend auf Skalierbarkeit angewiesen bist, dann ist vertikale Skalierung möglicherweise der einfachere Weg (vorausgesetzt, dass dein Kontostand dir das erlaubt). In den meisten Fällen kannst Du, ohne eine Zeile Code zu ändern, deine Anwendung auf einem superteuren 64-CPU-Server von Sun oder HP mit Speicher von EMC, Hitachi oder Netapp installieren und alles wird toll sein. Zu dumm, dass vertikales Skalieren immer teurer wird, je weiter Du es treibst.

Horizontale Skalierung hingegen nötigt dich nicht, immer teurere Server zu kaufen. Sie ist auf Skalierung mit normalen Speicher- und Serverlösungen ausgelegt. Aber horizontale Skalierung ist nicht automatisch billiger. Die Anwendung muss von Grund auf so konzipiert werden, dass einzelne Anwendungen auf mehreren Rechnern laufen können. Die zwei interessantesten Probleme, die die meisten Anwendungen in der Welt der horizontalen Skalierung fürchten müssen sind "Split Brain" und "Hardwareabsturz".

Während unendliche horizontale Skalierbarkeit schwierig zu erreichen ist, ist unendliche vertikale Skalierbarkeit unmöglich. Wenn Du Kapazitäten für eine vorher festgelegte Anzahl von Benutzern aufbaust, kann es weise sein, vertikal zu skalieren. Wenn Du aber eine Webanwendung baust, die von Millionen genutzt werden könnte, dann könnte die Entscheidung für vertikale Skalierung ein teurer Fehler sein.

Aber bei Skalierbarkeit geht es nicht nur um CPU (Rechenleistung). Für eine erfolgreich skalierbare Webanwendung müssen alle Schichten in gleichem Maße skalieren. Das schließt die Speicherschicht (geclusterte Dateisysteme, S3, etc.), die Datenbankschicht (Partitionierung, Federation), die Anwendungsschicht (Memcached, Scaleout, Terracotta, Tomcat Clustering, etc.), die Webschicht, den Lastverteiler, die Firewall und alle anderen ein. Wenn Du zum Beispiel nicht mehrere Lastverteiler einsetzen kannst um deine zukünftige Zugriffslast zu bewältigen, dann ist es wirklich egal, wie viel Geld und Aufwand Du in die horizontale Skalierbarkeit deiner Webschicht gesteckt hast. Deine Zugriffslast wird darauf beschränkt sein, was dein Lastverteiler stemmen kann.

Die Wahl der richtigen Art von Skalierbarkeit hängt davon ab, wie viel Du skalieren und wie viel Du ausgeben willst. Wenn jemand behauptet, es gäbe eine Lösung, die alle Bedürfnisse befriedigt - dann glaube ihm nicht. Und wenn jemand auf der nächsten Party eine Diskussion über "Skalierbarkeit" beginnt, dann frage ihn bitte zuerst, was er denn mit Skalierbarkeit meint.

Referenzen


  1. Cost and Scalability in Vertical and Horizontal Architectures, Implications for Database and Application Layer Deployments, Technical White Paper, Tom Atwood (Sun Microsystems), September 2004 (PDF, englisch)
  2. My Linear Scalability is bigger than yours! Posted at 07:30AM Dec 20, 2006 by Cameron Purdy on /dev/null

Kommentare:

Anonym hat gesagt…

Kleiner Fehler in der Übersetzung :

Während unendliche horizontale Skalierbarkeit schwierig zu erreichen ist, ist unendliche vertikale Skalierbarkeit möglich.

Es muss heissen :

..., ist unendliche vertikale Skalierbarkeit UNmöglich !

Gruß
hollz

Sebastian Wallroth hat gesagt…

Danke hollz für den Tip. ich hab's geändert.
Besten Gruß,
Sebastian