Von Jörn Dreyer und Tom Needham
Mit dem Release von user_ldap 0.10.0 am 20. Dezember 2017 konnte die Performance der LDAP-App um ein vielfaches gesteigert werden. Die App stellt ein Backend für ownCloud zur Verfügung, das es dem User ermöglicht, ein bestehendes Verzeichnis von Benutzern zu verwenden und ihnen Zugriff auf ihre Daten zu erlauben. user_ldap ist ein integraler Bestandteil jeder größeren ownCloud-Instanz, die LDAP zur Benutzerauthentifizierung nutzt. Leistung und Zuverlässigkeit sind in diesem Zusammenhang essentiell – und jede noch so kleine Steigerung der Performance kann bei großen Instanzen deutliche Auswirkungen haben.
Leistungssteigerung durch neuen oc_accounts table
Seit ownCloud X enthält ownCloud die neue Datenbanktabelle oc_accounts, die die Daten von Benutzer-Backends wie LDAP, SAML/Shibboleth enthält, aber auch Daten von Nutzern, die innerhalb der ownCloud erstellt wurden. Um die Suche und Autovervollständigung von Usern zu ermöglichen, wenn man sie benötigt, kann der Admin diese Backends vorab synchronisieren.
Bei der Legacy-Anwendung user_ldap waren dafür jedoch viele zusätzliche LDAP-Abfragen erforderlich, so dass eine Synchronisation für mehrere tausend Benutzer einige Stunden in Anspruch nehmen konnte. Wenn ein ownCloud-Administrator die initiale Benutzer-Synchronisation von LDAP zu oc_accounts veranlassen wollte, dauerte dies bei 100.000 Benutzern fünf Stunden – und damit zu lange.
Überwindung technischer Hürden
Als wir uns in den Code, der die Benutzer „einfängt”, genauer angesehen haben, stießen wir ein interessante Detail: Zuerst führte der Code eine Abfrage aus, um alle Benutzer-IDs abzurufen. Die Ergebnismenge enthielt bereits Elemente wie E-Mail, Displayname und Quota, diese wurden jedoch verworfen und nur die Benutzer-IDs wurden zurückgespiegelt. Demnach rief der Code alle notwendigen Attribute hinzereinandet ab, was zu 3-5 Abfragen pro Benutzer führte, bei 100.000 Benutzern also zu ungefähr 500.000 Einzelabfragen.
Darüber hinaus wurde zusätzlich jede laufende seitenbezogene Abfrage abgebrochen, da nicht alle LDAP-Server mehrere parallele seitenbezogene Abfragen auf derselben Verbindung unterstützen. Dadurch musste die initiale Abfrage für alle Benutzer für jede Seite neu gestartet werden. Hinzu kommt die Tatsache, dass die Default Page rund 500 Benutzer umfasst, wodurch weitere 200 Queries hinzukommen. Das Ergebnis war eine hohe Belastung vieler LDAP-Instanzen, hohe Verzögerungen und Frustration bei den Administratoren.
Ein Query, um sie alle zu beherrschen
Um hier Abhilfe zu schaffen, haben wir die user_ldap App überarbeitet, um alle notwendigen Attribute in einer initialen Abfrage zu erfassen und sie in einem UserEntry (einer kleinen Einheit, die gesetzte Attribute für einen bestimmten Benutzer enthält) zwischenzuspeichern. Jeder nachfolgende Zugriff auf diese Attribute verwendet nun das zwischengespeicherte LDAP-Ergebnis, anstatt ein Reset durch- und eine neue Abfrage auszuführen.
Der Sync umfasst 500 Benutzer pro Seite und führt keine zusätzlichen Abfragen mehr durch, um die einzelnen Attribute einzuholen. Dadurch reduziert sich die Anzahl der Abfragen auf eine einzige Abfrage mit mehreren Ergebnisseiten. Schneller geht es nicht.
Dies funktioniert besonders gut mit Active-Directory-Instanzen. Active Directory kann mit großen Abfragen wesentlich besser umgehen als mit mehreren Abfragen gleichzeitig. Somit trägt die neue user_ldap App zur Stabilität von Active-Directory-Instanzen bei.
Weitere Arbeiten
Zusätzlich zu diesen Leistungsverbesserungen wurde die Entwicklung weiterer Tools zur Unterstützung von Administratoren vorangetrieben – einschließlich single-user-sync, seen user sync (für bereits eingeloggte User). Außerdem wurden einige core-sync-refactorings realisiert, um Code-Duplizierung zu entfernen und die Protokollausgabe zu verbessern.
Jetzt upgraden!
Während die Performance-Anforderungen der größten Kunden der ownCloud GmbH diese Entwicklung vorangetrieben haben, kommt es auch der ownCloud-Community zugute. Wir beide sind seit Beginn Teil des ownCloud-Projektes und haben die Zeit seitdem dafür genutzt, den alten Legacy-Code zu überarbeiten und die hohen Standards zu erfüllen. Wir werden weiterhin Software entwickeln, die die Anforderungen von Unternehmen erfüllt, dabei aber Open Source bleibt.
Die neue LDAP-App ist ein guter Grund, um jetzt ein Upgrade durchzuführen! Holen Sie sich hier das neue user_ldap-Release, um von den enormen Performance-Verbesserungen zu profitieren: