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

Aggiornamenti automatizzati con tempi di inattività prossimi allo zero dei cluster PostgreSQL nel cloud (parte II)

Ho iniziato a scrivere dello strumento (pglupgrade) che ho sviluppato per eseguire aggiornamenti automatizzati con tempi di inattività prossimi allo zero dei cluster PostgreSQL. In questo post parlerò dello strumento e ne discuterò i dettagli di progettazione.

Puoi controllare la prima parte della serie qui:Aggiornamenti automatizzati con tempi di inattività quasi pari a zero dei cluster PostgreSQL nel cloud (Parte I).

Lo strumento è scritto in Ansible. Ho precedenti esperienze di lavoro con Ansible e attualmente ci lavoro anche in 2ndQuadrant , motivo per cui è stata un'opzione comoda per me. Detto questo, puoi implementare la logica di aggiornamento dei tempi di inattività minimi, che verrà spiegata più avanti in questo post, con il tuo strumento di automazione preferito.

Ulteriori letture:post del blog Ansible Loves PostgreSQL , PostgreSQL Planet in Ansible Galaxy e  presentazione Gestione di PostgreSQL con Ansible.

Pglupgrade Playbook

In Ansible, playbook sono gli script principali sviluppati per automatizzare processi come il provisioning di istanze cloud e l'aggiornamento dei cluster di database. I playbook possono contenere una o più riproduzione . I playbook possono contenere anche variabili , ruoli e gestori se definito.

Lo strumento è costituito da due playbook principali. Il primo playbook è provision.yml che automatizza il processo di creazione di macchine Linux in cloud, secondo le specifiche (Questo è un playbook opzionale scritto solo per effettuare il provisioning di istanze cloud e non direttamente correlato all'aggiornamento ). Il secondo (e principale) playbook è pglupgrade.yml che automatizza il processo di aggiornamento dei cluster di database.

Il playbook di Pglupgrade ha otto riproduzioni per orchestrare l'aggiornamento. Ciascuna delle riproduzioni, utilizza un file di configurazione (config.yml ), eseguire alcune attività sugli host o sui gruppi host definiti nel file di inventario dell'host (host.ini ).

File di inventario

Un file di inventario consente ad Ansible di sapere quali server deve connettersi tramite SSH, quali informazioni di connessione richiede e, facoltativamente, quali variabili sono associate a tali server. Di seguito puoi vedere un file di inventario di esempio, che è stato utilizzato per eseguire aggiornamenti automatici del cluster per uno dei casi di studio progettati per lo strumento. Discuteremo questi casi di studio nei prossimi post di questa serie.

[old-primary]
54.171.211.188

[new-primary]
54.246.183.100

[old-standbys]
54.77.249.81
54.154.49.180

[new-standbys:children]
old-standbys

[pgbouncer]
54.154.49.180

File di inventario (host.ini )

Il file di inventario di esempio contiene cinque host meno di cinque gruppi ospitanti che includono old-primary , new-primary , old-standbys , new-standbys e pgbouncer . Un server può appartenere a più di un gruppo. Ad esempio, il old-standbys è un gruppo contenente i new-standbys gruppo, che indica gli host definiti in old-standbys gruppo (54.77.249.81 e 54.154.49.180) appartiene anche al new-standbys gruppo. In altre parole, il new-standbys il gruppo viene ereditato da (figli di) old-standbys gruppo. Ciò si ottiene utilizzando lo speciale :children suffisso.

Una volta che il file di inventario è pronto, il playbook di Ansible può essere eseguito tramite ansible-playbook comando puntando al file di inventario (se il file di inventario non si trova nella posizione predefinita, altrimenti utilizzerà il file di inventario predefinito) come mostrato di seguito:

$ ansible-playbook -i hosts.ini pglupgrade.yml

Esecuzione di un playbook Ansible

File di configurazione

Il playbook di Pglupgrade utilizza un file di configurazione (config.yml ) che consente agli utenti di specificare i valori per le variabili di aggiornamento logico.

Come mostrato di seguito, il config.yml memorizza principalmente le variabili specifiche di PostgreSQL necessarie per configurare un cluster PostgreSQL come postgres_old_datadir e postgres_new_datadir per memorizzare il percorso della directory dei dati di PostgreSQL per la vecchia e la nuova versione di PostgreSQL; postgres_new_confdir memorizzare il percorso della directory di configurazione di PostgreSQL per la nuova versione di PostgreSQL; postgres_old_dsn e postgres_new_dsn per memorizzare la stringa di connessione per pglupgrade_user per poterti connettere al pglupgrade_database dei nuovi e dei vecchi server primari. La stringa di connessione stessa è composta dalle variabili configurabili in modo che l'utente (pglupgrade_user ) e il database (pglupgrade_database ) le informazioni possono essere modificate per i diversi casi d'uso.

ansible_user: admin

pglupgrade_user: pglupgrade
pglupgrade_pass: pglupgrade123
pglupgrade_database: postgres

replica_user: postgres
replica_pass: ""

pgbouncer_user: pgbouncer

postgres_old_version: 9.5
postgres_new_version: 9.6

subscription_name: upgrade
replication_set: upgrade

initial_standbys: 1

postgres_old_dsn: "dbname={{pglupgrade_database}} host={{groups['old-primary'][0]}} user {{pglupgrade_user}}"
postgres_new_dsn: "dbname={{pglupgrade_database}} host={{groups['new-primary'][0]}} user={{pglupgrade_user}}"

postgres_old_datadir: "/var/lib/postgresql/{{postgres_old_version}}/main" 
postgres_new_datadir: "/var/lib/postgresql/{{postgres_new_version}}/main"

postgres_new_confdir: "/etc/postgresql/{{postgres_new_version}}/main"

File di configurazione (config.yml )

Come passaggio chiave per qualsiasi aggiornamento, le informazioni sulla versione di PostgreSQL possono essere specificate per la versione corrente (postgres_old_version ) e la versione che verrà aggiornata a (postgres_new_version ). A differenza della replica fisica in cui la replica è una copia del sistema a livello di byte/blocco, la replica logica consente la replica selettiva dove la replica può copiare i dati logici includono i database specificati e le tabelle in quei database. Per questo motivo, config.yml permette di configurare quale database replicare tramite pglupgrade_database variabile. Inoltre, l'utente della replica logica deve disporre dei privilegi di replica, motivo per cui pglupgrade_user la variabile deve essere specificata nel file di configurazione. Ci sono altre variabili relative al funzionamento interno di pglogical come subscription_name e replication_set che vengono utilizzati nel ruolo pglogico.

Progettazione ad alta disponibilità dello strumento Pglupgrade

Lo strumento Pglupgrade è progettato per offrire all'utente la flessibilità in termini di proprietà ad alta disponibilità (HA) per i diversi requisiti di sistema. Il initial_standbys variabile (vedi config.yml ) è la chiave per designare le proprietà HA del cluster durante l'operazione di aggiornamento.

Ad esempio, se initial_standbys è impostato su 1 (può essere impostato su qualsiasi numero consentito dalla capacità del cluster), ciò significa che ci sarà 1 standby creato nel cluster aggiornato insieme al master prima dell'avvio della replica. In altre parole, se hai 4 server e imposti initial_standbys su 1, avrai 1 server primario e 1 server di standby nella nuova versione aggiornata, oltre a 1 server primario e 1 server di standby nella vecchia versione.

Questa opzione consente di riutilizzare i server esistenti mentre l'aggiornamento è ancora in corso. Nell'esempio di 4 server, i vecchi server primario e di standby possono essere ricostruiti come 2 nuovi server di standby al termine della replica.

Quando initial_standbys è impostata su 0, non ci saranno server di standby iniziali creati nel nuovo cluster prima dell'inizio della replica.

Se il initial_standbys la configurazione sembra confusa, non ti preoccupare. Questo verrà spiegato meglio nel prossimo post del blog quando discuteremo di due diversi casi di studio.

Infine, il file di configurazione consente di specificare i gruppi di server vecchi e nuovi. Questo potrebbe essere fornito in due modi. Innanzitutto, se esiste un cluster esistente, gli indirizzi IP dei server (possono essere sia bare metal che server virtuali ) deve essere inserito in hosts.ini file considerando le proprietà HA desiderate durante l'operazione di aggiornamento.

Il secondo modo è eseguire provision.yml playbook (questo è il modo in cui ho eseguito il provisioning delle istanze cloud, ma puoi utilizzare i tuoi script di provisioning o eseguire il provisioning manuale delle istanze ) per eseguire il provisioning di server Linux vuoti nel cloud (istanze AWS EC2) e ottenere gli indirizzi IP dei server in hosts.ini file. Ad ogni modo, config.yml otterrà informazioni sull'host tramite hosts.ini file.

Flusso di lavoro del processo di aggiornamento

Dopo aver spiegato il file di configurazione (config.yml ) utilizzato da pglupgrade playbook, possiamo spiegare il flusso di lavoro del processo di aggiornamento.

Flusso di lavoro Pglupgrade

Come si vede dal diagramma sopra, ci sono sei gruppi di server che vengono generati all'inizio in base alla configurazione (entrambi hosts.ini e il config.yml ). Il new-primary e old-primary i gruppi avranno sempre un server, pgbouncer il gruppo può avere uno o più server e tutti i gruppi di standby possono avere zero o più server al loro interno. Per quanto riguarda l'attuazione, l'intero processo è suddiviso in otto fasi. Ogni passaggio corrisponde a una riproduzione nel playbook di pgupgrade, che esegue le attività richieste sui gruppi host assegnati. Il processo di aggiornamento viene spiegato attraverso le seguenti riproduzioni:

  1. Crea host in base alla configurazione: Gioco di preparazione che crea gruppi interni di server in base alla configurazione. Il risultato di questo gioco (in combinazione con hosts.ini content) sono i sei gruppi di server (illustrati con colori diversi nel diagramma del flusso di lavoro) che verranno utilizzati dalle seguenti sette riproduzioni.
  2. Imposta un nuovo cluster con standby/i iniziali: Imposta un cluster PostgreSQL vuoto con i nuovi standby/i primari e iniziali (se presenti). Garantisce che non rimangano residui dalle installazioni di PostgreSQL dall'utilizzo precedente.
  3. Modifica il vecchio primario per supportare la replica logica: Installa l'estensione pglogic. Quindi imposta l'editore aggiungendo tutte le tabelle e le sequenze alla replica.
  4. Replica alla nuova primaria: Imposta l'abbonato sul nuovo master che funge da trigger per avviare la replica logica. Questa riproduzione termina la replica dei dati esistenti e inizia a recuperare ciò che è cambiato da quando è iniziata la replica.
  5. Passa pgbouncer (e applicazioni) alla nuova primaria: Quando il ritardo di replica converge a zero, sospende pgbouncer per cambiare l'applicazione gradualmente. Quindi punta pgbouncer config al nuovo primario e attende che la differenza di replica arrivi a zero. Infine, pgbouncer viene ripreso e tutte le transazioni in attesa vengono propagate al nuovo primario e lì iniziano l'elaborazione. Gli standby iniziali sono già in uso e rispondono alle richieste di lettura.
  6. Ripulisci la configurazione della replica tra il vecchio primario e il nuovo primario: Termina la connessione tra il vecchio e il nuovo server primari. Poiché tutte le applicazioni vengono spostate sul nuovo server primario e l'aggiornamento viene eseguito, la replica logica non è più necessaria. La replica tra i server primari e di standby continua con la replica fisica.
  7. Interrompi il vecchio cluster: Il servizio Postgres viene interrotto nei vecchi host per garantire che nessuna applicazione possa più connettersi ad esso.
  8. Riconfigura il resto degli standby per il nuovo primario: Ricostruisce altri standby se sono presenti host rimanenti diversi dagli standby iniziali. Nel secondo caso di studio, non ci sono server in standby rimanenti da ricostruire. Questo passaggio offre la possibilità di ricostruire il vecchio server primario come nuovo standby se indicato nel gruppo new-standbys su hosts.ini. La riutilizzabilità dei server esistenti (anche il vecchio primario) si ottiene utilizzando il progetto di configurazione in standby in due fasi dello strumento pglupgrade. L'utente può specificare quali server devono diventare standby del nuovo cluster prima dell'aggiornamento e quali dovrebbero diventare standby dopo l'aggiornamento.

Conclusione

In questo post, abbiamo discusso i dettagli di implementazione e la progettazione ad alta disponibilità dello strumento pglupgrade. In tal modo, abbiamo anche menzionato alcuni concetti chiave dello sviluppo di Ansible (ad esempio playbook, inventario e file di configurazione) utilizzando lo strumento come esempio. Abbiamo illustrato il flusso di lavoro del processo di aggiornamento e riassunto come funziona ogni passaggio con una riproduzione corrispondente. Continueremo a spiegare pglupgrade mostrando casi di studio nei post prossimi di questa serie.

Grazie per aver letto!