Machbarkeitsstudie: Magento-Multi-Store-Webshop
Im letzten Blog-Post habe ich einen Einblick in Machbarkeitsstudien gegeben. Sie sind besonders bei größeren Projekten wie Webshops immer wieder vonnöten. Heute stellen wir ein reales Beispiel vor.
Die Ausgangslage
Wir wurden mit der Aufgabe befasst herauszufinden, ob die Anforderungen für einen Webshop mit der e-Commerce-Software Magento umsetzbar sind. Da wir bereits gemeinsam mit dem Kunden / der Kundin das Konzept ausgearbeitet hatten, wussten wir über das Projekt Bescheid und konnten für Magento schnell für einen großen Anteil der Anforderungen grünes Licht geben.
Bevor wir guten Gewissens dem Einsatz von Magento zustimmen konnten, mussten wir jedoch evaluieren, ob der herausforderndste Aspekt gemeistert werden kann: es sollten in einer Installation hunderte Shops unter einem Dach vereint werden.
Aufgrund der Rahmenbedingungen war schnell klar, dass jeder Shop eine eigene Magento-Website benötigt. Daraus ergaben sich jedoch einige Herausforderungen, die es zu meistern galt.
Herausforderung: Transparente Zusammenführung der Shops
Getrennte Websites bedeuten nach Magento-Jargon, dass die Shops eine gemeinsame Code-Basis und Datenbank besitzen, abgesehen davon jedoch getrennt sind. Shop A und Shop B haben unterschiedliche URLs, Produktsortimente, Preise und somit auch Warenkörbe. KundInnen können immer nur in einem Shop gleichzeitig einkaufen. Ein Durchmischen der Warenkörbe ist nicht möglich.
Dieses Verhalten gilt es anzupassen. Für die EndkundInnen muss das Gesamtangebot transparent als ein Shop erscheinen. Benötigt wird also ein Multi-Store-Shop, der den KundInnen zugleich einen flexiblen Wechsel zwischen Sortimenten und Shops ermöglicht, ohne auf dem Weg Informationen aus dem Warenkorb oder Benutzerkonto zu verlieren. Ebenso muss die Bestellhistorie für alle Shops zusammen angezeigt werden. Dieses Muster führt sich an vielen, vielen Stellen fort und muss entsprechend implementiert werden.
Evaluierung: Recherche und Erfahrung
Für die Zusammenführung der Shops wurde eine Recherche durchgeführt. Sie zeigte, dass für Teile des Problems eine Lösung existiert. Zudem hatten wir bereits ein paar Erfahrungen mit der Zusammenführung von Shops gesammelt.
Die Gesamtaufgabe erscheint zwar durchaus umfangreich, ihre erfolgreiche Umsetzung aber realistisch.
Herausforderung: Performance
Getrennte Websites bedeuten zudem eine Datenduplizierung auf mehreren Ebenen. Der geplante Shop besteht aus tausenden Produkten mit jeweils hunderten Produktattributen, verteilt auf hunderte Websites. Magento bemüht sich zwar, bei den Produktinformationen Duplizierungen zu vermeiden, doch an bestimmten Stellen wird man zwangsweise mit einer Verhundertfachung der Datenmenge konfrontiert.
Die Verwaltung so vieler Shops in einer Installation ist aufgrund des Datenmodells technisch möglich. Magento ist aber eindeutig nicht darauf optimiert, womit die Performance einer solchen Installation ein wichtiges Thema ist.
Evaluierung: Machbarkeitsstudie mit Last-Test
Um die Datenstruktur und Performance zu testen, mussten wir schwerere Geschütze auffahren als eine simple Recherche. Der folgende Abschnitt gibt einen Einblick in unsere Arbeit. Auch wenn wir es letztendlich geschafft haben, wollen wir damit zeigen, dass es manchmal unvorhersehbare Probleme gibt und der Lösungsweg länger ist, als geplant.
Um die Auswirkungen der Datenmengen auf Magento festzustellen, war ein Last-Test mit Daten nötig, welche daszu erwartende Datenset widerspiegeln.
Die erste Testinstallation
Bei uns stehen intern virtuelle Serverumgebungen zur Verfügung, auf denen wir mit dem von mir geschriebenen MageSpawner in weniger als einer Minute eine neue Magento-Test-Instanz erstellen können. Der erste Schritt ist also schnell getan.
Datengenerierung
Mit einer solchen Instanz gingen wir daran, Daten zu generieren. Eine von uns für diese Zwecke entwickelte Extension erstellte die Testdaten in Form von Magento-Websites, Produkten, Kategorien, Attributsets und Attributen in realistischer Menge und Verteilung. Das ging ja einfach; dann wissen wir also gleich, ob der Shop läuft, oder?
Erste Tests
Es zeigte sich schnell: mit Standard-Magento bewegt sich die Geschwindigkeit auf nicht annehmbaren Niveau. Dank einem experimentellem Patch, den wir zur Verfügung gestellt bekommen haben und etlichen Performance-Optimierungen wurde der Shop wesentlich beschleunigt.
Von der Geschwindigkeit, die man sich für ein Live-System wünscht, war der Shop noch entfernt. Der Speed bewegte sich aber in einem Bereich, der uns in Anbetracht der eingesetzten Hardware Hoffnung machte. Großes Problem blieb die Indizierung der Daten, die sehr lange lief, bei einem Index nicht vollständig beendet wurde und verbunden mit Swapping auf diesem Server sogar für Platzprobleme sorgte.
Auslagerung der VM auf stärkere Hardware
Um die Indizierung zu einem erfolgreichen Abschluss zu bringen entschlossen wir uns, die Installation auf einen anderen Server zu verfrachten und ihr einen eigenen virtuellen Server zu spendieren.
Das wird durch das Open-Source-Tool VirtualBox ermöglicht. Es erzeugt virtuelle, vollfunktionsfähige Rechner („virtuelle Maschinen“ oder VM), auf denen nach Herzenslust getestet werden kann. In Verbindung mit Vagrant und Puppet ist es damit theoretisch möglich, auf Knopfdruck nach Belieben vorkonfigurierte Server bereitzustellen. (Theoretisch deswegen, weil mich die Tools just bei diesem Test schmählich im Stich gelassen und mir viel Geduld abverlangt haben. ;-)) Da die virtuellen Rechner unabhängig von der Hardware sind, können sie zwischen Servern transferiert und dort wieder eingesetzt werden.
Nach dem Umzug der VM auf die neue Server-Hardware konnte die Indizierung dank der besseren Ausstattung zwar durchgeführt werden, doch der Shop verhielt sich insgesamt langsamer, was nicht nur durch den nun vollständigen Index zu erklären war. Eine Recherche später wussten wir, dass diese Server-Hardware zwar gut war, genau der im Einsatz befindliche Prozessor in Zusammenhang mit der verwendeten Linux-Kernel-Version aber beleidigt auf Virtualisierungen reagierte. Im Web berichteten einige User, dass das Problem nach einem Linux-Upgrade behoben war. Andere nicht. Gut genug für einen Versuch.
Das Upgrade der Linux-Distribution verlief erfolgreich und endete mit einem schwarzen Bildschirm. Neue Recherche, neue Erkenntnis: der Treiber der im Server verbauten Graphik-Hardware ist mit der neuen Linux-Distribution nicht mehr kompatibel und wird es auch nicht mehr. So viel zum Thema Server-Hardware und langjähriger Support.
Umsiedlung des Shops auf direkte Hardware
Eine neue Graphik-Karte später sahen wir wieder etwas, auch wenn es uns nicht gefiel: stark verbessert hatte sich die Geschwindigkeit des virtuellen Servers nicht. Zu diesem Zeitpunkt entschlossen wir uns, auf „bare metal“ zu setzen und Webserver, Datenbank-Server und Magento ohne Virtualisierung direkt auf der Hardware aufzusetzen.
Schau‘ an: hallo Performance, da bist du!
Load-Tests mit Apache JMeter
Um einige neue Erfahrungen reicher waren wir nun wieder dort angelangt, wo wir vor den „Ersten Tests“ waren: die Daten sind im Shop und wir konnten einen Load-Test durchführen.
Das Tool Apache JMeter ermöglicht die Durchführung professioneller Last-Tests:
- das Abschicken unterschiedlicher Requests (HTTP, SOAP, Mail, …)
- Parallele Anfragen von einer beliebigen Anzahl von Usern
- Unterschiedliche Klick-Pfade für User, versetzte / zufallsbedingte Staffelung der User, Schleifen und konditionale Logik
- Cache-Warming-Phasen und vieles mehr
- Statistische und Graphische Auswertung der Ergebnisse
Nachdem die JMeter-Konfiguration auf einem weiteren Rechner eingerichtet war, starteten wir die Tests. Die Anzahl der parallelen User wurde bewusst höher als die zu erwartenden User-Zahlen angesetzt, um etwas Spielraum nach oben zu haben.
Diese Tests gaben uns Einsicht in das Verhalten des Shops, auf das wir uns einstellen müssen, falls das Projekt in dieser Form umgesetzt wird. Wir erfuhren, wo besondere Engpässe entstehen, welche Seiten bereits gut performen, welche Server-Ausstattung in etwa benötigt wird und wo noch Potential besteht.
Wir wissen nun, dass ein solcher Shop umsetzbar, aber auch mit entsprechendem Aufwand verbunden ist. Unser Kunde / unsere Kundin hat somit Informationen erhalten, mit denen er /sie planen kann.
Fazit
Durch die Evaluierung der Probleme und der Suche nach Lösungen konnten wir feststellen, ob die auftretenden Hürden überhaupt überwindbar sind und dem Kunden / der Kundin darlegen, mit welchen Aufwänden in der Umsetzung zu rechnen ist. Somit haben beide Seiten eine bessere Vorstellung vom Projekt und eine bessere Planbarkeit.