-Angebot Foreign Data Wrappers Postgres ITos GmbH, CH-9642 Ebnat-Kappel Swiss Postgres Conference 26. Juni 2014
Foreign Data Wrapper Postgres -Angebot Foreign Data Wrapper? Transparente Einbindung (art-)fremder Daten mit und in Postgres
Wer bin ich? -Angebot, ITos GmbH Web-(GIS)-Lösungen Postgres Django Systembetreuung
Weblösungen 2005 -Angebot
Anfragen 2015 -Angebot
Web API -Angebot
Application API -Angebot
Database API -Angebot
Postgres -Angebot
Sicherheit -Angebot Fremde Daten sind grundsätzlich als unsicher zu betrachten! Daten auf Konformität prüfen Zugriffsmöglichkeiten auf das erforderliche Minimum beschränken (Anwender/Daten) Zugriffe auf Anwendung oder Datenbank absichern
Gestern -Angebot SQL2003 definiert SQL/MED (Management of External Data) Contrib-Module DBlink: Standardisierter Zugriff auf Potgres-DBs Contrib Modul DBI-Link: SQL/MED Teilimplementation erlaubt Zugriff auf unterschiedliche DBs Postgres 9.1: als universelle, lesende SQL/MED-Schnittstelle (API) Postgres 9.3: Foreign Data Wrapper um Schreiboperationen erweitert
Aktueller Stand (PG 9.4) -Angebot Unterschiedlichste Implementierungen spezifischer s verfügbar Jeden Monat eine Neuimplementation Einige noch nicht voll ausgereift Dokumentation & Quellen: https://wiki.postgresql.org/wiki/sql/med http://wiki.postgresql.org/wiki/foreign data wrappers http://pgxn.org/tag/fdw/
file fwd -Angebot PG-Erweiterug, die mit der Postgres -API komuniziert Erlaubt Zugriff auf Dateien des Filesystem file fwd Bestandteil der Postgres Basisinstallation
file fwd Erweiterung laden -Angebot pg: CREATE EXTENSION ; CREATE EXTENSION
file fwd Instanz erstellen -Angebot pg: CREATE SERVER file server FOREIGN DATA WRAPPER ; CREATE SERVER
file fwd Tabelle erstellen -Angebot pg: CREATE FOREIGN TABLE passwd ( username text, pass text, uid int4, gid int4, gecos text, home text, shell text ) SERVER file server OPTIONS (format text, filename /etc/passwd, delimiter :, null ); CREATE FOREIGN TABLE
file fwd Tabelle Anzeigen -Angebot /etc/passwd, delimiter :, pg: \d passwd Fremdtabelle " public.passwd\\ Spalte Typ Attribute -Opt ----------+---------+-----------+-------- username text pass text uid integer gid integer gecos text home text shell text Server: file_server Options: (format text, filename "null" )
file fwd Abfrage -Angebot pg: select username, uid, home from passwd order by uid asc limit 3; username uid home ---------+-----+----------- root 0 /root daemon 1 /usr/sbin bin 2 /bin
file fwd Tabelle kopieren -Angebot pg: CREATE FOREIGN TABLE passwd rw ( like passwd INCLUDING DEFAULTS) Server file server OPTIONS (format text, filename /tmp/passwd, delimiter :, null ); FEHLER: LIKE wird für das Erzeugen von Fremdtabellen nicht unterstützt NB: Schreibende Operationen werden von file fwd unter Postgres 9.4 nicht unterstützt
postgres fwd -Angebot Ermöglicht die Kommunikation zwischen Postgres-Datenbanken postgres fwd Bestandteil der Postgres Basisinstallation
postgres fwd Erweiterung laden -Angebot pg: CREATE EXTENSION ; CREATE EXTENSION
postgres fwd Instanz erstellen -Angebot pg: CREATE SERVER fpg server FOREIGN DATA WRAPPER OPTIONS (host localhost, port 5432, dbname fdb ); CREATE SERVER
postgres fwd Map Roles -Angebot pg: CREATE USER MAPPING FOR local user SERVER fpg server OPTIONS (user foreign user, password password ); pg: CREATE USER MAPPING FOR postgres SERVER fpg server OPTIONS (user postgres, password passwd ); CREATE USER MAPPING
postgres fwd Tabelle erstellen -Angebot pg r : create table orig table as select id, md5(random()::text) from generate series(1,999999) as id; CREATE TABLE pg: CREATE FOREIGN TABLE fpg table ( id serial NOT NULL, md5 text) SERVER fpg server OPTIONS (schema name public, table name orig table ); CREATE FOREIGN TABLE
postgres fwd Tabelle abfragen -Angebot pg r : select * from orig table order by id asc limit 2; id md5 ----+---------------------------------- 1 348a8119a94fcf0fc98160b49f1b9be5 2 f865fe9343e06d8ce7b988d47968ac4e (2 Zeilen) pg: select * from fpg table order by id asc limit 2; id md5 ----+---------------------------------- 1 348a8119a94fcf0fc98160b49f1b9be5 2 f865fe9343e06d8ce7b988d47968ac4e (2 Zeilen)
postgres fwd Tabelle updaten -Angebot pg: UPDATE fpg table SET SET md5 where id = 2; UPDATE 1
postgres fwd Tabelle nach Update abfragen -Angebot pg r : select * from orig table order by id asc limit 2; id md5 ----+---------------------------------- 1 348a8119a94fcf0fc98160b49f1b9be5 2 (2 Zeilen) pg: select * from fpg table order by id asc limit 2; id md5 ----+---------------------------------- 1 348a8119a94fcf0fc98160b49f1b9be5 2 (2 Zeilen)
Ausführungszeiten -Angebot select * from table order by id desc limit 2; orig table ohne Index: 0.4s fpg table ohne Index: 4.2s orig table mit Index: 0.9ms fpg table mit Index: 4.2s select * from table where id = 34567; orig table ohne Index: 0.13s fpg table ohne Index: 0.13s orig table mit Index: 0.05ms fpg table mit Index: 0.6ms EXPLAIN ANALYZE VERBOSE < query > remote query
Zusammenfassung -Angebot Dokumentation lesen! CREATE EXTENSION CREATE SERVER CREATE USER MAPPING CREATE FOREIGN TABLE
-Angebot Übersicht -Angebot Relationale Datenbanken (generisch und spezifisch) Dokumentenorientierte Datenbanken Graphen-Datenbanken WorldWideWeb (generisch und spezifisch) Filesystem Betriebsystem Geodaten
-Angebot Auswahl -Angebot PGStrom (GPU) Neo4j pg dump JSON/GeoJSON Twitter Hadoop IMAP SQL-Alchemy
Einsatzszenarien -Angebot Macht Datenreplikation überflüssig Migration Data Warehouse Reporting
Grenzen -Angebot Viele Lösungen noch alpha oder beta Viele Lösungen nicht von PGDG unterstützt Durchzogene Performance Keine Datenintegrität (Fremddaten) Reduzierte Ausfallsicherheit
C-API -Angebot C-API Generisch Komplex wenig dokumentiert
-Angebot Python-API (Wrapper über C-API) Wrapper um den Wrapper Fokus auf Anwendung Python-Libs lassen sich einbinden Skeleton s Eingebunde : SQLAlchemy, CSV, Filesystem, SQlite, IMAP, RSS, LDAP Dokumentation: http://multicorn.org/documentation/ Bestehende Implementationen
Voraussetzungen -Angebot Postgres 9.1: 0.9.1 Postgres 9.2: > 1.0.0 Postgres ab 9.3: schreibend Postgres Entwicklungsumgebung Python 2.7 oder Python >= 3.3 Python Entwicklungsumgebung
Installation -Angebot Debian-Paketmanager (jessie) aptitude install postgresql-9.4-python-multicorn Python Installer pip install multicorn pgxn-client pgxn install multicorn Quellen git clone git://github.com/kozea/.git cd make && sudo make install
Anwendung -Angebot pg: CREATE EXTENSION multicorn; pg: CREATE SERVER multicorn imap FOREIGN DATA WRAPPER multicorn options (wrapper multicorn.imapfdw.imapfdw ); pg: CREATE FOREIGN TABLE mail (... ) server multicorn imap options (... );
Python Module Setup -Angebot import myfdw.myfdw from myfdw import myfdw
setup.py -Angebot import subprocess from setuptools import setup, find packages, Extension setup ( name= myfdw, version= 0.1.0, author= Monty Python, license= Postgresql, packages=[ myfdw ] )
myfdw.py -Angebot from multicorn import ForeignDataWrapper class ConstantForeignDataWrapper(ForeignDataWrapper): def init (self, options, columns): super(constantforeigndatawrapper, self). init (options, columns) self.columns = columns def execute(self, quals, columns): for index in range(20): line = {} for column name in self.columns: line[column name] = %s %s % (column name, index) yield line
Postgres 9.5 IMPORT FOREIGN SCHEMA -Angebot IMPORT FOREIGN SCHEMA: Importiert Remote-Schema Das Anlegen der lokalen Datenstrukturen entfällt In ab Version 1.2.0 verfügbar
Postgres 9.5 FOREIGN SCHEMA Anwendung -Angebot pg: IMPORT FOREIGN SCHEMA remote schema [LIMITTO EXCLUDE(table 1,...table n )] FROM SERVER remote server INTO local schema;
Postgres -Angebot