Hochschule für Technik und Wirtschaft Dresden Fakultät Geoinformation Masterstudiengang Geoinformation und Management Masterarbeit Entwurf und Implementierung einer Offline-Replikation unter PostgreSQL Eingereicht von Benjamin Thurm Seminargruppe: 11/063/71 Matrikelnummer: 33265 1. Gutachter: Prof. Dr.-Ing. F. Schwarzbach 2. Gutachter: MSc. A. Schulze (BTU Cottbus) Eingereicht am: 25.10.2013 Inhaltsverzeichnis i Inhaltsverzeichnis Abbildungsverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Einleitung iii 1 2 Open Information System for Research in Archaeology 2.1 Datenhaltung OpenInfRA . . . . . . . . . . . . . . . . 2.2 Mutter-Kind-Konzept . . . . . . . . . . . . . . . . . . . 2.3 Anforderungskatalog . . . . . . . . . . . . . . . . . . . 2.4 Fazit Analyse Grobkonzept . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4 6 9 11 3 Theoretische Grundlagen 3.1 Verteilte Datenbanksysteme . . . . . . . . . . . . . 3.2 Referenzarchitektur verteilter Datenbanken . . . . 3.3 Replikation . . . . . . . . . . . . . . . . . . . . . . 3.4 Transaktionsverarbeitung . . . . . . . . . . . . . . 3.5 Mobile verteilte Datenbanksysteme . . . . . . . . . 3.6 Architektur mobiler Datenbanksysteme . . . . . . . 3.7 Abgrenzung MDBMS und VDBMS . . . . . . . . . 3.8 Transaktionen in mobilen verteilten Systemen . . . 3.9 Eventually Concistency . . . . . . . . . . . . . . . 3.10 Synchronisation . . . . . . . . . . . . . . . . . . . 3.10.1 Pessimistische Synchronisationsverfahren . 3.10.2 Optimistische Synchronisationsverfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 14 16 18 19 21 22 23 24 25 27 28 29 4 Technik 4.1 Native Replikation mit PostgreSQL . . . . 4.1.1 Standby Server . . . . . . . . . . . 4.1.2 Hot-Standby-Replication . . . . . . 4.1.3 Streaming-Replikation . . . . . . . 4.1.4 Synchrone Replikation . . . . . . . 4.1.5 Interpretation der WAL-Segmente 4.2 PostgreSQL BDR . . . . . . . . . . . . . . 4.3 Softwarelösungen und Erweiterungen . . 4.3.1 Bucardo . . . . . . . . . . . . . . . 4.3.2 SymmetricDS . . . . . . . . . . . . 4.3.3 ArcGIS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 32 33 33 33 34 34 35 36 38 38 40 . . . . . 44 45 47 48 50 51 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Vorüberlegungen zur Replikationskomponente 5.1 Anpassungen Datenbankschema . . . . . . . . . . . 5.2 Synchronisation . . . . . . . . . . . . . . . . . . . . 5.3 Fragmentierung und Allokation der Projektdatenbank 5.4 Synchronisation externer Dokumente . . . . . . . . 5.5 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Implementierung 52 6.1 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 6.2 Funktionsweise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 6.3 Konfiguration Engine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Inhaltsverzeichnis 6.4 Datenmodell . . . . . . . . . . . . . . . . . . . . . 6.4.1 Konfigurationstabellen . . . . . . . . . . . . 6.4.2 Datentabellen . . . . . . . . . . . . . . . . . 6.5 Einrichten der Replikationshierachie eines Projekts 6.6 Protokollieren von Verlaufsdaten . . . . . . . . . . 6.7 Synchronisation externer Dokumente . . . . . . . 6.8 Mutterknoten einrichten . . . . . . . . . . . . . . . 6.9 Erstellen einer Kind-Instanz . . . . . . . . . . . . . 6.10 Synchronisation . . . . . . . . . . . . . . . . . . . 6.11 Offline-Synchronisation . . . . . . . . . . . . . . . 6.12 Konfliktlösung . . . . . . . . . . . . . . . . . . . . . 6.13 Purging . . . . . . . . . . . . . . . . . . . . . . . . 6.14 Knoten entfernen . . . . . . . . . . . . . . . . . . . 6.15 Sichern des Kommunikationswegs . . . . . . . . . 6.16 Test der Konfiguration . . . . . . . . . . . . . . . . 6.17 Notwendige Erweiterungen . . . . . . . . . . . . . 6.18 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 56 58 59 61 65 67 68 71 72 73 76 76 76 77 79 84 7 Zusammenfassung und Ausblick 86 Konfiguration SymmetricDS-Engine v Standardkonfiguration vii Email xiv Anlagenverzeichnis xx Monographien xxii Publikationen xxii Webseiten xxiii Erklärung über die eigenständige Erstellung der Arbeit xxvi Abbildungsverzeichnis iii Abbildungsverzeichnis 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 OpenInfRA-Informationsmdel . . . . . . . . . . . . . . . . . . . . Anwendungsschema Projektdatenbank . . . . . . . . . . . . . . Komplexe Datentypen . . . . . . . . . . . . . . . . . . . . . . . . Instanziierung Kind-Instanz . . . . . . . . . . . . . . . . . . . . . Exemplarische Mutter-Kind-Hierarchie . . . . . . . . . . . . . . . Vergleich Client-Server - VDBMS . . . . . . . . . . . . . . . . . . Referenzarchitektur Verteilter Datenbanken . . . . . . . . . . . . Fragmentierung und Allokation einer Relation . . . . . . . . . . . Darstellung Single- & Multi-Master-System . . . . . . . . . . . . Globale Transaktion . . . . . . . . . . . . . . . . . . . . . . . . . 2-Phase-Commit-Protokoll in einem verteilten Datenbanksystem Dimensionen verteilter Datenbanksysteme . . . . . . . . . . . . Architektur mobiler verteilter Datenbanksysteme . . . . . . . . . Transaktionen MDBS . . . . . . . . . . . . . . . . . . . . . . . . . CAP Pyramide . . . . . . . . . . . . . . . . . . . . . . . . . . . . Phasen optimistischer Synchronisation . . . . . . . . . . . . . . . CDC Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-Tier-Architektur . . . . . . . . . . . . . . . . . . . . . . . . . . . ArcGIS Versionsbaum . . . . . . . . . . . . . . . . . . . . . . . . ArcGIS Replikationsschema . . . . . . . . . . . . . . . . . . . . . Replikation externer Projektdaten . . . . . . . . . . . . . . . . . . SymmetricDS Systemtabellen . . . . . . . . . . . . . . . . . . . . SymmetricDS Verlaufstabellen . . . . . . . . . . . . . . . . . . . Pull- und Push-Verfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 5 6 7 9 15 16 17 19 20 21 22 23 25 27 29 37 39 42 43 50 57 59 61 Listings iv Listings 5.1 5.2 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 6.10 6.11 6.12 6.13 6.14 6.15 6.16 6.17 6.18 6.19 6.20 1 2 3 Installation uuid-ossp . . . . . . . . . . . . . . . . . . . . . . . . Abfrage aller Themeninstanzen eines Projekts . . . . . . . . . Starten des SymmetricDS-Standalone-Service . . . . . . . . . Minimalanwendung SymmetricDS . . . . . . . . . . . . . . . . Erstellen eines SymmetricDS-Nutzers . . . . . . . . . . . . . . Konfiguration der Knoten-Hierarchie . . . . . . . . . . . . . . . Einrichten von Pull- und Push-Verbindungen . . . . . . . . . . Definition eines Datenkanals . . . . . . . . . . . . . . . . . . . Einrichten der CDC-Trigger einer replizierten Relation . . . . . Einrichten der CDC-Trigger via Wild Card . . . . . . . . . . . . Einrichten eines Router . . . . . . . . . . . . . . . . . . . . . . Zuordnung Router - Trigger . . . . . . . . . . . . . . . . . . . . Registrieren der Mutter-Instanz . . . . . . . . . . . . . . . . . . Registrierung symadmin . . . . . . . . . . . . . . . . . . . . . . Registrierung SQL . . . . . . . . . . . . . . . . . . . . . . . . . Online-Initialisierung einer Kind-Instanz. . . . . . . . . . . . . . Hilfsfunktion Offline-Sync . . . . . . . . . . . . . . . . . . . . . Manuelle Konfliktlösungsstrategie für Projektdaten . . . . . . . Query zum Analysieren von Konflikten im empfangenen Batch Auffinden von Konflikten in ausgehenden Batches . . . . . . . Einfache Hilfsfunktion zum Entfernen einer Kind-Instanz . . . . Hilfsfunktion Offline-Import . . . . . . . . . . . . . . . . . . . . SymmetricDS-Engine . . . . . . . . . . . . . . . . . . . . . . . Standardkonfiguration Mutter-Kind-Konzept . . . . . . . . . . . Ordnerstruktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 49 53 54 56 60 60 62 63 63 64 66 67 69 69 70 71 73 74 75 76 79 v vii xx 1 Einleitung 1 1 Einleitung Fragt man jemanden, welche drei Dinge er auf eine einsame Insel mitnehmen würde, fällt mit hoher Wahrscheinlichkeit der Begriff des „Internet“. Aus dem heutigen Alltag kaum noch wegzudenken, hat sich ein ständiger Online-Zugang längst fest in das tägliche Leben vieler Menschen integriert. Was hierbei jedoch oft in Vergessenheit gerät ist, dass dies gar keine Selbstverständlichkeit darstellt. In weniger erschlossenen Gebieten ist eine stehende Internetverbindung ein kostbares Gut, das mitunter auch für Geld nicht zu haben ist. Besonders offensichtlich wird dieser Umstand für Fachgebiete wie der Archäologie. Während die Auswertung von Forschungsreisen mitunter komfortabel im Büro möglich ist, erfolgt die eigentliche Datenerhebung im Feld. Dies ist in der Praxis schnell Ursache für einen komplizierten Umgang mit den mühsam beschafften Daten. Unzureichende Mittel der Datensynchronisation zwischen offline gesammelten und online geänderten Daten stellen hier ein weit verbreitetes Problem dar. Im schlimmsten Fall kann dies bis hin zum Datenverlust führen, wenn der Aufwand den einstweiligen Nutzen der Datenintegration in den Grundbestand übersteigt - ein fürchterlicher Umstand, der der großen Mühe der Datenerhebung nicht würdig ist. Dennoch sind Mitarbeiter des Deutschen Archäologischen Instituts täglich mit diesem Problem bei ihrer Arbeit konfrontiert. Bei Projekten wie der Pergamon-Grabung in der Türkei, bei der Recherche in Museumsdepots und bei Forschungsreisen im Ausland sammeln sie neues Wissen und dokumentieren die Ergebnisse dabei in verschiedenster, zumeist digitaler Form. Grundlage dieser Arbeitsweise sollte ein Informationssystem sein, das für die vielen Facetten dieser Forschung geeignet ist. Dazu gehört insbesondere auch die Arbeit jenseits einer verlässlichen Netzwerkanbindung. In dieser Arbeit soll daher eine Replikations- und Sychronisationslösung als Bestandteil des digitalen Dokumentationssystems OpenInfRA Abhilfe für dieses Problem schaffen, indem das autonome Arbeiten von einem zentralen Datenbestand ermöglicht wird. Sie soll es dem Nutzer erlauben, online und offline mit der gleichen Anwendung zu arbeiten und den lokalen Datenbestand zu einem passenden Zeitpunkt mit den Änderungen auf der zentralen Auskunftsversion abzugleichen. Erfordern die Umstände eine weitere „Offline-Version“, für deren Einrichtung sich mit dem Internet nicht verbunden werden 1 Einleitung 2 kann, soll die Möglichkeit geschaffen werden, diese ausgehend vom lokalen Datenbestand zu erstellen. Einleitend wird daher zunächst das Informationssystem OpenInfRA vorgestellt, da es den Ausgangspunkt dieser Betrachtung darstellt. Eine Analyse des bestehenden Grobkonzeptes zu OpenInfRA wird darlegen, welche Anforderungen an eine Offline-Replikation gestellt werden. Hier soll auch das im Grobkonzept definierte sogenannte „Mutter-KindKonzept“ betrachtet werden, welches das Bilden von Kind-Instanzen ausgehend vom zentralen Datenbestand beschreibt. Im Anschluss daran soll der aktuelle Wissensstand zu verteilten und mobilen verteilten Datenbanken dargelegt werden, sodass davon ausgehend die optimistische Replikation und Synchronisation betrachtet werden kann. Ein Überblick über bereits bestehende Lösungen für das Datenbanksystem PostgreSQL soll dann zeigen, welche davon für die Umsetzung des Mutter-Kind-Konzepts in Frage kommen. Die im fünften Abschnitt folgenden Vorüberlegungen zum Entwurf einer Replikation und Synchronisation sollen anschließend die konkrete Umsetzung einer geeigneten Lösung vorbereiten. Abschließend wird die Implementierung mit der vorher für geeignet befundenen Lösung SymmetricDS dokumentiert. Dabei soll auch geprüft werden, inwieweit die vorher gestellten Anforderungen erfüllt werden können. 2 Open Information System for Research in Archaeology 3 2 Open Information System for Research in Archaeology Das Open Information System for Research in Archaeology (OpenInfRA) stellt die Bemühungen des Deutschen Archäologischen Instituts Berlin (DAI) dar, ein digitales Dokumentationssystem für „archäologische, bauforscherische und historische Fragestellungen [zu schaffen, das] unabhängig von konkreten Forschungsfragen“ (OpenInfRA 2013, S.6) eingesetzt werden kann. Ziel ist der Entwurf und die Implementierung des Systems sowohl für Projekte des DAI als auch für andere Institute wie Universitäten und ausländische Kooperationspartner. Ein großes Augenmerk liegt dabei darauf, das breite „Spektrum von Arbeitsmethoden, Ergebnistypen und Fachobjekten“ zu berücksichtigen. (ebd., S. 27f.) OpenInfRA ist ein Kooperationsprojekt zwischen dem Lehrstuhl für Vermessungskunde der Brandenburgischen Technischen Universität Cottbus, dem dort ebenfalls ansässigen Lehrstuhl für Datenbank- und Informationssysteme, der Fakultät Geoinformation der Hochschule für Technik und Wirtschaft Dresden und dem Deutschen Archäologischen Institut (DAI). Die aktuelle Entwicklungsgrundlage für OpenInfRA stellt das Grobkonzept dar, welches im Ergebnis dieser Arbeit zum Thema „Mutter-Kind-Konzept“ weiterentwickelt werden soll. Es beschreibt die Sicht „auf ein neues Dokumentationssystem für archäologische Feldforschungsprojekte [...], das einen effizienten und nachhaltigen Umgang mit Forschungsdaten“ (ebd., S. 6) ermöglichen soll. Bisher ist es üblich, dass jedes Forschungsprojekt am DAI mitunter „mehrere, individuell erstellte Dokumentationssyteme“ (ebd., S. 6) nutzt. Die Übernahme für andere, nachfolgende Projekte ist dabei oft - auch wenn die Datenerfassung zumeist digital erfolgt und sich Anwendungsgebiete überschneiden - nicht ohne erheblichen Aufwand, möglich. OpenInfRA soll dem Abhilfe schaffen und dabei auch durch eine Offline-Replikations- und Synchronisierungskomponente die Datenerfassung und digitale Projektpflege vor Ort erleichtern. Als Grundlage der weiteren Betrachtungen wurde das bestehende OpenInfRA-Grobkonzept mit Hinblick auf die für die Replikationskomponente relevanten Aspekte analysiert. In erster Linie interessiert hier natürlich die Datenhaltung. Die gewonnen Kenntnisse zur Speicherung in einer OpenInfRA-Projektdatenbank sind aus diesem Grund im Folgenden kurz charakterisiert. Anschließend wird das „Mutter-Kind-Konzept“ erläutert, welches die 2 Open Information System for Research in Archaeology 4 grundlegenden Überlegungen zur Umsetzung der Replikation der Projektdatenbank darstellt. 2.1 Datenhaltung OpenInfRA Für OpenInfRA ist die Open Source Datenbank PostgreSQL vorgesehen. Für das RDBMS spricht, dass es für jedermann frei verfügbar ist, dabei plattformunabhängig implementiert ist und mit PostGIS eine mächtige GIS-Erweiterung bietet. Eine Replikationskomponente für das Informationssystem muss dementsprechend mit dieser Datenbank kompatibel sein und den gleichen Grundsätzen folgen. Um das erklärte Ziel zu erreichen, „einem offenen Nutzerkreis die Bearbeitung von Projekten zu ermöglichen“, wird das Datenbankschema von OpenInfRA aus einem konzeptuellen Anwendungsschema abgeleitet, deren „Elemente auf einer höheren Abstraktionsebene modelliert werden (‚Metamodell‘)“. Zu erwarten ist, dass das generalisierte Datenbankschema dadurch „stabil und insbesondere in hohem Maße robust gegenüber zukünftigen projektspezifischen Anforderungen [ist]“. (OpenInfRA 2013, S. 57) Das projektspezifische Informationsmodell wird dabei wie in Abbildung 1 aus vorhandenem Domänenwissen des Metamodells durch Auswahl generiert. OpenInfRA Informationsmodell (Metamodell) Auswahl von Themen, Attributen und Wertelisten zur Projektinitialisierung Projektspezifisches Modell Abbildung 1: Ableitung des projektspezifischen Informationsmodells aus dem OpenInfRA-Informationsmodell (ebd., S. 56) Im Zusammenhang dieser Arbeit ist es wichtig in Bezug auf die grundlegende Datenhaltung in OpenInfRA-Systemdatenbank und der Projektdatenbank zu unterscheiden. Die Systemdatenbank stellt alle projektübergreifenden Informationen zur Verfügung und bildet so das OpenInfRA-Informationsmodell ab, aus dem die konkreten projektspezifischen 2 Open Information System for Research in Archaeology 5 Informationsmodelle abgeleitet werden können. Dies geschieht in Form der Initialisierung von Projektdatenbanken, welche ein aus der Systemdatenbank ausgewähltes „initiales Themengerüst“ übertragen bekommen. Das Anwendungsschema der Projektdatenbank ist in Abbildung 2 und 3 in UML-Notation dargestellt. Abbildung 2: Anwendungsschema der Projektdatenbank (ebd.) Die Systemdatenbank unterscheidet sich von diesem Schema im Fehlen der Klassen, welche nur projektspezifisch relevant sind, d.h. insbesondere konkrete Themeninstanzen und deren Daten. Es wird klar, dass es sich auch bei diesem Vorgang der Initialisierung einer Projektdatenbank um eine Replikation von Daten handelt, da Informationen aus der Systemdatenbank übertragen werden. Dieser Vorgang geschieht dabei in der Regel unidirektional und nur einmal bei der Einrichtung der OpenInfRA Komponenten eines Projekts. Allgemeingültige Daten, wie triviale Wertelisten und Themengerüste werden dabei direkt für die Projektdatenbank übernommen. Es ist gut möglich, dass während der Lebenszeit eines Projekts beispielsweise neue nützliche Wertelisten ergänzt werden. Die automatisierte Übernahme all dieser Daten in die Systemdatenbank ist aber nicht vorgesehen. (OpenInfRA 2013, S. 75) Inwiefern in Zukunft auch beispielsweise allgemein nützliche Erweiterungen der Wertelisten in den Projektdatenbanken an die Systemdatenbank verteilt werden, ist nicht geklärt. Für diese Arbeit bedeutet dies, dass die Replikation und Synchronisation zwischen Instanzen der Projektdatenbank betrachtet werden muss, nicht aber die Kommunikation 2 Open Information System for Research in Archaeology 6 Abbildung 3: Komplexe Datentypen (ebd.) zwischen der System- und Projektdatenbank. Der Vorgang der Replikation und Synchronisierung zwischen verschiedenen Projektdatenbank-Instanzen ist im Grobkonzept als Mutter-Kind-Konzept beschrieben. 2.2 Mutter-Kind-Konzept Abgeleitet aus den Arbeitsmethodiken der durch OpenInfRA angezielten Fachgebiete der Archäologie und archäologischen Bauforschung ist die Anforderung gewachsen, berechtigten Administratoren die Möglichkeit zu geben, Kopien des Projektdatenbestands anzulegen. Dabei soll der Projektdatenbestand der zentralen Online-Version, hier treffend als Mutter-Instanz bezeichnet, auf die lokalen Computern oder auf einen lokalen Server der Forschungsniederlassung kopiert werden. Diese Kopien der Projektdatenbank, in dem Zusammenhang als Kind-Instanz bezeichnet, sollen dann in der Regel ohne eine Netzwerkverbindung zum zentralen Repository über eine lokal installierte Offline-Version der OpenInfRA-Anwendung nutzbar sein. Während auch Kind-Instanzen selbst neue Instanzen abbilden können, besitzt die Mutter-Instanz durch ihre Rolle als zentrales Portal bzw. Auskunftssystem auf den DAI-Servern einen gewissen Sonderstatus. So entsteht eine hierarchische Replikation von Projektdaten über mehrere Ebenen, was sprachlich unter Umständen schwer auszudrücken ist. Um die Mutter-Instanz bei der Beschreibung der Replikation der Projektdaten mit OpenInfRA sprachlich besser abzugrenzen wird daher vorgeschlagen, die rein konzeptuelle Bezeichnung der Eltern-Instanz einzuführen. Diese Eltern-Instanz bezeichnet immer die übergeordnete Instanz in der Replikationshier- 2 Open Information System for Research in Archaeology 7 Online-System Erstellen Mutter-Instanz Sync Kind-Instanz Importieren Offline-System Sync Kind-Instanz Offline-System Kind-Instanz Abbildung 4: Instanziierung und anschließende Synchronisation einer Kind-Instanz (ebd.) archie. So wird demzufolge eine Mutter-Instanz beim Einrichten einer Kind-Instanz zur Eltern-Instanz. Ebenso wird eine ursprüngliche Kind-Instanz, sobald aus ihr eine weitere Kind-Instanz abgebildet wird, eine Eltern-Instanz dieser neuen Kind-Version. Neben den eigentlichen Projektdaten müssen je nach zukünftiger Ausprägung auch Anwendungsdaten der OpenInfRA-Anwendung, welche für die lokale Ausführung als Offline-Instanz von Bewandtnis sind, mit repliziert werden. Da der Nutzen dieses sogenannten Mutter-Kind-Konzepts sein soll, Projektdaten in jeder Arbeitssituation für die Mitarbeiter zur Verfügung zu stellen, um insbesondere auch die Datenerfassung mit Hilfe einer Offline-Version der OpenInfRA-Anwendung zu gewährleisten, ist eine paarweise bidirektionale Synchronisation zwischen den jeweilig verwandten Eltern- und Kind-Instanzen vonnöten, welche sich bis zum Ursprung der Hierarchie der zentralen Mutter-Instanz paarweise fortsetzt. Das Erstellen von Kind-Instanzen und das anschließende Importieren dieser in eine Offline-Version der OpenInfRA-Anwendung ist in Abbildung 4 schematisch dargestellt. Aus dem Mutter-Kind-Konzept folgt eine hierarchische Baumstruktur bzw. Baum-Topologie unbestimmt vieler Ebenen von Datenbankinstanzen, die zueinander durch ihre „Verwandt- 2 Open Information System for Research in Archaeology 8 schaftsverhältnisse“ verbunden sind. An der Spitze dieser Hierarchie steht immer die Mutter-Instanz (siehe auch Abbildung 5), deren Rolle nicht übertragbar ist und auf der durch Synchronisation entlang des sich ergebenden Graphen alle Änderungen zusammenlaufen. In der Praxis könnte die Nutzung folgendermaßen aussehen: Ein leistungsstarker, zentraler Server des DAI hostet die Online-Version der OpenInfRAAnwendung, welche die Mutter-Instanz des Projektdatenbestands verfügt. Interessierte Besucher könnten diese nutzen, um öffentlich zugängliche Informationen zu recherchieren, während über das Internet verbundene Mitarbeiter sie für ihre Aufgaben nutzen. Die Forschungsniederlassung, die das Projekt betreibt, installiert eine Offline-Version der OpenInfRA-Anwendung auf einem oder mehreren Desktop-Rechnern und spielt eine Kind-Instanz auf dem zugehörigen Datenbankserver ein. Die Mitarbeiter profitieren nun von einer höheren Lokalität der Daten und können auch ohne Internetverbindung auf die Projektdaten zugreifen. Für den Außendienst wird aber ein Laptop benötigt, der ebenfalls mit einer OpenInfRA-Anwendung ausgestattet wird. Im Feld erhobene und im Büro recherchierte Daten können schließlich über eine lokale Netzwerkverbindung durch Synchronisation zwischen Laptop und Desktop abgeglichen werden. Die Synchronisation zwischen Mutter-Instanz und den lokalen Desktop-Rechnern könnte beispielsweise periodisch zum Ende des Arbeitstages geschehen. Dieses Szenario ist exemplarisch in Abbildung 5 dargestellt. Um Daten zwischen den Instanzen abzugleichen, sind zwei Verfahren vorgesehen: eine Online-Synchronisation per Netzwerkverbindung und eine komplementäre Offline-Synchronisation. Für die Synchronisation von Offline-Versionen der OpenInfRA-Anwendung kommt auch eine temporäre Netzwerkverbindung, wie sie über ein einfaches LAN-Kabel oder einen stationären WLAN-Router hergestellt werden kann, in Frage. Für Synchronisationspartner mit einer relativ stabilen Netzwerkverbindung zueinander sollte zusätzlich auch eine periodische Synchronisation möglich sein, die das Abweichen der Datenbestände auf den Synchronisationspartner so gering wie möglich voneinander hält. Die Offline-Synchronisation soll durch den Austausch von Synchronisationsnachrichten erfolgen, die durch berechtigte Nutzer erstellt werden können. Die konkreten Erwartungen, die mit dem Mutter-Kind-Konzept verbunden werden, sind im Anforderungskatalog des Grobkonzepts näher beschrieben. 2 Open Information System for Research in Archaeology 1. Hierarchieebene 9 Online-System DAI-Server Mutter-Instanz 2. Ebene DesktopRechner Offline-System Offline-System Kind-Instanz Kind-Instanz 3. Ebene Laptop für Außendienst Offline-System Periodische Sync. Kind-Instanz On-Demand Sync. Abbildung 5: Die Hierarchie unter den Datenbankinstanzen folgt aus der Instanziierungsreihenfolge, deren Ausgangspunkt immer die zentrale Mutter-Instanz ist. Das Beispiel zeigt eine mögliche Konstellation, in der OpenInfRA im Rahmen eines Projekts genutzt werden könnte. 2.3 Anforderungskatalog Für die Ableitung funktionaler und nicht-funktionaler Anforderungen werden die im Grobkonzept definierten Anwendungsfälle genutzt. Das Mutter-Kind-Konzept und damit die Replikation bzw. Synchronisation betreffend ist der Anwendungsfall 1.2.4 - Administration Projekt Instanz, welcher die Abläufe bei der Verwaltung einer Projektinstanz beschreibt. Der Vorgang fällt unter die Kategorie der Projekt-Administration, als Akteur ist der Administrator bestimmt. Vorbedingung ist also, dass der Administrator angemeldet ist, die benötigten Rechte für die Administration der Projekt-Instanz hat und ein entsprechendes Projekt angelegt wurde. Zum möglichen Ablauf der Administration sind derzeit sechs Fälle definiert: • Das Erstellen einer Kind-Instanz eines Projektes. Die entsprechende Anforderung AC_0280 spezifiziert dies als das Erstellen einer (Offline-)Version in unterschiedli- chen Ausprägungen an einem ausgewähltem Speicherort mit den Wahlmöglichkeiten, nur den Datenbestand des Projekts zu exportieren und eventuelle Systemdateien und/oder Projektkonfigurationen mit einzubeziehen. 2 Open Information System for Research in Archaeology 10 • Die Möglichkeit eine Online- (AC_0300) oder Offline-Synchronisation (AC_0310) zwischen Kind-Instanz und Mutter-Instanz durchzuführen. • Eine Kind-Instanz auf einer Offline-Version der OpenInfRA-Anwendung importieren bzw. installieren (AC_0320, AC_0330). • Die für die Offline-Synchronisation vorgesehen Synchronisationsdateien (AC_0311, AC_0312) exportieren (AC_0313). Darüber hinaus bestehen konkrete Anforderungen im Bereich der Sicherheit, die nicht direkt aus dem Anwendungsfall entnommen werden können. Sie betreffen die Protokollierung aller Synchronisationsvorgänge durch Zeitstempel, Benutzername, der beteiligten Instanz, dem Status der Synchronisation und einer entsprechenden Fehlermeldung bei Misserfolg (SEC_0260). Darüber hinaus ist eine gesicherte Übertragung (SEC_0410) bei der Synchronisation gefordert (SEC_0420), die nur ein Administrator starten darf (SEC_0400). Des Weiteren werden im Grobkonzept konzeptuelle Anforderungen formuliert. So beschreibt KT_1000 genau eine Mutter-Version des Datenbestands eines Projekts, die als Grundlage der Erzeugung von Kind-Versionen und welche immer das Auskunftssystem des Systems darstellt (KT_1050). Ein oder mehrere Kind-Instanzen (KT_1010) bilden die Mutter-Instanz nach Datenbestand und projektspezifischen Eigenschaften ab. Darüber hinaus ist formuliert, dass die Transaktionierung zwischen Mutter und Kind-Instanz dem optimistischen Transaktionsansatz folgen soll (KT_1031) und für die Synchronisation lange Transaktionen unterstützt (KT_1032). Die grafische Benutzeroberfläche (GUI) soll letztendlich auf Online- und Offline-Instanzen gleich aussehen (KT_1040). Neben den konkret für die Replikations/Synchronisationskomponente formulierten Anforderungen gelten für sie die gleichen Grundsätze wie für alle Bestandteile von OpenInfRA. Dazu zählt insbesondere, dass die Implementierung betriebssystemunabhängig für die Systeme Microsoft Windows (XP), Mac OS X und Linux erfolgen muss (SW_0130), die grundlegende Administration per Admin-Client vorgenommen werden kann und die genutzten Komponenten als Open Source-Software zur Verfügung stehen (SW_0140, 0160). Der Aufbau der Komponente soll modular zum Gesamtsystem OpenInfRA erfolgen, sodass es möglich ist zu entscheiden, ob die Komponente Replikation für einige Projekte gar nicht von Bewandtnis sein soll (SW_4000). Bei auftretenden Fehlern soll der Nutzer außerdem per Statusnachricht darüber informiert werden (SW_0041). Nötige Einstellungen, die für die Komponente vonnöten sind, können neben der Nutzung des Admin-Client per Konfigurationsdateien (SW_0230) und/oder über administrative Einstellungen im Datenbanksystem (SW_0240) vorgenommen werden. Die bestehenden Anforderungen des Grobkonzepts sind im Folgenden zusammen mit 2 Open Information System for Research in Archaeology 11 ihrer ID und der Priorisierung in gekürzter Form aufgelistet: Tabelle 2.1: Anforderungsfälle Mutter-Kind-Konzept ID Art Anforderung Prior. AC_0280 AC_0300 AC_0310 AC_0311 AC_0312 AC_0313 AC_0320 AC_0330 FA FA FA FA FA FA FA FA Erstellen einer Instanz eines Projektes Online-Synchronisation Offline-Synchronisation Erstellung SQL-Dump Parametrierung SQL-Dump Import SQL-Dump Import einer Kind-Version Installation einer (Offline-)Instanz 1 1 1 2 2 2 1 1 SEC_0260 SEC_0410 SEC_0420 NFA NFA FA Protokollierung Synchronisation Datensicherheit Datenübertragung 1 3 2 KT_1000 KT_1010 KT_1031 KT_1032 KT_1040 KT_1050 NFA NFA NFA NFA NFA NFA Mutter-Version Kind-Version Optimistischer Transaktionsansatz Lange Transaktionen Einheitliche GUI für Online / Offline Nutzung Mutter-Instanz als Auskunftssystem 1 1 1 1 1 1 SW_0130 SW_0140 SW_0041 SW_0230 SW_0240 FA FA FA FA FA SW_4000 NFA Betriebssystem Client-Komponenten des Systems Fehlermeldungen Systemanpassungen über Konfigurationsdateien Systemanpassungen über Datenbankmanagementsystem Modularer Aufbau 1 KO KO KO KO KO 2.4 Fazit Analyse Grobkonzept Bei einer ersten Analyse des Grobkonzepts wurde der Unterschied zwischen Datenbankinstanzen und der Online- und Offline-Anwendung OpenInfRA durch die stringente Bezeichnungen Mutter/Kind-Instanz und Online/Offline-Version besser voneinander differenziert. Außerdem ist für den Fall der Offline-Synchronisation nun nicht mehr der „SQL-Dump“ als Format vorgesehen, um über die entsprechenden Anforderungen die Implementierungsmöglichkeiten nicht einzuschränken. Stattdessen wird die allgemeinere Formulierung „Synchronisationsdateien“ genutzt. Um die Replikationshierarchie zwischen Mutter- und Kind-Instanzen und Kind- und Kind-Instanzen leichter zu beschreiben, wurde die konzeptuelle Bezeichnung der Eltern-Instanz eingeführt, welche eine Instanz beschreibt, die zuvor eine Kind-Instanz gebildet hat und als dessen Synchronisationspartner auftritt. Dies dient außerdem zur besseren Abgrenzung der Sonderstellung der Mutter-Instanz bzw. der zentralen Online-Version als Auskunftssystem. 2 Open Information System for Research in Archaeology 12 Die Anforderung einer stetigen Online-Synchronisation in frei definierbaren Intervallen wurde mit einer mittleren Priorität aufgenommen. Grund dafür ist, dass sie für Niederlassungen mit einer stabilen Netzwerkverbindung zur Mutter-Instanz oder bei der Synchronisation von niederen Ebenen der Hierarchie in lokalen Netzwerken als sehr nützlich angesehen wird. Es kann so besser auf Bedürfnisse verschiedenster Projekte eingegangen werden. In Abschnitt 2.2 wurde der anvisierte Nutzen des Mutter-Kind-Konzepts beschrieben, die Projektdaten autonom vom zentralen Datenbestand auf den Servern des DAI bei den lokalen Kompetenzzentren zur Verfügung zu stellen. Dabei ist allgemein formuliert, dass jede Kind-Instanz als Eltern-Instanz eintreten kann. In der Praxis wird die Tiefe dieser Vererbungshierarchie eine praktikable Obergrenze haben, was für die Implementierung einer Softwarelösung unter Umständen berücksichtigt werden darf. Schon vor einer tiefgreifenderen Betrachtung ist klar, dass bei der Nutzung eines optimistische Transaktionsansatzes und autonomen Schreiboperationen auf den Kind-Instanzen Konflikte beim Synchronisieren möglich sind. Für OpenInfRA kann angenommen werden, dass solche Konflikte relativ selten sind, immerhin handelt es sich um eine Anwendung, die in erster Linie für das Sammeln von Informationen genutzt werden soll. Diese Annahme wird durch das in Abschnitt 2.1 beschriebene Anwendungsschema gestützt, in dem Attribute konkreter Instanzen durch Assoziationsbeziehungen referenziert sind. Praktisch bedeutet dies, dass die Wahrscheinlichkeit, dass zwei parallele Transaktionen die gleiche Tabellenzeile bearbeiten, sehr gering ist. Dementsprechend stellt die manuelle Auflösung von Konflikten bei der Synchronisation ein adäquates Mittel dar, das den Nutzern die beste Kontrolle über die Daten bietet. Entsprechend ist im Grobkonzept die manuelle Konfliktlösung durch Administratoren bei Synchronisationskonflikten aufgeführt. Für die Synchronisation zwischen Datenbankinstanzen ist zu beachten, dass die Qualität der Netzwerkverbindung stark variieren kann. Es sind deshalb Verfahren zu bevorzugen, die lediglich diejenigen Datensätze übermitteln, die von Änderungen betroffen sind. Dies gilt auch für die Offline-Synchronisation. Das Mutter-Kind-Konzept beschreibt die Replikation und Synchronisation der Projektdaten. Gemeint sind dabei auch externe Dokumente wie Texte, Bilder und Pläne, welche durch die OpenInfRA-Anwendung im Dateisystem abgelegt werden oder die zur Konfiguration der OpenInfRA-Komponenten benötigt werden. Deshalb muss beim Installieren der Offline-Version der Anwendung bzw. beim Import der initialen Daten eine Möglichkeit gegeben sein, externe Daten zu selektieren, die für die Projekt-Instanz bei der autonomen Arbeit relevant sind. Die Anwendungsschicht muss dabei auf Datensätze, welche Verknüpfungen auf externe Dateien darstellen die auf der Offline-Version nicht zur Ver- 2 Open Information System for Research in Archaeology 13 fügung stehen, ohne einen Systemfehler bzw. mit einem passenden Hinweise reagieren können. Es ist anzunehmen, dass die Replikation und Synchronisation von externen Daten nicht über eine Datenbankverbindung organisiert werden kann, sondern dass hierfür externe Prozesse benötigt werden. Bei der Online-Synchronisation ist bei Dateien insbesondere wichtig, dass diese komprimiert übertragen werden. Die Implementierung einer Replikationskomponente für das OpenInfRA-Projekt erfordert eine Auseinandersetzung mit der zugrundeliegenden Thematik der Replikation und Synchronisation in relationalen Datenbanken. Im anschließenden Kapitel wird deshalb eine theoretische Einführung hierzu geboten und auf mögliche Lösungsstrategien und eventuelle Fehlersituationen eingegangen. Im darauffolgenden Kapitel werden schließlich bestehende Replikationslösungen für PostgreSQL und verwandte Systeme beschrieben, die als Ausgangspunkt oder Vorlage der Implementierung dienen könnten. 3 Theoretische Grundlagen 14 3 Theoretische Grundlagen Das in Kapitel 2.2 beschriebene Mutter-Kind-Konzept stellt die Kommunikation zwischen den im System befindlichen Computern dar. Als Übertragungsmedium kommt eine Ethernetverbindung (LAN), eine Internetverbindung (WAN) aber sogar die Übertagung als Datei in Betracht. Um die Funktion eines Computers als Kommunikationspartner in einem solchen System besser abzugrenzen, werden sie häufig als Stationen oder Knoten bezeichnet. Um die Projektdaten verwalten zu können und so die Anforderungen des Mutter-Kind-Konzepts zu erfüllen, muss jede der Stationen über einen lokalen Datenbankserver verfügen. Neben diesem Datenbankserver werden unter Umständen weitere Services ausgeführt die für die OpenInfRA-Anwendung, sei es online oder offline, von Belang sind. Während die einzelnen Stationen mit Hilfe der auf ihnen gespeicherten Daten autonom voneinander arbeiten können, ist für die Konsolidierung von Änderungen am Datenbestand Kommunikation vonnöten. Es handelt sich deshalb um ein Verteiltes System, genauer ein verteiltes Datenbanksystem. Der Begriff soll im Folgenden kurz erläutert werden. 3.1 Verteilte Datenbanksysteme Unter einem verteilten System versteht man in der Informatik vernetzte Computer und Komponenten, die sich per Nachrichten über ihre Aktionen austauschen und koordinieren. Die Client/Server-Architektur des World Wide Web kann beispielsweise als verteiltes System angeführt werden, bei dem die Komponenten nebenläufig agieren, auf keine globale Uhr zurückgreifen und unter Umständen unabhängig voneinander ausfallen können. (Coulouris, Dollimore und Kindberg 2002, S. 17f.) In diesem Sinne beschreiben Ceri und Pelagatti (1984, S. 6f.) verteilte Datenbanken grob als eine Sammlung von Informationseinheiten, die einen logischen Zusammenhang bilden, aber räumlich getrennt auf mehreren durch ein Kommunikationsmedium verbundenen Computern verwaltet werden. Jeder dieser Computer, in diesem Zusammenhang als Knoten bezeichnet, nimmt dabei an mindestens einer globalen Aufgabe teil. Die Gesamtheit der Knoten bildet das verteilte Datenbanksystem. (Mutschler und Specht 2004, S. 65f.) Abbildung 6 stellt einer verteilten Datenbank die klassische Client-ServerArchitektur gegenüber. Im Vergleich „handelt es sich [beim Client-Server-System] also 3 Theoretische Grundlagen 15 sozusagen um ein ‚degeneriertes‘ VDBMS [=verteiltes Datenbankmanagementsystem], da nur der Server Daten abspeichert“. (Kemper und Eickler 2009, S. 462) Deshalb wird bei einer Client-Server-Architektur auch von einer verteilten Anwendung gesprochen. Station 1 Client Kommunikationsnetz Client Server Station 1 (a) Client-Server-Architektur Kommunikationsnetz Station 1 (b) Verteiltes Datenbanksystem Abbildung 6: Vergleich Client-Server-Architektur - verteilte Datenbank (ebd., S. 462) Verteilte Datenbanken können im wesentlichen nach drei Kriterien bzw. Dimensionen klassifiziert werden: • Heterogenität beschreibt „die grundsätzliche Verschiedenheit von Konzepten“ im Bereich der Hardware, Kommunikation oder des Betriebssystems. Für Datenbank- systeme gilt dies insbesondere auch für unterschiedliche Modellierung, unterschiedliche Datenbanksysteme und unterschiedlicher Datenmodelle. (Mutschler und Specht 2004, S. 65) • Verteilung beschreibt, ob das Datenbanksystem auf einem Computer zentral vorhanden ist, oder es sich über mehrere Computer hinweg erstreckt. (ebd., S. 65) • Die Autonomie umfasst die Konzepte der Kommunikationsautonomie (Communication Autonomy), also inwiefern eine Komponente mit einer anderen kommunizieren kann, der Entwurfsautonomie (Design Autonomy), welche beschreibt in welchem Umfang das eigene Design bestimmt werden kann und der Ausführungsautonomie (Execution Autonomy), die aussagt, ob externe Prozesse die Ausführung lokaler Operationen beschränkt. (ebd., S. 65) Im folgenden Abschnitt wird die Referenzarchitektur für verteilte Datenbanksysteme vorgestellt und anschließend die mit verteilten Datenbank oft einhergehende Replikation erläutert. In Abschnitt 3.4 werden schließlich die zur Konsistenzerhaltung eingesetzten Verfahren charakterisiert. 3 Theoretische Grundlagen 16 3.2 Referenzarchitektur verteilter Datenbanken Ceri und Pelagatti (1984, S. 37ff.) definieren eine Referenzarchitektur verteilter Datenbanken, welche von einem globalen Schema über das Fragmentierungsschema und dem Zuordnungs- bzw. Allokationsschema hin zur lokalen Datenbank reicht. Die Architektur ist in Abbildung 7 dargestellt. globales Schema Fragmentierungsschema Stationsunabhängige Schema Zuordnungsschema lokales Schema lokales Schema lokales DBMS lokales DBMS lokale DB lokale DB Abbildung 7: Referenzarchitektur Verteilter Datenbanken nach Ceri und Pelagatti (ebd., S. 38) Das globale Schema ist der Ausgangspunkt des Entwurfs und entspricht dem Implementierungsschema des zentralisierten Datenbankentwurfs. Für das Fragmentierungsschema, der logischen Ebene der Struktur des verteilten Datenbanksystems (Mutschler und Specht 2004, S. 68), werden sich daraus ergebende „logisch zusammenhängende Informationsmengen - hier Relationen - in (weitgehend) disjunkte Fragmente (Untereinheiten) zerlegt.“ (Kemper und Eickler 2009, S. 463) Die Zerlegung kann dabei in horizontaler (Zerlegung in Tupelmengen) als auch vertikaler Richtung (Projektion in Attributbereiche) erfolgen und muss sich nach dem zu erwartenden Zugriffsverhalten richten. Es gelten im wesentlichen drei Bedingungen für eine korrekte Fragmentierung: • Vollständigkeit: Alle Daten der globalen Relation müssen auf Fragmente aufgeteilt werden und dürfen bei der Fragmentierung nicht verloren gehen. 3 Theoretische Grundlagen 17 • Rekonstruierbarkeit: Globale Relationen müssen aus ihren Fragmenten wiederherstellbar sein. • Disjunktheit: Fragmente müssen disjunkt zueinander sein, das heißt ein Datum ist nicht mehreren Fragmenten zugeordnet, um Überlappungen durch das Allokations- schema explizit zu bestimmen. (Ceri und Pelagatti 1984, S. 42; Kemper und Eickler 2009, S. 465) Die Verteilung der Fragmente auf die einzelnen Stationen wird abschließend durch das Allokationsschema, der physischen Ebene der Struktur einer verteilten Datenbank (Mutschler und Specht 2004, S. 65), beschrieben. Für die Zuteilung der Fragmente sind zwei Möglichkeiten gegeben. Bei der redundanzfreien Allokation werden die Fragmente jeweils exakt einer Station zugewiesen. Die Zuordnung erfolgt in diesem Fall möglichst nah an der Station, die diese Daten am ehesten nutzt. Die zweite Möglichkeit besteht darin Fragmente mehr als einer Station zuzuweisen. Man spricht nun von Allokation mit Replikation. (Ceri und Pelagatti 1984, S. 39; Coulouris, Dollimore und Kindberg 2002, S. 644) Abbildung 8 stellt die beschriebene Fragmentierung und Allokation einer Relation noch einmal schematisch dar. Fragmentierung Allokation Station 1 Relation Station 2 Global Relation Fragmente Physisches Abbild Abbildung 8: Fragmentierung und Allokation einer Relation nach Ceri und Pelagatti (1984, S. 40) Die Allokation mit Replikation stellt ein häufig genutztes Konzept dar, welches Grundlage dafür ist, Informationen ohne eine Verbindung zum zentralen Server auf Knoten zur Verfügung zu stellen. Entsprechend soll es im Folgenden näher betrachtet werden. 3 Theoretische Grundlagen 18 3.3 Replikation Replikate sind Kopien von Datenobjekten, also Tabellen, Tabellenpartitionen, Datensätze oder Dateien, in verschiedenen Systemen, die konsistent zueinander gehalten werden sollen. Geläufig ist für sie auch die Bezeichnung Snapshot oder materialisierte Sicht. Für die Repliken verwaltenden Stationen ist der Begriff Repliken-Manager geläufig. (Coulouris, Dollimore und Kindberg 2002, S.644; Saito 2005, S. 1) Durch die beschriebene Allokation mit Replikation kann eine hohe Verfügbarkeit von Daten erreicht werden. Insbesondere die Lokalität von Daten kann durch Repliken an den entsprechenden Knoten erhöht und so die Zugriffszeit verkürzt werden, was insbesondere auch für die Verfügbarkeit von Daten auf entkoppelten Knoten gilt die zeitweise autonom vom verteilten Datenbanksystem agieren sollen. Caching und Hoarding sind dabei verwandte Techniken bei denen Daten vervielfältigt werden. Caching beschreibt dabei das dynamische Zwischenspeichern von angefragten Daten zur Beschleunigung von Abfragen und der Verbindungsentlastung beim Online-Betrieb, Hoarding die Erweiterung dieses Verfahrens durch „vorsorgliches“ Anfordern von Daten von denen vermutet wird, dass diese zukünftig benötigt werden. Während Caching- und Hoarding-Techniken nur geringen Einfluss auf die Wahl der lokal bzw. offline zur Verfügung stehenden Informationen zulassen, erlaubt Replikation durch die in Abschnitt 3.2 beschriebene Fragmentierung und Allokation eine sehr genaue Auswahl der Daten. (Höpfner, Türker und König-Ries 2005, S. 181ff.) So ist die grundsätzliche Möglichkeit der unverbundenen Arbeit, etwa bei archäologischen Außenarbeiten anhand der Repliken gegeben. Werden auf mehreren Repliken-Managern Änderungen akzeptiert, also nicht nur auf einem zentralen Server, und sollen diese zu einem späteren Zeitpunkt konsolidiert werden, spricht man von der sogenannten Multi-Master-Replikation. Das komplementäre Gegenstück hierzu wird als Master-Slave-Replikation bezeichnet, in der ein designierter Server über die verbleibenden Knoten wie über Sklaven „herrscht“. Lokale Änderungen sind in diesem Fall gar nicht möglich, oder werden im Zweifelsfall überschrieben. (Saito 2005, S. 3; Petersen, M. J. Spreitzer u. a. 1997, S. 288) Abbildung 9 stellt die beiden Formen exemplarisch gegenüber. Vergleicht man die beiden Konfigurationen, ist intuitiv klar, dass ein Single-Master-Systeme einfacher umzusetzen ist. Da Schreibzugriffe nur auf einem Knoten vorkommen können, werden eventuelle Konflikte sofort erkannt und können dem Benutzer transparent mitgeteilt werden. Updates müssen dann lediglich in eine Richtung transportiert werden. Nachteilig ist jedoch die Gefahr die von einem Single Point of Failure im Master-Knoten ausgeht. Im Gegensatz dazu kann die Multi-Master-Konfiguration diesen Nachteil durch 3 Theoretische Grundlagen Slave 1 Master 19 Slave 2 (a) Single-Master-System Master 1 Master 2 Master 3 (b) Multi-Master-System Abbildung 9: Exemplarische Darstellung eines Single-Master & Multi-Master-Systems in Anlehnung an Böszörmenyi und Schönig (2013, Pos. 496). Pfeile geben die Transportrichtung von Datensätzen an. hohe Verfügbarkeit mehrerer Knoten ausgleichen. Ähnlich wie bei der parallelen Nutzung durch viele Clients in einer zentralisierten Datenbank, kann es aber hier zu einem konkurrierenden Schreibzugriffen zwischen den Knoten kommen. (Saito 2005, S. 3) Diesem Umstand muss durch eine Transaktionsverarbeitung und Serialisierung der Schreibvorgänge begegnet werden. 3.4 Transaktionsverarbeitung Kemper und Eickler (2009) definieren den Begriff Transaktion in einem Datenbanksystem wie folgt: „Eine Transaktion stellt eine Folge von Datenverabeitungsbefehlen (lesen, verändern, einfügen, löschen) dar, die die Datenbasis von einem konsistenten Zustand in einen anderen - nicht notwendigerweise unterschiedlichen - konsistenten Zustand überführt.“ (ebd., S. 279) In diesem Zusammenhang kommt das Akronym ACID zum tragen welches die geforderten Eigenschaften einer Transaktion beschreibt und „Kernprinzipien der Architektur von relationalen Datenbanksystemen“ (Edlich u. a. 2011, S. 30) darstellt: • Atomarität (Atomicity): Eine Transaktion wird als kleinste, nicht mehr zerlegba- re Einheit betrachtet und wird ausschließlich im Gesamten festgeschrieben. „[Sie] muss alles oder nichts erledigen.“ (Coulouris, Dollimore und Kindberg 2002, S. 546) Werden alle Änderungen einer Transaktion zurückgesetzt, weil sie nicht komplett ausgeführt werden kann, so spricht man vom Zurücksetzen einer Transaktion. (Dadam 1996, S. 185) • Konsistenz (Consistency): Beim Abschluss einer Transaktion muss ein konsistenter Datenbestand zurückbleiben, der den Bedingungen des definierten Daten- 3 Theoretische Grundlagen 20 bankschemas genügt, dessen Integrität also nicht verletzt wird. (Dadam 1996, S. 185) • Isolation: Parallel ausgeführte Transaktionen dürfen sich nicht gegenseitig beein- flussen. Damit einher geht die Forderung nach der Serialisierbarkeit der parallel ausgeführten Operationen bei der das Ergebnis der Operationen mindestens durch eine „serielle (also nicht-überlappte) Ausführungsreihenfolge dieser Transaktionen erzeugbar sein muss.“ (ebd., S. 185) • Dauerhaftigkeit (Durability): Eine abgeschlossene Transaktion bleibt dauerhaft erhalten und ihre Wirkung kann nur durch eine „kompensierende Transaktion“ aufgehoben werden. (Kemper und Eickler 2009, S. 283) Die Struktur einer Transaktion besteht auch im verteilten DBS aus einer Folge von Leseund Schreibanweisungen, welche in Begin of Transaction und End of Transaction, bzw. Rollback geklammert sind. In einem verteilten Datenbanksystem können dabei mehrere Knoten beteiligt sein. Der Rechner an dem eine Transaktion gestartet wird ist dabei der Heimatknoten und übernimmt in der Regel die Koordination der Transaktion. Finden alle Operationen der Transaktion am Heimatknoten statt, spricht man von einer lokalen, andernfalls von einer globalen Transaktion. Abbildung 10 stellt eine globale Transaktion über drei Knoten exemplarisch dar. Bei einer globalen Transaktion muss dabei sichergestellt werden, dass alle beteiligten Knoten getreu dem ACID-Paradigma am Ende der Transaktion zum selben Ergebnis kommen und die Änderungen entweder alle festschreiben oder alle zurücknehmen. (Rahm 1994, S. 114) T1 Starte ST T11 Knoten B Knoten A Starte ST T12 Knoten C Abbildung 10: Beispiel einer globalen Transaktion koordiniert durch Knoten A, welcher Subtransaktionen an Knoten B und C startet. (Darstellung nach Dadam (1996, S. 186)) Für die Koordination von verteilten Transaktionen wurden verschiedene Verfahren entwickelt. Abbildung 11 stellt das 2-Phasen-Commit-Protokoll (2PC-Protokoll) das, das ausgehend von einer Koordinator-Station eine Transaktion im System in zwei Phasen kommuniziert. Durch sie wird sichergestellt, dass eine Transaktion immer auf allen beteiligten 3 Theoretische Grundlagen 21 Agenten-Stationen akzeptiert oder abgelehnt wird, sie also auch im verteilten System atomar erscheint. In allen Phasen des 2PC-Protokolls besteht dabei jedoch die Möglichkeit, dass die Transaktion nicht nur auf Grund einer Integrationsverletzung des Datenbankschemas, sondern wegen einer fehlerhaften Kommunikation abgebrochen werden muss. (Kemper und Eickler 2009, S. 485f.) A1 K A1 A2 K A2 A3 PREPARE K A3 FAILED/READY COMMIT/ABORT ACK Abbildung 11: Nachrichtenaustausch zwischen Koordinator K und beteiligten Agenten beim 2-Phase-Commit-Protokoll. (ebd., S. 486) In Kapitel 2 wurde festgestellt, dass der Zweck des Mutter-Kind-Konzepts die Arbeit autonom von einer ständigen Netzwerkverbindung sein soll. Dementsprechend sind restriktive Verfahren wie das 2PC-Protokoll für diese Belange ungeeignet. Dementsprechend müssen die Gedanken zum verteilten Datenbanksystem um die Komponente der Mobilität ergänzt werden. Hierfür wird im Folgenden das mobile verteilte Datenbanksystem vorgestellt. 3.5 Mobile verteilte Datenbanksysteme Mobile Geräte, wie sie häufig bei archäologischen Arbeiten verwendet werden, insbesondere „Mobile Standardcomputer“ wie Laptops, Notebooks, Subnotebooks und TabletPCs können ebenfalls Bestandteil eines verteilten Datenbanksystems sein. Sie werden treffend als mobile Knoten bezeichnet und sind zumeist über eine temporäre, drahtlose Netzwerkverbindung in das System integriert. Sie erweitern so die Definition des verteilten Datenbanksystems hin zu einem mobilen verteilten Datenbanksystem. (Höpfner, Türker und König-Ries 2005, S. 9ff.) Durch ihre „schwache“ Anbindung sind sie häufig vom Gesamtsystem getrennt und verursachen so Netzwerkpartitionierungen. Während diese Fehlersituation auch bei „normalen“ Knoten eintreten kann, ist dies bei mobilen Knoten wesentlich häufiger der Fall. (Mutschler und Specht 2004, S. 65) Die Klassifikation von verteilten Datenbanksystemen lässt sich für mobile verteilte Datenbanksysteme in der Dimension der Verteilung um den Faktor Mobilität erweitern. Abbildung 12 deutet an, 3 Theoretische Grundlagen 22 wie die Architektur des verteilten Datenbanksystems durch die oben definierten Kriterien beeinflusst wird. Verteilung Mobile Homogene DBMS Mobile Multidatenbanksysteme Mobilität Mobile Heterogene DBMS Mobile Heterogene Multidatenbanksysteme Autonomität verteilte Datenbanksysteme Zentralisierte Datenbanksysteme Heterogenität Abbildung 12: Dimensionen (mobiler) verteilter Datenbanksysteme Die konkrete Umsetzung eines Datenbanksystems fällt dabei natürlich immer als ein Kompromiss zwischen den Spannungsfeldern aus. Aus Abschnitt 2 ist bekannt, dass in erster Linie die Mobilität der Nutzer und damit einhergehend ihrer Geräte interessant ist. Darüber hinaus ist ein hoher Grad an Autonomie der Knoten gefragt, der es ihnen erlaubt auch ohne Kontakt zum globalen System im Sinne der in Abschnitt 3.1 vorgestellten Kommunikations- und Ausführungsautonomie Änderungen am Datenbestand vorzunehmen (s. auch Multi-Master-System Abschnitt 3.3). Während in Sachen Hard- und Software potentiell ein hoher Grad an Heterogenität der Knoten durch OpenInfRA unterstützt wird, kommt mit PostgreSQL lediglich ein Datenbanksystem zum Einsatz, auf dem das Projektdatenbankschema installiert ist. Das spricht in diesem Punkt sowohl für eine gewisse Homogenität als auch für eine geringe Design Autonomie. Allgemein lässt sich das System als ein mobiles Datenbanksystem einordnen für das im weiteren die möglichen Architekturen betrachtet werden sollen. 3.6 Architektur mobiler Datenbanksysteme Für mobile Datenbanksysteme bestehen zwei grundlegende Architekturen, welche als erweiterte Client-Server-Architektur und als Middleware-Architektur mit Replikati- 3 Theoretische Grundlagen 23 onsserver bezeichnet werden. Sync-Client Mobile DBMS Replikatauswahl Synchronisation Sync-Server Server DBMS DB Mobile DB Master-DB Mobiler Client DB-Server (a) Erweiterte Client-Server-Architektur Replikationsserver (b) Middleware-Architektur Abbildung 13: Architekturen mobiler Datenbanksysteme nach Höpfner, Türker und König-Ries (2005, S. 218f.) Bei der erweiterten Client-Server-Architektur kommunizieren der mobile Knoten, hier als Client bezeichnet und ein stationärer Server direkt miteinander, verfügt aber im Unterschied zur klassischen Client-Server-Architektur über einen eigenen Datenbankserver, der die Funktion des Servers übernehmen kann, wenn keine Verbindung besteht (vgl. Abbildung 6). „Welchen Grad der Autonomie ein mobiler Client dabei erreichen kann, hängt von seiner Leistungsfähigkeit und den lokal gespeicherten Daten ab. Diese reicht von einem einfachen datensatzorientierten Zugriff auf Anfrageergebnisse bis hin zur Möglichkeit, beliebige SQL-Anfragen und Änderungsoperationen auf dem lokal replizierten Datenbankausschnitt auszuführen.“ (Höpfner, Türker und König-Ries 2005, S. 218) Die Middleware-Architektur nutzt einen zwischengeschalteten Replikationsserver, der zwischen Server und Client vermittelt. Insbesondere wenn dieser Replikationsserver auch auf einen Datenbestand zugreifen kann, entlastet dies die zugeschalteten Server und erhöht die Performanz. Die Nutzung eines eigenen Replikationsservers wird für OpenInfRA nicht möglich sein, da nicht sichergestellt werden kann, dass mobile Knoten immer auf diesen zugreifen können um eine Synchronisation durchzuführen. Dementsprechend kommt nur eine erweiterte Client-Server-Architektur in Frage. 3.7 Abgrenzung MDBMS und VDBMS Da mobile Datenbanksysteme zeitweise entkoppelt voneinander arbeiten können, unterscheiden sich deren Merkmale mitunter deutlich von denen eines „einfachen“ verteilen Datenbanksystems. In der Regel finden keine Fragmentierung der Daten auf verschiedene Knoten statt sondern es werden Kopien der Master-Daten eingelagert um es den mobilen Knoten zu ermöglichen, auf diese auch im unverbundenen Zustand zuzugreifen. Das lokale Datenbankschema wird hierfür aus dem globalen Schema abgeleitet über 3 Theoretische Grundlagen 24 Tabelle 3.1: Vergleich verteilter Datenbanksystemarchitekturen nach Höpfner, Türker und König-Ries (ebd., S. 221) Mobiles DBS Verteiltes DBS X g!l (X) (X) X X X X g!l X X X - Aufteilung Replikation Globales Schema Verteilte Anfragen Globale Transaktionen Transparenz Lokale Autonomie Heterogenität das der Zugriff erfolgt. Eine Besonderheit ist dabei auch, dass zumindest im unverbundenen Zustand keine globale Transaktionskontrolle möglich ist. Die Verbindungsunterbrechung wird dabei nicht als Fehler, sondern als Normalfall angesehen, für den Konfliktvermeidungsstrategien und Konfliktauflösungsstrategien bei der Synchronisation betrachtet werden müssen. (Höpfner, Türker und König-Ries 2005, S. 219ff.) Um die verschiedenen Datenbanksysteme von einander abzugrenzen, werden ihre Architekturen in Tabelle 3.1 gegenübergestellt. Gleicht man die Eigenschaften gegen die Anforderungen an das Mutter-Kind-Konzept ab, ist ersichtlich, dass ein mobiles verteiltes Datenbanksystem umzusetzen ist, in dem eine globale Transaktionierung nur bedingt umsetzbar ist, die einzelnen Datenbanksysteme auf den Knoten dafür aber autonom arbeiten und auf heterogenen Systemen installiert sein können. Es ist deshalb im folgenden zu klären, wie die Konsistenz des Datenbestand trotzdem gesichert werden kann. 3.8 Transaktionen in mobilen verteilten Systemen Transaktionen auf nicht verbundenen mobilen Knoten werden immer lokale Transaktionen sein, welche als Subtransaktion einer langandauernden globalen Transaktion betrachtet werden können. Daraus folgt eine geschachtelte Server-Transaktion der Tiefe 2, welche in Abbildung 14 dargestellt ist. Die globale Server-Transaktion endet mit der Synchronisation zwischen den Änderungen die auf dem mobilen Knoten und dem stationären Server vorgenommen wurden. Das bedeutet zunächst, dass die lokalen Transaktionen auf dem Client nur vorläufig abgeschlossen sind. Die durch den lokalen Datenbankserver garantierte Konsistenz, die durch Mehrbenutzersynchronisation gewährleistete Isolation und die Einhaltung der Zugriffsrechte sind an diesem Punkt also lediglich für die lokale Umgebung gesichert. Sie 3 Theoretische Grundlagen 25 Server-Transaktion Client-Transaktionen Synchronisation Server Zeit Mobiler Client Abbildung 14: Transaktionen in mobilen Datenbanksystemen. (ebd., S. 226) werden erst beim Wiedereintritt des mobilen Knoten in das System zum Zeitpunkt der Synchronisation mit dem Server zum Abschluss gebracht und damit dauerhaft. Unter Berücksichtigung des bereits vorgestellten ACID-Paradigmas wird somit klar, dass für den globalen Datenbestand in der Zeit zwischen den Synchronisationphasen die Anforderung an Konsistenz gelockert ist, da der Datenbestand zwischen Client und Server unterschiedlich ausfällt. Diese Erkenntnis wurde durch Eric Brewer im sogenannten CAPTheorem für verteilte System beschrieben und kann analog für mobile verteilte Systeme betrachtet werden. 3.9 Eventually Concistency Im Jahr 2000 stellte Eric A. Brewer das sogenannte CAP-Theorem auf, welches zwei Jahre später durch Seth Gilbert und Nancy Lynch formal bestätigt werden konnte, und die gewünschten Eigenschaften eines verteilten Systems wie folgt beschreibt: • Konsistenz (Consistency): Die Definition zur Konsistenz im Sinne das CAP-Theo- rems ist analog zu der des bereits bescriebenen ACID-Paradigmas. Die verteilte Datenbank ist nach einer Transaktion in einem konsistenten Zustand. Dies bedeutet, dass nach einer Änderung im verteilten Datenbanksystem, auch alle Knoten diese Änderung in nachfolgenden Leseoperationen widerspiegeln. (Edlich u. a. 2011, S. 31) • Verfügbarkeit (Availability): Die Verfügbarkeit beschreibt eine „akzeptable Reaktionszeit“ für einen konkreten Anwendungsfall. Beispielsweise könnte eine hochak- 3 Theoretische Grundlagen 26 tive E-Commerce-Plattform eine Verfügbarkeit in Millisekunden definieren. (Edlich u. a. 2011, S. 32) Für ein verteiltes System, das einer schwankenden Netzwerkverbindung unterliegt, ist aber auch die bloße Anforderung nach Verfügbarkeit innerhalb des entkoppelten Teilnetzes denkbar, also die Möglichkeit auch hier eine Antwort auf Anfragen zu bekommen. • Ausfalltoleranz (Partition Tolerance): Ausfalltoleranz beschreibt die Fähigkeit des Systems den Ausfall eines Knotens zu kompensieren und weiterhin auf Anfragen zu reagieren. (ebd., S. 32) Die Vermutung Brewers war es, dass die Eigenschaften Konsistenz, Verfügbarkeit und Ausfall- bzw. Partitionstoleranz in einem verteilten System nie in vollem Maße gemeinsam erfüllt werden können. Infolge dessen müsse bei der Architektur eines jeden verteilten Systems ein Kompromiss zwischen diesen Größen gewählt werden, wobei die Abstufungen der „Wahl“ dabei nicht absolut sind. Ein Beispiel hierfür ist ein Cluster aus Relationalen Datenbanksystemen welches in der Regel auf eine Kombination aus absoluter Konsistenz und hoher Verfügbarkeit (CA) setzen wird. Es können also Netzwerkpartitionierung weniger gut kompensiert werden. Für Anwendungen, in denen hingegen der Ausfall eines von der Transaktion unberührten Servers nicht dazu führen darf, dass eine Änderung verloren geht, wird die Kombination aus Konsistenz und Partitionstoleranz (CP ) präferiert. Ein gutes Beispiel hierfür ist die Anwendung im Finanzwesen, bei der z.B. Überweisungen immer zielführend sein müssen. (Brewer 2000; Gilbert und Lynch 2002; Vogels 2009) Für eine Anwendung wie OpenInfRA, welche durch eine fehlende Netzwerkverbindung in Teilnetze partitioniert wird und das Daten in diesen Teilnetzen trotzdem „verfügbar“ machen will, folgt aus dem Theorem, dass in erster Linie die Konsistenzbedingungen gelockert werden müssen. In der in Abbildung 15 gezeigten CAP-Pyramide bewegt man sich nun auf der Kante AP . Dies unterstreicht die getroffenen Feststellungen zur Transaktionierung in mobilen verteilten Systemen, bei denen bei einer langen Server-Transaktion ein inkonsistenter Zustand zwischen Client und Server gebilligt wird. Um eine bessere Betrachtung der Konsistenz in verteilten Systemen zu ermöglichen, wurde deshalb das alternative Konsistenzmodell BASE durch Brewer vorgeschlagen. BASE steht für Basically Available, Soft State und Eventually Consistent. In diesem Modell wird die Konsistenz der Verfügbarkeit untergeordnet, indem sie als ein „Übergangsprozess“, statt wie bisher als ein fester Zustand nach einer Transaktion betrachtet wird. Das bedeutet, dass BASE-Systeme letztendlich Konsistenz erreichen, der konkrete Zeitpunkt jedoch an dem dies geschieht ist aber unbestimmt. Für diesen Sachverhalt setzt sich der Begriff „eventual consistency“ durch. (Edlich u. a. 2011, S. 32) Bei dieser besonderen Form der schwachen Konsistenz wird durch das System lediglich garantiert, dass wenn 3 Theoretische Grundlagen 27 Konsistenz (C) Verfügbarkeit (A) Partitionstoleranz (P) Abbildung 15: Nach dem durch Brewer beschriebenem CAP-Theorem muss jedes verteilte System einen Kompromiss zwischen Konsistenz, Verfügbarkeit und Ausfalltoleranz eingehen. Bildlich darstellen lässt sich dies an einem Spannungsdreieck, an dessen Kanten sich die Systeme einordnen lassen. keine neuen Änderungen der Daten hinzukommen und sich alle Knoten über Änderungen ausgetauscht haben, letztendlich alle Änderung in einer Abfrage reflektiert werden. (Vogels 2009) 3.10 Synchronisation Wie im zentralisierten Datenbanksystem ist es auch nötig die Änderungen nebenläufiger Transaktionen einer langen Server-Transaktion zu einem Schedule zu konsolidieren, die die Transaktionshistorien der Knoten zusammenführt und dabei die Konsistenz des Datenbestands wahrt. Sie schützen wie bei der Mehrbenutzersynchronisation auf einer zentralisierten Datenbank vor sogenannten Mehrbenutzeranomalien hervorgerufen durch Phänomene. Das resultierende Schedule ist nur dann serialisierbar, wenn diese Phänomene ausgeschlossen werden können: • Dirty Write (P0): Eine Transaktion ändert eine Zeile, die bereits durch eine parallele Transaktion geändert wurde. Beim Zurückrollen einer dieser Transaktionen ist nun nicht klar, welcher Wert den korrekten Zustand darstellt. • Dirty Read (P1): Eine Transaktion T 2 liest einen Wert einer nicht abgeschlossenen Transaktion T 1. Wird T 1 zurückgerollt, hat T 2 einen nicht konsistenten Zustand gelesen. • Non-repeatable Read (P2): Eine Transaktion liest aufgrund einer parallel ausgeführ- ten Transaktion bei wiederholtem Zugriff unterschiedliche Werte. P2 kann in weitere Phänomene differenziert werden: – Phantoms (P3): Stellt einen Sonderfall von P 2 dar, bei dem durch wiederholte Anwendung eines Suchprädikats unterschiedliche Wert zustande kommen. 3 Theoretische Grundlagen 28 – Read Skew (A5A): Eine Transaktion T liest zwei durch eine Integritätsbedingung verknüpfte Objekte a und b. b wird dabei durch eine konkurrierende Transaktion verändert noch bevor T b gelesen hat und stellt unter Umständen die Verletzung einer Integritätsbedienung fest. – Write Skew (A5B): Zwei konkurrierende Transaktionen lesen zwei durch Integritätsbedingungen verknüpfte Objekte und ändern jeweils eines dieser Objekte. Beim Abschluss beider Transaktionen ist es nun möglich, das die Integritätsbedienung im Ergebnis verletzt ist. • Lost Update (P4): Zwei offene Transaktionen ändern denselben Wert und schließen erfolgreich ab, wodurch einer der Werte sofort überschrieben wird. (Höpfner, Türker und König-Ries 2005, S. 233ff.) Um die Isolation der Transaktionen zu gewährleisten und diese Anomalien zu umgehen, kann im Zusammenhang von mobilen verteilten Systemen die Snapshot-Isolation angewandt werden. Dabei wird mit dem Start einer Server-Transaktion ein Snapshot (s.a. Abschnitt 3.3) der Daten auf dem Client kreiert, auf den alle folgenden Lese- und Schreiboperationen angewandt werden. Änderungen lokaler Transaktionen des jeweils anderen Knoten bleiben so unsichtbar, sodass die Anomalien P0, P1, P2 und A5A nicht auftreten können. Zum Abschluss der Transaktion muss der Snapshot nun wieder mit der Datenbank synchronisiert werden. Die Transaktion erhält dafür einen eindeutigen Zeitstempel der monoton steigend und größer als alle bereits vergebenen Zeitstempel sein muss. Anomalie P4 wird umgangen, wenn die Transaktion nur dann akzeptiert wird, wenn kein Commit-Zeitstempel anderer Transaktionen zwischen ihren Start- und CommitZeitstempeln liegt und durch keine Schreiboperationen in Konflikt steht. Nicht verhindert werden, können jedoch die Anomalien P3 und A5B, welche erst bei der Synchronisation der Transaktionen erkannt werden können. (ebd., S. 236) Für die Synchronisation wird dabei in die Gruppen der pessimistischen und der optimistischer Verfahren unterschieden, die im Folgenden betrachtet werden. 3.10.1 Pessimistische Synchronisationsverfahren Pessimistische Synchronisationsverfahren zielen darauf ab, Konflikte bereits von vornherein zu vermeiden. „Sie verhindern bereits während der Ausführung einer Transaktion das Auftreten unerlaubter Schedules.“ (ebd., S. 226) Das bekannteste Verfahren ist hier das 2-Phasen-Sperrprotokoll, bei dem für jeden Leseund Schreibzugriff Sperren auf die betroffenen Datenobjekte angefordert werden. Potentiell konkurrierende Transaktionen, die auf gesperrte Objekte zugreifen wollen, werden 3 Theoretische Grundlagen 29 dann solange blockiert, bis wiederum die benötigte Sperre auf das Objekt gewährt wird. Die Serialisierbarkeit von Transaktionen wird bei dem Verfahren durch die strikte Trennung in zwei Phasen gesichert: der Anforderung von Sperren und der Freigabe gehaltener Sperren. Um die in Abschnitt 3.8 beschriebenen langen Server-Transaktionen mit diesem Verfahren zu unterstützen, müssten vor dem „Offlinegehen“ der mobilen Knoten Sperren auf die benötigten Datenobjekte eingerichtet werden. Dies ist durch das Wissen über die Allokation der Objekte möglich, bedeutet aber, dass diese Objekte für eine lange Zeit nicht zur Verfügung stehen werden. Ein in der Praxis gebräuchliches Verfahren welches auf dem 2-Phasen-Sperrprotokoll begründet, ist das Check-out/Check-in-Verfahren. Hier wird das Konzept der flüchtigen Sperren um sogenannte Langzeitsperren erweitert, welche dauerhaft eingelagert werden können. Dabei wird beim „Check-out“ eines mobilen Knoten von Datenobjekten zur entkoppelten Arbeit vermerkt, dass diese ausschließlich gelesen werden dürfen und Sperranfragen paralleler Transaktionen nicht blockiert, sondern abgebrochen werden müssen. Bei der Reintegration der Änderungen auf dem Client ist es durch die vorher eingeholten Sperren möglich die ACID-Eigenschaften der langen Transaktion zu sichern. Ein erheblicher Nachteil bei der Nutzung von konfliktvermeidenden Strategien ist es, dass insbesondere Datenobjekte auf die häufig gemeinsam zugegriffen werden muss durch Sperren der langen Server-Transaktionen nicht verfügbar sein können. Das macht sie in solchen Fällen zu einer schlechten Wahl. 3.10.2 Optimistische Synchronisationsverfahren Optimistische Transaktionsverfahren können eingesetzt werden, wenn Sperrverfahren für die Server-Transaktion nicht geeignet sind, etwa wenn hierdurch die Verfügbarkeit der Daten eingeschränkt wäre. Es wird davon ausgegangen, dass Konflikte eher selten auftreten und erkannt werden können, weshalb sie deshalb nicht proaktiv verhindert, sondern nach Auftreten entdeckt und gelöst werden. Die dabei zu durchlaufenden Phasen der Lese-, Validierungs- und Schreibphase sind in Abbildung 16 dargestellt. LeseBOT Validierungs- Schreibphase EOT Abbildung 16: Die Phasen der optimistischen Synchronisation (ebd., S. 226) 3 Theoretische Grundlagen 30 Tabelle 3.2: Mögliche Konflikte bei datenorientierter Synchronisation (ebd., S. 237) BI AI CI Operation Bedingung X X X X X X X X X Löschen Einfügen Ändern Ändern BI 6= CI AI 6= CI BI 6= CI ^ AI 6= CI Konfliktart Löschkonflikt Einfügekonflikt Änderungslöschkonflikt Änderungskonflikt Die Lesephase stellt hier die Zeit dar, in der der mobile Knoten nicht mit einem stationären Knoten verbunden ist. Änderungen werden lokal akzeptiert, aber erst beim Wiedereintritt in das globale System, d.h. im Augenblick des Commits der Server-Transaktion, validiert. Konflikte mit bereits beendeten Transaktionen werden dabei rückwärtsgerichtet aufgedeckt. Sind keine Konflikte festzustellen, werden die lokalen Änderungen in der Schreibphase übertragen. Andernfalls muss die entsprechende Client-Transaktion lediglich zurückgesetzt werden. Um mit dem Zurücksetzen nicht alle Änderungen dieser Transaktion zu verlieren, werden dabei Synchronisationsalgorithmen genutzt, die maßgeblich durch die zur Synchronisation zur Verfügung gestellten Informationen geprägt sind. Beim Prinzip der datenorientierte Synchronisation werden für jede Änderungen Vorher(BI; before image) und Nachherabbilder (AI; after image) der betroffenen Objekte übermittelt. Diese können miteinander und gegen den aktuellen Stand auf dem Server (CI; current image) verglichen werden, um Konflikte aufzudecken. Zur Identifikation der Objekte in Datenbanksystemen dient dafür in der Regel der Primärschlüssel der Zeile, diesem kommt also eine besondere Rolle zu. Tabelle 3.2 schlüsselt mögliche Konfliktsituationen auf und zeigt unter welchen Bedingungen sie aufgedeckt werden. Die Konfliktlösung kann nun durch schema- oder inhaltsbasierende Regeln definiert werden, die auf die Objekte angewandt werden. Alternativ ist das manuelles Eingreifen möglich bei dem eine Konfliktlösung bestimmt und die Transaktion zu einem späteren Zeitpunkt neu ausgeführt wird. Die in der Tabelle beschriebenen Löschkonflikte treten auf, wenn auf einem mobilen Knoten Zeilen gelöscht wurden, diese aber in der Zwischenzeit auf der Server-Datenbank durch ein Update betroffen waren. Einfügekonflikte entstehen, wenn in beiden beteiligten Datenbanken der derselbe Primärschlüssel genutzt wurde. In diesem Fall muss ein neuer Primärschlüssel zugewiesen und der Client-Datenbank vermittelt werden. Die ebenfalls aufgeführten Änderungskonflikte bestehen zwischen Datensätzen, die in beiden Datenbanken bearbeitet wurden. Änderungslöschkonflikte bilden das logische Gegenstück zu Löschkonflikten, bei denen die betreffende Zeile auf der Server-Datenbank gelöscht wurde. In der Regel besteht hier die Lösung darin, die betroffene Zeile wiederherzustellen. (Höpfner, Türker und König-Ries 2005, S. 238) 3 Theoretische Grundlagen 31 Bei der transaktionsorientierten Synchronisation wird der datenorientierte Ansatz um Informationen zur Art der ausgeführten Operation (Einfügen, Ändern, Löschen) und die lokalen Transaktionsklammern erweitert. So ist es möglich, bei der Synchronisation und dem Zurücksetzen von Client-Transaktionen die Atomarität dieser zu erhalten. (Höpfner, Türker und König-Ries 2005, S. 239) Die semantikbasierte Synchronisation ersetzt den Vergleich der before, after, und current images mit einem Akzepttanztest. Die Client-Transaktion wird auf dem Server erneut ausgeführt und muss dabei diesem Test genügen, um als valide erachtet zu werden. Sollte dies nicht der Fall sein, wird eine Konfliktbehandlung angestoßen, die Teil der Synchronisationsinformation ist. Die semantische Synchronisation kann dadurch von anwendungsspezifischen Informationen profitieren und so intelligentere Entscheidungen treffen. (ebd., S. 239) In diesem Kapitel wurde das Konzept der verteilten Datenbanken vorgestellt und den Anforderungen des Mutter-Kind-Konzepts entsprechend um die Problematik der mobilen verteilten Datenbank ergänzt. Es wurde gezeigt, dass für mobile Knoten keine zentral kontrollierte Transaktionierung möglich ist und deshalb die „abbildisolierte Transaktionierung“ zutragen kommen muss, bei der der gemeinsame Datenbestand zwischen Server und Client nach einer unbestimmt langen Zeit letztendlich wieder synchronisiert werden muss. Im folgenden Kapitel soll nun auf die technischen Möglichkeiten um das Datenbanksystem PostgreSQL eingegangen werden, um zu prüfen ob bzw. welche Implementierung für die Umsetzung des Mutter-Kind-Konzepts genutzt werden kann. 4 Technik 32 4 Technik Während die Entwicklung von PostgreSQL nunmehr 20 Jahre zurückreicht, ist Replikation als Kernkomponente für das Datenbanksystem erst 2008 in den Fokus der Hauptentwickler gefallen. Tom Lane, einer der führenden Köpfe für PostgreSQL, beschreibt die Gründe hierfür in einer Nachricht an die Community: „Historically the project policy has been to avoid putting replication into core PostgreSQL, so as to leave room for development of competing solutions, recognizing that there is no ‚one size fits all‘ replication solution. However, it is becoming clear that this policy is hindering acceptance of PostgreSQL to too great an extent, compared to the benefit it offers to the add-on replication projects.“ (Lane 2008) Aus dieser Einsicht hervorgehend bietet PostgreSQL native Optionen die im Folgenden dieses Kapitels kurz beschrieben werden sollen. Anschließend werden Implementierungen Dritter vorgestellt, die während der Bearbeitung als mögliche Lösungswege ausgemacht wurden. Abschließend wird die Umsetzung der Replikation im proprietären GISSystem Esri ArcGIS betrachtet. 4.1 Native Replikation mit PostgreSQL PostgreSQL bietet das Verfahren der Physical Log Shipping Replication (PLSR), bei dem die durch das Datenbanksystem angelegte Write-Ahead-Log-Dateien (WAL) zu den angebundenen Servern versandt werden. Die Datenbanktabellen müssen für diese Form der Replikationstechnik nicht angepasst werden und die Konfiguration erfolgt durch den Administrator in Konfigurationsdateien des Datenbankservers. Die WAL-Dateien befinden sich in einer PostgreSQL-Installation im Verzeichnis pg_xlog des Datenverzeichnis ($PGDATA). Sie stellen für einen PostgreSQL-Server das Logbuch der Datenänderungen dar und werden in erster Linie für die Recovery-Komponente der Datenbank genutzt. Sollte der Server also durch eine Fehlersituation unerwartet beendet werden, kann die Konsistenz der Daten durch Wiedereinspielen der WAL-Einträge wiederhergestellt werden. Da das Write-Ahead-Log immer alle Änderungen des Datenbankclusters enthält, wird bei der Replikation mit Hilfe dieser Dateien auch immer der 4 Technik 33 gesamte Cluster vervielfältigt. Die aktuell zur Verfügung stehenden Replikationstechniken werden im Folgenden kurz skizziert. 4.1.1 Standby Server Zum Bereitstellen eines Standby-Servers werden die WAL-Dateien an einen oder mehrere verbundene Server übertragen. Die Synchronisation erfolgt dabei asynchron und in der Regel nachdem ein WAL-Segment die vorgesehene Dateigröße erreicht hat. Beim Empfänger wird das WAL-Segment anschließend durch Nutzung der Recovery-Komponente des Datenbankservers interpretiert und der neue Datenbestand sequentiell hergestellt. Der Sender der WAL-Segmente fungiert hier als Master des Replikationsclusters der die Slave-Server „beliefert“. Die Standby-Server dienen in erster Linie als Backup und zur Sicherung der Hochverfügbarkeit. Fällt der Master-Server aus, kann einer der StandbyServer als sein Nachfolger auserkoren werden. (PostgreSQL Global Development Group 2013f) 4.1.2 Hot-Standby-Replication Bei der Hot-Standby-Replication stehen die Standby-Server für Anfragen zur Verfügung, so dass sie als Read-only Server genutzt werden können. Durch den Parameter hot standby wird der Server dabei für Queries verfügbar gemacht, sobald dieser die dazu nötigen WAL-Daten vom zentralen Master-Server eingelesen hat. Es besteht aber auch in dieser Konfiguration keine Möglichkeit, Schreibzugriffe an einen solchen Read-only Server zu richten. (ebd.) 4.1.3 Streaming-Replikation Sowohl für Standby als auch Hot-Standby-Server gilt, dass das „Lag“, also die Zeit bis zum Herstellen des aktuellsten Datenbestands auf dem vorgeschalteten Master-Server, die Dauer bis zum Erhalt und zur Auswertung der WAL-Segmente ist. Um den Datenbestand des Standby-Servers möglichst nah dem des Master-Servers zu halten, steht seit PostgreSQL 9.0 die sogenannte Streaming-Replication zur Verfügung. Dabei werden über eine stehende Verbindung zwischen Master und Standby einzelne WAL-Einträge übertragen, bzw. „gestreamt“. So muss mit der Übertragung nicht gewartet werden bis das gesamte WAL-Segment abgeschlossen ist. Auch hier erfolgt die Replikation asynchron, immer erst nach dem Abschluss einer Transaktion. Dieses Verfahren wird mit Bezug zum WAL-Log auch als Physical log streaming replication bezeichnet. (ebd.) 4 Technik 34 Durch eine Kombination aus Archivierung der WAL-Segmente an einem sicheren Ort und der Streaming-Replikation auf einen Slave kann ein effektives Failover konfiguriert werden, das den Produktiveinsatz sichert. (PostgreSQL Global Development Group 2013f) 4.1.4 Synchrone Replikation Als Erweiterung der Streaming Replication ist es möglich, eine Reihe von Servern für eine synchrone Replikation zu konfigurieren. Dabei wird nach dem 2-Phase-CommitVerfahren bei jeder Transaktion darauf gewartet, dass diese durch jeden beteiligten Server bestätigt wurde und damit im WAL-Log des Servers vorhanden ist, bevor sie akzeptiert wird. (ebd.) Im vorhergehenden Kapitel wurde beschrieben, wie Client-Transaktionen beim Ende einer lange Server-Transaktionen in einem mobilen verteilten Datenbanksystem durch das Auswerten der am Client vorgenommenen Änderungen synchronisiert werden können. Da die WAL-Dateien des PostgreSQL-Servers ein Protokoll der Änderungen auf dem Server darstellt, soll im Folgenden geprüft werden, ob sie ebenfalls für diesen Zweck genutzt werden können. 4.1.5 Interpretation der WAL-Segmente WAL-Dateien eines PostgreSQL-Servers haben stets die gleiche, durch die Konfiguration vorgegebene Dateigröße (i.A. 16MB) und werden aus Performancegründen sequentiell geschrieben. Wird durch eine Menge von Transaktionen die definierte Größe erreicht, wird eine neue Datei mit einem inkrementierten Dateinamen begonnen. In einer Standardkonfiguration werden veraltete, durch Checkpoints bereits übergangene WALDateien in der Regel „recycelt“, d.h. überschrieben. Durch Setzen des wal_level der Postgres-Konfiguration auf archive ist es möglich, dieses Überschreiben zu unterbinden und die WALs zu archivieren. (Böszörmenyi und Schönig 2013, Pos. 696ff. PostgreSQL Global Development Group 2013i,e) Jede Änderung wird in WALs vermerkt noch bevor sie in die eigentlichen Datenbankdateien im Verzeichnis base eingetragen werden. Die Protokollierung erfolgt dabei nicht etwa in Form von SQL-Statements, sondern enthält unter anderem die veränderten Zeilenwerte und Indizes in Form von Datenseiten. Checksummen für jeden Eintrag werden genutzt, um die Integrität der Einträge zu sichern. Die beschriebenen nativen Replikationsmöglichkeiten von PostgreSQL sind dadurch sehr effektiv, da die Einträge an konkrete physische Adressen im Datenverzeichnis übertragen werden können. Außerdem fällt das WAL ohnehin im Standarddatenbankbetrieb an, sodass dessen Nutzung also keinen 4 Technik 35 „Overhead“ darstellt. Schwierig für dritte Anwendungen, die hiervon profitieren wollen ist aber, dass das konkrete Statement, das zum WAL-Eintrag geführt hat, nicht rekonstruierbar ist, also kein verwertbares Transaktionsprotokoll aus Vorher- und Nachherwerten geführt wird, wie es in Abschnitt 3.10 zur Optimistischen Synchronisation beschrieben ist. Darüber hinaus ist das Format abhängig von der PostgreSQL-Version, kann sich mit jeder Implementierung ändern und ist lediglich durch den Source-Code selbst dokumentiert. (Böszörmenyi und Schönig 2013, Pos. 1165ff.) Bei allen verfügbaren nativen Replikationsmethoden von PostgreSQL, die vorgestellten wurden, handelt es sich um Konstellation der Master-Slave-Replikation. Es ist so nicht möglich, Änderungen auf den Slave-Servern in den Primärknoten zurückzuspielen, geschweige denn Transaktionen auf autonomen Knoten zuzulassen. Im Folgenden soll daher das Projekt BDR vorgestellt werden, das sich der Herausforderung einer nativen Master-Master-Replikation mit PostgreSQL stellt und dies ändern will. 4.2 PostgreSQL BDR Das Feature BiDrectional Replication steht als Community-Projekt unter aktiver Entwicklung. Es soll mit Version 9.4 als Kernkomponente Bestandteil von PostgreSQL werden. Es handelt sich dabei um die Implementierung einer asynchronen Multi-Master-Replikationslösung, ähnlich der bereits bestehenden Streaming Replikation. Für BDR wurde dafür eine eigenes WAL-Level namens logical geschaffen, das im Unterschied zu dem in Abschnitt 4.1 bereits beschriebenen WAL-Format Informationen enthält, um logische Abfolgen von Änderungen auszulesen und über die normale Datenbankverbindung an verbundene Server zu senden. Man spricht hier deshalb von einer Logical log streaming replication. Die Übertragung ist dabei einseitig gerichtet, kann aber zu einer bidirektionalen Replikation ausgebaut werden, indem die Replikation ausgehend von beiden beteiligten Datenbanken konfiguriert wird. Ein weiterer Unterschied besteht in der Granularität, mit der eine Replikation möglich wird. Bestehende Methoden von PostgreSQL erlauben nur die Replikation des gesamten Datenbankcluster - mit BDR soll dies jedoch auf Ebene der einzelnen Datenbanken möglich sein, wobei die Übertragung synchron und asynchron erfolgen kann. Beim letzteren wird der konsistente Zustand zwischen den Synchronisationspartnern im Sinne der bereits beschrieben eventually consistancy hergestellt, dessen „Lag“ der Synchronisation dabei beliebig groß sein kann, solange es möglich ist die logischen WAL-Segmente zu archivieren die für das „aufholen“ der Synchronisationspartner nötig ist. (BDR Project 2013) Im Moment handelt es sich bei BDR um „work in progress“. Wie in jedem optimistischen 4 Technik 36 Replikationssystem können auch hier Konflikte zwischen den Datenbeständen auftreten. Konkurrierende Updates werden deshalb nach der Last-Wins-Strategie aufgelöst, d.h. die zuletzt aufgetretene Änderung dominiert die vorhergehenden. Bei „divergent conflicts“, also Konflikten, die Unique Index-Checks widersprechen, wird im Moment die Replikation beendet und der Vorgang geloggt. Die Installation von BDR ist im aktuelen Zustand nur durch Kompilieren eines Forks des PostgreSQL-Quellcodes möglich und damit relativ aufwändig. Auch ist nicht genau absehbar, in welcher Form die Master-Master-Replikation wirklich als Core-Komponente in PostgreSQL integriert sein wird, womit sie für ein Produktivsystem im Moment nicht in Frage kommt. 4.3 Softwarelösungen und Erweiterungen Neben der in PostgreSQL durch WAL-Shipping umgesetzten Master-Slave-Replikation bietet eine größere Menge externer Projekte und Erweiterungen verschiedene Replikationskonzepte, die mit PostgreSQL genutzt werden können. Da, wie in Abschnitt 4.1 beschrieben, die durch PostgreSQL geschriebenen WAL-Dateien momentan nicht für eine externe Interpretation des Transaktionsprotokolls dienen können, begründen sich diese Lösungen auf eigenen Umsetzungen des sogenannten Change Data Capture (CDC) Design-Pattern. Dieses Pattern wird genutzt, um Änderungen zu identifizieren und auf eine Art und Weise festzuhalten, die es ermöglicht, sie durch eine Anwendung oder durch den Nutzer interpretieren zu lassen. In der Regel wird eine relationale Darstellungsform für die Speicherung angestrebt. (Oracle 2005; Microsoft o.D.[b]) Die Art der Aufzeichnung unterscheidet sich dabei in ihrem Umfang und umfasst im Wesentlichen eine oder eine Kombination der folgenden Vorgehensweisen: • Zeitstempel als Attribut der Tabelle • Versionsnummern als Attribute der Tabellen • Statusindikatoren als Attribute der Tabellen • Änderungsprotokollierung durch Trigger • Eventbasierte Programmierung in der Anwendungsebene Insbesondere die ersten drei genannten Varianten werden häufig in einer Kombination eingesetzt, um komplizierte Abfragen hinsichtlich des Einbringungszeitpunkts in Kombination mit dem Status von Tabellenzeilen zu ermöglichen. Sie eignet sich dadurch besonders für Systeme, die aus Änderungen am Datenbestand einen semantischen Nutzen ziehen können. Der „Zustand“ der Daten wird hier zum Bestandteil der betreffenden Entität. Eine konkrete Historie der Änderungen wird dabei aber nicht erstellt. 4 Technik 37 Die beiden letzteren Verfahren sind etwas komplexer. Die triggerbasierende Änderungsprotokollierung ist mit dem Schreiben eines Transaktionsprotokolls vergleichbar. Durch die Nutzung von Datenbanktrigger können bei einer Änderung an einer konfigurierten Tabelle konkrete Spaltenwerte und Metadaten gesammelt werden, die je nach Implementierung in Log-Tabellen hinterlegt werden. Dadurch bleibt das Wissen um eine vorgenommene Änderung auch nach einem erneuten Überschreiben der Zeile erhalten. Mit Bezug auf die in Abschnitt 3.10 beschriebenen optimistischen Synchronisationstechniken ist ersichtlich, dass dieses Verfahren sich für derlei Auswertungen besonders gut eignet, da entsprechend der Fähigkeiten des Datenbanksystems beliebig viele Informationen zusammengestellt werden können. Abbildung 17 stellt das „loggen“ von Änderungen exemplarisch dar. Abbildung 17: Durch die Nutzung der triggerbasierten Änderungsprotokollierung ist es möglich, ein Transaktionsprotokoll zu führen. In der Darstellung werden Änderungen an zwei verschiedenen Tabellen in einer „Log-Tabelle“ protokolliert. (Long 2012) Die eventbasierte Änderungsprotokollierung gleicht im wesentlichen der triggerbasierten Protokollierung. Statt Datenbanktrigger werden jedoch bestimmte Zustände oder Aktionen durch die Anwendungsebene erkannt und überlassen es dieser, entsprechende Protokollmaßnahmen zu übernehmen. Diese Implementierung ist vielseitiger einsetzbar, stellt aber eine Lösung der Anwendungsentwicklung, nicht der Datenbanktechnik dar. Die folgende Tabelle soll einen Überblick über eine Teil der zum Zeitpunkt der Schriftsetzung offenkundig aktiven Open Source-Projekten ermögliche, die eine Form der Replikation mit PostgreSQL ermöglichen (PostgreSQL Wiki 2013): Für die Replikation und Synchronisation in einem mobilen verteilten Datenbanksystem kommen nur asynchrone Replikationssysteme in Frage. Da eine Multi-Master-Replikation zwischen den Instanzen der Projektdatenbank gefordert ist, spielen nur diese Lösungen für die weitere Betrachtung eine Rolle. 4 Technik 38 Tabelle 4.1: Auswahl von Open Source-Replikationslösungen für PostgreSQL Programm Lizenz Typ Replikationsmethodik Kommunikation Pgpool-II Slony Bucardo Londiste SymmetricDS Postgres-R BSD BSD BSD BSD GPL BSD Middleware Trigger Trigger Trigger Trigger PostgreSQL-Fork Master-Slave Master-Slave Multi-Master Master-Slave Multi-Master Multi-Master synchron asynchron asynchron asynchron asynchron synchron 4.3.1 Bucardo Bucardo ist ein asynchrones Replikationssystem das ab Version 5 sowohl Master-Slave als auch Multi-Master-Replikation für PostgreSQL verspricht. Es setzt die triggerbasierte Änderungensprotokollierung ein, bei der die Primärschlüssel der jeweiligen Zeilen in Delta-Tabellen vermerkt werden, die von Änderungen betroffen sind. Ein externer Prozess ist dann dafür zuständig aus den Delta-Tabellen eine Liste von Änderungen zu erstellen, die für die Synchronisation zum Sychronisationspartner übertragen werden müssen. Diese Funktionsweise wird als lazy data capture bezeichnet. Werden anhand gleicher Primärschlüssel Konflikte erkannt, wird anhand einer konfigurierten Konfliktlösungsstrategie gehandelt. Die datenbankseitigen Komponenten sind in PL/Perl bzw. PL/PerlU umgesetzt und sind so nicht an das Betriebssystem gebunden. Für den ebenfalls in Perl implementierten Bucardo-Daemon gilt dies jedoch nicht, das Ausführen auf Windows ist nicht möglich. Zwar ist für die Replikation egal, ob der Replikationsservice auf dem gleichen Server ausgeführt wird - er kann im Sinne der Middleware-Architektur von einem dritten Server ausgeführt werden - für eine autonom agierende Offline-OpenInfRA-Anwendung ist dies allerdings nicht geeignet. 4.3.2 SymmetricDS SymmetricDS ist eine quelloffene Replikations- und Synchronisationslösung und wird unter der Open Source Lizenz General Public License (GPL) version 3.0 vertrieben. Kommerzielle Produkte, die die Lösung unter der Lesser General Public License (LGPL) integrieren wollen, müssen das Produkt lizenzieren. Die Firma JumpMind, welche die Entwicklung der Software fördert, bietet in diesem Fall technischen Support. Ein Vorteil von SymmetricDS ist, dass es eine flexible Konfiguration von Replikation und Synchronisation zwischen Datenbanken erlaubt. Der Synchronisationsservice selbst ist in Java programmiert und wird betriebssystemunabhängig auf jedem Client ausgeführt. 4 Technik 39 Durch die Nutzung der standardisierten JDBC-API ist es möglich, Daten in heterogenen Systemen zu replizieren und zu synchronisieren, wobei die Synchronisationsrichtung dabei frei bestimmt werden kann. Zu den unterstützten Datenbanksystemen gehören Oracle Database, IBM DB2, Microsoft SQL Server, MySQL als sowie PostgreSQL. (JumpMind Inc. 2013c) Die Konfiguration des Replikationsschemas erfolgt über Systemtabellen, die auf der Datenbankinstanz installiert werden. Über sie lässt sich eine Replikationshierarchie anhand von Knoten-Gruppen definieren, zu denen die an der Replikation teilnehmenden Datenbankinstanzen zugeordnet werden. Die Tiefe der Hierarchie ist dabei nicht begrenzt und die Synchronisation erfolgt immer entlang dieser vorgegebenen Beziehungen. Zur Kommunikation dient das HTTP- bzw. HTTPS-Protokoll, über das Synchronisationsnachrichten komprimiert in einem einfachen CSV-Format übertragen werden. Abbildung 18 zeigt eine Konfiguration aus drei Hierarchieebenen, die als ein typische SymmetricDS-Setup beschrieben wird. Abbildung 18: SymmetricDS-Replikationshierachie (Long u. a. 2013, S. 25) Änderungen am replizierten Datenbestand werden nach dem CDC-Pattern in einer Verlaufstabelle geloggt. Dies umfasst unter anderem einen monoton steigenden Zeitstempel, Schema und Name der betreffenden Tabelle, die neuen und alten Spaltenwerte im CSV-Format sowie die lokale Transaktions-ID des ausführenden Datenbankservers. Die- 4 Technik 40 se Änderungen werden in sogenannte Batches zusammengefasst, die der Replikationshierarchie folgend an die Eltern- bzw. Kind-Instanzen addressiert sind. Die Synchronisation erfolgt dabei nach dem in Abschnitt 3.10.2 beschriebenem transaktionsorientierten Verfahren. Konflikte werden durch datensatzorientiertes Vergleichen der erwarteten und vorgefundenen Spalten aufgedeckt und können manuell oder nach verschiedenen Strategien gelöst werden. Da Änderungen in den Tabellen über Trigger geloggt werden, muss nach der Initialisierung des Knoten der Synchronisationsserver nicht laufen, wenn ohnehin keine Verbindung zu einem anderen Knoten möglich oder erwünscht ist. Der lokale Synchronisationsservice eines Knoten wird durch einfache Parameterdateien konfiguriert. Durch Anlegen mehrere Dateien mit unterschiedlichen Parametern können beliebig viele dieser Engines auf dem Client bzw. Server ausgeführt werden, welche die Synchronisation jeweils einer Datenbank übernehmen. (Long 2012) Seit Version 3.5 unterstützt SymmetricDS die bidirektionale Synchronisation von Dateien und Ordnern. Die Übertragung erfolgt dabei komprimiert als Zip-Archiv, welches auf Seiten des Empfängers entpackt wird. Durch den Einsatz von Java Bean Shell-Scripts (BeanShell o.D.), kann auch die Datei-Synchronisation betriebssystemunabhängig erfolgen und wird ebenfalls über das HTTP-Protokoll abgewickelt. (Long u. a. 2013, S. 69ff.) 4.3.3 ArcGIS Esri ArcGIS stellt die wohl verbreitetste kommerzielle GIS-Lösung der Industrie dar und wird derzeit als Version 10.2 vertrieben. PostgreSQL kann mit ArcGIS als relationales Backend genutzt werden und so an der Replikation der Geodatenbank teilnehmen. (Esri 2013a, S. 27, 2013b, S. 5) Zur Verfügung stehen dabei drei grundlegende Varianten: • Check-in/Check-out-Replikation (s.a. Abschnitt 3.10): Erlaubt es Daten in eine weitere Geodatenbank zu kopieren, zu editieren und anschließend wieder in die Elterninstanz zu importieren. Damit endet der Lifecycle der Replikation und ein neues Checkout/Checkin-Replika muss für weitere Editiervorgänge angelegt werden. • Uni-direktionale Synchronisation: Die Synchronisation ist im Sinne einer MasterSlave-Konfiguration einseitig gerichtet und kann über unbestimmt viele Synchronisationsvorgänge hinweg bestehen. • Bi-direktionale Synchronisation: Änderungen werden im Sinne einer Master-Mas- ter-Replikation beidseitig synchronisiert und die Replikation kann wie bei der unidirektionalen Replikation unbestimmt lang bestehen. (Zeiler und Murphy 2010, S. 261) 4 Technik 41 Grundlage für jede dieser Formen der Replikation mit ArcGIS ist die Versionierung der Daten in einer ArcSDE-Datenbank. Esri beschreibt den Grundgedanken einer Version als eine Art Sicht bzw. Schnappschuss der Datenbank zu einem bestimmten Zeitpunkt, unabhängig von der aktuellen „Default“-Version, also dem Originalzustand des Datenbestands. So werden parallele Editiervorgänge und lange Transaktionen effektiv voneinander isoliert und können sich nicht gegenseitig durch Sperren behindern. Dies entspricht effektiv der in Abschnitt 3.10 beschriebenen Snapshot-Isolation. Versionen können die in ihrer Reihenfolge weniger restriktiv werdenden Zugriffslevel Private, Protected und Public zugewiesen bekommen. Private erlaubt lediglich dem „Besitzer“ der Version auf sie zuzugreifen. Protected und Public erlauben es anderen Nutzer lesend bzw. lesend & schreibend mit der Version zu arbeiten. (Zeiler und Murphy 2010, S. 248ff.) Implementiert ist die Versionierung durch Versionierungstabellen, sogenannte Delta-Tabellen bestehend aus einer Hinzufügen- (A; Adds) und einer Löschen-Tabelle (D; Deletes). Diese spiegeln die Änderungen an den Versionen wieder und werden beim Einfügen mit eindeutigen, monoton steigenden Zeitstempeln versehen. Da sich auch die Basisoperation Ändern aus den Operationen Löschen und Einfügen konstruieren lässt, sind diese beiden Tabellen ausreichend, um jeden Schreibvorgang zu protokollieren. Jedes versionierte Dataset wird hierfür mit eigenen Delta-tabellen assoziiert. Da jede Änderung protokolliert wird, können die Delta-Tabellen so auch für eine Undo/Redo-Funktion genutzt werden. (ebd., S. 248ff.) Die Versionierung in ArcGIS beschränkt sich nicht auf eine aus der Default-Version abgeleiteten Ebene, sondern kann beliebig in die Tiefe verschachtelt werden, d.h. es können Kinder-Versionen (child version) aus Eltern-Versionen (parent version) abgeleitet werden. Daraus folgend spricht man von einem Versionenbaum (s. Abbildung 19), in dem jede Version einem bestimmten Zweck bei der Bearbeitung zugewiesen werden kann. Um Änderungen in Versionen entlang der Vererbungshierachie des Versionenbaums zu kommunizieren, wird ein zweistufiges Verfahren eingesetzt, bei dem Änderungen aus der Zielversion in der Editierversion zusammengeführt werden und anschließend an die Zielversion „geposted“ werden. Beim Zusammenführen werden etwaige Konflikte durch Nutzung der in Abschnitt 3.10 beschriebenen datenorientierten Synchronisation aufgedeckt. Die dafür nötigen Informationen können den Änderungstabellen der Datasets entnommen werden. Nachdem dieser Vorgang abgeschlossen ist, sind alle Änderungen der Zielversion mit den lokalen Änderungen in der Editierversion vorhanden. Diese werden nun im zweiten Schritt an die Zielversion gesendet und dort übernommen, womit beide Versionen identisch sind. (ebd., S. 251ff.) 4 Technik 42 Default version West extension version Planning version Operations version East extension version Circuit 1 version Circuit 2 version Abbildung 19: ArcGIS Versionsbaum (ebd., S. 252) Da insbesondere das Editieren in vielen verschiedenen Versionen zu einem großen Datenumsatz in den Delta-tabellen führt, bietet ArcGIS die Möglichkeit, die Geodatenbank zu komprimieren. Dabei werden nicht mehr benötigte Änderungsstände aus den DeltaTabellen gelöscht. (Zeiler und Murphy 2010, S. 255) Die Replikation von Geodatenbanken ist ein Mechanismus der ArcGIS-Software und unabhängig vom eingesetzten Datenbanksystem, d.h. es ist möglich, eine Replikation einzurichten, bei denen der relationale Unterbau zur ArcSDE-Geodatenbank unterschiedlich ist. Für eine bidirektionale Synchronisation ist dabei die Nutzung einer ArcSDEDatenbank Pflicht, da nur diese Versionierung, wie sie zuvor beschrieben wurde, unterstützt. Die File- oder Personal-Geodatenbanken die durch ArcGIS-Desktop angeboten werden, sind hierfür nicht geeignet. Bei der Einrichtung einer Replikation werden zwei Replikat-Versionen erstellt, von der eine an das child replica, dem neuen Kind-Knoten, übertragen wird und eine beim parent replica verbleibt. (Esri 2013d) Abbildung 20 zeigt, wie sich der zuvor vorgestellte Versionsbaum nun über mehrere Geodatenbanken erstreckt. Das Erstellen und Synchronisieren von Replikas ist mit ArcGIS sowohl offline als auch über eine Netzwerkverbindung möglich. Um beispielsweise ein Replika einzurichten, das zur aktuellen Datenbank keine Verbindung aufbauen kann, ist es möglich diesen als XML-Dokument zu exportieren und auf dem Zielcomputer schließlich zu importieren. Die Synchronisation zwischen den Partnern verläuft auf gleich Art und Weise, je nach Konfiguration ein- oder beidseitig, wobei hier nicht nur die konkreten Änderungen in Form von data change messages ausgetauscht werden müssen, sondern auch acknowledgment messages, welche dem Sender bestätigen, das Änderungen akzeptiert wurden und 4 Technik 43 Abbildung 20: ArcGIS Replikationsschema (ebd.) zukünftig nicht mehr gesendet werden müssen. Die Online-Synchronisation erfolgt über einen bereitgestellten Web-Service oder per direkter Verbindung zur Geodatenbank. In diesem Kapitel wurden die Replikationsfunktionen des Datenbanksystems PostgreSQL präsentiert und erläutert, warum die durch das RDBMS geschriebenen WAL-Dateien nicht für die Implementierung einer optimistischen Synchronisation in einem mobilen verteilten Datenbanksystem geeignet sind. Anschließend wurde deshalb das Change Data Capture Design Pattern vorgestellt, das durch Replikations-Erweiterungen eingesetzt wird, um ein logisches Protokoll an Schreiboperationen zu erstellen, anhand dessen die Synchronisation erfolgen kann. Unter den betrachteten Lösungen wurde einzig SymmetricDS als geeignet für die betriebssystemunabhängige Implementierung einer Replikationslösung herausgearbeitet. Das proprietäre ArcGIS sollte dazu dienen, weitere mögliche Lösungswege aufzuzeigen. Im folgenden Kapitel gilt es zu erarbeiten, wie die konkrete Implementierung des Mutter-Kind-Konzepts umzusetzen ist. 5 Vorüberlegungen zur Replikationskomponente 44 5 Vorüberlegungen zur Replikationskomponente Aus den vorhergehenden Betrachtungen lässt sich schließen, dass das Mutter-KindKonzept ein mobiles verteiltes Datenbanksystem beschreibt. Die Mutter-Instanz stellt dabei den stationären Server-Knoten dar. Entsprechend fungieren die Kind-Instanzen als Client-Knoten im Sinne der erweiterten Client-Architektur. Das Abbilden der Kind-Instanz durch das Übertragen des aktuellen Datenbestands kommt dem Erstellen eines Snapshots der Mutter-Instanz gleich. Die Arbeit mit dieser in einer vom zentralen Datenbestand entkoppelten Umgebung stellt somit eine lange Server-Transaktion dar, welche mit der Synchronisationsphase zwischen Mutter und Kind-Instanz endet. Diese Sicht lässt sich auf die Beziehung Eltern-Instanz/Kind-Instanz verallgemeinern, bei der jeweils die ElternInstanz als Server im Sinne der langen Server-Transaktion eintritt. Aus den bestehenden Anforderungen ist bekannt, dass ein optimistischer Transaktionsansatz gefordert ist, also keine Sperrverfahren angewandt werden dürfen, um beim Erstellen einer Kind-Instanz den Datenbestand der Eltern-Instanz weiter bearbeiten zu können. Daraus ist zu schließen, dass sich die Konsistenz des Datenbestands zwischen diesen Knoten durch Änderungen voneinander entfernt. Die Konsistenz des lokalen Datenbestands wird bei Client-Transaktionen durch die Mechanismen des lokalen Datenbanksystems gesichert. Da die entkoppelte Kind-Instanz ein Schnappschuss bzw. eine Version der Eltern-Instanz darstellt und keine Kommunikation zwischen den Instanzen stattfindet, kann ein Großteil der möglichen Phänomene von parallelen Transaktionen auf Höhe der langen Server-Transaktion durch die sich daraus ergebende abbildisolierte Transaktionierung ausgeschlossen werden (vgl. Abschnitt 3.10). Um am Ende der Server-Transaktion schließlich die Konsistenz zwischen den Synchronisationspartnern herzustellen, muss ein optimistisches Synchronisationsverfahren zum Einsatz kommen. Dabei muss die lange Server-Transaktion rückwärts gerichtet ausgewertet werden um eventuelle Konflikte aufzudecken. Wird die Synchronisation entlang der Netztopologie durchgeführt, ist gewährleistet, dass schließlich alle Informationen auf der Auskunftsinstanz, der Mutter-Instanz, zusammenlaufen. In Abschnitt 3.10 wurde festgestellt, dass bei der Synchronisation die Konflikte Löschkonflikt, Einfügekonflikt, Änderungslöschkonflikt und Änderungskonflikt auftreten 5 Vorüberlegungen zur Replikationskomponente 45 können. Lediglich Einfügekonflikte bzw. Schlüsselkonflikte lassen sich dabei auch ohne Sperrverfahren effektiv verhindern. 5.1 Anpassungen Datenbankschema Insbesondere das Auftreten von Einfügekonflikten ist bei der Nutzung der OpenInfRAAnwendung wahrscheinlich, wenn einfache Sequenzen als Primärschlüsselgeneratoren eingesetzt werden. In Abschnitt 2.4 wurde bereits beschrieben, dass gerade ein hohes Aufkommen an Einfüge-Operationen für OpenInfRA erwartet wird. Da Primärschlüssel in einem verteilten System einen hohe Wert besitzen und das Ändern von Primärschlüsseln in Datenbanken allgemein zu vermeiden ist, sollte dieses Problem früh berücksichtigt werden. Mögliche Lösungsstrategien werden in Tabelle 5.1 exemplarisch aufgezeigt: Tabelle 5.1: Mögliche Konfliktvermeidungsstrategien bei Primärschlüsselgeneration ohne zentrale Kontrolle. (M = Mutter-Instanz; K = Kind-Instanz; : = Neue Spalte) Strategie Beispiel Seriennummernblöcke Eindeutiges Inkrement Zusammengesetzter PK Namespacing UUID M = {1..1000}, K = {1001..2000} M = {1, 11, 21}, K = {2, 12, 22} M = {(1 : M )}; K = {(1 : K)} M = {“M 1”, “M 2”..}; K = {“K1”, “K2”..} {214ee93a 1af 0 448f 98b3 59a71498bca2} Das Zuweisen von Nummernblöcken ist ein einfaches Verfahren, aber ungünstig, wenn nicht abgeschätzt werden kann, wie hoch das Aufkommen an Einfügeoperationen am Kind-Knoten sein wird, da so der Block unvorhergesehen erschöpft werden kann. Dies gilt vor allem, wenn die Instanz selbst auch als Eltern-Instanz eintritt und so den Zahlenraum „aufteilen“ muss. Eine großer Nummernblock würde hier Abhilfe schaffen, kann aber bei unvorhergesehenen Ereignissen das Grundproblem nicht ausschließen. Das Zuweisen von eindeutigen Inkrementen hat im Grunde die gleichen Vor- und Nachteile, wobei hier die Schrittweite beachtet werden muss. Die Nutzung von zusammengesetzten Schlüsseln, bei denen eine Spalte die ID der ausführenden Instanz repräsentiert, erhöht aber den ohnehin schon großen Aufwand, der durch Fremdschlüsselverknüpfungen entsteht. Sinnvoll erscheint deshalb die Nutzung von sogenannten Universally Unique Identifiers (UUID). Das sind nach standardisierten Verfahren (s. Force (2005) sowie ISO ISO/IEC 9834-8:2008) generierte 16 Byte Zahlen, welche für die Nutzung in verteilten Systemen entwickelt wurden. Es ist möglich, UUIDs ohne zentralisierte Kontrolle parallel zu generieren, ohne dass eine realistische Chance besteht, dass die gleich Zahl zweimal auftritt. UUID wird als Standard-Datentyp durch PostgreSQL unterstützt und liefert die Extension 5 Vorüberlegungen zur Replikationskomponente 46 „uuid-ossp“, welche entsprechende Generatorfunktionen zur Verfügung stellt. Das Listing 5.1 präsentiert den Ablauf. (PostgreSQL Global Development Group 2013g,h) 1 create extension " uuid - ossp " ; 2 select uuid_generate_v4 () ; 3 uuid_generate_v4 4 -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 2 d7d1b5c - eaa6 -4919 -909 b -5103 ff803039 6 (1 row ) Listing 5.1: Installation der PostgreSQL-Extension „uuid-ossp“ und Generierung einer UUID Version 4. Das in Abschnitt 4.3.3 beschriebene GIS-System ArcGIS setzt ebenfalls auf eine UUIDSpalte, hier als Globally Unique Identifier (GUID) bezeichnet, um Zeilen über mehrere Geodatenbanken hinweg identifizieren zu können. Es schließt so die Entstehung von Schlüsselkonflikten in einer verteilten Umgebung aus. Das Datenbanksystem Microsoft SQL Server setzt ebenfalls auf GUID-Spalten für die Identifizierung in replizierten Tabellen. (Esri 2013c; Microsoft 2013) Ein Nachteil beim Einsatz des Datentyps ist der höhere Speicherbedarf von 16 Byte gegenüber 4 bzw. 8 Byte für Integer bzw. Big Integer. Dennoch überwiegen die Vorteile, denn für das OpenInfRA-Projekt wären beispielsweise Themenausprägungen, Themeninstanzen, Wertelisten und Attributtypen nicht nur innerhalb eines Projekts über alle bestehenden Instanzen eindeutig identifiziert, sondern global über alle Projektdatenbanken hinweg, ohne dass eine Koordination vonnöten ist. Zu beachten ist, dass UUIDs nicht sequentiell generiert werden. Da PostgreSQL Indizes aber generell nicht clustert (PostgreSQL Global Development Group 2013d) und das bestehende Datenschema sich ohnehin nicht dazu eignet, Bereichsabfragen über die Primärschlüssel zu formulieren, stellt dies kein Problem dar. Noch ein weiterer Vorteil spricht für die Nutzung von UUIDs. Da für jede verbreitete Programmiersprache standardkonforme Implementierungen der Generatorfunktionen bestehen, kann die Schlüsselgeneration sicher sowohl auf Seiten der Datenbank als auch durch die Anwendung geschehen. Aus diesen Gründen muss das Datenbankschema entsprechend angepasst werden. Im Rahmen dieser Arbeit wurde dies an dem im Moment bestehenden Datenbankschema und den zur Verfügung stehenden Importfunktionen für DAI-Projekte durchgeführt. 5 Vorüberlegungen zur Replikationskomponente 47 5.2 Synchronisation Um nur die nötigsten Informationen bei der Synchronisation auszutauschen und so den Übertragungsaufwand zwischen den Stationen so gering wie möglich zu halten, sollten lediglich Verlaufsdaten für den Synchronisationsalgorithmus genutzt werden. In Abschnitt 4.1 wurde verdeutlicht, warum das Write-Ahead-Log, das durch PostgreSQL erstellt wird, nicht genutzt werden kann, um Änderungen zwischen Eltern- und Kind-Instanz zu synchronisieren. Dementsprechend muss eine Form des Change Data Capture zur Anwendung kommen, bei der Änderungen durch Datenbanktrigger protokolliert werden. Da ein hohes Verhältnis von Einfügeoperationen gegenüber Updateoperationen erwartet wird, ist die Nutzung von Status und Zeitstempelspalten an den replizierten Tabellen ineffektiv. Darüber hinaus wird ein Großteil der Zeilen dieses Attribut nie nutzen, sodass die Änderung des Anwendungsschemas der Projektdatenbank deshalb vermieden werden sollte. Für die Synchronisation kommt deshalb die transaktionsorientierte Synchronisation in Frage, wie sie bereits in Abschnitt 3.10 vorgestellte wurde. Hier wird Vorher- (OLD) und Nachherbild (NEW) auf dem Empfänger der Synchronisationsdaten mit dem aktuellen Zustand verglichen. Eine semantikbasierte Synchronisation erscheint ungeeignet, da das generalisierte Datenmodell hier zu viel Verantwortung in der Anwendungsschicht suchen würde. Mit jeder Abfrage müssten entsprechende Bedingungen formuliert werden, die für die Operation einzuhalten sind und die angeben, wie eventuelle Konflikte aufzulösen sind. Da ohnehin eine manuelle bzw. interaktive Konfliktlösung vorgesehen ist, ist dies überflüssig. In 4.3.3 wurde gezeigt, dass das proprietäre ArcGIS die Replikation auf die Versionierung der Daten begründet, welche über separate Delta-Tabellen umgesetzt ist. Eine komplette Versionierung der Projektdaten ist aber nicht vorgesehen (Schäfer 2013) und erleichtert den Schritt hin zu einem sequentiell geschriebenem Transaktionsprotokoll in relationaler Form. Sequentiell daher, um die lokale Abfolge der Transaktionen auch auf dem Synchronisationspartner in dieser Reihenfolge auszuführen und so die kausale Ordnung der Operationen beizubehalten. Zusätzlich sollte die lokale Transaktions-ID hinterlegt sein, um Operationen über diese zu gruppieren und auf dem Empfänger atomar auszuführen, sie also auch dort in eine Transaktion bzw. eine Sub-Transaktion der Synchronisation zu klammern. Für das Loggen können Datenbanktrigger eingesetzt werden, die den replizierten Tabellen zugeordnet sind und in der Reihenfolge protokollieren, in der sie durch Änderungen in der Tabelle auslösen. Bei der Synchronisation kann so schließlich das seit der letzten Synchronisation entstan- 5 Vorüberlegungen zur Replikationskomponente 48 dene Transaktionsprotokoll an den Synchronisationspartner übertragen und ausgewertet werden. Beim Durchführen jeder Operation wird dabei entsprechend der in Tabelle 3.2 definierten Regeln überprüft, ob ein Konflikt vorliegt. Ist dies der Fall, muss die Transaktion und der Synchronisationsvorgang abgebrochen werden, andernfalls kann die Transaktion abgeschlossen werden. Wird dieser Vorgang auf beiden Synchronisationspartnern erfolgreich durchgeführt, sind die Datenbankinstanzen konsistent zueinander. Tritt ein Konflikt auf, das heißt wurde auf beiden Instanzen das gleiche Tupel verändert, sind die Transaktionen nicht serialisierbar (vgl. Abschnitt 3.10) und die Synchronisation muss abgebrochen werden. Um die lokalen Transaktionen des Clients an diesem Punkt nicht zu verlieren, muss eine Konfliktlösung durchgeführt werden, bei der entschieden wird, welcher Wert für dieses Tupel den richtigen darstellt. Um einen konsistenten Zustand auf beiden Datenbankinstanzen herzustellen muss sichergestellt werden, dass beide Synchronisationspartner bei der Konfliktlösung zum gleichen Ergebnis kommen. Da das auflaufende Transaktionsprotokoll nach einer erfolgreichen Synchronisation nicht mehr benötigt wird und unnötig Ressourcen des Datenbankservers verbraucht, sollte es regelmäßig „gesäubert“ werden. Dies kann aber erst dann geschehen, wenn alle zu dieser Instanz in Beziehung stehenden Knoten die Synchronisation bis zu diesem Punkt abgeschlossen haben. Dementsprechend ist neben dem Austausch der lokalen Operationen auch eine Erfolgsmeldung nötig, welche ebenfalls protokolliert wird und die erfolgte Synchronisation bestätigt. 5.3 Fragmentierung und Allokation der Projektdatenbank Aus Abschnitt 3.2 ist bekannt, dass sich das Fragmentierungs- und Allokationsschema einer verteilten Datenbank aus dem globalen Schema ableitet. Für eine OpenInfRAProjektdatenbank ist dies das hoch generalisierte Anwendungsschema bzw. das daraus abgeleitete Datenbankschema, welches in Abschnitt 2.1 vorgestellt wurde. Eine vertikale Fragmentierung der Relationen ist hier nicht sinnvoll möglich ohne den Grundsatz der Vollständigkeit zu verletzten. Interessanter ist ohnehin die Fragmentierung in horizontaler Richtung. Das heißt, das Zuweisen von Teilprojekten eines Projekts welche im Feld bearbeitet werden sollen zu einem Fragment um dieses schließlich auf einen mobilen Computern zu replizieren. Problematisch sind an dieser Stelle die vielen referentiellen Beziehungen und Selbstbeziehungen, die durch das generalisierte Schema entstehen. Während es beispielsweise trivial ist, die Relation „Projekt“ auf Selbstbeziehungen, also Teilprojekte, zu prüfen und daraus die Menge der Themenausprägungen zu bestimmen, gestaltet sich dies für weiter assoziierte Klassen schwieriger. Listing 5.2 demonstriert 5 Vorüberlegungen zur Replikationskomponente 49 dies für alle Themeninstanzen eines imaginären Projekts mit der ID 1. Hier ist es nötig, die Selbstbeziehung der Klasse Themeninstanz zu berücksichtigen und über die Relation „Themeninstanz_x_Themeninstanz“ zu prüfen, ob diese zu einer anderen Instanz in Beziehung steht: 1 -- Projekt und dessen Teilprojekte 2 WITH p AS ( 3 SELECT " Id " 4 FROM " Projekt " 5 WHERE " Id " = 1 OR " Teilprojekt_von " = 1 6 7 ), 8 -- Betroffene Themenauspr ä gungen 9 ta AS ( 10 SELECT ta . " Id " 11 FROM " Themenauspraegung " ta 12 INNER JOIN p ON ta . " Projekt_Id " = p . " Id " 13 -- Themeninstanzen der Themenauspr ä gungen 14 ) , ti_pre AS ( 15 SELECT ti . " Id " 16 FROM " Themeninstanz " ti 17 INNER JOIN ta ON ti . " Themenauspraegung_Id " = ta . " Id " 18 ) 19 -- Beziehungen Themeninstanzen ersten Grades 20 SELECT ti_x_ti . " Themeninstanz_2 " AS " Id " 21 FROM " T h e m e n i n s t a n z _ x _ T h e m e n i n s t a n z " ti_x_ti 22 INNER JOIN ti_pre ON ti_x_ti . " Themeninstanz_1 " = ti_pre . " Id " 23 UNION 24 SELECT " Id " from ti_pre ; Listing 5.2: Abfrage aller Themeninstanzen eines Projekts In diesem Query ist jedoch noch nicht berücksichtigt, dass auch die in Beziehung stehende Instanz eigene Beziehungen pflegt und dabei insbesondere auch einer anderen Themenausprägung angehören kann, welche unter Umständen abermals einem anderen Projekt zugeteilt ist. Diese rekursiven Beziehungen müssen beachtet werden, da sonst Fremdschlüsselverletzungen auftreten werden. Neben dieser Schwierigkeit steht hier der rein praktische Nutzen in Frage, wenn auch auf Offline-Instanzen Beziehungen zwischen Themeninstanzen hergestellt werden sollen, die nicht dem gewählten Teilprojekt angehören. (s.a. Email Schäfer (2013)) Entsprechend sollte der relationale Projektdatenbestand nicht fragmentiert werden. 5 Vorüberlegungen zur Replikationskomponente 50 5.4 Synchronisation externer Dokumente Anders ist dies für externe Dateien die mit dem Datenbestand verknüpft sind. Es ist anzunehmen, dass diese Daten im Verhältnis zur Datenbank sehr viel mehr Speicherplatz in Anspruch nehmen werden. Der Import dieser Daten auf einem Laptop ist damit sowohl praktisch als auch technisch unmöglich. Die Zuordnung der externen Daten zu Teilprojekten könnte dabei anhand der zugrundeliegenden Ordnerstruktur organisiert werden, wie dies in Abbildung 21 verdeutlicht wird, welche von der Anwendung beim Upload bestimmt wird. Mutter-Instanz Kind-Instanz Projektdatenbank Projektdatenbank Teilprojekt A Teilprojekt B Teilprojekt B Abbildung 21: Replikation externer Projektdaten Für die Replikation und Synchronisation von externen Dokumenten im Dateisystem können die für relationale Datenbanken beschriebenen Mechanismen nicht eingesetzt werden. Einzig die Verweise, die durch die OpenInfRA-Anwendung in der Datenbank angelegt werden, werden deshalb durch die Datenbanksynchronisation übermittelt. Um insbesondere bei Außendiensten gesammelte Informationen wie Bilder und Pläne an die Büros, bzw. letztendlich an die Auskunftsversion zu übermitteln, ist ein externer Prozess nötig, der diese Aufgabe neben der Datenbanksynchronisation übernimmt. Denkbar wäre der Einsatz einer Versionskontrolle wie Git, dessen komplexe Funktionsweise durch die Oberfläche der Anwendung verschleiert wird. Problematisch dabei ist allerdings, dass es sich zuerst um Binärdaten (JPEG, PDF) handeln wird, die für die Synchronisation anfallen. Ein Großteil dieser Dateien wird nach dem Anlegen nicht wieder verändert werden, sondern hat in erster Linie dokumentarischen Nutzen. Eine Versionierung dieser Daten im Dateisystem würde deshalb schnell zu „Datenmüll“ führen, der unnötig Speicherplatz verbraucht. Eine Alternative stellt das Auslesen der Änderungszeiten dar, gewissermaßen eine Adaption des zeitspaltenbasierten Change Data Capture für Dateien. Diese Änderungszeiten können in der Datenbank hinterlegt und bei einem Synchronisationsvorgang abgeglichen 5 Vorüberlegungen zur Replikationskomponente 51 werden. Der Transfer der Dateien muss wiederum von einem externen Prozess übernommen werden, der einen entsprechenden Komprimierungsalgorithmus anwendet. 5.5 Zusammenfassung Zusätzlich zu den in in Kapitel 2 zusammengetragenen Anforderungen können aus den im vorangegangenen Kapitel gewonnenen Informationen neue Anforderungen formuliert werden, die durch die Replikationskomponente von OpenInfRA erbracht werden müssen, um das Mutter-Kind-Konzept umzusetzen. Sie beziehen sich in erster Linie auf die Synchronisation und die Lösung von Synchronisationskonflikten, aber auch auf administrative Funktionen, wie das Ändern der Host-Adresse einer Eltern-Instanz, um für mobile Knoten sicherzustellen, dass diese eine Verbindung herstellen können. Die überarbeiteten und neuen Anforderungen AC_0280 bis AC_0371 sind im Anforderungskatalog ergänzt. Darüber hinaus wurde der Anforderungsfall „Administration Projektinstanz“ angepasst, um auch neue Anforderungen zu berücksichtigen. In Anbetracht der Umstände, dass OpenInfRA nicht nur eine einfache Synchronisation von Datenbanken, sondern auch eine Synchronisation von externen Dateien benötigt, ist es offensichtlich, dass die in Abschnitt 4.3.2 vorgestellte Synchronisationslösung SymmetricDS die logische Wahl sein muss. Es wurde deshalb basierend auf diesem System eine Standardkonfiguration entwickelt, die individuell angepasst auf das jeweilige Projekt für die Replikation der Projektdaten genutzt werden soll. Die Vorgehensweise ist dabei im folgenden Kapitel ausführlich dokumentiert. 6 Implementierung 52 6 Implementierung Die Replikations- und Synchronisationslösung SymmetricDS wurde bereits in Abschnitt 4.3.2 kurz vorgestellt und als gute Lösung für OpenInfRA eingeschätzt. Die Implementierung bzw. Konfiguration soll daher im Folgenden dokumentarisch beschrieben werden. Dafür wird zuerst darauf eingegangen, auf welche Art und Weise die Software in die OpenInfRA-Anwendung integriert werden kann, wie die Konfiguration für ein Projekt erfolgt und schließlich wie die Synchronisation zwischen den Instanzen durchgeführt wird. Anschließend werden auch administrative Funktionen erläutert. Die hier vorgestellte Konfiguration wird als Template bereitgestellt, das für den Betrieb eines jeden Projekts angepasst werden kann. 6.1 Installation Aktuell ist Version 3.5.10 der Synchronisationslösung SymmetricDS veröffentlicht. Diese kommt in der hier vorgestellten Implementierung zum Einsatz. Grundvoraussetzung für die Installation und anschließende Ausführung ist die Java SE Runtime Environment (JRE) ab Version 5, welche als kostenloser Download sowohl für Microsoft Windows und Apple OSX als auch kompiliert für die meisten Linux Distributionen bereit gestellt wird (http://www.java.com/en/download/). Unterstützt wird neben anderen Datenbanksystemen PostgreSQL ab der Version 8.2.5. Die aktuelle Version der Dokumentation zu SymmetricDS gibt fälschlicherweise an, dass für die Nutzung mit PostgreSQL die Nutzervariablenklasse symmetric in der postgresql.conf des Datenbankservers aktiviert werden muss. (Long u. a. 2013, S. 148) Die Möglichkeit dieser Einstellung wurde aber ab Version 9.2 von PostgreSQL ersatzlos und abwärtskompatibel gestrichen. (PostgreSQL Global Development Group 2012) Neben der nachfolgend beschriebenen Installation der Systemtabellen von SymmetricDS und der Konfiguration müssen für aktuelle Versionen des Datenbanksystems also keine weiteren Anpassungen am Server selbst vorgenommen werden. Die Installation bzw. das Ausführen von SymmetricDS kann auf drei Arten geschehen und ist durch die Implementierung in Java betriebssystemunabhängig. Am einfachsten ist dabei die direkte Nutzung der mitgelieferten ausführbaren Dateien, im Folgenden als Standalone-Installation bezeichnet. Dafür wird das nach dem Download entpackte 6 Implementierung 53 SymmetricDS-Verzeichnis lediglich an dem gewünschten Ort auf dem Computer abgelegt. Neben dem eigentlichen Synchronisationsservice werden weitere Tools zur Konfiguration und für den Import und Export im Unterverzeichnis bin mitgeliefert. Sie sind in der anschließenden Tabelle kurz erläutert. Tabelle 6.1: Ausführbare Dateien einer SymmetricDS-Installation Bezeichnung Beschreibung sym symadmin dbimport dbexport dbfill sym_service.initd sym_service.bat Starten/Stoppen des SymmetricDS-Synchronisationsservices Konfiguration und Registrierung von Knoten Import Datenbankschema Export Datenbankschema Testdatengenerator Linux/OSX-Daemon Windows-Service Die sym_service.*-Skriptdateien können genutzt werden, um SymmetricDS auf unixoiden Systemen als Daemon bzw. auf der Windows-Plattform als Service auszuführen. Ist dies nicht gewünscht, also soll der Synchronisationsservice beispielsweise nur bei einer aktiven Internetverbindung gestartet werden, kann er direkt über das Java-Programm sym kontrolliert werden. Bei dieser Nutzungsart wird ein integrierter Jetty-Webserver gestartet, über den die Kommunikation zwischen den Knoten abgewickelt wird. Das Starten des Dienstes erfolgt in diesem Fall per nachfolgendem Kommando: 1 ./ sym -- port 9090 Listing 6.1: Starten des SymmetricDS-Standalone-Service Alternativ hierzu ist es möglich, den Service als Web Application Archive (WAR) zu installieren. In diesem Fall müssen die benötigten Java-Bibliotheken und Konfigurationsdateien entsprechend der Java-Servlet-Spezifikation (s. Sun Microsystems Inc. (2011)) in die Verzeichnisstruktur des Archivs aufgenommen werden. Die Nutzung eines WARArchivs ist insbesondere dann sinnvoll, wenn bereits ein Anwendungsserver wie Apache Tomcat ausgeführt wird. Das Archiv kann in dem Fall durch den Anwendungsserver geladen, gestartet und gestoppt werden, während dessen Web-Server statt dem integrierten Jetty-Server genutzt wird. Die dritte Möglichkeit besteht darin, SymmetricDS direkt in eine Java-Anwendung zu integrieren. Die quelloffene Bibliothek ist gut dokumentiert (s. JumpMind Inc. (2013b)) und stellt eine Reihe von Interfaces bereit, die es erlauben, die Funktionsweise zu erweitern. Der Standalone-Client stellt nichts anderes als eine Benutzerschnittstelle zu den durch diese Bibliotheken definierten Klassen und Methoden dar. Listing 6.2 gibt ein Minimalbeispiel vor, wie der Service programmatisch ausgeführt werden kann. 6 Implementierung 1 54 import org . jumpmind . symmetric . SymmetricWebServer ; 2 3 public class StartSymmetricEngine { public static void main ( String [] args ) throws Exception { 4 SymmetricWebServer node = new SymmetricWebServer ( " classpath :// 5 properties / pergamon000 . properties " ) ; node . start (9090) ; 6 } 7 8 } Listing 6.2: Minimalanwendung zum Starten des SymmetricDS Synchronisationsservices 6.2 Funktionsweise SymmetricDS nutzt Datenbanktrigger, um Verlaufsdaten (Knoten-ID, Schema, Tabelle, Primärschlüsselspalten, alte Spaltenwerte, neue Spaltenwerte, Zeitpunkt) zu sammeln und setzt damit das Change Data Capture-Design Pattern um. Diese Informationen werden entsprechend der an einem Knoten registrierten Synchronisationspartner in sogenannte Batches verteilt, die in Form von CSV-Dateien versendet werden. Auf Seiten des Empfängers werden diese Dateien interpretiert und anschließend als eine Transaktion ausgeführt. Durch die monoton steigende Batch-ID und die mit übermittelte Knoten-ID wird dabei sichergestellt, dass diese nur in ihrer kausalen Reihenfolge ausgeführt werden, auch wenn mehr als ein Batch vom Sender empfangen wird. Werden Konflikte festgestellt, können diese entweder via einer automatisierten Konfliktlösung bearbeitet werden (Priorität Sender, etc.), oder die Synchronisation wird abgebrochen und die Transaktion zurückgerollt. So ist sichergestellt, dass die Datenbank in einem konsistenten Zustand verbleibt. Die empfangenen Batches werden damit nicht verworfen, sondern warten lediglich auf eine manuelle Konfliktlösung, bevor sie beim nächsten Synchronisationsvorgang angewandt werden. So müssen Verlaufsdaten nur ein mal übertragen werden. Die externen Prozesse, genannt Jobs, die für die Synchronisation ausgeführt werden müssen, können unabhängig voneinander konfiguriert und gestartet werden. Die wichtigsten sind hier der Router -Job, welcher durch die Trigger gesammelte Verlaufsdaten in Batches zuteilt, sowie die Pull und Push-Jobs, welche für die Übertragung zuständig sind. Es ist nicht nötig, dass diese Prozesse ausgeführt werden, wenn lediglich Verlaufsdaten gesammelt werden sollen. Es reicht, wenn sie für eine Synchronisation gestartet werden. 6 Implementierung 55 6.3 Konfiguration Engine Der Replikations- und Synchronisationsprozess, der durch den SymmetricDS-Dienst angestoßen wird, ist auf Höhe sogenannter Engines definiert, welche eine Verbindung der Java-Anwendung zur Datenbank beschreiben. Es ist möglich, mehrere Engines durch einen Java-Prozess auf einem Computer und über einen Port zu betreiben. Anfragen richten sich dabei an eine REST-API unter der konfigurierten Synchronisations-URL, über die die Engine angesprochen wird. Lokale Datenbanken lassen sich dabei ebenso untereinander adressieren. Die Verbindungsparameter werden in einfachen Java-PropertiesDateien vorgenommen, deren grundlegenden Einstellungen in der folgenden Tabelle zusammengefasst sind: Tabelle 6.2: Die wichtigsten Startup-Einstellungen einer SymmetricDS-Engine Bezeichnung Kurzbeschreibung engine.name group.id external.id registration.url sync.url db.driver db.url db.user db.password Name der Engine zur Identifikation in der JVM ID der Knoten-Gruppe Sekundärer Identifikator dieses Knotens URL, die durch die Engine zur Registrierung kontaktiert wird Eigene Synchronisations-URL der Engine Klassenname des JDBC-Treibers JDBC-URL zur Datenbankverbindung Datenbanknutzer für Zugriff durch die Engine Password Die Properties-Dateien werden beim Start einer Engine ausgewertet, wobei sie in einer Standalone-Installation im Unterverzeichnis $SYM/engines gesucht werden. In einem WAR-Archiv sind sie unter WEB-INF/classes zu platzieren. Eine typische Konfiguration zur Anwendung auf der Mutter-Instanz bzw. auf deren Kinder-Instanzen wurde erstellt und ist im Anhang 7 beigefügt. Die Registrierungs-URL dient beim Einrichten der Replikationshierarchie zur Verbindungsaufnahme mit der Eltern-Instanz. Ein neu startender Synchronisationsserver wird prüfen, ob die SymmetricDS-Systemtabellen im gewählten Datenbankschema installiert sind, dies unter Umständen nachholen und anschließend diese URL ansprechen, um um eine Registrierung zu bitten. Wird diese gewährt, werden zuerst die auf der Eltern-Instanz vorliegenden Konfigurationsdaten übertragen. Anhand dieser Konfiguration wird entschieden, welche Datenbanktrigger installiert werden müssen, um Verlaufsdaten für die Synchronisation zu sammeln. Die Wurzel der Replikationshierarchie, bzw. der Mutter-Instanz, hat natürlich keinen Zugriff auf eine Registrierungs-URL. Auf dieser Instanz wird vielmehr die erste Konfiguration 6 Implementierung 56 vorgenommen, bevor sie als ein Knoten der Synchronisation definiert wird. Dieser Schritt wird in Abschnitt 6.8 eingehender erläutert. Da der Synchronisationsservice Änderungen am Datenbestand durchführen und Datenbanktrigger an den entsprechenden Tabellen installieren muss, sollte ein eigener Datenbanknutzer hierfür eingerichtet werden. So ist es auch möglich zu bestimmen, in welches Datenbankschema die Systemtabellen des Services installiert werden sollen. Standardmäßig werden diese im Schema public angelegt. Um dies zu verhindern, kann dem SymmetricDS-Datenbanknutzer ein Standardsuchpfad zugewiesen werden, wie dies in Listing 6.3 demonstriert wird. 1 # Unter der Annahme dass die SymmetricDS - Systemtabellen 2 # im Schema ’ sym ’ installiert werden sollen 3 CREATE USER sym_user LOGIN PASSWORD ’ secr3t ’; 4 GRANT USAGE ON SCHEMA sym TO sym_user ; 5 GRANT CREATE ON SCHEMA sym TO sym_user ; 6 ALTER USER sym_user SET SEARCH_PATH TO sym , public , pg_catalog ; Listing 6.3: Erstellen eines SymmetricDS-Nutzers Neben diesen Nutzerrechten braucht der SymmetricDS-Datenbanknutzer das Recht auf Tabellen, die repliziert werden sollen, zuzugreifen und an ihnen Tabellentrigger zu kreieren. Das Einrichten des Datenbanknutzers muss mit jeder Installation der OpenInfRAAnwendung auf dem lokalen Datenbankserver durchgeführt werden. Damit sind alle Vorkehrungen getroffen, um die Replikation und Synchronisation einzurichten. 6.4 Datenmodell SymmetricDS stellt ein umfassendes Datenmodell zur Verfügung, über welche die Replikation und Synchronisation feingranular konfiguriert werden kann. Für einen Überblick sind in Abbildung 22 die wichtigsten hierfür genutzten Entitäten gegeben und ihre Beziehungen untereinander dargestellt. Die Übersicht soll in erster Linie dazu dienen, die folgenden Erläuterungen nachvollziehbar zu machen. Eine detailliertere Aufstellung wird in der Dokumentation geboten. (Long u. a. 2013, S. 99ff.) 6.4.1 Konfigurationstabellen • Node: Die Tabelle enthält die Definition der Datenbankinstanzen, die an der Synchronisation teilnehmen. Während eine durch den Nutzer selbst gewählte externe ID (external_id) den Knoten entsprechend seiner Domäne identifiziert, wird eine 6 Implementierung 57 Node Identity Node Group Node Node Channel Ctl Node Group Link Node Security Channel Router Trigger_Router Trigger Abbildung 22: ER-Diagramm der zur Konfiguration von SymmetricDS genutzten Systemtabellen. (ebd., S. 99) eindeutige Knoten-ID (node_id) genutzt, um die Instanz im System zu erkennen. Darüber hinaus werden in dieser Tabelle die Gruppenzugehörigkeiten der Knoten zugeteilt. • Node Security: Neben den Authentifizierungsparametern der Knoten, die mit dieser Instanz kommunizieren dürfen, wird hier verwaltet, ob für einen Server die Re- gistrierung geöffnet wurde, er diese bereits abgeschlossen hat und ein initialer Datenbestand gesendet wurde. • Node Identity: Enthält lediglich eine einzige Zeile, die die Identität des Knoten anhand seiner node_id repräsentiert. Für die Mutter-Instanz der Replikationshierarchie wird diese Zeile händisch eingetragen. Alle nachfolgenden Instanzen erhalten ihre „Identität“ mit der Registrierung bei einem Elternknoten. • Node Group: Enthält die Definition der verschiedenen Knoten-Gruppen, die zur Kategorisierung der Knoten genutzt werden kann. Typisch ist eine hierarchische Topologie. Die Zuordnung konkreter Knoten in Gruppen erfolgt in der Tabelle „Node“. • Node Group Link: Zuordnung der Kommunikationswege zwischen Knoten-Gruppen nach Pull-, in diesem Zusammenhang als Wait (W) bezeichnet, und Push-Verfahren (P). Ohne einen „Link“ zwischen den Gruppen ist keine Synchronisation zulässig. Sollen Daten bidirektional zwischen den Gruppen ausgetauscht werden, müssen für beide Richtungen Tupel angelegt werden. • Channel: Kanäle kategorisieren abgeschlossene Einheiten von Verlaufsdaten, die unabhängig voneinander synchronisiert werden sollen. Fehler bei der Synchronisa- 6 Implementierung 58 tion eines Kanals lassen andere davon unberührt. • Node Channel Control: Dient der Kontrolle der Synchronisationskanäle auf Ebene der einzelnen Knoten. • Trigger: Über die Entität „Trigger“ werden die konkreten Tabellentrigger definiert, die durch den Synchronisationsservice in der Datenbank installiert werden. Dabei lässt sich insbesondere auch bestimmen, ob nur eine Teilmenge der Operationen INSERT, UPDATE und DELETE zu CDC-Protokolleinträgen führen soll. • Router: Über Router lässt sich der Vorgang des „Batching“ konfigurieren. Hier wird eingestellt, wie der Synchronisationsservice im Betrieb die Verlaufsdaten in Batches zuweist, die letztendlich an die Synchronisationspartner gesendet werden. • Trigger_Router: Hierbei handelt es sich um eine Join-Tabelle, welche die Verbindung zwischen den Datenbanktriggern und den Routern herstellt. • Conflict: Die Tabelle „Conflict“ dient der Definition der Art der Konflikterkennung und -lösung auf Höhe der Kanäle. Die initiale Konfiguration der Replikation erfolgt auf dem Mutter-Knoten. Änderungen an der Konfiguration werden ausgehend von diesem Knoten an alle Kind-Instanzen bei der Synchronisation in einem separaten Kanal übertragen. Neben diesen Konfigurationstabellen dient eine Reihe weiterer Tabellen zur Organisation des Transaktionsprotokolls und der Durchführung des Synchronisationsvorgangs. Die Entitäten sind mit ihren Beziehungen in Abbildung 23 dargestellt. 6.4.2 Datentabellen • Data: Enthält die Captured Data Changes, die durch Trigger aufgezeichnet wurden. Dabei wird neben der Art der Operation, die zur Änderung geführt hat, den neuen und alten Attributwerten auch diejenige Knoten-ID gesichert, auf der die Änderung stattgefunden hat. Darüber hinaus wird die interne Transaktions-ID des Datenbankservers hinterlegt, um bei der Synchronisation Änderungen atomar zu gruppieren und einzuspielen. Der Zeitpunkt der Protokollierung wird zur Information mit der lokalen Uhrzeit und einer logischen Zeit in Form eines monoton steigenden Zählers versehen. • Data Event: Daten-Events stellen die Zuordnung zwischen den lokalen protokollierten Änderungen und den Empfängern dieser Änderungen dar. Da über die Zuord- nung von Triggern und Router eine feingranulare Kontrolle darüber besteht, welcher Knoten welche Änderungen empfangen soll, ist diese Zuordnung hier nötig. • Outgoing Batch: Ein Batch ist eine abgeschlossene Einheit von Operationen, die lokal protokolliert wurden und für die Synchronisation an einen Empfänger gesen- 6 Implementierung 59 Node Channel Ctl Outgoing Batch Node Incoming Batch Data Event Node Communication Incoming Error Data Trigger History Channel Trigger Abbildung 23: ER-Diagramm der an der Protokollierung von Änderungen und Synchronisation beteiligten Systemtabellen. (ebd., S. 100) det werden. Data-Events referenzieren Outgoing Batches. • Incoming Batch: Enthält von Synchronisationspartnern empfangene Batches und stellt so das logische Gegenstück zu Outgoing Batches dar. • Incoming Error: Als Incoming Error werden Operationen vermerkt, welche in einem Batch empfangen wurden und im Konflikt zum lokalen Datenbestand stehen. 6.5 Einrichten der Replikationshierachie eines Projekts Um die Replikation der Projektdaten im Sinne des Mutter-Kind-Konzepts umzusetzen, wird im Folgenden damit begonnen, eine Standardkonfiguration zu erstellen, die für die Nutzung bei den jeweiligen Projekten leicht angepasst werden kann. Dafür werden KindInstanzen als Knoten in Knoten-Gruppen, auch als Tier bezeichnet, geordnet und durch Einträge in der Tabelle Node Group bekannt gemacht. Für die prototypische Implementierung für ein OpenInfRA Projekt wurden vier Hierarchieebenen vorgesehen, die in der Praxis etwa durch die Mutter-Instanz auf einem zentralen Server, Desktop-Rechner im Büro und Laptops für die Feldarbeit belegt werden können (s.a. Abbildung 5). Damit steht eine weitere Ordnungsebene gewissermaßen als Backup zur Verfügung. Die Definition 6 Implementierung 60 weiterer Tier kann zu einem späteren Zeitpunkt erfolgen und ist in ihrer Tiefe unbegrenzt. Das folgende Listing 6.4 zeigt die vorgeschlagene Konfiguration: 1 INSERT INTO sym_node_group ( 2 node_group_id , 3 description , 4 create_time , 5 last_update_by , 6 last_update_time 7 ) VALUES 8 ( ’ mother ’ , ’ Mutter - Instanz - Zentraler Server ’ , current_timestamp , current_user , current_timestamp ) , 9 ( ’ office ’ , ’ 2. - Desktop ’ , current_timestamp , current_user , current_timestamp ) , 10 ( ’ mobile ’ , ’ 3. - Laptops f ü r Au ß endienst ’ , current_timestamp , current_user , current_timestamp ) , 11 ( ’ rover ’ , ’ 4. - Laptops f ü r Au ß endienst ’ , current_timestamp , current_user , current_timestamp ) ; Listing 6.4: Konfiguration der Knoten-Hierarchie Nachdem die Hierarchie angelegt wurde, gilt es den Datenfluss zwischen den Ebenen als Synchronisation zu definieren. Hierzu dient die Tabelle Node Group Link, in der Verbindungen nach dem Push- (P) oder Pull-Verfahren (W) eingefügt werden. Für eine bidirektionale Synchronisation sind jeweils ein Eintrag für den Down- und den Upstream zwischen Eltern- und Kind-Instanz nötig. Für Offline-Instanzen ist hier das Push-Verfahren geeignet, welches diese zum Einleiten der Synchronisation verpflichtet. Die Eltern-Instanz wartet damit auf eine Kontaktaufnahme der Kind-Instanz. Diese führt zur Synchronisation jeweils eine Pull-Anweisung durch, bei der sie Änderungen vom Eltern-Knoten einholt, und eine „Push“-Anweisung, bei der sie die lokalen Änderungen übermittelt. Die Reihenfolge bestimmt dabei, auf welchem Knoten eventuelle Synchronisationskonflikte bearbeitet werden. 1 INSERT INTO sym_node_group_link ( 2 source_node_group_id , 3 target_node_group_id , 4 data_event_action , 5 create_time , 6 last_update_by 7 ) VALUES 8 ( ’ office ’ , ’ mother ’ , ’P ’ , current_timestamp , current_user ) , 9 ( ’ mother ’ , ’ office ’ , ’W ’ , current_timestamp , current_user ) , 10 ( ’ mobile ’ , ’ office ’ , ’P ’ , current_timestamp , current_user ) , 6 Implementierung 61 11 ( ’ office ’ , ’ mobile ’ , ’W ’ , current_timestamp , current_user ) , 12 ( ’ rover ’ , 13 ( ’ mobile ’ , ’ rover ’ , ’ mobile ’ , ’P ’ , current_timestamp , current_user ) , ’W ’ , current_timestamp , current_user ) ; Listing 6.5: Einrichten von Pull- und Push-Verbindungen Der Unterschied zwischen Pull- und Push-Verfahren lässt sich am folgenden Sequenzdiagramm besser nachvollziehen. Sie unterscheiden sich insbesondere durch den Einsatz der HTTP-Verben GET, POST, PUT und HEAD. Kind-Instanz Eltern-Instanz Push OK to Push? (HTTP HEAD) Push (HTTP PUT) Pull Pull (HTTP GET) ack (HTTP POST) Abbildung 24: Einsatz der HTTP-Verben beim Synchronisationsvorgang. (Darstellung nach Long (2012)) 6.6 Protokollieren von Verlaufsdaten Um Änderungen in den Tabellen zu loggen, werden Datenbanktrigger eingesetzt, die die Zeilenattribute in der Reihenfolge der Ausführung in die Verlaufstabelle Data eintragen. Jeder Trigger ist dabei einem „Datenkanal“ (engl. Channel) zugeordnet, der die Änderungen bei der Übertragung und Synchronisation gegenüber Änderungen in anderen Kanälen isoliert. Wird einer dieser Kanäle ausgebremst, weil beispielsweise ein Konflikt bei der Synchronisation aufgetreten ist, hat dies so keinen Einfluss auf andere Kanäle. Zu beachten ist, dass insbesondere Trigger der Tabellen einem gemeinsamen Kanal zugeordnet werden müssen, welche in einer Fremdschlüsselbeziehung zueinander stehen, einen semantischen Zusammenhang bilden und deren Änderungen auch auf dem Synchronisationspartner in der gleichen Reihenfolge ausgeführt werden müssen. So ist vermeidbar, dass die Synchronisation später aufgrund eines fehlenden Fremdschlüssels scheitert. Mit der Installation der Systemtabellen und der Initialisierung bestehen bereits 6 Implementierung 62 die Kanäle default und config, welche die Synchronisation der Konfigurationsparameter kapseln. Für die Projektdaten der OpenInfRA-Anwendung soll ein eigener Kanal definiert werden. 1 INSERT INTO sym_channel ( 2 channel_id , 3 processing_order , 4 max_batch_size , 5 max_batch_to_send , 6 enabled , 7 batch_algorithm , 8 description , 9 create_time , last_update_by , last_update_time 10 ) VALUES ( 11 ’ project_data ’ , 12 100 , 13 10000 , 14 100 , 15 1, 16 ’ default ’ , 17 ’ Projektdaten des Projekts Pergamon ’ , 18 current_timestamp , current_user , current_timestamp 19 ); Listing 6.6: Definition eines Datenkanals Listing 6.6 zeigt die hierfür vorgeschlagene Konfiguration. Die processing_order gibt an, in welcher Reihenfolge die Kanäle übertragen und synchronisiert werden sollen. Die Standardkanäle default (Priorität 0) und config (Priorität 1) sollten eine höhere Priorität behalten, um sicherzustellen, dass geänderte Einstellungen zuerst ihren Weg auf die Repliken-Manager finden. Darüber hinaus wird definiert, wie viele Änderungen in einer Übertragungseinheit zusammengefasst werden sollen. Ein zu kleiner max_batch_size würde zu einer unnötig großen Menge an Batches führen. Ein Wert von 10000 Änderungen, bzw. 10000 Schreibvorgängen erscheint hingegen vertretbar und entspricht dem vorgeschlagenen Standard. Der batch_algorithm bestimmt, auf welche Art und Weise die lokalen Transaktionsklammern bei der Bildung der Batches berücksichtigt werden. Zur Verfügung stehen die Algorithmen transactional, nontransactional und default. Ersteres diktiert genau eine Transaktion in einen Batch und ignoriert damit den Wert für die maximale Batch-Größe. Nontransaktional bewirkt das Gegenteil, das heißt Transaktionsklammern werden komplett ignoriert, wodurch die Atomarität einer Transaktion über die Grenzen der maximalen Batch-Größe verloren gehen kann. Default stellt den hier geeignetsten Algorithmus dar, bei dem einerseits die Transaktionsklammern beim Routing 6 Implementierung 63 berücksichtigt und andererseits mehrere Transaktionen einem Batch zugewiesen werden, bis dieser „voll“ ist. Nun können dem Kanal entsprechende Trigger zugeordnet werden, wie es im Folgenden demonstriert wird: 1 -- CDC - Trigger 2 INSERT INTO sym_trigger ( 3 trigger_id , 4 source_schema_name , 5 source_table_name , 6 channel_id , last_update_time , last_update_by , create_time 7 8 ) 9 VALUES ( 10 ’ PT_FreeText ’ , 11 ’ Projektdatenbank_v10 ’ , 12 ’ PT_FreeText ’ , 13 ’ project_data ’ , current_timestamp , current_user , current_timestamp 14 15 ); Listing 6.7: Einrichten der CDC-Trigger einer replizierten Relation Bei einem umfassenden Datenmodell, das über mehrere Datenbankinstanzen repliziert werden soll, wird die Definition von Triggern auf die Art, wie sie in Listing 6.7 demonstriert ist, schnell unübersichtlich, da hier jede einzelne Tabelle bedacht werden muss. Wird ohnehin das gesamte Schema verteilt, können ähnlich der Regex-Notation die zu diesem Zweck verfügbaren Wild Card-Zeichen genutzt werden, um mehrere Tabellen gleichzeitig mit einzubeziehen. Für die Konfiguration für die OpenInfRA-Projektdatenbank bietet sich die Ausweitung auf alle Tabellen im Schema der Projektdatenbank an. In diesem Fall ist das folgende Listing maßgeblich: 1 INSERT INTO sym_trigger ( 2 trigger_id , 3 source_schema_name , 4 source_table_name , 5 channel_id , 6 sync_on_incoming_batch , 7 create_time , last_update_by , last_update_time 8 ) VALUES 9 ( ’ project_data_trigger ’ , 10 ’ Projektdatenbank_v10 ’ , 11 ’* ’ , 6 Implementierung 12 ’ project_data ’ , 13 1, 14 current_timestamp , current_user , current_timestamp ) ; 64 Listing 6.8: Einrichten der CDC-Trigger via Wild Card Nachdem die neue Konfiguration durch den Synchronisationsservice erkannt wurde, werden die entsprechenden Datenbanktrigger an den Tabellen installiert und Änderungsoperationen schließlich in der Verlaufstabelle „Data“ protokolliert. Die zuvor beschriebenen Router dienen an dieser Stelle letztendlich dazu, zu bestimmen, welche Änderungen an welche Knoten-Gruppe übertragen werden sollen. Dem Attribut sync_on_incoming_batch kommt hier eine besondere Wichtigkeit zu. Es bewirkt, dass bei der Synchronisation empfangene Änderungen bei der Anwendung auf den lokalen Datenbestand wieder neue CDC-Events triggern und die resultierenden Verlaufsdaten an die entsprechend nachfolgenden Ebenen der Replikationshierarchie weitergeleitet werden können. Um hier eine zirkuläre Beziehung zwischen Sender und Empfänger zu verhindern, wird die Knoten-ID des Senders berücksichtigt. Listing 6.9 demonstriert einen Router zwischen den Hierarchieebenen mother, also der Mutter-Instanz, als Sender und office als Empfänger. Die Join-Tabelle Trigger_Router erlaubt letztlich eine feingranulare Konfiguration, die bestimmt, welche lokalen Änderungen an welche Knoten-Gruppe gesendet werden sollen. Die initial_load_order gibt dabei an, in welcher Reihenfolge diese Konfiguration beim Senden des initialen Datenbestands bedient wird. Der initial_load_select erlaubt nur bestimmte Zeilen der Tabelle beim Übermitteln des ersten Datenbestands zu berücksichtigen, also die Tabelle zu fragmentieren. 1 INSERT INTO sym_router ( 2 router_id , 3 source_node_group_id , 4 target_node_group_id , 5 router_type , 6 create_time , last_update_by , last_update_time 7 ) 8 VALUES ( ’ mother_2_office ’ , 9 10 ’ mother ’ , 11 ’ office ’ , 12 ’ default ’ , 13 current_timestamp , current_user , current_timestamp 14 ); 15 16 17 INSERT INTO sym_trigger_router ( trigger_id , 6 Implementierung 18 router_id , 19 initial_load_order , 65 20 initial_load_select , 21 create_time , last_update_by , last_update_time 22 ) 23 VALUES ( 24 ’ project_data_trigger ’ , 25 ’ mother_2_office ’ , 26 100 , 27 null , 28 current_timestamp , current_user , current_timestamp 29 ); Listing 6.9: Einrichten eines Router Ähnlich der Konfiguration zur Synchronisation von Änderungen in der Datenbank verhält sich die Konfiguration externer Daten. Dies kann genutzt werden, um sowohl externe Projektdate, als auch externe Konfigurations- oder Systemdateien zwischen den Instanzen zu synchronisieren. 6.7 Synchronisation externer Dokumente Die Konfiguration der Synchronisation externer Dokumente und Dateien erfolgt ebenfalls über die SymmetricDS-Systemtabellen. Die Logik bei der Vorgehensweise ist der Datenbanksynchronisation sehr ähnlich. Statt CDC-Trigger über die Tabelle Trigger einzurichten, werden Java BeanShell Scripts über die Tabelle File Trigger definiert. Der File Tracker Job untersucht darauf periodisch die definierten Ordner und gleicht Zeitstempel und Checksummen der Dateien ab. Dabei kann zusätzlich nach Dateiname und -endung gefiltert werden, um beispielsweise nur PDF-Pläne von der Mutter-Instanz auf Kind-Instanzen zu replizieren. Auch dieser Prozess muss im Offline-Betrieb auf den Kind-Instanzen nicht durchgehend ausgeführt werden, sondern begnügt sich mit dem Auslesen der Änderungszeitpunkte der Dateien vor der Synchronisation. Durch die Nutzung von BeanShellSkripten, welche über die lokale Java JVM ausgeführt werden, ist der Service betriebssystemunabhängig. Das Hinzufügen, Ändern und Löschen von Dateien wird in der Tabelle „File Snapshot“ durch Dateipfad, Dateiname, CRC32-Checksumme und weitere Merkmale verbucht. Wie bei der Definition „normaler“ Tabellentrigger, werden die File Trigger über bereits zuvor definierte Router (s. Abschnitt 6.6) an die designierten Empfänger vermittelt. Listing 6.10 zeigt die Definition eines File-Triggers für den Medienordner eines Teilprojekts und die Zuordnung zu einem der bereits zuvor definierten Router. Die Synchronisa- 6 Implementierung 66 tion weiterer Ordner bspw. für externe Konfigurationsdateien der OpenInfRA-Anwendung kann auf die gleiche Weise erfolgen. 1 -- File Trigger 2 INSERT INTO sym_file_trigger ( 3 trigger_id , 4 base_dir , 5 recurse , 6 includes_files , 7 excludes_files , 8 sync_on_create , sync_on_modified , sync_on_delete , 9 before_copy_script , 10 after_copy_script , 11 create_time , last_update_by , last_update_time 12 ) VALUES ( 13 ’ baalbek_directory ’ , 14 ’ ../ OpenInfRA / Media / baalbek ’ , 15 1, 16 ’ *. pdf ’ , 17 null , 18 1 ,1 ,1 , 19 ’ targetBaseDir = System . getEnv () . get (" OPENINFRA_MEDIA_BAAL ") ; ’ , 20 null , 21 current_timestamp , current_user , current_timestamp 22 ); 23 24 -- Trigger - Router 25 INSERT INTO sy m _f il e _t ri gg e r_ ro ut e r ( 26 trigger_id , 27 router_id , 28 enabled , initial_load_enabled , 29 target_base_dir , 30 conflict_strategy , create_time , last_update_by , last_update_time 31 ) 32 VALUES 33 ( 34 ’ baalbek_directory ’ , 35 ’ mother_2_office ’ , 36 1, 1, 37 ’’, 38 ’ SOURCE_WINS ’ , 39 current_timestamp , current_user , current_timestamp 40 ); Listing 6.10: Zuordnung Router - Trigger 6 Implementierung 67 Die Spalten before_copy_script und after_copy_script erlauben die Definition eigener BeanShell Skripte, die auf dem Empfänger-Knoten ausgeführt werden. So kann beispielsweise über die Java-Klasse System auf die Environment-Variablen des Systems zugegriffen werden, um den Zielpfad der Dateien bei der Synchronisation zu bestimmen. Es ist so möglich, die unterschiedlichen Konventionen der Pfadangabe zwischen Windows und unixoiden Systemen zu berücksichtigen und schließlich im Skript die Variable targetBaseDir anzupassen. Die Übertragung der zu synchronisierenden Dateien erfolgt als Zip-Archiv gepackt über den konfigurierten Web-Server. Auf Seite des Empfängers wird das Archiv entpackt, das enthaltene BeanShell Skript interpretiert und die Dateien anschließend an ihren relativen Pfad verschoben. Dabei wird geprüft, ob das Ablegen der Datei einen Konflikt verursacht. Sollte dem so sein, kann eine Priorisierung der bestehenden oder empfangenen Datei bestimmt werden (Spalte conflict_strategy). Zu beachten ist, dass hierdurch das Überschreiben der Dateien verursacht werden kann, wenn beide Instanzen diese verändert haben. Die Anwendungsebene sollte hier sicherstellen, dass bei Änderungen neue Versionen angelegt werden. Damit ist die Konfiguration der Replikationshierarchie und des Datenflusses beendet und die Mutter-Instanz eines Projekts kann für die Replikation eingerichtet werden. 6.8 Mutterknoten einrichten Der Root-Knoten bzw. die Mutter-Instanz der Replikationshierarchie muss bei der Einrichtung einer Replikation händisch initialisiert werden. Dafür wird der Knoten im System „registriert“, indem in den Tabellen Node und Node Security entsprechende Einträge vorgenommen werden. Anschließend kann die Identität des Mutter-Knoten in der Tabelle Node Identity zugewiesen werden. Bei der Erstellung von Kind-Instanzen wird dieser Vorgang automatisch durch die Registrierung an einer Eltern-Instanz durchgeführt. 1 -- Mutter - Instanz definieren 2 INSERT INTO sym_node ( 3 node_id , 4 node_group_id , 5 external_id , 6 sync_enabled , 7 schema_version 8 9 10 ) VALUES ( ’ pergamon - mother -000 ’ , ’ mother ’ , 6 Implementierung 68 11 ’ pergamon - mother -000 ’ , 12 1, ’ 10 ’ 13 14 ); 15 16 INSERT INTO sym_node_security ( 17 node_id , 18 node_password , 19 registration_time , 20 initial_load_time , 21 created_at_node_id 22 ) VALUES ( 23 ’ pergamon - mother -000 ’ , 24 ’ secr3t ’ , 25 current_timestamp , 26 current_timestamp , 27 ’ pergamon - mother -000 ’ 28 ); 29 30 -- Identit ä t zuweisen 31 INSERT INTO sym_node_identity VALUES ( ’ pergamon - mother -000 ’) ; Listing 6.11: Registrieren der Mutter-Instanz Durch das Setzen der Attribute registration_time und initial_load_time wird der Knoten beim Starten des Synchronisationsservices als „aktiv“ erkannt und steht nun für die Kontaktaufnahme bereit. 6.9 Erstellen einer Kind-Instanz Die Voraussetzung zum Erstellen einer Kind-Instanz ist eine initialisierte Elterninstanz, welche für die Registrierung erreichbar ist. Auf dem Computer müssen ein Datenbankserver und der SymmetricDS-Service installiert sein (s. Abschnitt 6.1). Für das Laden der Projektdaten ist außerdem eine initialisierte Datenbank mit dem Projektdatenschema vonnöten. Das Erstellen einer Kind-Instanz ist dem Erstellen einer Mutter-Instanz sehr ähnlich. Hierfür wird für die neue Instanz „die Registierung geöffnet“, indem an der gewählten ElternInstanz identifizierende Einträge in den Tabellen Node und Node Security gemacht werden. Diese Registrierung am Eltern-Knoten kann entweder durch SQL oder über das Tool symadmin erfolgen: 6 Implementierung 1 69 ./ symadmin -- engine pergamon - mother -000 open - registration office pergamon office -001 Listing 6.12: Öffnen der Registrierung eines Kind-Knoten am Eltern-Knoten per symadmin 1 INSERT INTO sym_node ( 2 node_id , 3 node_group_id , 4 external_id , 5 sync_enabled , 6 schema_version 7 ) 8 VALUES ( ’ pergamon - office -001 ’ , ’ office ’ , ’ pergamon - child -101 ’ , 1 , ’10 ’) ; 9 10 INSERT INTO sym_node_security ( 11 node_id , 12 node_password , 13 registration_enabled , 14 registration_time , 15 initial_load_time , 16 created_at_node_id 17 ) 18 VALUES ( ’ pergamon - office -001 ’ , ’ secr3t ’ , 1 , null , null , ’ pergamon - mother -000 ’) ; Listing 6.13: Öffnen der Registrierung eines Kind-Knoten am Eltern-Knoten per SQL Nachdem diese Einstellungen vorgenommen wurden, kann der Synchronisationsservice auf dem Kind-Knoten gestartet werden. Dieser wird den Kontakt über die definierte Registrierungs-URL (s. Abschnitt 6.3) aufnehmen und die Registrierung mit der ElternInstanz abschließen. Die Kind-Instanz erhält damit eine registration_time und bekommt eine eigene node_id zugewiesen. Enthält die Konfiguration Trigger, welche durch einen Eintrag in der Tabelle Trigger_Router auf diese Instanz zutreffen, werden diese automatisch an den entsprechenden Tabellen installiert. Um letztendlich die Projektdaten selbst auf dem neuen Knoten zur Verfügung stellen zu können, muss der Datenbestand vom Elternknoten an diesen übermittelt werden. Dazu dient das sogenannte „initial load“-Event, das auf dem Elternknoten auf mehreren Wegen ausgelöst werden kann. Für eine Standalone-Installation kann wiederum das Kommandozeilentool symadmin genutzt werden. Alternativ hat das Aktivieren des Attributs initial_load_enabled in der Node Security-Tabelle den gleichen Effekt. 6 Implementierung 1 -- symadmin 2 ./ symadmin -- engine pergamon - mother -000 reload - node pergamon - office -001 70 3 4 -- SQL 5 UPDATE sym . sym_node_security 6 SET initial_load_enabled = 1 7 WHERE node_id = ’ pergamon - child -101 ’; Listing 6.14: Online-Initialisierung einer Kind-Instanz. Durch dieses Flag werden beim nächsten Synchronisationsvorgang alle Daten an die Kind-Instanz übermittelt, welche durch die Konfiguration der Trigger und Router für diese von Bewandtnis sind. Außerdem wird für diesen Knoten anschließend das Attribut initial_load_time gesetzt, was ihn dazu berechtigt, selbst Registrierungen anzunehmen. Soll ein großer Datenbestand übertragen werden, ist es unter Umständen besser, diesen manuell auf der Kind-Instanz einzuspielen. Dafür werden die betreffenden Tabellen am Elternknoten exportiert, die Registrierung für die designierte Kind-Instanz geöffnet und die Datensätze schließlich am Kind-Knoten importiert. Für den Export können sowohl die Datenbankfunktionen (pg_dump) als auch die durch SymmetricDS zur Verfügung gestellten Funktionen genutzt werden, welche leichter in eine Anwendung zu integrieren sind. Statt nun ein Reload-Event nach der Registrierung auszulösen, muss lediglich das Attribut initial_load_time in der Tabelle Node Security auf die Exportzeit gesetzt werden. Die Einstellung ist nicht zwingend für die Synchronisation zwischen diesen beiden Partnern notwendig, allerdings ist es dem neuen Kind-Knoten nur mit einem definierten Initialisierungszeitpunkt möglich, selbst Registrierungen zuzulassen. Durch Öffnen der Registrierung beim Export der Projektdaten ist die Eltern-Instanz angehalten, Verlaufsdaten für die neue Kind-Instanz zu sammeln, die zwischen Import und und Abschluss der Registrierung anfallen. So ist sichergestellt, dass nach der Synchronisation ein konsistenter Zustand zwischen den Instanzen herrscht. Alternativ zum manuellen Registrieren der Kind-Knoten kann für einen Eltern-Knoten in der Properties-Datei die Einstellung auto.registration aktiviert werden, welche die Registrierung automatisch öffnet, wenn eine neue Instanz diese kontaktiert. Hinzu kommt die Möglichkeit, mit jeder neuen Registrierung den entsprechenden Datenbestand zu übertragen, ohne dies explizit starten zu müssen. Hierzu dient die Einstellung auto.reload. Um sicherzustellen, dass der Kind-Knoten keine Daten enthält, die vom initialen Bestand abweichen, können die Tabellen durch initial.load.delete.first geleert werden. 6 Implementierung 71 6.10 Synchronisation Die Synchronisation erfolgt beim Starten des Synchronisationsservices bzw. anschließend nach den konfigurierten Intervallen der Pull- bzw. Push-Jobs. Durch die Nutzung des HTTP-Protokolls kann anhand des HTTP-Header-Felder Content-Length bzw. Content-MD5 sichergestellt werden, dass das gesamte CSV-Dokument korrekt übertragen wurde. Der Transport erfolgt dabei komprimiert und, entsprechend der Konfiguration des Web Servers, verschlüsselt. Tabelle 6.3 gibt Aufschluss über die wichtigsten Parameter. Tabelle 6.3: Konfigurationsparameter Synchronisation Parameter Beschreibung job.route.cron Gibt an, wie oft die aufgelaufenen Verlaufsdaten zu Batches zugeordnet werden sollen. Gibt an, wie oft die definierte Push-Synchronisationen eingeleitet werden soll. Gibt an, wie oft die definierte Pull-Synchronisationen eingeleitet werden soll. job.push.cron job.pull.cron Soll die Synchronisation für eine Offline-Instanz komplett pausiert werden, ist es lediglich nötig, den Synchronisationsdienst zu stoppen. Änderungen werden weiterhin durch die Datenbanktrigger aufgezeichnet. Sobald der Synchronisationsservice wieder gestartet wird, werden die aufgelaufenen Änderungen in Batches organisiert und eine Synchronisation gestartet. Es ist möglich, den Synchronisationsservice stetig gestartet zu lassen, auch wenn keine Datenverbindung verfügbar ist. Die Synchronisation wird dann entsprechend der definierten Cron-Jobs mit der nächsten Gelegenheit ausgeführt. Da das periodische Synchronisieren nicht in jedem Fall sinnvoll ist, wurde das Konsolentool symadmin um Hilfsfunktionen zum manuellen Starten des Push- und Pull-Jobs erweitert (s. Listing 6.15). Vor einem „Push“ wird ein Routing-Vorgang eingeleitet, der angelaufene Änderungen in Batches zusammenfasst. Anschließend werden die Batches an die Eltern-Instanz übermittelt. Die Implementierung ist dabei denkbar einfach, da auf bestehende Service-Schnittstellen zurückgegriffen werden kann. So lässt sich nicht nur der Zeitpunkt kontrollieren, an dem eine Synchronisation durchgeführt wird, sondern es kann auch entschieden werden, ob potentiell konfliktverursachende Operationen eingeholt werden sollen, um diese lokal zu lösen. 1 private void pushNode ( CommandLine line , List < String > args ) { 2 ISymmetricEngine engine = getSymmetricEngine () ; 3 engine . getRouterService () . routeData ( true ) ; 4 engine . getPushService () . pushData ( true ) ; 6 Implementierung 5 72 } 6 7 private void pullNode ( CommandLine line , List < String > args ) { 8 ISymmetricEngine engine = getSymmetricEngine () ; 9 engine . getPullService () . pullData ( true ) ; 10 } 11 12 private void syncNode ( CommandLine line , List < String > args ) { 13 pullNode ( line , args ) ; 14 pushNode ( line , args ) ; 15 } Listing 6.15: Hilfsfunktionen zum manuellen Senden und Empfangen von Synchronisationsdaten. (Paket org.jumpmind.symmetric.SymmetricAdmin.java) 6.11 Offline-Synchronisation Die Offline-Synchronisation stellt keine Standardfunktion von SymmetricDS dar, kann aber über die bestehenden Funktionen realisiert werden. Batches werden dafür als CSVDateien in das Dateiverzeichnis exportiert und auf der Gegenseite importiert. Es handelt sich dabei um das gleiche Format, das für die Online-Synchronisation angewandt wird. Beim Import ist dann darauf zu achten, dass Batches immer in der sequentiellen Reihenfolge ihrer ID ausgeführt werden. 1 ./ symadmin -- engine pergamon - mother -000 export - batch pergamon - child -001 178 2 ./ symadmin -- engine pergamon - child -001 import - batch 178. csv 178. csv Um zu verhindern, dass der bereits offline importierte Batch ein weiteres Mal bei einer Online-Synchronisation an den Empfänger versendet wird, und damit unnötiger Netzwerktraffic entsteht, kann der Status in der Tabelle outgoing_batches auf „OK“ gesetzt werden. Dies sollte aber nur dann geschehen, wenn sichergestellt ist, dass der Batch wirklich abgearbeitet wurde. Ein mehrfacher Import durch den Empfänger ist durch die Identifizierung per Node-Id und Batch-ID nicht möglich. Diese Vorgehensweise ist vergleichbar mit der in Abschnitt 4.3.3 vorgestellten manuellen Synchronisation mit ArcGIS. 6 Implementierung 73 6.12 Konfliktlösung Natürlich können auch bei der Synchronisation mit SymmetricDS Konflikte auftreten, die entsprechend behandelt werden müssen. In der Standardeinstellung wird SymmetricDS bei einem Konflikt probieren, die empfangene Änderung auf den lokalen Datenbestand anzuwenden, indem die Operation semantisch angepasst wird. Das bedeutet, dass für ein Tupel, das in einer Relation unvorhergesehen schon vorhanden ist, ein INSERT in ein UPDATE und ein UPDATE bei einem nicht vorhandenen Datensatz in ein INSERT gewandelt wird. Das Löschen eines bereits entfernten Datensatzes wird lediglich geloggt. Während diese Funktionsweise für eine unidirektionale Synchronisation passend sein kann, ist dies für Projektdaten der OpenInfRA-Anwendung nicht geeignet, da keine Kontrolle stattfindet, ob Attribute vor Anwendung der Operation zwischen den Synchronisationspartnern divergieren und lokale Änderungen im Sinne eines Lost Update überschrieben werden. Besser ist hier eine Konflikterkennung, die nicht nur die Primärschlüssel vergleicht, sondern dafür auch die Spaltenwerte berücksichtigt. In Abschnitt 6.10 wurde dies bereits als datensatzbasierte Synchronisation definiert. Die Konfliktlösung soll manuell erfolgen, um dem Nutzer volle Kontrolle über Änderungen zu geben. Hierfür können entsprechende Strategien in der Tabelle Conflict definiert werden: 1 INSERT INTO sym . sym_conflict ( 2 conflict_id , 3 source_node_group_id , 4 target_node_group_id , 5 target_channel_id , 6 detect_type , 7 resolve_type , 8 ping_back , 9 create_time , last_update_by , last_update_time 10 ) 11 VALUES 12 ( ’ man ua l_m ot her _2 _of fic e ’ , 13 ’ mother ’ , 14 ’ office ’ , 15 ’ project_data ’ , -- Kanal der Projektdaten 16 ’ use_old_data ’ , -- Verwende Spaltenwerte vor Ä nderung zum Abgleich 17 ’ manual ’ , -- Fehler loggen und auf Nutzerinteraktion warten 18 ’ SINGLE_ROW ’ , -- Ping Back der Zeile zum Sender nach Konfliktl ö sung 19 current_timestamp , current_user , current_timestamp 20 ); Listing 6.16: Manuelle Konfliktlösungsstrategie für Projektdaten 6 Implementierung 74 In der in Listing 6.16 gezeigten Konfiguration wird eine manuelle Konfliktlösung auf Höhe des Projektdatenkanals project_data definiert. So ist der Nutzer angehalten, den Konflikt aufzulösen bevor die empfangenen Änderungen eingespielt werden. Dies garantiert die Konsistenz des Datenbestands bei voller Kontrolle über die semantische Integrität. Die Konfliktlösung erfolgt auf Seiten des Empfängers mit Hilfe der Tabellen Incoming Batch und Incoming Batch Error. Der nachfolgende Query gibt unter anderem Informationen über den Grund des Konflikts, die betreffende Tabelle, die erwarteten Spaltenwerte, die beim Sender vor der Änderung bestanden (old_data) und die Spaltenwerte, die neu eingebracht werden sollen (row_data). 1 SELECT err .* , bat . sql_state , bat . sql_code , bat . sql_message 2 FROM sym_incoming_error AS err 3 INNER JOIN sym_incoming_batch AS bat 4 ON bat . batch_id = err . batch_id 5 AND bat . node_id = err . node_id 6 WHERE bat . status = ’ ER ’; 7 8 -- Result 9 batch_id = 194 10 node_id = 000 11 failed_row_number = 1 12 failed_line_number = 1 13 target_catalog_name = 14 target_schema_name = Projektdatenbank_v8 15 target_table_name = Landkodierung 16 event_type = U 17 binary_encoding = BASE64 18 column_names = Id , Landkodierung 19 pk_column_names = Id 20 row_data = " 29201 d46 -32 d1 -4290 -9551 -99 b85e6c6c7c " ," USA " 21 old_data = " 29201 d46 -32 d1 -4290 -9551 -99 b85e6c6c7c " ," RUS " 22 cur_data = 23 resolve_data = 24 resolve_ignore = 25 conflict_id = manual_strategy 26 create_time = 2013 -10 -09 16:01:25.955 27 last_update_by = symmetricds 28 last_update_time = 2013 -10 -09 16:01:25.955 29 sql_state = CONFLICT 30 sql_code = -999 31 sql_message = Detected conflict while executing UPDATE on Projektdatenbank_v8 . Landkodierung . d46 -32 d1 -4290 -9551 -99 b85e6c6c7c }. The primary key data was : { Id =29201 6 Implementierung 75 Listing 6.17: Query zum Analysieren von Konflikten im empfangenen Batch Bis ein solcher Konflikt gelöst ist, werden auf dem betreffenden Kanal zu dem betreffenden Knoten keine Batches mehr eingespielt, um die Konsistenz des Datenbestands zu sichern. Batches werden in diesem Fall nur empfangen, sodass beim Fortsetzen der Synchronisation an diesem Punkt die Kausalität der Änderungen beibehalten wird. Lösen lässt sich der Konflikt über die Attribute resolve_data oder resolve_ignore. So ist es möglich, die Attribute zu hinterlegen, die beim nächsten Synchronisationsversuch statt der in Konflikt stehenden Werte genutzt werden sollen. Alternativ lässt sich die Änderung ignorieren, beispielsweise da der in der Datenbank hinterlegte Wert dem neuen bereits gleicht. Die in Listing 6.16 vorgenommene Einstellung ping_back bewirkt, dass die Konfliktlösung beim nächsten Synchronisationsvorgang an den Sender übermittelt und auch dort als normale Änderung angewandt wird. So ist die Konsistenz zwischen den Synchronisationspartnern wiederhergestellt. Neben der Konfliktbehandlung beim Empfänger besteht auch die Möglichkeit, Konflikte auf Seiten des Senders zu bearbeiten. Um Konflikte in ausgehenden Batches aufzudecken, wird wiederum das Attribut error_flag in der Tabelle Outgoing Batch genutzt. Es wird beim Synchronisationsvorgang auf „wahr“ bzw. 1 gesetzt, wenn durch den Empfänger gemeldet wird, dass ein Konflikt ansteht. Über die Batch-ID kann dann nach der entsprechenden Änderung, die den Fehler verursacht, in der Tabelle Data gefiltert werden. Allgemein ist die Behandlung beim Empfänger vorzuziehen, da auf Seiten des Senders nur die Möglichkeit besteht, die Änderung oder den gesamten Batch zu ignorieren. 1 -- Batch mit Konflikt bestimmen 2 SELECT * FROM sym_outgoing_batch WHERE error_flag = 1; 3 4 -- Ä nderung finden die den Konflikt verursacht 5 -- Annahme das Batch 13 im vorhergehenden Schritt bestimmt wurde 6 SELECT * FROM sym_data WHERE data_id IN 7 ( SELECT data_id FROM sym_data_event WHERE batch_id = ’ 13 ’) ; Listing 6.18: Auffinden von Konflikten in ausgehenden Batches Während ein ausgehender Batch einen Konflikt auf einem anderen Knoten verursacht, ist der lokale Betrieb nicht beeinträchtigt. Die Synchronisation mit anderen Knoten kann ebenfalls fortgesetzt werden. 6 Implementierung 76 6.13 Purging Für jede Änderung in den replizierten Tabellen fallen Daten in der Data-Tabelle an. Hinzu kommen entsprechende Einträge in den Tabellen Data Event, Outgoing und Incoming Batch und weitere Metadaten. Nachdem die Synchronisation erfolgreich durchgeführt wurde, sind diese Daten nur noch für die Analyse der Vorgänge von Interesse. Um also Speicherplatz zu sparen, macht es Sinn, diese zu entfernen. Hierfür wird auf jeder Engine periodisch oder manuell der sogenannte „Purge“-Job ausgeführt, welcher Informationen über den Status der Batches mit den Informationen verwandter Knoten und definierten Routern verknüpft und die bereits auf allen Synchronisationspartnern angewandten Verlaufsdaten löscht. Dieser Vorgang ist vergleichbar mit dem Komprimieren der Geodatenbank, wie sie für ArcGIS in Abschnitt 4.3.3 beschriebene wurde. 6.14 Knoten entfernen Um einen nicht mehr benötigten oder anderweitig verloren gegangenen Knoten aus dem System zu entfernen, genügt es, ihn aus den Tabellen seines Elternknoten zu entfernen. Der in Abschnitt 6.13 beschriebene Purge-Job wird Metadaten und an diesen Knoten adressierte Batches entfernen und Speicherplatz freigeben. Dieser Vorgang ist unwiderruflich, da folgende Änderungen auf dem Eltern-Knoten nicht mehr in Batches an diesen Knoten adressiert werden. Soll der Computer also später wieder als eine Instanz eingerichtet werden, muss sie neu registriert werden. Listing 6.19 demonstriert das Entfernen eines Knoten. 1 CREATE OR REPLACE FUNCTION sym_delete_node ( text ) 2 RETURNS void AS $body$ 3 DELETE FROM sym_node_security WHERE node_id = $1 ; 4 DELETE FROM sym_node_host WHERE node_id = $1 ; 5 DELETE FROM sym_node WHERE node_id = $1 ; 6 $body$ LANGUAGE SQL STRICT VOLATILE ; Listing 6.19: Einfache Hilfsfunktion zum Entfernen einer Kind-Instanz 6.15 Sichern des Kommunikationswegs Insbesondere bei der Synchronisation mit der zentralen Mutter-Instanz ist eine verschlüsselte Datenübertragung wünschenswert. Wird die Instanz über einen bestehenden Web- 6 Implementierung 77 Server abgewickelt (s. Abschnitt 6.1), ist es möglich, die auf diesem Server konfigurierten SSL-Zertifikate zu nutzen und so die Verbindung zu diesem Server zu verschlüsseln. Die Java-Runtime sucht nach diesen Zertifikaten in der Regel im Keystore der Java-Installation. Je nach Gestalt des OpenInfRA-Clients müssen die für die Anwendung generierten SSL-Keys hier importiert, oder der Java-Pfad entsprechend angepasst werden, um auf ein lokales Keystore zu verweisen. Um die Synchronisation und Registrierung schließlich über das HTTPS-Protokoll abzuwickeln, genügt es, die entsprechenden Sync- und Registrierungs-URLs der betreffenden Engines anzupassen. Wird die Synchronisation über einen bestehenden Anwendungsserver ausgeführt, kann die dort konfigurierte Verschlüsselung genutzt werden. Alternativ zur Sicherung per SSL besteht die Möglichkeit, die Kontaktaufnahme per HTTPAuthentifizierung zu sichern. Dieser Weg ist natürlich einfacher zu konfigurieren, stellt aber nur innerhalb einer „vertrauten“ Umgebung eine Alternative dar. Die Konfiguration erfolgt via der Parameter http.basic.auth.username bzw. http.basic.auth.password auf Höhe der Engine. 6.16 Test der Konfiguration Die in den vorhergehenden Schritten vorgestellte Konfiguration wurde in verallgemeinerter Form als SQL-Skript verfasst und soll, ähnlich wie beim Erstellen des initialen Themengerüsts, für eine neue Projektdatenbank für jedes Projekt individuell anpassbar sein. Das Mutter-Kind-Konzept ist mit einer Vererbungstiefe von vier Ebenen bedacht, kann aber durch die Administratoren beliebig erweitert werden. Das Hinzufügen neuer Ebenen ist auch zu einem späteren Zeitpunkt möglich. Die Konfiguration sollte dabei in der Regel auf der Mutter-Instanz erfolgen, wodurch sie bei der Synchronisation im System verteilt wird. Die Registrierung neuer Kind-Instanzen kann an einem beliebigen Knoten erfolgen. Soll die Kind-Instanz aus dem System entfernt werden, muss lediglich die Definition des Knoten an seiner Eltern-Instanz gelöscht werden. Da bei der Entwicklung von SymmetricDS bereits Regressionstests zur Anwendung kommen, wurde hier davon abgesehen, „Standardszenarien“ der Implementierung zu testen. Um die Eignung der Konfiguration speziell für OpenInfRA zu prüfen, wurde sie anhand einer 3-Ebenen Hierarchie mit den bestehenden und neu formulierten Anforderungen abgeglichen. Dafür kam das in Tabelle 6.4 gezeigte Setup zum Einsatz, für das der Vorgang der Initialisierung im Folgenden kurz beschrieben ist. Auf jedem der Knoten wurde PostgreSQL installiert, eine Datenbank angelegt und ein entsprechender SymmetricDS-Nutzer erstellt (s. Abschnitt 6.1). Als Datengrundlage diente 6 Implementierung 78 Tabelle 6.4: Testkonfiguration ID Ebene OS PostgreSQL Eltern-Instanz 000 101 102 201 0 1 1 2 Ubuntu Linux 12.04 VM Mac OSX 10.8.3 Mac OSX 10.8.3 Windows 8.1 9.2 9.3.1 9.3.1 9.2 000 000 101 ein Testdatenbestand des Pergamon-Projekts, der für das in Abschnitt 5.1 beschriebene angepasste Datenbankschema generiert wurde und als „initiales Themengerüst“ dienen soll. Die Engine der Mutter-Instanz wurde für eine automatische Registrierung und Initialisierung von Kind-Instanzen konfiguriert. Mit dem Start der Engine auf der Mutter-Instanz wurden die SymmetricDS-Systemtabellen in das für den Replikationsnutzer definierte Datenbankschema installiert. Anschließend wurde die vorhergehend entwickelte Standard-Konfiguration für drei Replikationsebenen angepasst und als SQL-Skript auf dem Datenbankserver ausgeführt. Nach dem Schreiben der Konfiguration wird mit dem nächsten Start des Synchronisationsservices die Installation der Tabellentrigger ausgelöst. Das Projektdatenschema ist damit erfolgreich für das Protokollieren von Schreibvorgängen in der Verlaufstabelle Data eingerichtet und der Ausgangzustand der Mutter-Instanz ist hergestellt. Das Einrichten der ersten Hierarchieebene zeigt sich problemlos. Durch Starten des Synchronisationsservices für Knoten 101 und 102 wird die Registrations-URL der MutterInstanz angesprochen und die Registrierung abgeschlossen. Nach der Synchronisation der Konfigurationsdaten werden die Projektdaten übertragen, wodurch der Projektdatenbestand nun zwischen allen drei Instanzen konsistent ist. Für das Einrichten der mobilen Kind-Instanz wurde der in Abschnitt 6.9 beschriebene, alternative Weg des manuellen Imports genutzt. Dafür wurde die Registrierung auf dem Knoten 101 geöffnet und anschließend ein SQL-Dump des Projektdatenschemas über die Datenbankfunktion pg_dump exportiert. Nach dem Import des Schemas auf dem Laptop wurde der Synchronisationsservice gestartet, welcher die Registrierung am ElternKnoten erfolgreich abschließt. Mit dieser Konfiguration wurden die erstellten Anforderungen als Orientierung genutzt, um zu prüfen, inwiefern sie momentan erfüllt werden können. Synchronisationsvorgänge wurden sowohl manuell, als auch per Cron-Job ausgeführt. Die Ergebnisse beziehen sich dabei auf die Funktion der Synchronisationslösung. Als Datengrundlage wurde ein Testdatenbestand des Pergamon-Projekts genutzt, der auf Grundlage des in Abschnitt 5.1 beschriebenen angepassten Datenbankschemas erstellt und durch willkürlich generierte Geometrien ergänzt wurde. 6 Implementierung 79 Die Online-Synchronisation hat sich als sehr funktional ergeben und kann alle Anforderungen erfüllen. Änderungen werden auch dann zuverlässig synchronisiert, wenn die beteiligten Knoten lange Zeit nicht erreichbar waren, oder viele Änderungen eingebracht wurden. Beim Test der Offline-Synchronisation sind jedoch Fehler aufgetreten. Die zur Verfügung stehende Import-Anweisung ignoriert die Knoten-ID des Senders und interpretiert so alle eingespielten Änderungen als lokal entstandene. Infolgedessen werden diese Änderungen nun auch an den Sender rückadressiert und es entstehen beim nächsten Synchronisieren Einfügekonflikte. Dieses Problem konnte mit der in Listing 6.20 präsentierten Hilfsfunktion behoben werden. Sie ist ebenfalls über das Konsolentool symadmin zugänglich. 1 private void importBatchFromNode ( CommandLine line , List < String > args ) throws Exception { 2 IDataLoaderService service = getSymmetricEngine () . getDataLoaderService () ; 3 String sourceId = popArg ( args , " Source ID " ) ; 4 String sourceGroupId = popArg ( args , " Node Group ID " ) ; 5 Node node = new Node ( sourceId , sourceGroupId ) ; 6 System . out . println ( sourceId + " : " + sourceGroupId ) ; 7 InputStream in = null ; 8 if ( args . size () == 0) { 9 in = System . in ; } else { 10 in = new FileInputStream ( args . get (0) ) ; 11 12 } 13 service . loadDataFromPush ( node , in , System . out ) ; 14 System . out . flush () ; 15 in . close () ; 16 } Listing 6.20: Hilfsfunktion import-from-node zum Offline-Import von Synchronisationsnachrichten Im Folgenden sind die zuvor definierten Anforderungen an die Replikations- und Synchronisationlösung für OpenInfRA der aktuellen Funktionalität der Implementierung gegenübergestellt. 6.17 Notwendige Erweiterungen Bei der Erarbeitung der hier vorgestellten Standard-Konfiguration wurde lediglich die Standalone-Installation (s. Abschnitt 6.1) genutzt, dessen Tool symadmin um nötige Funktionen erweitert wurde. Der Grund hierfür ist, dass zum gegenwärtigen Zeitpunkt nicht ID Anforderung AC_0280 Erstellen einer Kind-Instanz eines Status X Projektes Bemerkung Die Kind-Instanz wird durch Export der Projektdaten und Öffnen der Registrierung am Eltern-Knoten erstellt. Alternativ kann eine Online-Registrierung ausgehend vom Kind- 6 Implementierung Tabelle 6.5: Vergleich Anforderungen - Implementierung (X: Funktion erfüllt, (X): Funktion eingeschränkt erfüllt, 7: Funktion nicht erfüllt) Knoten durchgeführt werden, bei der der initiale Datenbestand übertragen wird. AC_0281 Erstellen einer Kind-Instanz eines X Teilprojektes Die gesamte Projektdatenbank wird repliziert, um Verknüpfungen zwischen Themeninstanzen über Projektgrenzen hinweg zuzulassen (s. Abschnitt 5.3). Externe Daten können für die Replikation auf Teilprojekte (Unterordner) eingeschränkt werden. AC_0282 Löschen einer Kind-Instanz eines X Projekts AC_0300 Bidirektionale Das Löschen aller Informationen zur Kind-Instanz schließt diese von der Synchronisation aus (s. Abschnitt 6.14). X Die bidirektionale Synchronisation zwischen Eltern- und Kind-Instanz ist durch die Online-Synchronisation des Standardkonfiguration erfüllt. Änderungen werden entlang der Replikationshierarchie Datenbestands transportiert und angewandt. AC_0301 Stoppen der Online-Synchronisation X Das Beenden des SymmetricDS Prozesses stoppt die Synchronisation. AC_0302 Periodische Online-Synchronisation X Bei laufendem SymmetricDS-Service können Pull- und Push-Job seperat gestartet des Datenbestands AC_0303 Anpassen der werden, womit die Synchronisation in den definierten Intervallen durchgeführt wird. X Synchronisationsintervalle AC_0304 Sperren für Synchronisationsvorgänge Die Synchronisationsintervalle sind per Cron frei definierbar (Bsp. 0 0 0 * * * für täglich 0 Uhr). X Ohne laufenden Synchronisationsservice werden keine eingehenden Änderungen empfangen. 80 Offline-Synchronisation des (X) Datenbestands Der Import und Export von Batches in CSV-Dateien funktioniert, wobei der mehrmalige Import zu keinen Nebeneffekten führt. Beim Import muss die Hilfsfunktion import-from-node genutzt werden, um zirkuläre Beziehungen bei der folgenden Synchronisation auszuschließen. Die Offline-Synchronisation externer Daten ist im Moment nicht möglich. AC_0311 Export von (X) Offline-Synchronisationsdateien 6 Implementierung AC_0310 Der Export und Offline-Synchronisationsdaten ist möglich, erfordert aber die konkrete Nennung der Batch-ID. Die Funktion muss um einen massenhaften Export aller ausstehenden Batches an einen Knoten erweitert werden, um die Nutzbarkeit zu verbessern. AC_0312 Parametrierung von X s. AC_0311 Offline-Synchronisationsdateien AC_0313 Import Synchronisationsnachricht AC_0320 Import einer Kind-Instanz (X) X Der Import von Batches ist möglich. (s.a. AC_0311). Eine Kind-Instanz kann manuell aus einem Datenbank-Dump oder über eine OnlineSynchronisation importiert werden (s.a. AC_0280). AC_0321 Online-Import einer Kind-Instanz X Nach dem Öffnen der Registrierung einer Kind-Instanz am Eltern-Knoten ist es möglich, den Datenbestand entsprechend der Konfiguration zu übertragen (s.a. AC_0320). AC_0330 Installation einer 7 OpenInfRA-Offline-Version Die Installationsprozedur der OpenInfRA-Anwendung als Offline-Version ist Bestandteil der Anforderungen an das Basissystem. Die Replikationskomponente sollte hier als Modul mit installiert werden können. Die Installation als Standalone-Komponente ist ohne Erweiterung möglich. AC_0340 Lösen von Synchronisationskonflikten X Mögliche Konflikte werden erkannt und ohne Nebeneffekt auf den Datenbestand aufgeführt. Die Synchronisation von ausstehenden Änderungen wird nach Lösen des 81 Konflikts fortgesetzt. Synchronisieren von gelösten X Konflikten Durch die Einstellung ping_back der Konfliktlösungsstrategie für Projektdaten, wird die Konfliktlösung mit der nächsten Synchronisation übertragen und auf dem Synchronisationspartner angewandt. AC_0350 Synchronisationskonflikte anzeigen X Das Auflisten der Konflikte kann über die Tabelle incoming_error sowie über die Tabelle outgoing_batch erfolgen. AC_0351 Synchronisationskonflikte X bearbeiten 6 Implementierung AC_0341 incoming_error erlaubt die Definition neuer Spaltenwerte bzw. das Ignorieren des Konflikts, wenn die aktuellen Spaltenwerte die korrekte Lösung darstellen. Die Synchronisation wird daraufhin fortgesetzt. AC_0352 Synchronisationskonflikte von (X) Geometriedaten bearbeiten Die Bearbeitung ist wie für AC_0351 möglich. Für die Lösung von Konflikten ist aber eine Verknüpfung mit dem WebGIS-Client sinnvoll, um eine korrekte Lösungsstrategie formulieren zu können. AC_0360 Anpassen von X Synchronisationsparametern AC_0370 Hinweis auf Synchronisationskonflikt Parameter können über die Properties der Engine, oder über die Konfigurationstabellen angepasst werden. X Konflikte werden generell geloggt und können so für den zukünftigen Admin-Client aufbereitet werden. AC_0371 Protokolle zu Synchronisationsvorgängen X Der Erfolg- oder Misserfolg der Synchronisationsvorgänge wird anhand des Status der einzelnen Batches vermerkt. Darüber hinaus wird eine Log-Datei über Synchronisationsvorgänge geführt. 82 6 Implementierung 83 klar ist, wie die OpenInfRA-Anwendung konkret implementiert werden wird, die Entwicklung einer Benutzeroberfläche aber davon abhängig ist. Wird das Basissystem ebenfalls in Java programmiert, ist die Integration von SymmetricDS als Modul mit den hier vorgestellten Funktionalität einfach und der entsprechende Entwicklungsaufwand gering. Sollte eine andere Technologie zur Anwendung kommen, beispielsweise ein klassischer LAMP-Stack, können Adapter wie mod_jk genutzt werden, um SymmetricDS beispielsweise über einen Tomcat Servlet-Container in die Konfiguration einzugliedern. Neben der Frage zur Integration der Lösung sind die folgenden Anpassungen bzw. Erweiterungen ausstehend, die bei der Weiterentwicklung zu klären sind. • Für die Lösung von Synchronisationskonflikten muss eine passendes Nutzerschnitt- stelle zur Verfügung gestellt werden. In der Regel wird der Vorgang auf Seiten des Empfängers eingeleitet. Dieser kann über die Tabelle Incomming Error abfragen, welche Relation betroffen ist und so ein passendes Interface herleiten. Für die Lösung von Konflikten bei Geometriedaten ist zu überlegen, ob der OpenInfRA-WebGIS-Client um entsprechende Funktionen erweitert werden kann. • Während die Grundfunktionalität der Offline-Synchronisation funktioniert, ist der Export einzelner Batches im Moment aufwendig (manuelle Auswahl Eltern-ID und Batch-ID). Allgemein lässt sich anhand der Tabelle Outgoing Batches leicht abfragen, welche Synchronisationsdaten an einen gewählten Knoten übertragen werden sollen. Es sollte möglich sein, alle nötigen CSV-Dateien als Zip-Archiv zu exportieren, sodass diese leichter für die Übermittlung per Wechseldatenträger oder Email dienen können. Auf Seiten des Empfänger sollte wiederum der Import dieses ZipArchivs möglich sein, wobei auf die entwickelte Hilfsfunktion zurückgegriffen werden kann. • Die Offline-Synchronisation externer Projektdaten ist im Moment nicht möglich. Hier lassen sich ebenfalls die bestehenden Funktionen nutzen, die ohnehin zur Anwendung kommen, wenn diese für die Online-Synchronisation als Zip-Paket vorbereitet werden. Dabei sollte ebenfalls das konfigurierte BeanShell-Skript mit exportiert werden, um die Pfadangaben beim Import auf dem Empfänger wiederherzustellen. Die aufgeführten Erweiterungen bauen auf bereits bestehenden Funktionen auf, das heißt es ist zu erwarten, dass bereits bestehende Klassen und Methoden bzw. die zur Verfügung stehenden Schnittstellen der SymmetricDS-Bibliotheken genutzt werden können. Der Aufwand der Implementierung wird daher als gering eingeschätzt. 6 Implementierung 84 6.18 Fazit Neben der hier vorgestellten Lösung mit SymmetricDS wurde die prototypische Entwicklung einer Replikationskomponente als PostgreSQL-Extension unternommen. Da die SymmetricDS-Lösung schließlich als überlegen eingestuft wurde, wurde darauf verzichtet, diese Implementierung näher zu beschreiben. Allgemein basiert sie auf denselben Grundsätzen der triggerbasierten Protokollierung von Schreiboperationen im replizierten Datenbestand und dem Austausch des so entstandenen Verlaufsprotokolls. Eine wesentliche Überlegung bei der Umsetzung dieser Lösung war es, auf externe Komponenten zu verzichten und so die Anforderungen bei der Installation und Nutzung zu reduzieren. Dabei fielen letztendlich entscheidende Nachteile ins Gewicht, die für die Nutzung von SymmetricDS sprachen und hier kurz als abschließendes Fazit vergleichend aufgeführt werden sollen. Die Eigenentwicklung pg_sengi nutzt die PostgreSQL-Extension dblink, um eine Verbindung zu anderen Servern aufzunehmen und Log-Einträge auszutauschen. SymmetricDS nutzt hingegen einen Webserver für die Übertragung, der Daten ähnlich wie beim Aufrufen einer normalen Website auf Seiten des Senders komprimiert und auf Seiten des Empfängers entpackt. Bei der Synchronisation langer Server-Transaktionen werden die Batch-Dateien dabei zusätzlich im Dateisystem zwischengespeichert und nicht direkt aus der Datenbank gestreamt. So kommt ein effektiveres Übertragungsverhalten zustande und die Dauer einer Synchronisation wird massiv reduziert. Hinzu kommt der Vorteil der Entlastung des Datenbankservers durch den SymmetricDS-Service, der die erfolgreiche Übertragung der Daten gewährleistet und bei einem Fehler eventuell neu einleitet. Ohne einen externen Prozess, der als Mittler auftritt, besteht nur die Möglichkeit, die Übertragung in eine Transaktion zu klammern, welche im Ernstfall neu begonnen werden muss. Gerade in einer Netzwerkumgebung mit schlechter Verbindung oder hoher Ausfallrate sind dies Vorteile, die für einen Einsatz von SymmetricDS für die Replikation von OpenInfRA-Projektdaten sprechen. Darüber hinaus hat die Kommunikation der Synchronisation über einen Web-Server auch eine positiven Sicherheitsaspekt. Während beim Verbinden mit dblink eine direkte Datenbankverbindung aufgebaut wird, die damit auch im Netzwerk verfügbar sein muss, ist dies bei der Nutzung eines Middleware-Layers in Form eines Webservers nicht nötig. Hier muss die Datenbank nur lokal durch die von SymmetricDS eröffnete JDBC-Verbindung verfügbar sein. Die Gefahr eines Exploits der Datenbank wird dadurch stark reduziert. Neben diesen Aspekten ist der Aufwand der Eigenentwicklung einer Replikations- und Synchronisationskomponente auch durch die zusätzlichen Anforderung in Bezug auf ex- 6 Implementierung 85 terne Projektdateien zu groß, als das bereits bestehenden Lösungen übergangen werden dürfen. Dies deckt sich mit der Forderung, keine Nischenprodukte für das Endprodukt einzusetzen, um die Nutz- und Wartbarkeit der OpenInfRA-Anwendung allgemein zu erhöhen. Letztlich stellt sich die hier vorgestellte Implementierung des Mutter-Kind-Konzepts per SQL-Skript einfach dar und kann leicht auf die verschiedenen Bedürfnisse der Projekte des DAI angepasst werden. Wird dabei die entwickelte Standardkonfiguration genutzt, kann sie beim Prozess der Initialisierung einer neuen Projektdatenbank schnell umgesetzt werden. Die noch nötigen Anpassungen zur Offline-Synchronisation stellen gegenüber dem zu erwartenden Nutzen einen vertretbaren Aufwand dar. 7 Zusammenfassung und Ausblick 86 7 Zusammenfassung und Ausblick Inhalt dieser Arbeit sollte es sein, die Offline-Replikation des Datenbestands im Sinne des Mutter-Kind-Konzepts für das Informationssystem OpenInfRA umzusetzen. Hierfür wurde zuerst das OpenInfRA-Grobkonzept analysiert und herausgestellt, welche Anforderungen eine Replikation und Synchronisation erfüllen müssen. Dabei wurden insbesondere das Prinzip der Datenhaltung und des Mutter-Kind-Konzeptes unter Einführung des Begriffs der Eltern-Instanz erläutert. Bereits an dieser Stelle wurden der Anforderungskatalog und das Grobkonzept erweitert, um die zu entwickelnde Lösung daran zu orientieren. Dies umfasste unter anderem die Konfliktidentifizierung und -lösung bei der Synchronisation von Projektinstanzen. Dabei wurde festgestellt, dass eine manuelle Konfliktlösungsstrategie ein adäquates Mittel darstellt, das dem Nutzer ausreichend Kontrolle über die Daten ermöglicht. Darüber hinaus wurde dargelegt, dass nicht nur das Problem der Synchronisation von Datensätzen eine Rolle spielt, sondern auch die Synchronisation externer Dateien berücksichtigt werden muss. Um eine Lösung zu finden, die all den beschriebenen Anforderungen gerecht wird, wurde im zweiten Abschnitt dieser Arbeit der aktuelle Wissensstand zu verteilten mobilen Datenbanken und deren Synchronisation erarbeitet. Dabei wurde deutlich, dass durch die Autonomie der am Mutter-Kind-Konzept beteiligten Instanzen keine zentralisierte Transaktionierung möglich ist, aber von einer Snapshot-Isolation zwischen Eltern- und KindInstanz ausgegangen werden kann, deren lokale Änderungen durch eine optimistische Synchronisation paarweise konsolidiert werden können. Zur Umsetzung dieser „optimistischen Transaktionierung“ wurden anschließend die nativen Replikationsfunktionen von PostgreSQL betrachtet. Es wurde festgestellt, dass das Mutter-Kind-Konzept nicht mit den nativ zur Verfügung stehenden Mitteln umgesetzt werden kann. Deshalb wurde geprüft, ob sich das im Datenbankbetrieb anfallende WriteAhead-Log für die logische Auswertung der Schreiboperationen eignet. Da dies nicht der Fall war, wurde das Change-Data-Capture Entwurfsmuster vorgestellt, welches es ermöglicht, Änderungen am Datenbestand nachzuverfolgen, was eine wichtige Voraussetzung einer asynchronen Synchronisation ist. Anschließend wurden Softwarelösungen vorgestellt, die dieses Entwurfsmuster umsetzen und damit eine Multi-Master-Replikation mit PostgreSQL ermöglichen. 7 Zusammenfassung und Ausblick 87 Im darauf folgenden Kapitel wurden die gewonnenen Erkenntnisse genutzt, um eine mögliche Umsetzung der Offline-Replikation zu beschreiben. Dabei wurde die Anpassung des Datenbankschemas zur Nutzung von universal identifizierbaren Identifikatoren vorgeschlagen. Es zeigte sich, dass die Fragmentierung des Projektdatenbankschemas für die praktische Nutzung nicht sinnvoll ist, dafür aber die Möglichkeit gegeben sein muss, nur einen Teil der externe Daten auf Kind-Instanzen zu replizieren. Aufgrund dieser Einschätzung wurde die zuvor vorgestellte Lösung SymmetricDS als geeignet für die Implementierung des Mutter-Kind-Konzepts für OpenInfRA befunden. Im letzten Abschnitt der Arbeiten erfolgte eine Vorstellung der Konzepte von SymmetricDS und eine Erläuterung der Konfiguration. Zusätzlich wurde eine erweiterbare Standardkonfiguration für die Nutzung mit OpenInfRA erarbeitet und um Funktionen zum manuellen Einleiten einer Synchronisation und dem Offline-Import von Synchronisationsdaten ergänzt. Anschließend wurde die Konfiguration in Hinblick auf die gestellten Anforderungen geprüft. Hier konnte festgestellt werden, dass Anpassungen für die zweckmäßige Offline-Synchronisation vorgenommen werden müssen. Dies betrifft in erster Linie die OfflineSynchronisation von externen Dateien. Bei einem kurzen Vergleich mit der prototypischen Eigenentwicklung pg_sengi wurden die Vorteile der Nutzung der bestehenden Softwarekomponente SymmetricDS für OpenInfRA in Sachen Sicherheit, Performanz und Zuverlässigkeit herausgestellt, die für die Integration in das Kernsystem sprechen. Letztendlich zeigte sich, dass sämtliche Anforderungen bis auf die Offline-Synchronisation von externen Dateien durch die Implementierung mit SymmetricDS erfüllt werden konnten. Sobald geklärt ist, welche Technologie für die Umsetzung des OpenInfRA-Basissystems eingesetzt werden, kann damit begonnen werden, die vorgestellte Lösung als Erweiterung dessen zu integrieren. Die Hauptaufgabe wird dabei sein, die Komplexität der Konfiguration für den Nutzer zu vereinfachen, die Parametrisierung über den geplanten AdminClient umzusetzen und ein logisches Interface für die Lösung von Synchronisationskonflikten anzubieten. Mit dieser Erweiterung sind jedoch nicht nur die Voraussetzungen der Offline-Replikation der Projektdaten mit OpenInfRA erfüllt. Viel wichtiger ist der Beitrag zur Arbeitserleichterung in der Archäologie, der durch eine so ermöglichte zunehmende Unabhängigkeit von stehenden Internetanbindungen geschaffen wird. Konfiguration SymmetricDS-Engine Konfiguration SymmetricDS-Engine 1 # Naming 2 engine . name =000 3 group . id = mother 4 external . id = mother 5 schema . version =10 6 7 auto . registration = true 8 auto . reload = true 9 10 # URLs 11 registration . url = http : // 192.168.1.16:9090/ sync /000 12 sync . url = http : // 192.168.1.16:9090/ sync /000 13 14 # DB Connection 15 db . driver = org . postgresql . Driver 16 db . url = jdbc : postgresql : // localhost / openinfra ? stringtype = unspecified 17 db . user = sym_user 18 db . password = secr3t 19 db . pool . initial . size =1 20 db . pool . max . active =10 21 22 # Routing 23 start . route . job = true 24 job . route . cron =0 0 * * * * 25 # job . routing . period . time . ms =30000 26 27 # Push 28 start . push . job = false 29 push . thread . per . server . count =3 30 job . push . cron =0 * * * * * 31 # job . push . period . time . ms =180000 32 33 # Pull 34 start . pull . job = false 35 pull . thread . per . server . count =3 36 job . pull . cron =0 * * * * * 37 # job . pull . period . time . ms =180000 38 39 # Purging v Konfiguration SymmetricDS-Engine 40 start . purge . job = true 41 job . purge . incoming . cron =0 0 0 * * * 42 job . purge . outgoing . cron =0 0 0 * * * 43 job . purge . datagaps . cron =0 0 0 * * * 44 purge . retention . minutes =1440 45 46 # Heartbeat 47 start . heartbeat . job = true 48 job . heartbeat . period . time . ms =10000 49 heartbeat . sync . on . push . period . sec =300000 50 51 # Watchdog 52 start . watchdog . job = false 53 job . watchdog . period . time . ms =3600000 54 55 # Propagation 56 auto . registration = true 57 auto . reload = true 58 59 # File 60 start . file . sync . tracker . job = true 61 job . file . sync . tracker . cron =0 * * * * * 62 63 start . file . sync . pull . job = false 64 job . file . sync . pull . cron =0 * * * * * 65 66 start . file . sync . push . job = false 67 job . file . sync . pull . cron =0 * * * * * Listing 1: SymmetricDS-Engine vi Standardkonfiguration vii Standardkonfiguration 1 /* * 2 * S tanda rdkonf igura tion f ü r OpenInfRA - Projekte 3 * 4 * {{ projektname }} - Eindeutiger Namen des Projekts 5 * {{ schema }} - Name des Datenbankschemas der Projektdaten 6 * {{ version }} - Schemaversion der Projektdatenbank 7 * {{ password }} - Passwort der Mutter - Instanz 8 * {{ Media }} - Ordner f ü r Mediendateien 9 * {{ Config }} - Ordner f ü r Konf igura tionsd ateie n 10 11 */ BEGIN ; 12 13 -- Standardschema f ü r Systemtabellen 14 SET SEARCH_PATH TO sym ; 15 16 -- K onf igu ra tio ns tab ell en leeren 17 DELETE FROM sym_trigger_router ; 18 DELETE FROM sym_router ; 19 DELETE FROM sym_node_group_link ; 20 DELETE FROM sym_node_group ; 21 DELETE FROM sym_node_identity ; 22 DELETE FROM sym_node_security ; 23 DELETE FROM sym_node ; 24 DELETE FROM sym_trigger ; 25 DELETE FROM sym_channel ; 26 27 -- Hierarchiebenen bzw . Knoten - Gruppen anlegen 28 INSERT INTO sym_node_group ( 29 node_group_id , 30 description , 31 create_time , 32 last_update_by , 33 last_update_time 34 ) VALUES 35 ( ’ mother ’ , ’ Mutter - Instanz - Zentraler Server ’ , 36 ( ’ office ’ , ’ 2. Ebene - Lokale Online / Offline - Instanzen ’ , current_timestamp , current_timestamp , current_user , current_timestamp ) , current_user , current_timestamp ) , Standardkonfiguration 37 viii ( ’ mobile ’ , ’ 3. Ebene - Laptops f ü r Au ß endienst ’ , current_timestamp , current_user , current_timestamp ) , 38 ( ’ rover ’ , ’ 4. Ebene - Laptops f ü r Au ß endienst ’ , current_timestamp , current_user , current_timestamp ) ; 39 40 -- Knotengruppen verlinken 41 -- Downstream pushed zu Upstream 42 INSERT INTO sym_node_group_link ( 43 source_node_group_id , 44 target_node_group_id , 45 data_event_action , 46 create_time , 47 last_update_by 48 ) VALUES 49 ( ’ office ’ , ’ mother ’ , ’P ’ , current_timestamp , current_user ) , 50 ( ’ mother ’ , ’ office ’ , ’W ’ , current_timestamp , current_user ) , 51 ( ’ mobile ’ , ’ office ’ , ’P ’ , current_timestamp , current_user ) , 52 ( ’ office ’ , ’ mobile ’ , ’W ’ , current_timestamp , current_user ) , 53 ( ’ rover ’ , 54 ( ’ mobile ’ , ’ rover ’ , ’ mobile ’ , ’P ’ , current_timestamp , current_user ) , ’W ’ , current_timestamp , current_user ) ; 55 56 -- Initialisierung der Mutter - Instanz der Re pli ka tio nsh ie rar ch ie 57 INSERT INTO sym_node ( 58 node_id , 59 node_group_id , 60 external_id , 61 sync_enabled , schema_version 62 63 ) VALUES ( 64 ’ mother -{{ projektname }} ’ , 65 ’ mother ’ , 66 ’ mother -{{ projektname }} ’ , 67 1, ’ {{ version }} ’ 68 69 ); 70 71 INSERT INTO sym_node_security ( 72 node_id , 73 node_password , 74 registration_time , 75 initial_load_time , 76 created_at_node_id 77 ) VALUES ( 78 ’ mother -{ projektname } ’ , 79 ’ {{ password }} ’ , 80 current_timestamp , Standardkonfiguration 81 current_timestamp , 82 ’ mother -{{ projektname }} ’ 83 ix ); 84 85 INSERT INTO sym_node_identity VALUES ( ’ mother -{{ projektname }} ’) ; -- Identit ä t zuweisen 86 87 -- Sync hroni sation skana l 88 INSERT INTO sym_channel ( 89 channel_id , 90 processing_order , 91 max_batch_size , 92 max_batch_to_send , 93 enabled , 94 batch_algorithm , 95 description , 96 create_time , 97 last_update_by , 98 last_update_time 99 ) VALUES ( 100 ’ project_data ’ , 101 100 , 102 10000 , 103 100 , 104 1, 105 ’ default ’ , 106 ’ Projektdaten des Projekts {{ projektname }} ’ , 107 current_timestamp , 108 current_user , 109 current_timestamp 110 ); 111 112 -- Ä nderungstrigger 113 INSERT INTO sym_trigger ( 114 trigger_id , 115 source_schema_name , 116 source_table_name , 117 channel_id , 118 sync_on_incoming_batch , 119 create_time , 120 last_update_by , 121 last_update_time 122 ) VALUES 123 ( ’ project_data_trigger ’ , ’ {{ schema }} ’ , ’* ’ , ’ project_data ’ , 1 , current_timestamp , current_user , current_timestamp ) ; 124 Standardkonfiguration x 125 -- Router 126 INSERT INTO sym_router ( 127 router_id , 128 source_node_group_id , 129 target_node_group_id , 130 router_type , 131 create_time , 132 last_update_by , 133 last_update_time 134 ) VALUES 135 ( ’ mother_2_office ’ , ’ mother ’ , ’ office ’ , ’ default ’ , current_timestamp , current_user , current_timestamp ) , 136 ( ’ office_2_mother ’ , ’ office ’ , ’ mother ’ , ’ default ’ , current_timestamp , current_user , current_timestamp ) , 137 ( ’ office_2_mobile ’ , ’ office ’ , ’ mobile ’ , ’ default ’ , current_timestamp , current_user , current_timestamp ) , 138 ( ’ mobile_2_office ’ , ’ mobile ’ , ’ office ’ , ’ default ’ , current_timestamp , current_user , current_timestamp ) , 139 ( ’ mobile_2_rover ’ , ’ mobile ’ , ’ rover ’ , ’ default ’ , current_timestamp , current_user , current_timestamp ) , 140 ( ’ rover_2_mobile ’ , ’ rover ’ , ’ mobile ’ , ’ default ’ , current_timestamp , current_user , current_timestamp ) ; 141 142 -- Trigger Router Links 143 INSERT INTO sym_trigger_router ( 144 trigger_id , 145 router_id , 146 enabled , 147 initial_load_order , 148 create_time , 149 last_update_by , 150 last_update_time 151 ) VALUES 152 ( ’ project_data_trigger ’ , ’ mother_2_office ’ , 1 , 100 , current_timestamp , current_user , current_timestamp ) , 153 ( ’ project_data_trigger ’ , ’ office_2_mother ’ , 1 , 200 , current_timestamp , current_user , current_timestamp ) , 154 ( ’ project_data_trigger ’ , ’ office_2_mobile ’ , 0 , 300 , current_timestamp , current_user , current_timestamp ) , 155 ( ’ project_data_trigger ’ , ’ mobile_2_office ’ , 0 , 400 , current_timestamp , current_user , current_timestamp ) , 156 ( ’ project_data_trigger ’ , ’ mobile_2_rover ’ , 0 , 500 , current_timestamp , current_user , current_timestamp ) , 157 ( ’ project_data_trigger ’ , ’ rover_2_mobile ’ , current_user , current_timestamp ) ; 158 0 , 600 , current_timestamp , Standardkonfiguration xi 159 -- Conflict Resolution 160 INSERT INTO sym . sym_conflict ( 161 conflict_id , 162 source_node_group_id , 163 target_node_group_id , 164 target_channel_id , 165 detect_type , 166 resolve_type , 167 ping_back , 168 create_time , 169 last_update_by , 170 last_update_time 171 ) 172 VALUES 173 ( ’ ma nua l_ mot her _2 _of fi ce ’ , ’ mother ’ , ’ office ’ , ’ project_data ’ , ’ use_old_data ’ , ’ manual ’ , ’ SINGLE_ROW ’ , current_timestamp , current_user , current_timestamp ) , 174 ( ’ ma nua l_ off ice _2 _mo th er ’ , ’ office ’ , ’ mother ’ , ’ project_data ’ , ’ use_old_data ’ , ’ manual ’ , ’ SINGLE_ROW ’ , current_timestamp , current_user , current_timestamp ) , 175 ( ’ ma nua l_ off ice _2 _mo bi le ’ , ’ office ’ , ’ mobile ’ , ’ project_data ’ , ’ use_old_data ’ , ’ manual ’ , ’ SINGLE_ROW ’ , current_timestamp , current_user , current_timestamp ) , 176 ( ’ ma nua l_ mob ile _2 _of fi ce ’ , ’ mobile ’ , ’ office ’ , ’ project_data ’ , ’ use_old_data ’ , ’ manual ’ , ’ SINGLE_ROW ’ , current_timestamp , current_user , current_timestamp ) , 177 ( ’ manua l_mobi le_2_ rover ’ , ’ mobile ’ , ’ rover ’ , ’ project_data ’ , ’ use_old_data ’ , ’ manual ’ , ’ SINGLE_ROW ’ , current_timestamp , current_user , current_timestamp ) , 178 ( ’ manua l_rove r_2_m obile ’ , ’ rover ’ , ’ mobile ’ , ’ project_data ’ , ’ use_old_data ’ , ’ manual ’ , ’ SINGLE_ROW ’ , current_timestamp , current_user , current_timestamp ) ; 179 180 -- File Sync 181 INSERT INTO sym_file_trigger ( 182 trigger_id , 183 base_dir , 184 recurse , 185 includes_files , 186 excludes_files , 187 sync_on_create , 188 sync_on_modified , 189 sync_on_delete , 190 before_copy_script , 191 after_copy_script , 192 create_time , Standardkonfiguration 193 last_update_by , 194 last_update_time 195 ) VALUES ( 196 ’ media_directory ’ , 197 ’ {{ Media }} ’ , 198 1, 199 ’ *. jpeg ,*. jpg ,*. pdf ’ , 200 null , 201 1 ,1 ,1 , 202 ’ targetBaseDir = "{{ Media }}" ’ , 203 null , 204 current_timestamp , 205 current_user , 206 current_timestamp 207 ); 208 209 INSERT INTO sym_file_trigger ( 210 trigger_id , 211 base_dir , 212 recurse , 213 includes_files , 214 excludes_files , 215 sync_on_create , 216 sync_on_modified , 217 sync_on_delete , 218 before_copy_script , 219 after_copy_script , 220 create_time , 221 last_update_by , 222 last_update_time 223 ) VALUES ( 224 ’ config_directory ’ , 225 ’ {{ Config }} ’ , 226 1, 227 ’ *. txt ,*. properties ,*. config ,*. conf ’ , 228 null , 229 1 ,1 ,1 , 230 null , 231 null , 232 current_timestamp , 233 current_user , 234 current_timestamp 235 ); 236 237 238 INSERT INTO sy m _f il e _t ri gg e r_ ro ut e r ( trigger_id , xii Standardkonfiguration 239 router_id , 240 enabled , 241 initial_load_enabled , 242 target_base_dir , 243 conflict_strategy , 244 create_time , 245 last_update_by , 246 last_update_time 247 ) 248 VALUES 249 ( ’ config_directory ’ , ’ mother_2_office ’ , 1 , 1 , ’ ’ , ’ SOURCE_WINS ’ , current_timestamp , current_user , current_timestamp ) , 250 ( ’ config_directory ’ , ’ office_2_mobile ’ , 1 , 1 , ’ ’ , ’ SOURCE_WINS ’ , current_timestamp , current_user , current_timestamp ) , 251 ( ’ config_directory ’ , ’ mobile_2_router ’ , 1 , 1 , ’ ’ , ’ SOURCE_WINS ’ , current_timestamp , current_user , current_timestamp ) ; 252 ( ’ media_directory ’ , ’ mother_2_office ’ , 1 , 1 , ’ ’ , ’ SOURCE_WINS ’ , current_timestamp , current_user , current_timestamp ) , 253 ( ’ media_directory ’ , ’ office_2_mobile ’ , 1 , 1 , ’ ’ , ’ SOURCE_WINS ’ , current_timestamp , current_user , current_timestamp ) , 254 ( ’ media_directory ’ , ’ mobile_2_router ’ , 1 , 1 , ’ ’ , ’ SOURCE_WINS ’ , 255 ( ’ media_directory ’ , ’ office_2_mother ’ , 1 , 1 , ’ ’ , ’ SOURCE_WINS ’ , current_timestamp , current_user , current_timestamp ) , current_timestamp , current_user , current_timestamp ) , 256 ( ’ media_directory ’ , ’ mobile_2_office ’ , 1 , 1 , ’ ’ , ’ SOURCE_WINS ’ , current_timestamp , current_user , current_timestamp ) , 257 ( ’ media_directory ’ , ’ rover_2_mobile ’ , 1 , 1 , ’ ’ , ’ SOURCE_WINS ’ , current_timestamp , current_user , current_timestamp ) ; 258 259 CREATE OR REPLACE FUNCTION sym_delete_node ( text ) 260 RETURNS void AS $body$ 261 DELETE FROM sym_node_security 262 WHERE node_id = $1 ; 263 DELETE FROM sym_node_host 264 WHERE node_id = $1 ; 265 DELETE FROM sym_node 266 WHERE node_id = $1 ; 267 $body$ LANGUAGE SQL STRICT VOLATILE ; 268 269 COMMIT ; Listing 2: Standardkonfiguration Mutter-Kind-Konzept xiii Email xiv Email Von: Benjamin Thurm An: Felix Falko Schäfer, Frank Henze, Philipp Gerth Kopie: Alexander Schulze, Frank Schwarzbach 11. Juni 2013 Sehr geehrter Herr Schäfer, sehr geehrter Herr Gerth, sehr geehrter Herr Henze, ich habe ein paar Fragen zusammengestellt, die für die Replikation der OpenInfRAProjektdatenbanken von Wichtigkeit sind. Ich würde mich freuen, wenn Sie mir diese beantworten können: 1. Das Attribut „Sichtbarkeit“ kann durch den Projektadministrator im Zuge der Projektinitialisierung auf „0“ gesetzt werden. Dadurch können vordefinierte Attributwerte, die in einem Projekt (zunächst) als nicht zutreffend angesehen werden, ausgeblendet werden. (S.59) Liegt die Verantwortung über die Sichtbarkeit auch nach der Projektinitialisierung ausschließlich beim Projektadministrator? Falls dem so ist, kann hier beim Initialisieren von Kind-Instanzen aus der Projektdatenbank davon abgesehen werden, diese Daten mit zu replizieren. Dieser Schritt würde bei einem nachträglichen Aktivieren nachgeholt werden. 2. Alle Wertelisten sind projektspezifisch erweiterbar, wobei die Erweiterungen nach Zustimmung durch den System-Administrator auch anderen Projekten zur Verfügung gestellt werden können. (S.59) Für das Zurückschreiben von Daten aus der Projektdatenbank ist im Moment kein konkreter Mechanismus vorgesehen. Das heißt, dass alle Klassen, die im Systemschema vorhanden sind - nach aktuellem Stand im Grunde alles, was nicht direkt mit den konkreten Themeninstanzen verbandelt ist - mit dem Systemschema abgeglichen werden können. Dies gilt damit auch für die Wertelisten. Ist es nötig, hier einen „Schalter“ zu führen, der bestimmt, welche Wertelisten vom Systemadministrator übernommen werden sollen/dürfen? Oder ist hier eher die konkrete Kommunikation SystemadministratorProjektadministrator vorgesehen, bei der die Übernahme solcher Daten besprochen wird? 3. Beim Abbilden von Kinderinstanzen aus dem initialen Themengerüst der Projektdatenbank könnte unter Umständen darauf verzichtet werden, den gesamten Bestand der Email xv Daten zu übertragen. Wäre hier die Differenzierung nach Teilprojekten sinnvoll? Daraus resultiert natürlich auch, dass diese Instanz anschließend nur dazu genutzt werden kann, aus ihr den gleichen eingeschränkten Datenbestand in eine eventuelle Kinderinstanz abzubilden. Der Nutzen einer solchen Funktion ist sicherlich abhängig von der zu erwartenden Datenmenge. Vorteile wären hier unter anderem ein geringerer Kopieraufwand (siehe auch externe Bilder, Dokumente) und eine physikalische Zugriffssicherung bei Diebstahl/Verlust. Die benötigte Logik für diesen Vorgang kann zum Nachteil werden, insbesondere wenn Themeninstanzen auf Themeninstanzen verweisen, die nicht Bestandteil des Teilprojekts sind. Ärgerlich wäre natürlich auch, wenn der Datenbestand für die Arbeit im Feld zu großzügig eingegrenzt wurde. 4. Um die Bearbeitung von Daten durch mehrere Nutzer im verteilten System zu ermöglichen, müssen die Arbeitsschritte versioniert werden. Dies ermöglicht als Nebeneffekt auch ein Undo/Redo während der Arbeit an der Instanz. Beim abschließenden Übernehmen der Änderungen würden diese „Zwischenstände“ lokal verbleiben und periodisch gelöscht. Ihr Nutzen ist danach zweifelhaft und sie verursachen entsprechenden Speicherbedarf. Ist eine projektweite Historie sinnvoll? 5. Außerdem würde mich für einige Einschätzungen interessieren, die beschreiben, wie die Vorraussetzungen vor Ort aussehen können. In welcher Größenordnung bewegen sich die Projekte in Sachen Mitarbeiter und genutzter Computer? Welche Betriebssysteme kommen zum Einsatz (Win, *unix, OSX)? Werden die Rechner in jedem Fall durch DAI o.ä. administriert oder durch die Nutzer selbst? Mit freundlichen Grüßen, Benjamin Thurm Von: Felix Falko Schäfer An: Benjamin Thurm Kopie: Frank Henze, Philipp Gerth, Alexander Schulze, Frank Schwarzbach 11. Juni 2013 Lieber Herr Thurm, ich erlaube mir mal Ihnen zu antworten, in der Hoffnung, dass ich auch die Meinung der anderen richtig treffe: 1. Das Attribut „Sichtbarkeit“ kann durch den Projektadministrator im Zuge der Projektinitialisierung auf „0“ gesetzt werden. Dadurch können vordefinierte Attributwerte, die in einem Projekt (zunächst) als nicht zutreffend angesehen werden, ausgeblendet werden. Email xvi (S.59) Liegt die Verantwortung über die Sichtbarkeit auch nach der Projektinitialisierung ausschließlich beim Projektadministrator? Falls dem so ist, kann hier beim Initialisieren von Kind-Instanzen aus der Projektdatenbank davon abgesehen werden, diese Daten mit zu replizieren. Dieser Schritt würde bei einem nachträglichen Aktivieren nachgeholt werden. Ja, die Sichtbarkeit wird ausschließlich von dem Projektadmin festgelegt. Nutzer müssen sich ggf. an diesen wenden, wenn sie etwas ein-/ausblenden wollen. 2. Alle Wertelisten sind projektspezifisch erweiterbar, wobei die Erweiterungen nach Zustimmung durch den System-Administrator auch anderen Projekten zur Verfügung gestellt werden können. (S.59) Für das Zurückschreiben von Daten aus der Projektdatenbank ist im Moment kein konkreter Mechanismus vorgesehen. Das heißt, dass alle Klassen, die im Systemschema vorhanden sind - nach aktuellem Stand im Grunde alles, was nicht direkt mit den konkreten Themeninstanzen verbandelt ist - mit dem Systemschema abgeglichen werden können. Dies gilt damit auch für die Wertelisten. Ist es nötig, hier einen „Schalter“ zu führen, der bestimmt, welche Wertelisten vom Systemadministrator übernommen werden sollen/dürfen? Oder ist hier eher die konkrete Kommunikation Systemadministrator-Projektadministrator vorgesehen, bei der die Übernahme solcher Daten besprochen wird? So ganz verstehe ich die Frage nicht bzw. würden den Fall etwas anders beschreiben, da ich nicht die Zustimmung des System-Admins für die Weitergabe erforderlich halte bzw. mir nicht klar ist, nach welchen Kriterien er seine Zustimmung gibt oder nicht. Konkret stelle ich mir folgenden Ablauf vor (der evtl. falsch oder zu kompiziert sein kann): - Der Projektadmin für Projekt 1 fügt an Werteliste X einen neuen Wert ein - Dieser Wert wird dem Gesamtbestand aller für Werteliste X zulässigen Werte hinzugefügt, ist aber nur bei Projekt 1 unmittelbar aktiviert und sichtbar - Für die anderen Projekte werden die Projektadmins informiert (sagen wir mal für den Moment durch eine manuell verfasste email des Sys-Admins), dass es einen neuen Wert gibt, der nun potentiel auch von den anderen Projekten verwendet werden kann - Wenn die Projektadmins nach der Nachricht dies tun wollen, können sie den Wert auch für ihr konkretes Projekt freischalten. ==> insgesamt kommt es hier also auf die konkrete Kommunikation Sys- und Projekt-Admins an. 3. Beim Abbilden von Kinderinstanzen aus dem initialen Themengerüst der Projektdatenbank könnte unter Umständen darauf verzichtet werden, den gesamten Bestand der Daten zu übertragen. Wäre hier die Differenzierung nach Teilprojekten sinnvoll? Ja, auf alle Fälle. Es kann sogar der Regelfall sein, dass eine Kindinstanz nur für ein Teilprojekt erzeugt werden muss. Email xvii Daraus resultiert natürlich auch, dass diese Instanz anschließend nur dazu genutzt werden kann, aus ihr den > gleichen eingeschränkten Datenbestand in eine eventuelle Kinderinstanz abzubilden. Der Nutzen einer solchen Funktion ist sicherlich abhängig von der zu erwartenden Datenmenge. Vorteile wären hier unter anderem ein geringerer Kopieraufwand (siehe auch externe Bilder, Dokumente) und eine physikalische Zugriffssicherung bei Diebstahl/Verlust. Die benötigte Logik für diesen Vorgang kann zum Nachteil werden, insbesondere wenn Themeninstanzen auf Themeninstanzen verweisen, die nicht Bestandteil des Teilprojekts sind. Ärgerlich wäre natürlich auch, wenn der Datenbestand für die Arbeit im Feld zu großzügig eingegrenzt wurde. Ja, das sehe ich auch als ein Probem an. Evtl. ist es möglich alle Themeninstanzen eines Telprojektes zu nehmen plus alle außerhalb des Teilprojektes, auf die verwiesen wird. Das ist aber auch nur z.T. gut, weill es Verweise, die während der Offlinearbeit erfolgen, z.T. verhindert. Ggf. muss man alle Themeninstanzen für eine Kindversion eines Teilprojektes verwenden, aber die externen Bilder, Dokumente, etc., die nicht zu TeilprojektThemeniinstanzen gehören, weglassen. Insgesamt schwierig und ich befürchte erst die Praxisi wird zeigen, was wirklich praktikabel ist - sowohl für den Forscher als auch für den Synchronisationsprozess. 4. Um die Bearbeitung von Daten durch mehrere Nutzer im verteilten System zu ermöglichen, müssen die Arbeitsschritte versioniert werden. Dies ermöglicht als Nebeneffekt auch ein Undo/Redo während der Arbeit an der Instanz. Beim abschließenden Übernehmen der Änderungen würden diese „Zwischenstände“ lokal verbleiben und periodisch gelöscht. Ihr Nutzen ist danach zweifelhaft und sie verursachen entsprechenden Speicherbedarf. Ist eine projektweite Historie sinnvoll? M.E. nicht. Ich kann mir kaum einen Fall vorstellen, wo es sinnvoll ist, auf eine ältere Version eines Themeninstanz zurückgreifen zu wollen. Ich würde das wenn überhaupt durch regelmäßige Backups (Datenbankdumps) lösen, auf die im Notfall durch den Projektadmin zurückgriffen werden kann, wenn Theminstanzen gelöscht oder einzelne Attribute falsch überschrieben wurden. 5. Außerdem würde mich für einige Einschätzungen interessieren, die beschreiben, wie die Vorraussetzungen vor Ort aussehen können. In welcher Größenordnung bewegen sich die Projekte in Sachen Mitarbeiter und genutzter Computer? Kind-Instanzen können von 1 Person mit 1 Laptop (z.B. Forscher nimmt Objekte in einem Museumskeller auf) bis hin zu ca. 15 Personen an 10 Rechnern in einem lokalen Netzwerk reichen (so z.B. in Pergamon als eines der „großen“ Feldforschungsprojekte) Welche Betriebssysteme kommen zum Einsatz (Win, *unix, OSX)? Email xviii Primär wohl Win, OSX ganz wenig und *unix gar nicht (Ich kenne keinen Archäologen, der mit *unix-Systemen arbeitet, schon gar nicht bei Feldforschungen ...). Werden die Rechner in jedem Fall durch DAI o.ä. administriert oder durch die Nutzer selbst? Unterschiedlich: Wenn DAI-Projekt dann Administration durch das DAI, wenn aber OpenInfRA von nicht DAI- Projekten genutzt wird (z.B. im Rahmen von TOPOI der FU & HU Berlin), dann ist die Administartion vielfältig ... Ich hoffe, meine Antworten helfen Ihnen ein wenig weiter. Ansonsten bitte Rückfragen. Beste Grüße, Felix Schäfer Von: Philipp Gerth An: Felix Falko Schäfer Kopie: Benjamin Thurm, Frank Henze, Philipp Gerth, Alexander Schulze, Frank Schwarzbach 11. Juni 2013 Lieber Herr Thurm, generell schließe ich mich Felix’ Antworten an, habe aber noch einige Anmerkungen: Welche Betriebssysteme kommen zum Einsatz (Win, *unix, OSX)? Primär wohl Win, OSX ganz wenig und *unix gar nicht (Ich kenne keinen Archäologen, der mit *unix-Systemen arbeitet, schon gar nicht bei Feldforschungen ...). Ansonsten spielt in anderen Ländern teilweise Linux eine größere Bedeutung und insbesondere ArcheOS könnte hier eine größere Rolle spielen, in der man thereotisch sicher auch OpenInfRA einbinden könnte, was ein Deploy auf Rechnern natürlich erheblich erleichtert: http://www.archeos.eu Android wird aber vermutlich zukünftig in der Archäologie eine größere Rolle spielen, wobei das eher Kaffeesatzlesen ist, da es im Moment kaum angewendet wird. IOS wird sich hier aber m.E. wegen der Restriktionen für Feldforschungen nicht durchsetzen, während aber der Nutzen von Tablets für Feldforschungen potenziell sehr groß ist. Das soll aber kein Aussschlusskriterium sein, lediglich ein Hinweis auf eine wahrscheinliche zukünftige Entwicklung. Meine Hoffnung/Bemühungen für ein mögliches Nachfolgeprojekt wäre vermutlich auch in diesem Bereich. Email xix Werden die Rechner in jedem Fall durch DAI o.ä. administriert oder durch die Nutzer selbst? Unterschiedlich: Wenn DAI-Projekt dann Administration durch das DAI, wenn aber OpenInfRA von nicht DAI- Projekten genutzt wird (z.B. im Rahmen von TOPOI der FU & HU Berlin), dann ist die Administartion vielfältig ... Prinzipiell gehe ich davon aus, daß sich die Administration von OpenInfRA nur größere Institute „leisten“ können, da hierzu immer eine Person mit IT verstand notwendig sein wird. Ob es dann aber in der Summe für die Institute nicht leichter ist auf den DAI Bus aufzuspringen, wird die Zeit dann zeigen. Ob es gelingen wird eine eigene größere Open Source Community aufzubauen, die dann ähnlich QGIS und co die Entwicklung voran treibt, wage ich zu bezweifeln, da die Zielgruppe viel kleiner und auch weniger IT affin ist. Von daher denke ich wird OpenInfRA später administrativ und (weiter-)entwicklungstechnisch nur von Institutionen, Exellenzclustern und wirklich großen Instituten (wovon es vll ein halbes Dutzend in Deutschland gibt) zu tragen sein. Schöne Grüße, Philipp Gerth Anlagenverzeichnis Anlagenverzeichnis 1 | - - M a s t e r a r b e i t _ B e n j a m i n _ T h u r m . pdf 2 | - - Anhang - A_Anwendungsf ä lle_ Ü berarbeitung . odt 3 | - - Anhang - B _An fo rde ru ngs ka tal og_ Ü berarbeitung . xls 4 | - - Datenbankschema 5 | | - - 1 _UUID_v10_Relationen . sql 6 | | - - 2 _ UU I D_ v1 0_ S ta nd a rd we rt e . sql 7 | | - - 3 _UUID_v10_Funktionen . sql 8 | - - Grobkonzept_Erg ä nzungen_Thurm . odt 9 | - - PostgreSQL Extension pg_sengi 10 | | - - pg_sengi 11 | | - - vclock 12 | - - S tanda rdkonf igura tion 13 | | - - SymOpenInfRA . sql 14 | | - - child . properties 15 | | - - mother . properties 16 | - - SymmetricDS Anpassungen 17 | | - - SVN 18 | | - - SymmetricAdmin . java 19 | | - - symmetric - client -3.5.10. jar 20 | | - - user - guide . pdf 21 | - - Test 22 | | - - Config . sql 23 | | - - UUID_Import . sql 24 | | - - U U ID _M ig r at io ns e rg eb ni s . sql 25 | - - Webseiten 26 | - - BDR Project (2013) - BDR Project - PostgreSQL wiki 27 | - - BeanShell ( o . D .) - Lightweight Scripting for Java 28 | - - Cottbus , BTU (2013) CISAR 29 | - - Esri (2013 a ) - ArcGIS 10.2 for Desktop Functionality Matrix . pdf 30 | - - Esri (2013 b ) - ArcGIS 10.2 for Server Functionality Matrix . pdf 31 | - - Esri (2013 c ) - ArcGIS Help 10.2 - Preparing data for replication 32 | - - Esri (2013 d ) - ArcGIS Help 10.2 - Replica creation and versioning 33 | - - FileMaker Inc . (2013 b ) - FileMaker Pro - Funktionen | FileMaker Pro 12 34 | - - FileMaker , Inc . (2013 a ) - Database syncing - an overview of approaches | FileMaker 35 | - - Internet Engineering Task Force (2005) - RFC 4122 - A Universally Unique IDentifier ( UUID ) URN Namespace 36 | - - JumpMind (2013 a ) - Editions xx Anlagenverzeichnis xxi 37 | - - JumpMind (2013 b ) - SymmetricDS API 3.5.5 38 | - - Keating (2001) - Challenges Involved in Multimaster Replication 39 | - - Lane (2008) - Core team statement on replication in PostgreSQL 40 | - - Long (2012) - How SymmetricDS Works 41 | - - Microsoft (2013) - Mergereplikation 42 | - - Microsoft - Nachverfolgen von Datena ?\210 nderungen ( SQL Server ) 43 | - - Microsoft - U ?\210 ber Change Data Capture ( SQL Server ) 44 | - - Oracle (2005) - Change Data Capture 45 | - - Postgres (2010) - Postgres - R : a database replication system for PostgreSQL 46 | - - Postgres (2012) - PostgreSQL : Documentation : devel : Release 9.2 47 | - - Postgres (2013 a ) - PostgreSQL : PostgreSQL 9.3 Pressemappe 48 | - - Postgres (2013 b ) - PostgreSQL : Documentation : 9.3: Transaction Isolation 49 | - - Postgres (2013 e ) - PostgreSQL : Documentation : 9.3: Introduction 50 | - - Postgres (2013 f ) - PostgreSQL : Documentation : 9.3: Log - Shipping Standby Servers 51 | - - Postgres (2013 g ) - PostgreSQL : Documentation : 9.3: UUID Type 52 | - - Postgres (2013 h ) - PostgreSQL : Documentation : 9.3: uuid - ossp 53 | - - Postgres (2013 i ) - PostgreSQL : Documentation : 9.0: Write - Ahead Logging ( WAL ) 54 | - - Sun Microsystems (2011) - The Java Community Process ( SM ) Program JSRs : Java Specification Requests - detail JSR # 315 55 | - - Test Anything Protocoll (2007) - Test Anything Protocol 56 | - - Wheeler (2013) - pgTAP : Unit Testing for PostgreSQL Listing 3: Ordnerstruktur Monographien xxii Monographien Abeck, Sebastian u. a. (2003). Verteilte Informationssysteme. 2. Aufl. Heidelberg: dpunkt.verlag. Böszörmenyi, Zoltan und Hans-Jürgen Schönig (Aug. 2013). PostgreSQL Replication. Birmingham: Packt Publishing Ltd. Ceri, Stefano und Giuseppe Pelagatti (1984). Distributed Databases - Principles and Systems. Computer Science Series. McGraw-Hill Book Company. Coulouris, George, Jean Dollimore und Tim Kindberg (2002). Verteilte Systeme. 3. Aufl. München: Pearson Studium. Dadam, Prof. Dr. Peter (1996). Verteilte Datenbanken und Client-, Server-Systeme. Grundlagen, Konzepte und Realisierungsformen. Berlin: Springer-Verlag. Edlich, Stefan u. a. (2011). NoSQL. Einstieg in die Welt nichtrelationaler Web 2.0 Datenbanken. Carl Hanser Verlag München. Höpfner, Hagen, Can Türker und Birgitta König-Ries (2005). Mobile Datenbanken und Informationssysteme - Konzepte und Techniken. dpunkt.verlag. Kemper, Prof. Dr. Alfons und Dr. André Eickler (2009). Datenbanksysteme. Eine Einführung. 7. Aufl. München: Oldenbourg Wissenschaftsverlag GmbH. Mutschler, Bela und Günther Specht (2004). Mobile Datenbanksysteme. Springer-Verlag Berlin Heidelberg. Rahm, Erhard (1994). Mehrrechner-Datenbanksysteme. 1. Auflage. Addison-Wesley Publishing Company. Zeiler, Michael und Jonathan Murphy (2010). Modeling Our World. 2. Aufl. Redlands: Esri Press. Publikationen Anderson, Ross (2001). „Distributed Systems“. In: A Guide to Building Dependable Distributed Systems. Wiley Computer Publishing. Kap. Distributed Systems, S. 115–135. Demers, Alan u. a. (1994). The Bayou Architecture: Support for Data Sharing among Mobile Users. Techn. Ber. Palo Alto, California 94304 U.S.A.: Xerox Palo Alto Research Center. Esri (9. Juli 2007). An Overview of Distributing Data with Geodatabases. White paper. Redlands: Esri. Fidge, Colin J. (1988). „Timestamps in Message-Passing Systems That Preserve the Partial Ordering“. In: Australian Computer Science Communications. Gilbert, Seth und Nancy Lynch (2002). „Brewer’s Conjecture and the Feasibility of Consistent Available Partition-Tolerant Web Services“. In: In ACM SIGACT News. Webseiten xxiii Lamport, Leslie (1978). „Time, Clocks, and the Ordering of Events in a Distributed System“. In: Communications of the ACM. Hrsg. von R. Stockton Gaines. Bd. 21. 7, S. 558– 565. Lamprecht, Jana (Aug. 2008). „Konzeption und Implementierung eines Intermittently Synchronized Database System für paläoanatomische Anwendungen“. Diplomarbeit. München: Ludwig Maximilians Universität München. Long, Eric u. a. (2013). SymmetricDS User Guide. v3.5. Meijden, Chris van der (2012). OSSOBOOK. Spicing archaeo related sciences with archaeo-informatics. Präsentation. ArchaeoBioCenter. OpenInfRA, Projektteam (2013). „OpenInfRA. Grobkonzept für ein webbasiertes Informationssystem zur Dokumentation archäologischer Forschungsprojekte“. unveröffentlicht. Arbeitsstand V2.2. Cottbus und Dresden. Petersen, Karin, Mike J. Spreitzer u. a. (1997). „Flexible Update Propagation for Weakly Consistent Replication“. In: SOSP ’97 Proceedings of the sixteenth ACM symposium on Operating systems principles, S. 288–301. Petersen, Karin, Mike Spreitzer u. a. (1996). „Bayou: Replicated Database Services for World-wide Applications“. In: In Proceedings 7th SIGOPS European Workshop. ACM, S. 275–280. Rabinovich, Michael, Narain Gehani und Alex Kononov (1995). „Scalable Update Propagation in Epidemic Replicated Databases“. In: In Proceedings of the 5th International Conference on Extending Database Technology. Springer, S. 207–222. Saito, Yasushi (2000). Optimistic Replication Algorithms. White Paper. International Symposium on Distributed Computing. – (2005). „Optimistic replication“. In: ACM Computing Surveys 37, S. 42–81. Schäfer, Felix Falko (11. Juni 2013). Re: Replikation OpenInfRA - Allgemeine Fragen. Email. Shah, Jignesh (2013). Best Practices for HA and Replication for PostgreSQL in Virtualized Enviroments. Präsentation. vPostgres Team und VMware. Vogels, Werner (2009). „Eventually Consistent“. In: Communications of the ACM. Bd. 52. 2. Webseiten BDR Project (3. Mai 2013). URL: http://wiki.postgresql.org/wiki/BDR_Project (besucht am 29. 09. 2013). BeanShell (o.D.). BeanShell - Lightweight Scripting for Java. URL: http://www.beanshell. org. Brewer, Eric A. (2000). Towards Robust Distributed Systems. URL: http://www.cs.berkeley. edu/~brewer/cs262b-2004/PODC-keynote.pdf (besucht am 02. 09. 2013). Cottbus, BTU (2. Sep. 2013). CISAR. Ein modulares Informationssystem für Archäologie und Bauforschung. BTU Cottbus. URL: http : / / www . tu - cottbus . de / cisar / cisar / beschreibung.html (besucht am 02. 09. 2013). Webseiten xxiv Esri (2013a). ArcGIS 10.2 for Desktop Functionality Matrix. URL: http://www.esri.com/ software / arcgis / arcgis - for - desktop / ~ / media / Files / Pdfs / library / brochures / pdfs / arcgis102-desktop-functionality-matrix.pdf (besucht am 15. 10. 2013). – (2013b). ArcGIS 10.2 for Server Functionality Matrix. URL: http : / / www . esri . com / software / arcgis / arcgis - for - desktop / ~ / media / Files / Pdfs / library / brochures / pdfs / arcgis102-desktop-functionality-matrix.pdf (besucht am 15. 10. 2013). – (2013c). ArcGIS Help 10.2 - Preparing data for replication. URL: http : / / resources . arcgis . com / en / help / main / 10 . 2 / index . html # /Preparing _ data _ for _ replication / 003n000000z5000000/ (besucht am 15. 10. 2013). – (9. Okt. 2013d). Replica creation and versioning. URL: http://resources.arcgis.com/en/ help/main/10.2/index.html#/Replica_creation_and_versioning/003n000000vr000000/ (besucht am 15. 10. 2013). FileMaker, Inc. (15. Apr. 2013a). Database syncing. An overview of approaches. URL: http://help.filemaker.com/app/answers/detail/a_id/7720/~/database- syncing--- anoverview-of-approaches (besucht am 01. 09. 2013). – (2013b). FileMaker Pro-Funktionen. URL: http://www.filemaker.de/products/filemakerpro/all-features.html (besucht am 01. 09. 2013). Force, Internet Engineering Task (Juli 2005). RFC 4122: A Universally Unique IDentifier (UUID) URN Namespace. URL: http : / / tools . ietf . org / html / rfc4122 (besucht am 08. 10. 2013). Group, Postgres Global Development (2010). About Postgres-R. URL: http : / / postgres r.org/about/about (besucht am 29. 09. 2013). JumpMind Inc. (2013a). Editions. URL: http://www.jumpmind.com/products/symmetricds/ editions. – (2013b). SymmetricDS API 3.5.5. URL: http://www.symmetricds.org/doc/3.5/javadoc/ (besucht am 10. 10. 2013). – (9. Sep. 2013c). SymmetricDS - Open Source Database Replication. URL: http://www. symmetricds.org. Keating, Brian (2001). Challenges Involved in Multimaster Replication. URL: http://www. dbspecialists.com/files/presentations/mm_replication.html (besucht am 27. 09. 2013). Lane, Tom (29. Mai 2008). Core team statement on replication in PostgreSQL. URL: http: //www.postgresql.org/message- id/[email protected] (besucht am 28. 09. 2013). Long, Eric (15. Sep. 2012). How SymmetricDS Works. URL: http://www.symmetricds.org/ docs/how-to/how-symmetricds-works (besucht am 28. 09. 2013). Microsoft (o.D.[a]). Nachverfolgen von Datenänderungen (SQL Server). URL: http : / / technet.microsoft.com/de-de/library/bb933994.aspx. – (o.D.[b]). Über Change Data Capture (SQL Server). URL: http://technet.microsoft.com/ de-de/library/cc645937.aspx. – (2013). Mergereplikation. URL: http://technet.microsoft.com/de-de/library/ms152746. aspx (besucht am 22. 10. 2013). Oracle (2005). Oracle Database Data Warehousing Guide. Change Data Capture. URL: http : / / docs . oracle . com / cd / B19306 _ 01 / server. 102 / b14223 / cdc . htm (besucht am 15. 10. 2013). PostgreSQL Global Development Group (10. Sep. 2012). PostgreSQL Documentation: Release 9.2. URL: http : / / www. postgresql . org / docs / devel / static / release - 9 - 2 . html (besucht am 07. 10. 2013). Webseiten xxv PostgreSQL Global Development Group (9. Sep. 2013a). PostgreSQL 9.3 Pressemappe. URL : http://www.postgresql.org/about/press/presskit93/de/ (besucht am 25. 09. 2013). – (2013b). PostgreSQL Documentation. Concurrency Control. Transaction Isolation. URL: http : / / www . postgresql . org / docs / current / static / transaction - iso . html (besucht am 26. 09. 2013). – (2013c). PostgreSQL Documentation. Concurrency Control. Introduction. URL: http:// www.postgresql.org/docs/current/static/mvcc-intro.html (besucht am 26. 09. 2013). – (2013d). PostgreSQL Documentation: Cluster. URL: http://www.postgresql.org/docs/9. 3/static/sql-cluster.html (besucht am 17. 10. 2013). – (2013e). PostgreSQL Documentation: Continuous Archiving and Point-in-Time Recovery (PITR). URL: http://www.postgresql.org/docs/9.3/static/continuous-archiving.html (besucht am 27. 09. 2013). – (2013f). PostgreSQL Documentation: Log-Shipping Standby Servers. URL: http://www. postgresql.org/docs/9.3/static/warm-standby.html (besucht am 27. 09. 2013). – (2013g). PostgreSQL Documentation: UUID Type. URL: http : / / www. postgresql . org / docs/9.3/static/datatype-uuid.html (besucht am 15. 10. 2013). – (2013h). PostgreSQL Documentation: uuid-ossp. URL: http://www.postgresql.org/docs/ 9.3/static/uuid-ossp.html (besucht am 08. 10. 2013). – (2013i). PostgreSQL Documentation: Write-Ahead Logging (WAL). URL: http://www. postgresql.org/docs/9.0/static/wal-intro.html (besucht am 27. 09. 2013). PostgreSQL Wiki (5. Okt. 2013). Replication, Clustering, and Connection Pooling. URL: http : / / wiki . postgresql . org / wiki / Replication , _Clustering , _and _ Connection _ Pooling (besucht am 05. 10. 2013). Sun Microsystems Inc. (9. März 2011). JSR 315: Java Servlet 3.0 Specification. URL: http://jcp.org/en/jsr/detail?id=315 (besucht am 06. 10. 2013). Test Anything Protocol (29. Mai 2007). URL: http://testanything.org/wiki/index.php/Main_ Page (besucht am 06. 09. 2013). Wheeler, David E. (6. Sep. 2013). pgTAP: Unit Testing for PostgreSQL. URL: http://pgtap. org (besucht am 06. 09. 2013). Erklärung über die eigenständige Erstellung der Arbeit xxvi Erklärung über die eigenständige Erstellung der Arbeit Hiermit erkläre ich, dass ich die vorgelegte Arbeit mit dem Titel „Entwurf und Implementierung einer Offline-Replikation unter PostgreSQL“ selbständig verfasst, keine anderen als die angegebenen Quellen und Hilfsmittel benutzt sowie alle wörtlich oder sinngemäß übernommenen Stellen in der Arbeit als solche und durch Angabe der Quelle gekennzeichnet habe. Dies gilt auch für Zeichnungen, Skizzen, bildliche Darstellungen sowie für Quellen aus dem Internet. Mir ist bewusst, dass die Hochschule für Technik und Wirtschaft Dresden Prüfungsarbeiten stichprobenartig mittels der Verwendung von Software zur Erkennung von Plagiaten überprüft. Ort, Datum Benjamin Thurm