[Talk-de] ?Unterstützung für die(?) Server

AK-Palme ak-palme at ak-palme.de
Mo Sep 24 22:15:34 UTC 2007


Hi Frederick,

> Willkommen bei OSM ,-)
>   
Danke :)
>> Wenn ich mich für ein Szenario entscheiden müsste, würde ich, ohne die 
>> finanzielle Lage zu kennen, ein 5-Server-Cluster empfehlen. Dabei gibt 
>> es 2 Frontend-Server, auf denen der Webserver läuft, und 2 
>> Backend-Server die die Datenbank beherbergen.
>>     
>
> Fileserver und NFS brauchen wir vermutlich (an dieser Stelle) nicht;
> es gibt naemlich praktisch keinen statischen Content, der ausgeliefert
> wird. 
Wie schon gesagt, ich kenne mich mit der aktuellen Infrastruktur nicht 
aus, aber ich dachte bei der rsync-Syncronisation an die Scripte die die 
Tiles, etc. generieren. Klar, Fileserver ist oversized für 20 
PHP-Dateien aber ich habe ihn der Anschaulichkeit angeführt.

> Bevor man anfaengt, sich irgendwelche Replikations-Szenarien
> auszudenken, muss man erstmal schauen, was wir eigentlich haben, was
> wir wollen, und wo das Problem ist.
>   
ACK
> Klar, das Problem ist, dass derzeit alles (alle Datenbank-Lese- und
> Schreib-Requests) ueber einen Server laufen. Das macht nicht nur
> unnoetig viel Last, sondern das gibt auch zuweilen im MySQL-Server
> einfach Haenger wegen des Locking (ein Prozess macht einen dicken
> SELECT, der 2 Minuten dauert, macht derweil ein Write-Lock, so dass
> andere zwar lesen, aber nicht schreiben duerfen; ein zweiter Prozess
> kommt und will schreiben, darf nicht, haengt in der Warteschlange; ein
> dritter Prozess kommt und will eigentlich nur lesen, darf aber nun
> auch nicht, weil der zweite Prozess erster war und schon einen
> Lock-Request eingequeuet hat).
>   
Wäre es nicht möglich den Write-Lock zu umgehen, indem man die 
Write-Requests in einem temporärem Table erledigt? Nagut, ich kenne das 
System nicht -> gefährliches Halbwissen :)
Sehe ich richtig, dass es das Ziel sein sollte, die Write-Querys zu 
verkürzen/teiles um das Locking effektiver zu machen? Man könnte, wenn 
man einen MySQL-Cluster nutzt das Ziel mit LOW_PRIORITY-Updates machen. 
Wenn man dann noch wenige und effektive B-Trees in der Indexierung nutzt 
würde das sicher viel Wirkung zeigen. Oder wird das schon gemacht?
> Ein sehr grosser Teil unserer Anfragen sind Lese-Requests. Die haben
> wir im Moment schon stark eingeschraenkt - man kann nicht mal mehr
> eine ganze deutsche Grossstadt auf einmal abrufen, weil so grosse
> Requests nicht erlaubt sind. Das ist nur ein Notanker - eigentlich
> waere es schoen, wenn jeder alles requesten darf, was ihn interessiert. 
>
> Wir haben, damit sich keiner zu arg aergern muss, das "planet file",
> einen Komplett-Dump aller Daten, der woechtenlich rauskommt. Jeder,
> der mit eine Woche alten Daten zufrieden ist, kann damit arbeiten
> (obwohl das auch zunehmend unhandlicher wird - eine Datenbank ist
> schon komfortabler als ein Riesenfile).
>   
Statt planet-File könnte man im Grunde doch durch ein Planet-Table 
ersetzen? Das würde das Caching und die Performace der Datenbank nutzen. 
Oder sehe ich das falsch, dass das Planet-File eine Art "SELECT * FROM 
alle_tabellen" ist?!
> Das "planet file" wird demnaechst vermutlich auch haeufiger kommen,
> oder es wird zumindest taegliche Updates dafuer geben, so dass es
> leichter ist, einigermassen aktuell zu blieben. Aber es ist und bleibt
> (finde ich) eine Kruecke.
>
> Ich skizziere mal eine Idee, die ich schon ewig mit mir rumtrage und
> bei jeder Gelegenheit wieder mal auf den Tisch bringe:
>
> Ich finde einen zentralen Server fuer alle Schreibrequests, einen
> zentralen "Master", ok. (Man *koennte* durchaus auch partitionieren -
> der Master fuer Deutschland koennte in Deutschland stehen, und
> grenzueberschreitende Requests waeren dann durch geeignete Metaserver
> zusammenzusammeln. Hat auch viele Vorteile. Aber nehmen wir erstmal
> an, wir haben einen zentralen Server.)
>
> Dieser zentrale Master hat einen Slave, auf den er alle Aenderungen
> in Quasi-Echtzeit kopiert. Alle Lese-Requests sind von diesem Slave zu
> machen. Der Slave wiederum akzeptiert eine begrenzte Anzahl von
> "Feeds". Ein Feed ist eine weitere Datenbank am Ende irgendeiner
> Leitung, die alle Updates oder nur bestimmte Updates geliefert
> bekommt. Ein Feed, der alle Updates bekommt, ist ein "full feed"; ein
> Feed koennte aber auch sagen: "Ich will nur alles, was in dieser und
> jener Bounding box liegt" (ein regionaler Feed), oder thematisch "ich
> will nur alles, was railway=irgendwas ist". 
>
> Diese Feeds koennen wiederum kaskadiert werden - wer in vor-IP-Zeiten
> Usenet gemacht hat, kann sich das vielleicht besser vorstellen: Nicht
> jeder kann einen Full-Feed von der Zentrale bekommen, aber es koennte
> einen Full-Feed irgendwo in Deutschland geben, an dem wiederum 10
> unter-Feeds dranhaengen, und so weiter. Durch die entstehende
> Baumstruktur "troepfeln" dann Aenderungen mehr oder weniger schnell
> nach unten durch; letzten Endes kann jeder, ueberall auf der Welt,
> einen stets aktuellen OSM-Bestand von allem haben, was ihn
> interessiert.
>
> Wenn man nun mit JOSM oder so etwas aendert, kann man sich problemlos
> die Daten von einem halbwegs aktuellen Feed laden: Wir unterstuetzen
> ja eh keine transaktionalen Updates, d.h. selbst wenn ich mit JOSM
> direkt vom zentralen Server etwas lade und daran Aenderungen vornehme,
> kann es immer sein, dass mir jemand anders in die Quere kommt. Ob ich
> nun 10 Minuten alte Daten lade und daran eine halbe Stunde
> herumbastele oder ob meine Daten 10 Millisekunden alt sind, macht
> keinen Unterschied.
>
> Eine solche Architektur waere extrem leistungsfaehig und beliebig
> skalierbar. Superflexibel obendrein - denn Feeds muessten ja nicht
> alle die OSM-Software fahren, jemand kann durchaus auch direkt in eine
> Postgres-Datenbank hineinfeeden oder irgendwas anderes. 
>
> Eine solche Architektur koennte allerdings nicht auf MySQL-Replikation
> aufgesetzt werden, sondern muesste eine Abstraktionsstufe weiter oben
> stattfinden, im API: In dem Moment, in dem die Aenderung geschrieben
> wird, muss praktisch eine Aenderungs-Message generiert werden, die
> dann ueber die Architektur verteilt werden kann. (Notfalls ginge das
> mit Triggern, aber da alle Aenderungen eh ueber die API geschehen,
> waere die API der bessere Punkt.)
>
> Die Feeds koennten entweder ueber offene Verbindungen direkt vom
> Server benachrichtigt werden, wenn sich was aendert, oder, was weniger
> effizient, aber auch weniger fehleranfaellig waere, einfach
> regelmaessig pollen: "Gib mir alle Changes der letzten Minute fuer die
> Bounding Box ...".
>   
Die Idee finde ich gut, aber sie ist doch extrem hoch skaliert. Als 
Unterscheidungsmerkmal könnte man den Baum sowie den DNS-Baum aufbauen. 
Wobei dann jeder Server für einen bestimmten Koordinatenbereich 
zuständig ist. Das würde auch das Problem lösen wie die Daten aktuell 
bleiben.

Zur Verdeutlichung:
Hamburg:    53° 34' N, 10° 1' O
                     053034N 010001O
Server-Anfrage geht an z.b. 053034.nodes.osm.com, der dann für den 
gesamten Breitengrad verantwortlich ist.
Zukunfsmusik :)

> Soviel mal dazu. Aber bis wir sowas kriegen, wird noch viel Wasser die
> Themse runterfliessen ;-)
>
> Bye
> Frederik
>
>   
Gute Nacht,
Christian




Mehr Informationen über die Mailingliste Talk-de