MapEdit mit Loadbalancer
Ab Version 9.1.x oder neuer wird der Server Parameter in der web.config
von MapEdit nicht mehr verwendet. Dieser kann entfernt werden. Sollten Sie bereits einen Loadbalancer im Einsatz haben, müssen Sie unbedingt diesen Artikel berücksichtigen um die geänderte Funktionsweise des Caching zu verstehen.
<add key="UseLoadBalancer" value="true"/>
Allgemeines
Wenn die Anfragen von MapEdit Desktop oder Professional (gilt nicht für MapEdit Mobile) an den MapEdit Server über einen Loadbalancer zur Lastverteilung optimiert werden soll, müssen zwei MapEdit Server vorhanden sein.
D. h. als erstes müssen zwei MapEdit Server (Webserver) installiert und lizenziert werden. Davor ist ein Software oder Hardware Loadbalancer geschaltet, der alle Anfragen auf die MapEdit URL weiterleitet bzw. verteilt.
Ein Loadbalancer ist nicht Bestandteil der MapEdit Software.
Die Einstellungen in der MapEdit.ini
müssen auf die IP-Adresse oder den Namen des Loadbalancers für alle Clients eingestellt werden.
MapEditServerUrl=https://loadbalancer-name/mum.geo.services
MapEditStorageName=loadbalancer-name
Je nach Konfiguration (Failover oder Lastverteilung) des Loadbalancers werden z.B. bei Lastverteilung ein Teil der Anfragen auf den MapEdit Server 1 geleitet. In diesem MapEdit Server ist in den Projekten bzw. den Kartendefinitionen eingestellt welche Karten von welchem Kartenserver abgerufen werden.
Das bedeutet, dass i.d.R. auch der Kartenserver (TileServer, MapGuide, MapServer usw.) doppelt vorhanden ist und eben für den MapEdit Server 1 der z.B. Karten Server 1 verwendet werden soll. Beim MapEdit Server 2 wird dann der Karten Server 2 verwendet (usw.). Dh. der Anwender "landet" entweder auf den Servern der Linie 1 oder den Servern der Linie 2.
Man muss jetzt dafür sorgen, dass die Konfiguration und Inhalten bei beiden Linien/Serverpaaren zueinander passt. Da die Kartenserver per URL oder Namen in den Projekten/Karten-Server Einstellungen konfiguriert werden, müssen diese bei der Verwendung von Loadbalancern jeweils entsprechend zusammen passen.
Intelligentes Caching
Ein MapEdit Client (Desktop oder Professional) hat einen lokalen Cache, in dem die Konfiguration des MapEdit Server Repositories speichert/gespiegelt werden. Dabei haben die Dateien im Cache das exakt gleiche Datum/Uhrzeit (letztes Änderungsdatum) wie die Dateien des Servers.
Beim Starten des Clients passiert folgendes:
- Alle Dateien, bei denen das Datum vom Client nicht zum Datum der Server Datei passt werden vom Client gelöscht.
- Alle Dateien, die es auf dem Server nicht mehr gibt, werden vom Client gelöscht.
- Wenn der Client nun die Datei braucht und sie nicht existiert, holt er sie vom Server neu.
- Der Client holt sich nicht alle Einstellungen auf einmal. Er holt sich diejenigen Einstellungen "On Demand" welche er braucht, zum Zeitpunkt wenn er sie braucht.
- Sobald das letzte Änderungsdatum einer Datei anders ist, wird die Datei im lokalen Client Cache ersetzt.
- Hierbei ist es auch egal, ob die Datei neuer oder älter ist. Das geschieht immer, solange das Datum der Dateien zwischen Client und Server unterschiedlich sind.
Sobald der GIS Admin eine Änderung in der MapEdit Konfiguration speichert, wird die jeweilige Konfigurationsdatei (Datum) auf dem Server geändert. Also beispielsweise ändert sich die Suche in einem Projekt. Beim nächsten Start/Zugriff auf den Server wird der Client die bestehende Suche (und nur diese Suche) im Cache mit der neuen vom Server ersetzen.
D.h. wenn man wie oben beschrieben zwei MapEdit Server hat, würde man zuerst mit dem AppBuilder den MapEdit Server 1 die Änderungen durchführen und anschließend die gleichen Änderungen im MapEdit Server 2. Natürlich muss zuvor der Loadbalancer insofern den jeweils anderen MapEdit Server "deaktivieren", sodass die Administration auch gezielt auf dem richtigen Server ausgeführt werden kann.
Man kann auch für die GIS Administration weitere URL in die MapEdit.ini eintragen oder eine andere für die Wartungsarbeiten verwenden in der man nicht die Loadbalancer URL eingibt, sondern direkt die MapEdit Server 1/2 angibt.
Wenn die Änderungen zuerst auf Server 1 und dann auf Server 2 gemacht werden, enthalten die beiden MapEdit Repositories auf den MapEdit Servern, Dateien mit jeweils unterschiedlichem Änderungsdatum.
Beispiel: Funktionsweise mit zwei Servern
Der vorgeschaltete Loadbalancer leitet alle Client Anfragen zwischen zwei MapEdit Server hin und her. Dh. bei jedem Neustart landet der Anwender entweder auf Server 1 oder Server 2.
- Erster Start: Der Client startet und verbindet sich mit MapEdit Server 1, holt die Dateien die er braucht haut sie in den Cache und gut.
- Zweiter Start: Gleicher Client und gleicher MapEdit Server 1. Keine Aktualisierung, alle Dateien sind bereits im Cache.
- Dritter Start: Gleicher Client aber MapEdit Server 2. Der Client "merkt" das die Dateien im Cache ein anderes Datum haben als der Server und ersetzt alle.
- Vierter Start: Gleicher Client aber wieder MapEdit Server 1. Der Client "merkt" das die Dateien im Cache wieder ein anderes Datum haben als der Server und ersetzt diese ebenfalls.
In den Einstellungen von MapEdit Server 1 stehen andere Karten Server drin als bei MapEdit Server 2 und somit erhält der Client immer die aktuellen Einstellungen für die Karten Server.
Solange das Datum von einer der Konfigurationsdateien von Server 1 und Server 2 unterschiedlich ist, wird jeweils die Datei vom Client Cache durch die des jeweiligen Server ersetzt.
Vorgehensweise
Das Problem könnte sein, dass wenn man viele Änderungen an der Konfiguration macht und diese dann auf beiden Servern nachführt, alle diese Dateien / Einstellungen natürlich ein unterschiedliches Datum besitzen und damit bei jedem Start des Clients neu geladen werden. (je nachdem auf welchem Server er landet = random)
Dh. der Start könnte sich damit etwas verzögern da immer zuerst der Cache aktualisiert werden muss. Gerade das ist aber ja der Zweck des Caches das alles was sich nicht ändert, nicht bei jedem Start neu geladen werden soll. Sondern nur dann wenn es sich was geändert hat.
Wenn man jetzt beispielsweise alle Formulare auf Server 1 aktualisiert hat und diese Änderungen auf Server 2 nachbaut, haben diese alle ein anderes Datum. Da sie aber ja gleich sein müssen, um ein ersetzen/neuladen zu verhindern, müssen die Dateien das gleiche Datum haben.
Um dies zu erreichen, müssen die Dateien vom Server 1 auf den Server 2 kopiert werden und dabei das Datum (Änderungsdatum) zwingend gleich bleiben.
Verzeichnisse und Dateien kopieren
Möglicher Ablauf (keine Garantie auf Vollständigkeit), bitte im Zweifel mit Ihrem Consultant der das System kennt abstimmen:
- Loadbalancer MapEdit Server 1 herausnehmen
- Änderungen im AppBuilder auf MapEdit Server 1 durchführen, speichern und testen
- Loadbalancer MapEdit Server 2 herausnehmen und MapEdit Server 1 wieder aktivieren
- Alle Dateien welche sich geändert haben von MapEdit Server 1 auf MapEdit Server 2 übertragen
- Änderungen im AppBuilder auf MapEdit Server 2 überprüfen und sofern notwendig die Karten-Server und Ref-Sys URLs anpassen
- Loadbalancer MapEdit Server 2 wieder aktivieren
Wenn sich hier etwas ändert, bzw. die URL auf den Servern unterschiedlich sein muss, muss dies auf beiden Servern zeitlich versetzt gemacht, sodass diese Dateien ein unterschiedliches Datum haben!
Nicht Supported
Bitte beachten Sie, wenn Sie die Dateien im Verzeichnis auf dem Server manuell / per Skript anpassen, dass wir ggf. keine Unterstützung / Support mehr bieten können.
Wenn man die Anpassungen zwischen den Servern automatisieren möchte, also nicht auf dem jeweiligen MapEdit Server die Änderungen mittels AppBuilder durchführt, kann man auch Verzeichnisse bzw. Dateien von einem Server auf den anderen kopieren.
Um die Dateien von einem Server auf einen anderen Server zu kopieren kann u.a. dieses Programm von Microsoft genutzt werden. Die entsprechende Syntax insb. des Änderungsdatum bitte der Dokumentation dort entnehmen: https://docs.microsoft.com/de-de/windows-server/administration/windows-commands/robocopy Mindestens diese Verzeichnisse und Dateien müssen dann synchronisiert werden, sobald sich was ändert.
\MumGeoData\Repositories
\MumGeoData\MapGuide
\MumGeoData\Userdata
Sowie die system.db
aus dem Verzeichnis MumGeoData\System
.
Es ist möglich hier die Anpassungen auf einen anderen Karten-Server manuell oder per Skript im Anschluss nach dem Kopieren vom ursprünglichen MapEdit Server durchzuführen. Per Skript würde das Öffnen/Ändern im MapEdit AppBuilder ersetzen und kann einen automatisierten Update Prozess der MapEdit Server unterstützen.
In diesen Dateien stehen URLs drin bzw. in den MapServerConnections und den Kartenfenster Refsys Angaben müssen angepasst werden.
\MumGeoData\Repositories\Default\MapServerConnections
\MumGeoData\Repositories\Default\MapWindows
Diese Dateien müssen ein anderes Datum haben wie auf dem zweiten Server. Nur dann werden sie vom Client neu geladen (Siehe oben Client Caching)
Hier als Beispiel die Konfigurationsdatei von einem MapGuide Kartenserver aus dem Verzeichnis, die markierten URLs wären anzupassen:
SOD2
FILE
Item Mum.Geo.MapGuide.MapGuideConnection
Aliasname String DEFAULT
BasePath String LIBRARY://
BlackoutServer String (NONE)
CryptedPassword String awBhAG4AZABpAG4AcwBrAHkA
CryptedProxyPassword String
ProxyUsername String
ServerUrl String https://gisdemo.mum.de/mapguide/
Timeout Int32 60
Username String Administrator
End
SOD2
FILE
Item Mum.Geo.Map.DeepThought.MapWindowMetadata
AdditionalCoordinateSystem1DisplayName String
AdditionalCoordinateSystem1EPSGCode String
CopyrightText String MuM GIS Demoprojekt
MapBehavior Enum Default
MaxZoomLevel Int32 21
MinZoomLevel Int32 14
ReferenceSystemInfoUrl String https://gisdemo.mum.de/MumGeoData/RefSysInfo/RefSysInfoDemoprojekt.xml
ShowCoordinates Boolean True
ShowLayerControl Boolean True
ShowScaleBar Boolean True
StartLocationX Double 8.61784100532532
StartLocationY Double 48.16220680135
StartScale Double 17
SymbolPath String
Title String
CustomZoomLevels List