Als je Microsoft de laatste tijd hebt gevolgd, zal het geen verrassing zijn dat de aanbieder van een concurrerend databaseproduct, namelijk SQL Server, ook op de PostgreSQL-trein is gesprongen. Van het vrijgeven van 60.000 patenten aan OIN tot het zijn van Platinum-sponsor bij PGCon, Microsoft als een van de PostgreSQL-ondersteunende organisaties. Grijpte elke gelegenheid aan om te laten zien dat je niet alleen PostgreSQL op Microsoft kunt draaien, maar dat ook het omgekeerde waar is:Microsoft kan, via zijn cloudaanbod, PostgreSQL voor je draaien. De uitspraak werd nog duidelijker met de overname van Citus Data en de release van hun vlaggenschipproduct in de Azure Cloud onder de naam Hyperscale. Het is veilig om te zeggen dat de acceptatie van PostgreSQL groeit en dat er nu nog meer goede redenen zijn om ervoor te kiezen.
Mijn reis door de Azure-cloud begon precies op de landingspagina waar ik de kanshebbers ontmoette:Single Server en een preview (met andere woorden geen SLA meegeleverd) release van Hyperscale (Citus). Deze blog gaat over het eerste. Tijdens deze reis kreeg ik de kans om te oefenen wat open source inhoudt - teruggeven aan de gemeenschap - in dit geval, door feedback te geven aan de documentatie die, tot eer van Microsoft, ze dit heel gemakkelijk maken door de feedback recht door te spitten naar Github:
PostgreSQL-compatibiliteit met Azure
Versiebeheer
Volgens de productdocumentatie richt Single Server zich op PostgreSQL-versies in het n-2 hoofdbereik:
Als een prestatiegerichte oplossing wordt Single Server aanbevolen voor datasets van 100 GB en groter. De servers leverden voorspelbare prestaties - de database-instances worden geleverd met een vooraf gedefinieerd aantal vCores en IOPS (op basis van de grootte van de ingerichte opslag).
Extensies
Er is een behoorlijk aantal ondersteunde extensies, waarvan sommige kant-en-klaar worden geïnstalleerd:
[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-bewaking op Azure
Serverbewaking is gebaseerd op een reeks meetwaarden die netjes kunnen worden gegroepeerd om een aangepast dashboard te maken:
Degenen die bekend zijn met Graphviz of Blockdiag zullen waarschijnlijk de mogelijkheid waarderen om de hele dashboard naar een JSON-bestand:
Verdere statistieken kunnen - en moeten - worden gekoppeld aan waarschuwingen:
Querystatistieken kunnen worden gevolgd door middel van Query Store en worden gevisualiseerd met Query Performance In zicht. Daarvoor moeten een aantal Azure-specifieke parameters worden ingeschakeld:
[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
Om de trage zoekopdrachten en wachttijden te visualiseren, gaan we verder met de widget Query Performance:
Langlopende zoekopdrachten
Wachtstatistieken
PostgreSQL-logboekregistratie op Azure
De standaard PostgreSQL-logboeken kunnen worden gedownload of geëxporteerd naar Log Analytics voor geavanceerdere parsering:
PostgreSQL-prestaties en schalen met Azure
Hoewel het aantal vCores gemakkelijk kan worden verhoogd of verlaagd, zal deze actie een herstart van de server veroorzaken:
Om nul downtime te bereiken, moeten applicaties tijdelijke fouten gracieus kunnen afhandelen .
Voor afstemmingsquery's biedt Azure de DBA prestatieaanbevelingen, naast de vooraf geladen pg_statements en pg_buffercache-extensies:
Hoge beschikbaarheid en replicatie op Azure
Hoge beschikbaarheid van databaseservers wordt bereikt door middel van hardwarereplicatie op basis van nodes. Dit zorgt ervoor dat bij hardwarestoringen binnen tientallen seconden een nieuwe node kan worden opgeroepen.
Azure biedt een redundante gateway als netwerkverbindingseindpunt voor alle databaseservers binnen een regio.
PostgreSQL-beveiliging op Azure
Standaard weigeren firewallregels de toegang tot de PostgreSQL-instantie. Aangezien een Azure-databaseserver het equivalent is van een databasecluster, zijn de toegangsregels van toepassing op alle databases die op de server worden gehost.
Naast IP-adressen kunnen firewallregels verwijzen naar een virtueel netwerk, een functie die alleen beschikbaar is voor de lagen voor algemeen gebruik en geoptimaliseerd voor geheugen.
Eén ding vond ik merkwaardig in de webinterface van de firewall:ik kon niet navigeren weg van de pagina terwijl wijzigingen werden opgeslagen:
Gegevens in rust worden versleuteld met een door de server beheerde sleutel en cloudgebruikers kunnen dit niet de codering uitschakelen. Gegevens die onderweg zijn, worden ook gecodeerd. De vereiste SSL kan alleen worden gewijzigd nadat de databaseserver is gemaakt. Net als de gegevens in rust, worden back-ups gecodeerd en kan codering niet worden uitgeschakeld.
Advanced Threat Protection biedt waarschuwingen en aanbevelingen voor een aantal verzoeken om toegang tot de database die als een beveiligingsrisico worden beschouwd. De functie is momenteel in preview. Om te demonstreren heb ik een brute force-aanval met een wachtwoord gesimuleerd:
~ $ 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"
....
Controleer de PostgreSQL-logboeken:
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.
De e-mailwaarschuwing arriveerde ongeveer 30 minuten later:
Om fijnmazige toegang tot de databaseserver mogelijk te maken, biedt Azure RBAC, wat een cloudeigen toegangscontrolefunctie is, slechts een extra tool in het arsenaal van de PostgreSQL Cloud DBA. Dit komt zo dicht mogelijk bij de alomtegenwoordige pg_hba-toegangsregels.
PostgreSQL back-up en herstel op Azure
Ongeacht de prijsniveaus, back-ups worden tussen de 7 en 35 dagen bewaard. Het prijsniveau is ook van invloed op de mogelijkheid om gegevens te herstellen.
Point-in-time recovery is beschikbaar via de Azure Portal of de CLI en volgens de documentatie zo gedetailleerd als maximaal vijf minuten. De functionaliteit van de portal is nogal beperkt - de datumkiezer-widget toont blindelings de laatste 7 dagen als mogelijke datums om te selecteren, hoewel ik de server vandaag heb gemaakt. Er is ook geen verificatie uitgevoerd op de hersteldoeltijd — ik verwachtte dat het invoeren van een waarde buiten het herstelinterval een fout zou veroorzaken waardoor de wizard niet verder kon gaan:
Zodra het herstelproces is gestart, verschijnt er een fout, vermoedelijk veroorzaakt door de van bereikwaarde, verschijnt ongeveer een minuut later:
...maar helaas was de foutmelding niet erg behulpzaam:
Ten slotte is back-upopslag gratis voor een bewaarperiode van maximaal 7 dagen. Dat zou erg handig kunnen zijn voor ontwikkelomgevingen.
Hints en tips
Grenzen
Word vertrouwd met de limieten voor één server.
Connectiviteit
Gebruik altijd de verbindingsreeks om de verbinding naar de juiste databaseserver te routeren.
Replicatie
Voor scenario's voor noodherstel zoekt u naar leesreplica's in een van de gekoppelde regio's.
Rollen
Net als bij AWS en GCloud is er geen superuser-toegang.
GUC's
Parameters die een herstart van de server of superuser-toegang vereisen, kunnen niet worden geconfigureerd.
Schaal
Tijdens automatisch schalen moeten toepassingen het opnieuw proberen totdat het nieuwe knooppunt wordt weergegeven.
Geheugenhoeveelheid en IOPS kunnen niet worden opgegeven — geheugen wordt toegewezen in eenheden van GB per vCore, tot een maximum van 320 GB (32vCores x 10 GB), en IOPS is afhankelijk van de grootte van de ingerichte opslag maximaal 6000 IOPS. Op dit moment biedt Azure een grote opslagpreview-optie met een maximum van 20.000 IOPS.
Servers die in de Basic-laag zijn gemaakt, kunnen niet worden geüpgraded naar General Purpose of Memory Optimized.
Opslag
Zorg ervoor dat de functie voor automatisch groeien is ingeschakeld — als de hoeveelheid gegevens de beschikbare opslagruimte overschrijdt, gaat de database in de alleen-lezen modus.
Opslag kan alleen worden opgeschaald. Net als bij alle andere cloudproviders kan de opslagtoewijzing niet worden verlaagd en kon ik geen verklaring vinden. Gezien de ultramoderne apparatuur die de grote cloudspelers zich kunnen veroorloven, zou er geen reden moeten zijn om geen functies te bieden die vergelijkbaar zijn met LVM online gegevensverplaatsing. Opslag is tegenwoordig erg goedkoop, er is echt geen reden om na te denken over het verkleinen tot de volgende grote versie-upgrade.
Firewall
In sommige gevallen kan het tot vijf minuten duren voordat updates van firewallregels zijn doorgevoerd.
Een server bevindt zich in hetzelfde subnet als de applicatieservers en is pas bereikbaar als de juiste firewallregels aanwezig zijn.
Virtuele netwerkregels staan geen toegang tussen regio's toe en als gevolg daarvan kunnen dblink en postgres_fdw niet worden gebruikt om verbinding te maken met databases buiten de Azure-cloud.
De VNet/Subnet-benadering kan niet worden toegepast op webapps omdat hun verbindingen afkomstig zijn van openbare IP-adressen.
Grote virtuele netwerken zijn niet beschikbaar zolang de service-eindpunten zijn ingeschakeld.
Encryptie
Voor toepassingen die validatie van servercertificaten vereisen, kan het bestand worden gedownload van Digicert. Microsoft heeft het gemakkelijk gemaakt en u hoeft zich pas in 2025 zorgen te maken over verlenging:
~ $ openssl x509 -in BaltimoreCyberTrustRoot.crt.pem -noout -dates
notBefore=May 12 18:46:00 2000 GMT
notAfter=May 12 23:59:00 2025 GMT
Inbraakdetectiesysteem
De preview-versie van Advanced Threat Protection is niet beschikbaar voor de Basic-tierinstanties.
Back-up maken en terugzetten
Voor toepassingen die zich geen regio-downtime kunnen veroorloven, kunt u overwegen de server te configureren met geo-redundante back-upopslag. Deze optie kan alleen worden ingeschakeld op het moment dat de databaseserver wordt gemaakt.
De vereiste voor het opnieuw configureren van de cloud-firewallregels na een PITR-bewerking is bijzonder belangrijk.
Als u een databaseserver verwijdert, worden alle back-ups verwijderd.
Na het herstel zijn er bepaalde taken na het herstellen die moeten worden uitgevoerd.
Niet-gelogde tabellen worden aanbevolen voor bulkinvoegingen om de prestaties te verbeteren, maar ze worden niet gerepliceerd.
Bewaking
Metrieken worden elke minuut geregistreerd en 30 dagen bewaard.
Logboekregistratie
Query Store is een globale optie, wat betekent dat het van toepassing is op alle databases. Alleen-lezen transacties en query's langer dan 6.000 bytes zijn problematisch. Standaard worden de vastgelegde zoekopdrachten 7 dagen bewaard.
Prestaties
Query Performance Insight-aanbevelingen zijn momenteel beperkt tot het maken en neerzetten van een index.
Pg_stat_staements uitschakelen wanneer niet nodig.
Vervang uuid_generate_v4 door gen_random_uuid(). Dit is in lijn met de aanbeveling in de officiële PostgreSQL-documentatie, zie Building uuid-ossp.
Hoge beschikbaarheid en replicatie
Er is een limiet van vijf leesreplica's. Schrijfintensieve toepassingen moeten het gebruik van leesreplica's vermijden, aangezien het replicatiemechanisme asynchroon is, wat vertragingen met zich meebrengt die toepassingen moeten kunnen tolereren. Leesreplica's kunnen zich in een andere regio bevinden.
REPLICA-ondersteuning kan alleen worden ingeschakeld nadat de server is gemaakt. De functie vereist een herstart van de server:
Leesreplica's nemen de firewallregels van het hoofdknooppunt niet over:
Failover om replica te lezen is niet automatisch. Het failover-mechanisme is gebaseerd op nodes.
Er is een lange lijst met overwegingen die moeten worden bekeken voordat leesreplica's worden geconfigureerd.
Het maken van replica's duurt lang, zelfs als ik heb getest met een relatief kleine dataset:
VacuümVacuüm
Bekijk de belangrijkste parameters, aangezien Azure Database for PostgreSQL wordt geleverd met standaardwaarden voor upstream vacuüm:
[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 grote upgrades worden niet ondersteund. Zoals eerder vermeld, is dit een mogelijkheid om kosten te besparen door de automatisch gegroeide opslag te verkleinen.
PostgreSQL Azure-verbeteringen
Tijdreeksen
TimescaleDB is beschikbaar als een extensie (geen onderdeel van de PostgreSQL-modules), maar het is slechts een paar klikken verwijderd. Het enige nadeel is de oudere versie 1.1.1, terwijl de upstream-versie momenteel op 1.4.1 (2019-08-01) staat.
[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)
Logboekregistratie
Naast PostgreSQL-registratieopties, kan Azure Database for PostgreSQL worden geconfigureerd om aanvullende diagnostische gebeurtenissen vast te leggen.
Firewall
Azure Portal bevat een handige functie om verbindingen toe te staan vanaf de IP-adressen die zijn ingelogd op de portal:
Ik merkte op dat deze functie het gemakkelijk maakt voor ontwikkelaars en systeembeheerders om zichzelf binnenlaten, en het valt op als een functie die noch door AWS, noch door GCloud wordt aangeboden.
Conclusie
Azure Database for PostgreSQL Single Server biedt services op ondernemingsniveau, maar veel van deze services bevinden zich nog in de voorbeeldmodus:Query Store, Performance Insight, Performance Recommendation, Advanced Threat Protection, Large Storage, Cross-region Lees Replica's.
Hoewel kennis van het besturingssysteem niet langer vereist is voor het beheer van PostgreSQL in de Azure-cloud, wordt verwacht dat de DBA vaardigheden verwerft die niet beperkt zijn tot de database zelf:Azure-netwerken (VNet), verbindingsbeveiliging (firewall ), logviewer en analyse samen met KQL, Azure CLI voor handige scripting, en de lijst gaat maar door.
Ten slotte, voor degenen die van plan zijn hun PostgreSQL-workloads naar Azure te migreren, zijn er een aantal bronnen beschikbaar, samen met een selecte lijst van Azure-partners, waaronder Credativ, een van de belangrijkste sponsors en bijdragers van PostgreSQL.