PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Approfondimento del fornitore di cloud:PostgreSQL su Microsoft Azure

Se hai seguito Microsoft ultimamente, non sorprende che anche il provider di un prodotto di database concorrente, ovvero SQL Server, sia salito sul carro di PostgreSQL. Dal rilascio di 60.000 brevetti a OIN all'essere Platinum sponsor a PGCon, Microsoft come una delle organizzazioni di supporto aziendale di PostgreSQL. Ha colto ogni opportunità per dimostrare che non solo puoi eseguire PostgreSQL su Microsoft, ma è anche vero il contrario:Microsoft, attraverso la sua offerta cloud, può eseguire PostgreSQL per te. La dichiarazione è diventata ancora più chiara con l'acquisizione di Citus Data e il rilascio del loro prodotto di punta in Azure Cloud sotto il nome di Hyperscale. È sicuro affermare che l'adozione di PostgreSQL è in crescita e ora ci sono ancora più buoni motivi per sceglierlo.

Il mio viaggio attraverso il cloud di Azure è iniziato proprio dalla pagina di destinazione in cui incontro i contendenti:Single Server e un'anteprima (in altre parole nessun SLA fornito) di Hyperscale (Citus). Questo blog si concentrerà sul primo. Durante questo viaggio, ho avuto l'opportunità di mettere in pratica ciò che è l'open source — restituire alla comunità — in questo caso, fornendo feedback alla documentazione che, a merito di Microsoft, lo rendono molto semplice collegando direttamente il feedback in Github:

Compatibilità PostgreSQL con Azure

Versionamento

Secondo la documentazione del prodotto Single Server punta alle versioni di PostgreSQL nella gamma principale n-2:

Come soluzione creata per le prestazioni, si consiglia un server singolo per set di dati da 100 GB e più grande. I server hanno fornito prestazioni prevedibili:le istanze del database sono dotate di un numero predefinito di vCore e IOPS (in base alle dimensioni dello storage di cui è stato eseguito il provisioning).

Estensioni

C'è un discreto numero di estensioni supportate con alcune di esse installate immediatamente:

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

Monitoraggio PostgreSQL in Azure

Il monitoraggio del server si basa su una serie di metriche che possono essere raggruppate in modo ordinato per creare una dashboard personalizzata:

Chi ha familiarità con Graphviz o Blockdiag apprezzerà probabilmente l'opzione di esportare il l'intera dashboard in un file JSON:

Ulteriori metriche possono, e dovrebbero, essere collegate agli avvisi:

Le statistiche delle query possono essere tracciate tramite Query Store e visualizzate con Query Performance Intuizione. Per questo, sarà necessario abilitare un paio di parametri specifici di Azure:

[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

Per visualizzare le query lente e le attese procediamo al widget Query Performance:

Query di lunga durata​​​​

Statistiche di attesa

Accesso PostgreSQL in Azure

I log PostgreSQL standard possono essere scaricati o esportati in Log Analytics per un'analisi più avanzata:

Prestazioni PostgreSQL e ridimensionamento con Azure

Mentre il numero di vCore può essere facilmente aumentato o diminuito, questa azione attiverà un riavvio del server:

Per ottenere zero tempi di inattività, le applicazioni devono essere in grado di gestire correttamente gli errori transitori .

Per le query di ottimizzazione, Azure fornisce al DBA consigli sulle prestazioni, oltre alle estensioni pg_statements e pg_buffercache precaricate:

Alta disponibilità e replica in Azure

L'elevata disponibilità del server di database si ottiene mediante una replica hardware basata su nodi. Ciò garantisce che in caso di guasto dell'hardware, un nuovo nodo possa essere attivato entro decine di secondi.

Azure fornisce un gateway ridondante come endpoint di connessione di rete per tutti i server di database all'interno di un'area.

Sicurezza PostgreSQL in Azure

Per impostazione predefinita, le regole del firewall negano l'accesso all'istanza PostgreSQL. Poiché un server di database di Azure è l'equivalente di un cluster di database, le regole di accesso verranno applicate a tutti i database ospitati sul server.

Oltre agli indirizzi IP, le regole del firewall possono fare riferimento alla rete virtuale, una funzionalità disponibile solo per i livelli per uso generico e con ottimizzazione per la memoria.

Una cosa che ho trovato peculiare nell'interfaccia web del firewall:non riuscivo a navigare lontano dalla pagina durante il salvataggio delle modifiche:

I dati inattivi vengono crittografati utilizzando una chiave gestita dal server e gli utenti cloud non possono disabilitare la crittografia. Anche i dati in transito sono crittografati:l'SSL richiesto può essere modificato solo dopo la creazione del server di database. Proprio come i dati inattivi, i backup sono crittografati e la crittografia non può essere disabilitata.

La protezione avanzata dalle minacce fornisce avvisi e consigli su una serie di richieste di accesso al database considerate un rischio per la sicurezza. La funzione è attualmente in anteprima. Per dimostrare, ho simulato un attacco di forza bruta con password:

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

....

Controlla i log di PostgreSQL:

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.

L'e-mail di avviso è arrivata circa 30 minuti dopo:

Per consentire l'accesso granulare al server di database, Azure fornisce RBAC, che è una funzionalità di controllo degli accessi nativa del cloud, solo un altro strumento nell'arsenale del DBA PostgreSQL Cloud. Questo è il più vicino possibile alle onnipresenti regole di accesso di pg_hba.

Backup e ripristino PostgreSQL in Azure

Indipendentemente dai livelli tariffari, i backup vengono conservati per un periodo compreso tra 7 e 35 giorni. Il piano tariffario influenza anche la possibilità di ripristinare i dati.

Il ripristino point-in-time è disponibile tramite il portale di Azure o l'interfaccia della riga di comando e in base alla documentazione in modo granulare fino a cinque minuti. La funzionalità del portale è piuttosto limitata:il widget di selezione della data mostra ciecamente gli ultimi 7 giorni come possibili date da selezionare, anche se ho creato il server oggi. Inoltre, non viene eseguita alcuna verifica sul tempo target di ripristino:mi aspettavo che l'immissione di un valore al di fuori dell'intervallo di ripristino avrebbe attivato un errore che impediva alla procedura guidata di continuare:

Una volta avviato il processo di ripristino, si verifica un errore, presumibilmente causato dall'uscita del valore dell'intervallo, apparirà circa un minuto dopo:

... ma, sfortunatamente, il messaggio di errore non è stato molto utile:

Infine, lo spazio di archiviazione di backup è gratuito per periodi di conservazione fino a 7 giorni. Ciò potrebbe rivelarsi estremamente utile per gli ambienti di sviluppo.

Suggerimenti e suggerimenti

Limiti

Abituati ai limiti del server singolo.

Connettività

Utilizzare sempre la stringa di connessione per instradare la connessione al server database corretto.

Replica

Per gli scenari di ripristino di emergenza, individuare le repliche di lettura in una delle regioni associate.

Ruoli

Proprio come nel caso di AWS e GCloud, non c'è accesso come superutente.

GUC

I parametri che richiedono il riavvio del server o l'accesso come superutente non possono essere configurati.

Ridimensionamento

Durante il ridimensionamento automatico, le applicazioni dovrebbero riprovare fino a quando non viene attivato il nuovo nodo.

Impossibile specificare la quantità di memoria e gli IOPS:la memoria viene allocata in unità di GB per vCore, fino a un massimo di 320 GB (32vCore x 10 GB) e gli IOPS dipendono dalle dimensioni dello storage fornito un massimo di 6000 IOPS. Al momento Azure offre un'ampia opzione di anteprima di archiviazione con un massimo di 20.000 IOPS.

I server creati nel livello Base non possono essere aggiornati a Uso generico o Ottimizzazione per la memoria.

Archiviazione

Assicurati che la funzione di crescita automatica sia abilitata:se la quantità di dati supera lo spazio di archiviazione fornito, il database entrerà in modalità di sola lettura.

Lo spazio di archiviazione può essere solo aumentato. Proprio come con tutti gli altri provider di cloud, l'allocazione dello spazio di archiviazione non può essere ridotta e non sono riuscito a trovare alcuna spiegazione. Data l'attrezzatura all'avanguardia che i grandi player del cloud possono permettersi, non dovrebbe esserci alcun motivo per non fornire funzionalità simili al trasferimento dei dati online di LVM. Al giorno d'oggi lo spazio di archiviazione è davvero economico, non c'è davvero motivo di pensare di ridimensionare fino al prossimo aggiornamento della versione principale.

Firewall

In alcuni casi, la propagazione degli aggiornamenti delle regole del firewall può richiedere fino a cinque minuti.

Un server si trova nella stessa sottorete in cui i server delle applicazioni non saranno raggiungibili finché non saranno applicate le regole del firewall appropriate.

Le regole di rete virtuale non consentono l'accesso tra regioni e, di conseguenza, dblink e postgres_fdw non possono essere usati per connettersi a database al di fuori del cloud di Azure.

L'approccio VNet/Subnet non può essere applicato alle app Web poiché le loro connessioni provengono da indirizzi IP pubblici.

Le grandi reti virtuali non saranno disponibili mentre gli endpoint del servizio sono abilitati.

Crittografia

Per le applicazioni che richiedono la convalida del certificato del server, il file è disponibile per il download da Digicert. Microsoft l'ha reso facile e non dovresti preoccuparti del rinnovo fino al 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

Sistema di rilevamento delle intrusioni

La versione di anteprima di Advanced Threat Protection non è disponibile per le istanze di livello Basic.

Backup e ripristino

Per le applicazioni che non possono permettersi un tempo di inattività in una regione, prendere in considerazione la configurazione del server con l'archiviazione di backup con ridondanza geografica. Questa opzione può essere abilitata solo al momento della creazione del server del database.

Il requisito per la riconfigurazione delle regole del firewall cloud dopo un'operazione PITR è particolarmente importante.

L'eliminazione di un server di database rimuove tutti i backup.

Dopo il ripristino, ci sono alcune attività post-ripristino che dovranno essere eseguite.

Le tabelle non registrate sono consigliate per gli inserimenti in blocco al fine di aumentare le prestazioni, tuttavia non vengono replicate.

Monitoraggio

Le metriche vengono registrate ogni minuto e archiviate per 30 giorni.

Registrazione

Query Store è un'opzione globale, il che significa che si applica a tutti i database. Le transazioni di sola lettura e le query più lunghe di 6.000 byte sono problematiche. Per impostazione predefinita, le query acquisite vengono conservate per 7 giorni.

Prestazioni

I consigli di Query Performance Insight sono attualmente limitati alla creazione e all'eliminazione di indici.

Disabilita pg_stat_staements quando non necessario.

Sostituisci uuid_generate_v4 con gen_random_uuid(). Questo è in linea con la raccomandazione nella documentazione ufficiale di PostgreSQL, vedi Compilazione di uuid-ossp.

Alta disponibilità e replica

C'è un limite di cinque repliche di lettura. Le applicazioni a uso intensivo di scrittura dovrebbero evitare di utilizzare repliche di lettura poiché il meccanismo di replica è asincrono, il che introduce alcuni ritardi che le applicazioni devono essere in grado di tollerare. Le repliche di lettura possono trovarsi in un'area diversa.

Il supporto REPLICA può essere abilitato solo dopo la creazione del server. La funzione richiede il riavvio del server:

Le repliche di lettura non ereditano le regole del firewall dal nodo master:

Il failover della lettura della replica non è automatico. Il meccanismo di failover è basato sul nodo.

C'è un lungo elenco di Considerazioni che devono essere riviste prima di configurare le repliche di lettura.

La creazione di repliche richiede molto tempo, anche quando ho testato con set di dati relativamente piccoli:

 Vuoto

Vuoto

Esaminare i parametri chiave, poiché il database di Azure per PostgreSQL viene fornito con valori predefiniti del vuoto a monte:

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

Aggiornamenti

Gli aggiornamenti principali automatici non sono supportati. Come accennato in precedenza, questa è un'opportunità di risparmio sui costi, riducendo lo spazio di archiviazione auto-cresciuto.

Miglioramenti di Azure PostgreSQL

Serie temporali

TimescaleDB è disponibile come estensione (non parte dei moduli PostgreSQL), tuttavia, è a pochi clic di distanza. L'unico inconveniente è la versione precedente 1.1.1, mentre la versione upstream è attualmente a 1.4.1 (01-08-2019).

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

Registrazione

Oltre alle opzioni di registrazione di PostgreSQL, è possibile configurare il database di Azure per PostgreSQL per registrare eventi di diagnostica aggiuntivi.

Firewall

Il portale di Azure include una pratica funzionalità per consentire le connessioni dagli indirizzi IP registrati al portale:

Ho notato la funzione in quanto rende facile per sviluppatori e amministratori di sistema lasciarsi entrare e si distingue come una funzionalità non offerta né da AWS, né da GCloud.

Conclusione

Il database di Azure per PostgreSQL Single Server offre servizi di livello aziendale, tuttavia molti di questi servizi sono ancora in modalità di anteprima:Query Store, Performance Insight, Performance Recommendation, Advanced Threat Protection, Large Storage, Cross-region Leggi le repliche.

Sebbene la conoscenza del sistema operativo non sia più necessaria per l'amministrazione di PostgreSQL nel cloud di Azure, il DBA dovrebbe acquisire competenze che non si limitano al database stesso:rete di Azure (VNet), sicurezza della connessione (firewall ), visualizzatore di log e analisi insieme a KQL, CLI di Azure per uno scripting pratico e l'elenco potrebbe continuare.

Infine, per coloro che intendono migrare i propri carichi di lavoro PostgreSQL ad Azure, sono disponibili numerose risorse insieme a un elenco selezionato di partner di Azure, tra cui Credativ, uno dei principali sponsor e contributori di PostgreSQL.