Build Service/Weiterleiter
aus openSUSE, der freien Wissensdatenbank
Inhaltsverzeichnis |
openSUSE Download-Weiterleiter
Geschichte
Um das Herunterladen von openSUSE zu vereinfachen, wurde Ende 2005 die erste Version des Weiterleiter (engl. redirector) entwickelt und auf dem FOSDEM 2006 vorgestellt. Diese erste Machbarkeitsstudie enthielt noch keine der Fähigkeiten, die im heutigen Redirector enthalten sind, welcher über download.opensuse.org zugänglich ist.
Die ersten beiden Versionen des redirector waren in PHP geschrieben. Sie wurden durch die (aktuelle), in C als Apache-Modul ausgeführte, Implementierung ersetzt. Es gibt außerdem eine Implentierung in Ruby, die über FastCGI integriert werden kann; was wir nutzen ist aber das Apache-Modul.
Was macht er?
Ziel von download.opensuse.org ist die Bereitstellung einer automatischen und transparenten Spiegelserverwahl, die für jeden Nutzer, auf Basis seines Standorts (GeoIP) und der Spiegelservergeschwindigkeit, den passendsten Server auswählt. Um dies zu erreichen, hält der Weiterleiter eine Spiegelserverdatenbank und einen "Statuszwischenspeicher" für jede Datei auf jedem Spiegelserver vor. Diese Datenbank wird kontinuierlich vom so genannten "Scanner" aktualisiert, welcher in der Lage ist, den Spiegelserver via FTP, HTTP oder rsync zu überprüfen. Ein zweiter Teil des Redirector-Rahmenwerks, der "pingd", prüft die Verfügbarkeit der Spiegelserver, um sicherzustellen, dass die Weiterleitungen jederzeit funktionieren. Schlüssel dieses Rahmenwerks ist der Weiterleiter selbst. Die ersten beiden Runden des Redirector waren in PHP geschrieben. Für die v2-Versuche gibt es nun zwei verschiedene "Frontends": mod_zrkadlo (ein Apache-Modul) und ein Ruby-basiertes Skript. Beide nutzen MaxMind GeoIP [eine freie Datenbank, die IP-Adressen auf Länder abbildet] um den Standort der Anforderung (basierend auf deren IP) festzustellen, um dann die Spiegelserverdatenbank abzufragen, um eine Liste potentieller Spiegelserver zu erhalten.
Alle Downloads von und für openSUSE (download.opensuse.org, software.opensuse.org, ftp.opensuse.org) werden vom Download Redirector verarbeitet.
Allgemeine Informationen, inklusive eines Überblicks, finden Sie hier: mirrorbrain.org
Wie funktioniert das nun?
Die Funktionsweise, wie Spiegelserver ausgewählt werden, kann am einfachsten in Pseudocode erklärt werden. Der Algorithmus geht etwas so vor:
do not redirect in certain cases:
is this a request for a directory index?
does the file exist?
is the file too small?
is the file excluded from being redirected by user agent / client IP / mime type / filemask?
canonicalize filename, resolving symlinks in the path
look up country and continent of client IP via GeoIP
if client country needs to be treated as another country:
/* New Zealand case -- pick a mirror from Australia */
client country = other country
mirrors =
SELECT file_server.serverid, server.identifier, server.country, server.region, server.score, server.baseurl \
FROM file \
LEFT JOIN file_server \
ON file.id = file_server.fileid \
LEFT JOIN server \
ON file_server.serverid = server.id \
WHERE file.path=canonicalized_filename AND server.enabled=1 AND server.status_baseurl=1 AND server.score > 0
results example:
+----------+----------------------------+---------+--------+-------+---------------------------------------------------+
| serverid | identifier | country | region | score | baseurl |
+----------+----------------------------+---------+--------+-------+---------------------------------------------------+
| 14 | ftp.ale.org | us | NA | 100 | http://ftp.ale.org/pub/mirrors/opensuse/opensuse/ |
| 18 | ftp.fi.muni.cz | cz | EU | 10 | http://ftp.fi.muni.cz/pub/linux/opensuse/ |
| 23 | ftp.iasi.roedu.net | ro | EU | 10 | http://ftp.iasi.roedu.net/mirrors/opensuse.org/ |
| 41 | ftp.uni-heidelberg.de | de | EU | 100 | http://download.uni-hd.de/ftp/pub/linux/opensuse/ |
| 44 | ftp5.gwdg.de | de | EU | 200 | http://ftp5.gwdg.de/pub/opensuse/ |
| 44 | ftp5.gwdg.de | de | EU | 200 | http://ftp5.gwdg.de/pub/opensuse/ |
| 70 | ftp.nux.ipb.pt | pt | EU | 50 | http://ftp.nux.ipb.pt/pub/dists/opensuse/ |
| 74 | mirrors.uol.com.br | br | SA | 50 | http://ftp.opensuse.org/pub/opensuse/ |
| 79 | ftp.halifax.rwth-aachen.de | de | EU | 100 | http://ftp.halifax.rwth-aachen.de/opensuse/ |
+----------+----------------------------+---------+--------+-------+---------------------------------------------------+
for mirror in mirrors:
/* use the "score" to give each mirror a weighted randomized rank */
mirror->rank = (rand()>>16) * ((RAND_MAX>>16) / mirror->score)
if memcache daemon knows combination of this client ip and this mirror id:
/* client got this mirror before */
chosen = mirror
if country of client is same as mirror:
put country into country pool
else if continent of client is same as mirror:
put country into region pool
else
put country into world pool
if country pool is not empty:
chosen = find lowest ranked mirror(country pool)
else if continent pool is not empty:
chosen = find lowest ranked mirror(continent pool)
else if world pool is not empty:
chosen = find lowest ranked mirror(world pool)
else:
do not redirect, send the file ourselves
store combination client ip <-> mirror id in memcache daemon
do the redirect
Sobald ein Spiegelserver ausgewählt wurde, gibt der Redirector einen HTTP Statuscode 302 (Gefunden) zurück und fügt einen Location Header mit der Weiterleitungs-URL hinzu, was den Anfragenden veranlasst, dorthin zu gehen. Fall für die angegebene Datei kein Spiegel bekannt ist, wird der Server die Datei einfach selber ausliefern.
Es gibt einige wichtige Ausnahmen. Für bestimmte Dateien ist es schwierig sciherzustellen, dass Sie aktuell auf allen Spiegeln sind, da sie sich zu häufig ändern. Deshalb leitet der Server Anfragen nach diesen Dateien nicht weiter.
Spiegelserver-"Klebrigkeit"
Sobald ein Client an einen bestimmten Spiegelserver weitergeleitet wurde, wird er auch bei der nächsten Anfrage an diesen Spiegel weitergeleitet und und nicht an einen anderen, zufällig ausgewählten.
Natürlich überprüft der Server bei jeder Anfrage, ob der Spiegel zur Zeit über die Datei verfügt, da es ansonsten passieren könnte, dass der Client ins Nirgendwo geschickt wird. Darüber hinaus kann nicht allen Dateien auf den Spiegelservern vertraut werden -- weshalb einige nicht weitergeleitet werden.
Die Assoziierung Spiegelserver-ID <-> Client-IP (wie sie vom Server gespeichert wurd) läuft nach einer bestimmten Zeit an Inaktivität aus (30 Minuten auf download.opensuse.org).
Eingebaute Metalink-Unterstütztung
Der Redirector kann Metalink-Dateien erstellen (siehe http://metalinker.org). Damit zurechtkommende Clients können automatisch einen anderen Server auswählen, falls des zu Problemen kommt, oder sogar parallel mehrere Server nutzen. Ein Metalink wird immer dann zurückgegeben, wernn ".metalink" an die URL einer herunterzuladenden Datei angehängt wird.
Ein Beispiel wäre http://download.opensuse.org/distribution/10.3/iso/dvd/openSUSE-10.3-GM-DVD-i386.iso.metalink
Beachten Sie: Der redirector fügt bisher nicht das übliche <verification>-Element ein, aber die Metalinks funktionieren dennoch bereits. Es wird bald hinzugefügt.
Andere Leckerbissen
Die "zentrale" Art von Distributionsdatein hat eine interessante Implikation - sie erlaubt es uns, interessante Daten darüber zu sammeln, welche Datein angefragt werden, was wir sonst nicht tun könnten. Dafür steht ein zusätzliches Apache-Modul bereit. Es sammelt Statistiken über Transfers individueller Build Service-Pakete. Im Prinzip trennt das Modul Pfad und Dateiname auf und protokolliert die Komponenten, respektive erhöht einen Zähler in einer SQL-Datenbank. Die Quellen können hier gefunden werden: https://forgesvn1.novell.com/svn/opensuse/trunk/tools/download-stats/mod_stats/.
Entwicklerinfos / Kontakt
- Die Quellen erhalten Sie unter https://forgesvn1.novell.com/svn/opensuse/trunk/tools/download-redirector-v2
- Kommentare, Fragen und Patches werden auf der opensuse-buildservice Mailing-Liste entgegengenommen und beantwortet!
- Die aktuelle Implementierung stammt von Jürgen Weigert und Martin Polster (scanner, pingd), Peter Poeml (mod_zrkadlo, pingd), Marcus Rueckert (redirector Frontend in Ruby).
- Die ersten beiden Versionen des Download Redirector wurden von Christoph Thiel geschrieben. (Diese werden nicht mehr genutzt, aber die aktuellen Implementierungen teilen sich mit diesen den Großteil des ursprünglichen technischen Aufbaus.)
Danksagung
Dieses Produkt enthält von MaxMind erstellte GeoLite-Daten, erhältlich auf http://maxmind.com/

