PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Cloud Anbieter Deep Dive:PostgreSQL auf Microsoft Azure

Wenn Sie Microsoft in letzter Zeit verfolgt haben, wird es Sie nicht überraschen, dass der Anbieter eines konkurrierenden Datenbankprodukts, nämlich SQL Server, ebenfalls auf den PostgreSQL-Zug aufgesprungen ist. Von der Freigabe von 60.000 Patenten für OIN bis hin zum Platinum-Sponsor bei PGCon, Microsoft als eine der PostgreSQL-Unternehmensorganisationen. Er nutzte jede Gelegenheit, um zu zeigen, dass Sie PostgreSQL nicht nur auf Microsoft ausführen können, sondern dass auch das Gegenteil zutrifft:Microsoft kann PostgreSQL über sein Cloud-Angebot für Sie ausführen. Noch deutlicher wurde die Aussage mit der Übernahme von Citus Data und der Veröffentlichung ihres Flaggschiffprodukts in der Azure Cloud unter dem Namen Hyperscale. Man kann mit Sicherheit sagen, dass die Akzeptanz von PostgreSQL zunimmt, und jetzt gibt es noch mehr gute Gründe, sich dafür zu entscheiden.

Meine Reise durch die Azure-Cloud begann direkt auf der Zielseite, wo ich die Konkurrenten treffe:Single Server und eine Vorschauversion (mit anderen Worten kein SLA bereitgestellt) von Hyperscale (Citus). Dieser Blog wird sich auf ersteres konzentrieren. Während dieser Reise hatte ich die Gelegenheit, zu üben, worum es bei Open Source geht – der Community etwas zurückzugeben – in diesem Fall, indem ich Feedback zur Dokumentation gab, die Microsoft dies sehr einfach macht, indem sie das Feedback direkt weiterleiten in Github:

PostgreSQL-Kompatibilität mit Azure

Versionierung

Laut Produktdokumentation zielt Single Server auf PostgreSQL-Versionen im Hauptbereich n-2 ab:

Als auf Leistung ausgelegte Lösung wird Single Server für Datensätze mit 100 GB empfohlen und größer. Die Server boten eine vorhersehbare Leistung – die Datenbankinstanzen verfügen über eine vordefinierte Anzahl von virtuellen Kernen und IOPS (basierend auf der Größe des bereitgestellten Speichers).

Erweiterungen

Es gibt eine ganze Reihe von unterstützten Erweiterungen, von denen einige sofort installiert werden:

[email protected]:5432 postgres> select name, default_version, installed_version from pg_available_extensions where name !~ '^postgis' order by name;

            name             | default_version | installed_version

------------------------------+-----------------+-------------------

address_standardizer         | 2.4.3 |

address_standardizer_data_us | 2.4.3           |

btree_gin                    | 1.2 |

btree_gist                   | 1.5 |

chkpass                      | 1.0 |

citext                       | 1.4 |

cube                         | 1.2 |

dblink                       | 1.2 |

dict_int                     | 1.0 |

earthdistance                | 1.1 |

fuzzystrmatch                | 1.1 |

hstore                       | 1.4 |

hypopg                       | 1.1.1 |

intarray                     | 1.2 |

isn                          | 1.1 |

ltree                        | 1.1 |

orafce                       | 3.7 |

pg_buffercache               | 1.3 | 1.3

pg_partman                   | 2.6.3 |

pg_prewarm                   | 1.1 |

pg_qs                        | 1.1 |

pg_stat_statements           | 1.6 | 1.6

pg_trgm                      | 1.3 |

pg_wait_sampling             | 1.1 |

pgcrypto                     | 1.3 |

pgrouting                    | 2.5.2 |

pgrowlocks                   | 1.2 |

pgstattuple                  | 1.5 |

plpgsql                      | 1.0 | 1.0

plv8                         | 2.1.0 |

postgres_fdw                 | 1.0 |

tablefunc                    | 1.0 |

timescaledb                  | 1.1.1 |

unaccent                     | 1.1 |

uuid-ossp                    | 1.1 |

(35 rows)

PostgreSQL-Überwachung auf Azure

Die Serverüberwachung stützt sich auf eine Reihe von Metriken, die sauber gruppiert werden können, um ein benutzerdefiniertes Dashboard zu erstellen:

Diejenigen, die mit Graphviz oder Blockdiag vertraut sind, werden wahrscheinlich die Option zum Exportieren der Datei zu schätzen wissen gesamte Dashboard in eine JSON-Datei:

Darüber hinaus können – und sollten – Metriken mit Warnungen verknüpft werden:

Anfragestatistiken können mithilfe von Query Store nachverfolgt und mit Query Performance visualisiert werden Einblick. Dazu müssen einige Azure-spezifische Parameter aktiviert werden:

[email protected]:5432 postgres> select * from pg_settings where name ~ 'pgms_wait_sampling.query_capture_mode|pg_qs.query_capture_mode';

-[ RECORD 1 ]---+------------------------------------------------------------------------------------------------------------------

name            | pg_qs.query_capture_mode

setting         | top

unit            |

category        | Customized Options

short_desc      | Selects which statements are tracked by pg_qs. Need to reload the config to make change take effect.

extra_desc      |

context         | superuser

vartype         | enum

source          | configuration file

min_val         |

max_val         |

enumvals        | {none,top,all}

boot_val        | none

reset_val       | top

sourcefile      |

sourceline      |

pending_restart | f

-[ RECORD 2 ]---+------------------------------------------------------------------------------------------------------------------

name            | pgms_wait_sampling.query_capture_mode

setting         | all

unit            |

category        | Customized Options

short_desc      | Selects types of wait events are tracked by this extension. Need to reload the config to make change take effect.

extra_desc      |

context         | superuser

vartype         | enum

source          | configuration file

min_val         |

max_val         |

enumvals        | {none,all}

boot_val        | none

reset_val       | all

sourcefile      |

sourceline      |

pending_restart | f

Um die langsamen Abfragen und Wartezeiten zu visualisieren, fahren wir mit dem Abfrageleistungs-Widget fort:

Lange laufende Abfragen​​​​

Wartestatistik

PostgreSQL-Protokollierung in Azure

Die standardmäßigen PostgreSQL-Protokolle können heruntergeladen oder für eine erweiterte Analyse nach Log Analytics exportiert werden:

PostgreSQL-Leistung und -Skalierung mit Azure

Während die Anzahl der virtuellen Kerne leicht erhöht oder verringert werden kann, löst diese Aktion einen Serverneustart aus:

Um null Ausfallzeiten zu erreichen, müssen Anwendungen in der Lage sein, vorübergehende Fehler problemlos zu verarbeiten .

Zur Optimierung von Abfragen stellt Azure dem DBA zusätzlich zu den vorinstallierten pg_statements- und pg_buffercache-Erweiterungen Leistungsempfehlungen zur Verfügung:

Hochverfügbarkeit und Replikation auf Azure

Hochverfügbarkeit des Datenbankservers wird durch eine knotenbasierte Hardwarereplikation erreicht. Dadurch wird sichergestellt, dass im Falle eines Hardwarefehlers innerhalb von zehn Sekunden ein neuer Knoten hochgefahren werden kann.

Azure bietet ein redundantes Gateway als Netzwerkverbindungsendpunkt für alle Datenbankserver innerhalb einer Region.

PostgreSQL-Sicherheit auf Azure

Standardmäßig verweigern Firewallregeln den Zugriff auf die PostgreSQL-Instanz. Da ein Azure-Datenbankserver das Äquivalent zu einem Datenbankcluster ist, gelten die Zugriffsregeln für alle Datenbanken, die auf dem Server gehostet werden.

Zusätzlich zu IP-Adressen können Firewall-Regeln auf virtuelle Netzwerke verweisen, eine Funktion, die nur für die Tarife „Allgemein“ und „Speicheroptimiert“ verfügbar ist.

Eine Sache fand ich an der Firewall-Weboberfläche merkwürdig – ich konnte nicht navigieren weg von der Seite, während Änderungen gespeichert wurden:

Ruhige Daten werden mit einem serververwalteten Schlüssel verschlüsselt, Cloud-Benutzer können dies nicht Deaktivieren Sie die Verschlüsselung. Daten während der Übertragung werden ebenfalls verschlüsselt – SSL erforderlich kann nur geändert werden, nachdem der Datenbankserver erstellt wurde. Genau wie die Daten im Ruhezustand werden Backups verschlüsselt und die Verschlüsselung kann nicht deaktiviert werden.

Advanced Threat Protection bietet Warnungen und Empfehlungen zu einer Reihe von Datenbankzugriffsanfragen, die als Sicherheitsrisiko gelten. Die Funktion befindet sich derzeit in der Vorschau. Zur Demonstration habe ich einen Passwort-Brute-Force-Angriff simuliert:

~ $ while : ; do psql -U $(pwgen -s 20 1)@pg10 ; sleep 0.1 ; done

psql: FATAL:  password authentication failed for user "AApT6z4xUzpynJwiNAYf"

psql: FATAL:  password authentication failed for user "gaNeW8VSIflkdnNZSpNV"

psql: FATAL:  password authentication failed for user "SWZnY7wGTxdLTLcbqnUW"

psql: FATAL:  password authentication failed for user "BVH2SC12m9js9vZHcuBd"

psql: FATAL:  password authentication failed for user "um9kqUxPIxeQrzWQXr2v"

psql: FATAL:  password authentication failed for user "8BGXyg3KHF3Eq3yHpik1"

psql: FATAL:  password authentication failed for user "5LsVrtBjcewd77Q4kaj1"

....

Prüfen Sie die PostgreSQL-Protokolle:

2019-08-19 07:13:50 UTC-5d5a4c2e.138-FATAL:  password authentication failed

for user "AApT6z4xUzpynJwiNAYf"

2019-08-19 07:13:50 UTC-5d5a4c2e.138-DETAIL:  Role "AApT6z4xUzpynJwiNAYf" does not exist.

   Connection matched pg_hba.conf line 3: "host all all 173.180.222.170/32 password"

2019-08-19 07:13:51 UTC-5d5a4c2f.13c-LOG:  connection received: host=173.180.222.170 port=27248 pid=316

2019-08-19 07:13:51 UTC-5d5a4c2f.13c-FATAL:  password authentication failed for user "gaNeW8VSIflkdnNZSpNV"

2019-08-19 07:13:51 UTC-5d5a4c2f.13c-DETAIL:  Role "gaNeW8VSIflkdnNZSpNV" does not exist.

   Connection matched pg_hba.conf line 3: "host all all 173.180.222.170/32 password"

2019-08-19 07:13:52 UTC-5d5a4c30.140-LOG:  connection received: host=173.180.222.170 port=58256 pid=320

2019-08-19 07:13:52 UTC-5d5a4c30.140-FATAL:  password authentication failed for user "SWZnY7wGTxdLTLcbqnUW"

2019-08-19 07:13:52 UTC-5d5a4c30.140-DETAIL:  Role "SWZnY7wGTxdLTLcbqnUW" does not exist.

   Connection matched pg_hba.conf line 3: "host all all 173.180.222.170/32 password"

2019-08-19 07:13:53 UTC-5d5a4c31.148-LOG:  connection received: host=173.180.222.170 port=32984 pid=328

2019-08-19 07:13:53 UTC-5d5a4c31.148-FATAL:  password authentication failed for user "BVH2SC12m9js9vZHcuBd"

2019-08-19 07:13:53 UTC-5d5a4c31.148-DETAIL:  Role "BVH2SC12m9js9vZHcuBd" does not exist.

   Connection matched pg_hba.conf line 3: "host all all 173.180.222.170/32 password"

2019-08-19 07:13:53 UTC-5d5a4c31.14c-LOG:  connection received: host=173.180.222.170 port=43384 pid=332

2019-08-19 07:13:54 UTC-5d5a4c31.14c-FATAL:  password authentication failed for user "um9kqUxPIxeQrzWQXr2v"

2019-08-19 07:13:54 UTC-5d5a4c31.14c-DETAIL:  Role "um9kqUxPIxeQrzWQXr2v" does not exist.

   Connection matched pg_hba.conf line 3: "host all all 173.180.222.170/32 password"

2019-08-19 07:13:54 UTC-5d5a4c32.150-LOG:  connection received: host=173.180.222.170 port=27672 pid=336

2019-08-19 07:13:54 UTC-5d5a4c32.150-FATAL:  password authentication failed for user "8BGXyg3KHF3Eq3yHpik1"

2019-08-19 07:13:54 UTC-5d5a4c32.150-DETAIL:  Role "8BGXyg3KHF3Eq3yHpik1" does not exist.

   Connection matched pg_hba.conf line 3: "host all all 173.180.222.170/32 password"

2019-08-19 07:13:55 UTC-5d5a4c33.154-LOG:  connection received: host=173.180.222.170 port=12712 pid=340

2019-08-19 07:13:55 UTC-5d5a4c33.154-FATAL:  password authentication failed for user "5LsVrtBjcewd77Q4kaj1"

2019-08-19 07:13:55 UTC-5d5a4c33.154-DETAIL:  Role "5LsVrtBjcewd77Q4kaj1" does not exist.

Die E-Mail-Benachrichtigung kam etwa 30 Minuten später an:

Um einen differenzierten Zugriff auf den Datenbankserver zu ermöglichen, bietet Azure RBAC, Dies ist eine Cloud-native Zugriffskontrollfunktion, nur ein weiteres Tool im Arsenal des PostgreSQL Cloud DBA. Das kommt den allgegenwärtigen pg_hba-Zugriffsregeln am nächsten.

PostgreSQL-Sicherung und -Wiederherstellung auf Azure

Unabhängig von den Tarifen werden Backups zwischen 7 und 35 Tagen aufbewahrt. Die Preisstufe beeinflusst auch die Möglichkeit, Daten wiederherzustellen.

Point-in-Time-Recovery ist über das Azure-Portal oder die CLI verfügbar und laut Dokumentation bis zu fünf Minuten granular. Die Portalfunktionalität ist eher eingeschränkt – das Datumsauswahl-Widget zeigt blind die letzten 7 Tage als mögliche Daten zur Auswahl an, obwohl ich den Server heute erstellt habe. Außerdem wird keine Überprüfung der Wiederherstellungszielzeit durchgeführt – ich hatte erwartet, dass die Eingabe eines Werts außerhalb des Wiederherstellungsintervalls einen Fehler auslösen würde, der den Assistenten daran hindert, fortzufahren:

Sobald der Wiederherstellungsvorgang gestartet wird, tritt ein Fehler auf, der angeblich durch das Aus des Bereichswerts, erscheint etwa eine Minute später:

…aber leider war die Fehlermeldung nicht sehr hilfreich:

Schließlich ist der Sicherungsspeicher für Aufbewahrungsfristen von bis zu 7 Tagen kostenlos. Das könnte sich für Entwicklungsumgebungen als äußerst praktisch erweisen.

Hinweise und Tipps

Grenzen

Gewöhnen Sie sich an die Single-Server-Limits.

Konnektivität

Verwenden Sie immer die Verbindungszeichenfolge, damit die Verbindung zum richtigen Datenbankserver geleitet wird.

Replikation

Suchen Sie für Disaster-Recovery-Szenarien Read Replicas in einer der gepaarten Regionen.

Rollen

Genau wie bei AWS und GCloud gibt es keinen Superuser-Zugriff.

GUCs

Parameter, die einen Serverneustart oder Superuser-Zugriff erfordern, können nicht konfiguriert werden.

Skalierung

Während der automatischen Skalierung sollten Anwendungen es erneut versuchen, bis der neue Knoten aufgerufen wird.

Speichergröße und IOPS können nicht angegeben werden – Speicher wird in Einheiten von GB pro virtuellem Kern bis zu einem Maximum von 320 GB (32 vCores x 10 GB) zugewiesen, und IOPS sind von der Größe des bereitgestellten Speichers abhängig maximal 6000 IOPS. Derzeit bietet Azure eine große Speichervorschauoption mit maximal 20.000 IOPS an.

Server, die in der Basic-Stufe erstellt wurden, können nicht auf „Allgemein“ oder „Speicheroptimiert“ aktualisiert werden.

Speicherung

Stellen Sie sicher, dass die automatische Vergrößerungsfunktion aktiviert ist – wenn die Datenmenge den bereitgestellten Speicherplatz überschreitet, wechselt die Datenbank in den schreibgeschützten Modus.

Speicher kann nur hochskaliert werden. Wie bei allen anderen Cloud-Anbietern kann die Speicherzuweisung nicht verringert werden, und ich konnte keine Erklärung finden. Angesichts der hochmodernen Ausrüstung, die sich die großen Cloud-Player leisten können, sollte es keinen Grund geben, keine Funktionen anzubieten, die der LVM-Online-Datenverschiebung ähneln. Speicherplatz ist heutzutage wirklich billig, es gibt wirklich keinen Grund, bis zum nächsten großen Versions-Upgrade über eine Verkleinerung nachzudenken.

Firewall

In einigen Fällen kann es bis zu fünf Minuten dauern, bis Aktualisierungen von Firewall-Regeln verbreitet werden.

Ein Server befindet sich im selben Subnetz wie die Anwendungsserver und ist nicht erreichbar, bis die entsprechenden Firewall-Regeln vorhanden sind.

Virtuelle Netzwerkregeln erlauben keinen regionenübergreifenden Zugriff und daher können dblink und postgres_fdw nicht verwendet werden, um eine Verbindung zu Datenbanken außerhalb der Azure-Cloud herzustellen.

Der VNet/Subnet-Ansatz kann nicht auf Web-Apps angewendet werden, da ihre Verbindungen von öffentlichen IP-Adressen stammen.

Große virtuelle Netzwerke sind nicht verfügbar, während die Dienstendpunkte aktiviert sind.

Verschlüsselung

Für Anwendungen, die eine Validierung des Serverzertifikats erfordern, steht die Datei zum Download bei Digicert zur Verfügung. Microsoft hat es einfach gemacht und Sie sollten sich bis 2025 keine Sorgen um die Verlängerung machen müssen:

~ $ openssl x509 -in BaltimoreCyberTrustRoot.crt.pem -noout -dates

notBefore=May 12 18:46:00 2000 GMT

notAfter=May 12 23:59:00 2025 GMT

Intrusion Detection System

Die Vorschauversion von Advanced Threat Protection ist für die Instanzen der Basisstufe nicht verfügbar.

Sichern und Wiederherstellen

Für Anwendungen, die sich eine regionale Ausfallzeit nicht leisten können, sollten Sie den Server mit georedundantem Sicherungsspeicher konfigurieren. Diese Option kann nur zum Zeitpunkt der Erstellung des Datenbankservers aktiviert werden.

Die Anforderung zur Neukonfiguration der Cloud-Firewall-Regeln nach einem PITR-Vorgang ist besonders wichtig.

Durch das Löschen eines Datenbankservers werden alle Sicherungen entfernt.

Nach der Wiederherstellung müssen bestimmte Aufgaben nach der Wiederherstellung durchgeführt werden.

Nicht protokollierte Tabellen werden für Masseneinfügungen empfohlen, um die Leistung zu steigern, sie werden jedoch nicht repliziert.

Überwachung

Metriken werden jede Minute aufgezeichnet und 30 Tage lang gespeichert.

Protokollierung

Query Store ist eine globale Option, was bedeutet, dass sie für alle Datenbanken gilt. Schreibgeschützte Transaktionen und Abfragen, die länger als 6.000 Byte sind, sind problematisch. Standardmäßig werden die erfassten Abfragen 7 Tage lang aufbewahrt.

Leistung

Die Empfehlungen von Query Performance Insight beschränken sich derzeit auf das Erstellen und Löschen von Indizes.

pg_stat_staements deaktivieren, wenn nicht benötigt.

Ersetzen Sie uuid_generate_v4 durch gen_random_uuid(). Dies steht im Einklang mit der Empfehlung in der offiziellen PostgreSQL-Dokumentation, siehe Building uuid-ossp.

Hohe Verfügbarkeit und Replikation

Es gibt ein Limit von fünf Lesereplikaten. Schreibintensive Anwendungen sollten die Verwendung von Lesereplikaten vermeiden, da der Replikationsmechanismus asynchron ist, was zu einigen Verzögerungen führt, die Anwendungen tolerieren können müssen. Lesereplikate können sich in einer anderen Region befinden.

REPLICA-Unterstützung kann nur aktiviert werden, nachdem der Server erstellt wurde. Die Funktion erfordert einen Serverneustart:

Read Replicas erben die Firewall-Regeln nicht vom Master-Knoten:

Failover auf Read Replica erfolgt nicht automatisch. Der Failover-Mechanismus ist knotenbasiert.

Es gibt eine lange Liste von Überlegungen, die überprüft werden müssen, bevor Lesereplikate konfiguriert werden.

Das Erstellen von Repliken dauert lange, selbst wenn ich mit einem relativ kleinen Datensatz getestet habe:

 Vakuum

Vakuum

Überprüfen Sie die Schlüsselparameter, da Azure Database for PostgreSQL mit Upstream-Vakuum-Standardwerten ausgeliefert wird:

[email protected]:5432 postgres> select name,setting from pg_settings where name ~ '^autovacuum.*';

               name                 | setting

-------------------------------------+-----------

autovacuum                          | on

autovacuum_analyze_scale_factor     | 0.05

autovacuum_analyze_threshold        | 50

autovacuum_freeze_max_age           | 200000000

autovacuum_max_workers              | 3

autovacuum_multixact_freeze_max_age | 400000000

autovacuum_naptime                  | 15

autovacuum_vacuum_cost_delay        | 20

autovacuum_vacuum_cost_limit        | -1

autovacuum_vacuum_scale_factor      | 0.05

autovacuum_vacuum_threshold         | 50

autovacuum_work_mem                 | -1

(12 rows)

Upgrades

Automatische größere Upgrades werden nicht unterstützt. Wie bereits erwähnt, ist dies eine Gelegenheit zur Kosteneinsparung durch Herunterskalieren des automatisch erstellten Speichers.

PostgreSQL Azure-Verbesserungen

Zeitreihen

TimescaleDB ist als Erweiterung verfügbar (nicht Teil der PostgreSQL-Module), jedoch nur wenige Klicks entfernt. Der einzige Nachteil ist die ältere Version 1.1.1, während die Upstream-Version derzeit  1.4.1 (1.8.2019) ist.

[email protected]:5432 postgres> CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;

WARNING:

WELCOME TO

_____ _                               _ ____________

|_   _(_)                             | | | _ \ ___ \

| |  _ _ __ ___   ___ ___ ___ __ _| | ___| | | | |_/ /

| | | |  _ ` _ \ / _ \/ __|/ __/ _` | |/ _ \ | | | ___ \

| | | | | | | | |  __/\__ \ (_| (_| | |  __/ |/ /| |_/ /

|_| |_|_| |_| |_|\___||___/\___\__,_|_|\___|___/ \____/

               Running version 1.1.1

For more information on TimescaleDB, please visit the following links:



1. Getting started: https://docs.timescale.com/getting-started

2. API reference documentation: https://docs.timescale.com/api

3. How TimescaleDB is designed: https://docs.timescale.com/introduction/architecture




CREATE EXTENSION



[email protected]:5432 postgres> \dx timescaledb

                                    List of installed extensions

   Name     | Version | Schema |                            Description

-------------+---------+--------+-------------------------------------------------------------------

timescaledb | 1.1.1   | public | Enables scalable inserts and complex queries for time-series data

(1 row)

Protokollierung

Zusätzlich zu den PostgreSQL-Protokollierungsoptionen kann Azure Database for PostgreSQL so konfiguriert werden, dass zusätzliche Diagnoseereignisse aufgezeichnet werden.

Firewall

Azure Portal enthält eine praktische Funktion zum Zulassen von Verbindungen von den beim Portal angemeldeten IP-Adressen:

Ich habe die Funktion zur Kenntnis genommen, da sie es Entwicklern und Systemadministratoren erleichtert sich erlauben, und es sticht als eine Funktion hervor, die weder von AWS noch von GCloud angeboten wird.

Fazit

Azure Database for PostgreSQL Single Server bietet Dienste auf Unternehmensebene, viele dieser Dienste befinden sich jedoch noch im Vorschaumodus:Abfragespeicher, Leistungseinblick, Leistungsempfehlung, Erweiterter Bedrohungsschutz, Großer Speicher, Regionsübergreifend Repliken lesen.

Während für die Verwaltung von PostgreSQL in der Azure-Cloud keine Betriebssystemkenntnisse mehr erforderlich sind, wird vom DBA erwartet, dass er sich Fähigkeiten aneignet, die nicht auf die Datenbank selbst beschränkt sind – Azure-Netzwerke (VNet), Verbindungssicherheit (Firewall ), Log Viewer und Analytics zusammen mit KQL, Azure CLI für praktisches Scripting und die Liste geht weiter.

Zu guter Letzt gibt es für diejenigen, die planen, ihre PostgreSQL-Workloads zu Azure zu migrieren, eine Reihe von Ressourcen zusammen mit einer ausgewählten Liste von Azure-Partnern, einschließlich Credativ, einem der Hauptsponsoren und Mitwirkenden von PostgreSQL.

P>