sql >> Databasteknik >  >> RDS >> PostgreSQL

Cloud Vendor Deep-Dive:PostgreSQL på Microsoft Azure

Om du har följt Microsoft på sistone kommer det inte som någon överraskning att leverantören av en konkurrerande databasprodukt, nämligen SQL Server, också hoppade på PostgreSQL-tåget. Från att släppa 60 000 patent till OIN till att vara Platinum-sponsor på PGCon, Microsoft som en av PostgreSQL-företagens stödorganisationer. Tog alla tillfällen i akt för att visa att du inte bara kan köra PostgreSQL på Microsoft, utan också det omvända:Microsoft kan, genom sitt molnerbjudande, köra PostgreSQL åt dig. Uttalandet blev ännu tydligare med förvärvet av Citus Data och lanseringen av deras flaggskeppsprodukt i Azure Cloud under namnet Hyperscale. Det är säkert att säga att PostgreSQL-användningen växer och nu finns det ännu fler goda skäl att välja det.

Min resa genom Azure-molnet började precis vid landningssidan där jag möter utmanarna:Single Server och en förhandsvisning (med andra ord ingen SLA tillhandahållen) utgåva av Hyperscale (Citus). Den här bloggen kommer att fokusera på det förstnämnda. Medan jag var på den här resan hade jag möjlighet att öva på vad öppen källkod handlar om – att ge tillbaka till samhället – i det här fallet, genom att ge feedback till dokumentationen att de, till Microsofts förtjänst, gör detta mycket enkelt genom att skicka feedbacken rakt. till Github:

PostgreSQL-kompatibilitet med Azure

Version

Enligt produktdokumentation riktar singelserver sig mot PostgreSQL-versioner i n-2 huvudsortimentet:

Som en lösning byggd för prestanda rekommenderas Single Server för datamängder 100 GB och större. Servrarna gav förutsägbar prestanda — databasinstanserna kommer med ett fördefinierat antal vCores och IOPS (baserat på storleken på den tillhandahållna lagringen).

Tillägg

Det finns ett ganska stort antal tillägg som stöds och några av dem installeras direkt:

[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-övervakning på Azure

Serverövervakning är beroende av en uppsättning mätvärden som prydligt kan grupperas för att skapa en anpassad instrumentpanel:

De som är bekanta med Graphviz eller Blockdiag kommer sannolikt att uppskatta alternativet att exportera hela instrumentpanelen till en JSON-fil:

Ytterligare mätvärden kan — och de bör — länkas till varningar:

Frågestatistik kan spåras med hjälp av Query Store och visualiseras med Query Performance Insikt. För det måste ett par Azure-specifika parametrar aktiveras:

[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

För att visualisera de långsamma frågorna och väntan fortsätter vi till Query Performance-widgeten:

Långa sökningar​​​

Väntestatistik

PostgreSQL-loggning på Azure

StandardpostgreSQL-loggarna kan laddas ned eller exporteras till Log Analytics för mer avancerad analys:

PostgreSQL-prestanda och skalning med Azure

Medan antalet vCores enkelt kan ökas eller minskas, kommer denna åtgärd att utlösa en omstart av servern:

För att uppnå noll driftstopp måste applikationer kunna hantera övergående fel på ett elegant sätt .

För justering av frågor förser Azure DBA med prestandarekommendationer, förutom de förinlästa pg_statements och pg_buffercache-tilläggen:

Hög tillgänglighet och replikering på Azure

Databasserverns hög tillgänglighet uppnås med hjälp av en nodbaserad hårdvarureplikering. Detta säkerställer att i händelse av hårdvarufel kan en ny nod tas fram inom tiotals sekunder.

Azure tillhandahåller en redundant gateway som en nätverksanslutningsslutpunkt för alla databasservrar inom en region.

PostgreSQL-säkerhet på Azure

Som standard nekar brandväggsregler åtkomst till PostgreSQL-instansen. Eftersom en Azure-databasserver är motsvarigheten till ett databaskluster kommer åtkomstreglerna att gälla för alla databaser som finns på servern.

Förutom IP-adresser kan brandväggsregler referera till virtuella nätverk, en funktion som endast är tillgänglig för nivåer för allmänna ändamål och minnesoptimerade.

En sak jag tyckte var märklig i brandväggens webbgränssnitt — jag kunde inte navigera borta från sidan medan ändringarna sparades:

Data i vila krypteras med en serverhanterad nyckel och molnanvändare kan inte inaktivera krypteringen. Data under överföring är också krypterad - SSL krävs kan endast ändras efter att databasservern har skapats. Precis som data i vila, är säkerhetskopior krypterade och kryptering kan inte inaktiveras.

Avancerat hotskydd ger varningar och rekommendationer om ett antal förfrågningar om databasåtkomst som anses vara en säkerhetsrisk. Funktionen är för närvarande i förhandsvisning. För att demonstrera simulerade jag en brute force-attack med lösenord:

~ $ 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"

....

Kontrollera PostgreSQL-loggarna:

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.

E-postvarningen kom cirka 30 minuter senare:

För att tillåta finkornig åtkomst till databasservern tillhandahåller Azure RBAC, som är en molnbaserad åtkomstkontrollfunktion, bara ett verktyg till i arsenalen av PostgreSQL Cloud DBA. Det här är så nära vi kan komma de allestädes närvarande pg_hba åtkomstreglerna.

PostgreSQL säkerhetskopiering och återställning på Azure

Oavsett prisnivåer sparas säkerhetskopior mellan 7 och 35 dagar. Prisnivån påverkar också möjligheten att återställa data.

Återställning vid tidpunkt är tillgänglig via Azure Portal eller CLI och enligt dokumentationen så detaljerad som upp till fem minuter. Portalfunktionaliteten är ganska begränsad - datumväljarwidgeten visar blint de senaste 7 dagarna som möjliga datum att välja, även om jag skapade servern idag. Dessutom utförs ingen verifiering av återställningsmåltiden – jag förväntade mig att inmatning av ett värde utanför återställningsintervallet skulle utlösa ett fel som hindrar guiden från att fortsätta:

När återställningsprocessen har startat uppstår ett fel, förmodligen orsakat av out av intervallvärde, dyker upp ungefär en minut senare:

...men tyvärr var felmeddelandet inte särskilt användbart:

Sistligen är säkerhetskopieringslagring gratis för lagringsperioder på upp till 7 dagar. Det kan visa sig vara extremt praktiskt för utvecklingsmiljöer.

Tips och tips

Begränsningar

Vänja dig med gränserna för singelserver.

Anslutning

Använd alltid anslutningssträngen för att anslutningen ska dirigeras till rätt databasserver.

replikering

För scenarier för katastrofåterställning, leta reda på läsrepliker i en av de parade regionerna.

Roller

Precis som fallet är med AWS och GCloud finns det ingen superanvändaråtkomst.

GUC

Parametrar som kräver omstart av servern eller superanvändaråtkomst kan inte konfigureras.

Skalning

Under automatisk skalning bör applikationer försöka igen tills den nya noden visas.

Minnesmängd och IOPS kan inte specificeras — minnet tilldelas i enheter om GB per vCore, upp till maximalt 320 GB (32vCores x 10 GB), och IOPS är beroende av storleken på den tillhandahållna lagringen till maximalt 6000 IOPS. För närvarande erbjuder Azure ett stort alternativ för förhandsvisning av lagring med maximalt 20 000 IOPS.

Server skapade i Basic-nivån kan inte uppgraderas till General Purpose eller Memory Optimized.

Lagring

Se till att funktionen för automatisk tillväxt är aktiverad – om mängden data överstiger det tillhandahållna lagringsutrymmet kommer databasen att gå över i skrivskyddat läge.

Lagring kan bara skalas upp. Precis som med alla andra molnleverantörer kan lagringsallokeringen inte minskas och jag kunde inte hitta någon förklaring. Med tanke på den senaste utrustningen bör de stora molnaktörerna ha råd att det inte finns någon anledning att inte tillhandahålla funktioner som liknar LVM online-dataflyttning. Lagring är riktigt billigt nuförtiden, det finns egentligen ingen anledning att tänka på att skala ner tills nästa större versionsuppgradering.

Brandvägg

I vissa fall kan det ta upp till fem minuter innan uppdateringar av brandväggsregler sprids.

En server finns i samma undernät som applikationsservrarna inte kommer att kunna nås förrän lämpliga brandväggsregler är på plats.

Virtuella nätverksregler tillåter inte åtkomst över regioner och som ett resultat kan dblink och postgres_fdw inte användas för att ansluta till databaser utanför Azure-molnet.

VNet/Subnet-metoden kan inte tillämpas på webbappar eftersom deras anslutningar kommer från offentliga IP-adresser.

Stora virtuella nätverk kommer att vara otillgängliga medan tjänstens slutpunkter är aktiverade.

Kryptering

För applikationer som kräver servercertifikatvalidering är filen tillgänglig för nedladdning från Digicert. Microsoft gjorde det enkelt och du borde inte behöva oroa dig för förnyelse förrän 2025:

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

notBefore=May 12 18:46:00 2000 GMT

notAfter=May 12 23:59:00 2025 GMT

Intrångsdetekteringssystem

Förhandsversionen av Advanced Threat Protection är inte tillgänglig för Basic tier-instanserna.

Säkerhetskopiera och återställa

För applikationer som inte har råd med en regionavbrottstid, överväg att konfigurera servern med geo-redundant backuplagring. Det här alternativet kan endast aktiveras när databasservern skapas.

Kravet på att konfigurera om molnbrandväggsreglerna efter en PITR-operation är särskilt viktigt.

Om du tar bort en databasserver tas alla säkerhetskopior bort.

Efter återställningen finns det vissa uppgifter efter återställning som måste utföras.

Ologgade tabeller rekommenderas för bulkinfogningar för att öka prestandan, men de replikeras inte.

Övervakning

Mätvärden spelas in varje minut och lagras i 30 dagar.

Loggning

Query Store är ett globalt alternativ, vilket innebär att det gäller alla databaser. Skrivskyddade transaktioner och frågor som är längre än 6 000 byte är problematiska. Som standard sparas de infångade frågorna i 7 dagar.

Prestanda

Rekommendationer för Query Performance Insight är för närvarande begränsade till att skapa och släppa index.

Inaktivera pg_stat_staements när det inte behövs.

Ersätt uuid_generate_v4 med gen_random_uuid(). Detta är i linje med rekommendationen i den officiella PostgreSQL-dokumentationen, se Building uuid-ossp.

Hög tillgänglighet och replikering

Det finns en gräns på fem läsrepliker. Skrivintensiva applikationer bör undvika att använda läsrepliker eftersom replikeringsmekanismen är asynkron vilket introducerar vissa förseningar som applikationer måste kunna tolerera. Läskopior kan finnas i en annan region.

REPLICA-stöd kan endast aktiveras efter att servern skapats. Funktionen kräver omstart av servern:

Läsrepliker ärver inte brandväggsreglerna från huvudnoden:

Filover för att läsa replika är inte automatisk. Överstyrningsmekanismen är nodbaserad.

Det finns en lång lista med överväganden som måste granskas innan du konfigurerar läsrepliker.

Att skapa repliker tar lång tid, även när jag testade med relativt liten datamängd:

 Vakuum

Vakuum

Granska nyckelparametrarna, eftersom Azure Database for PostgreSQL levereras med uppströms vakuumstandardvärden:

[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)

Uppgraderingar

Automatiska större uppgraderingar stöds inte. Som nämnts tidigare är detta en kostnadsbesparingsmöjlighet genom att skala ner det automatiskt odlade lagringsutrymmet.

PostgreSQL Azure-förbättringar

Tidsserier

TimescaleDB är tillgänglig som tillägg (inte en del av PostgreSQL-modulerna), men det är bara några klick bort. Den enda nackdelen är den äldre versionen 1.1.1, medan uppströmsversionen för närvarande är 1.4.1 (2019-08-01).

[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)

Loggning

Förutom PostgreSQL-loggningsalternativ kan Azure Database for PostgreSQL konfigureras för att registrera ytterligare diagnostikhändelser.

Brandvägg

Azure Portal innehåller en praktisk funktion för att tillåta anslutningar från de IP-adresser som är inloggade på portalen:

Jag noterade funktionen eftersom den gör det enkelt för utvecklare och systemadministratörer att släpper in sig själva, och det sticker ut som en funktion som inte erbjuds av varken AWS eller GCloud.

Slutsats

Azure Database for PostgreSQL Single Server erbjuder tjänster på företagsnivå, men många av dessa tjänster är fortfarande i förhandsgranskningsläge:Query Store, Performance Insight, Performance Recommendation, Advanced Threat Protection, Large Storage, Cross-region Läs Replicas.

Medan kunskap om operativsystemet inte längre krävs för att administrera PostgreSQL i Azure-molnet, förväntas DBA:n förvärva färdigheter som inte är begränsade till själva databasen — Azure-nätverk (VNet), anslutningssäkerhet (brandvägg) ), loggvisare och analyser tillsammans med KQL, Azure CLI för praktiskt skript, och listan fortsätter.

Sistligen, för dem som planerar att migrera sina PostgreSQL-arbetsbelastningar till Azure, finns det ett antal resurser tillgängliga tillsammans med en utvald lista med Azure-partners inklusive Credativ, en av PostgreSQL:s stora sponsorer och bidragsgivare.


  1. Hur kan jag extrahera filer från ett Oracle BLOB-fält?

  2. Oracle:Konvertera valutabelopp i ord med PL/SQL

  3. Databassäkerhet 101:Säkerhet i databaser med öppen källkod

  4. Hur man tar bort dubbletter av rader utan unik identifierare