From c73697d6b7e986432e56e80f07af2e77ec004e72 Mon Sep 17 00:00:00 2001 From: Matteo <matteo.difazio@garr.it> Date: Mon, 20 Apr 2020 15:34:48 +0200 Subject: [PATCH] Update README.md --- README.md | 95 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 67 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 2f0f4d5..b1efa75 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,10 @@ -# Configurazione HA geografica per il Database di MAAS +[[_TOC_]] -Per realizzare una HA geografica per il DB di MAAS utilizzeremo **Stolon**: https://github.com/sorintlab/stolon +--- + +# Configurazione HA geografica di PostgresQL + +Per realizzare una HA geografica di un database PostgreSQL utilizzeremo **Stolon**: https://github.com/sorintlab/stolon ## Architettura di Stolon @@ -26,7 +30,7 @@ Scegliamo **tre** nodi, uno per ogni **datacenter**, e su ognuno di questi nodi In questo esempio utilizzeremo i seguenti container: **10.3.0.244**, **10.2.0.243**, **10.2.244**. -**NOTA**: i container sono disposti solamente su due datacenter, in produzione (come già detto) è consigliabile istanziare i container su tre datacenter diversi per ottenere maggiore resilienza. +**NOTA**: i container in questo esempio sono disposti solamente su due datacenter, in produzione (come già detto) è consigliabile istanziare i container su tre datacenter diversi per ottenere maggiore resilienza e poter 'sopravvivere' al down di uno dei tre datacenter. Su ognuno di questi container procediamo in questo modo: @@ -42,6 +46,13 @@ mkdir /root/etcd-scripts #### Configuriamo ETCD sul primo container (10.3.0.244) +**Nota**: rispetto all'esempio riportato nella documentazione di riferimento condivisa più sopra, abbiamo aggiunto i seguenti parametri: + +1. ```--auto-tls --peer-auto-tls ```: guarda https://github.com/etcd-io/etcd/blob/master/Documentation/op-guide/security.md per una descrizione di questi due parametri +2. ```--quota-backend-bytes=$((6*1024*1024*1024))```: aumentiamo a 6GB il limite sulla dimensione del database relativo ad un singolo etcd container +3. ```--auto-compaction-retention=1```: vedi sezione di troubleshooting in fondo al documento +4. ```--heartbeat-interval '300' --election-timeout '3000'```: vedi sezione di troubleshooting in fondo al documento + ```bash TOKEN=token-01 CLUSTER_STATE=new @@ -178,23 +189,33 @@ Procediamo come di seguito: 5. ```systemctl restart etcdinit``` -## Setup di un cluster Stolon sui MAAS Region +## Setup di un cluster Stolon + +In questo esempio andremo a replicare il database PostgreSQL del servizio **MAAS** ma la procedura è valida per qualsiasi servizio che utilizzi un db PostgreSQL. -Dopo aver configurato con successo un cluster ETCD in HA, possiamo configurare **Stolon** sui Region di MAAS. +Dopo aver configurato con successo un cluster ETCD in HA, andremo a configurare **le componenti di Stolon** su: -In questo esempio abbiamo installato i MAAS Region su i seguenti nodi (linux containers con ubuntu 18.04) : **10.3.0.232**, **10.2.0.232**. +1. la macchina contentente il database da replicare +2. la macchina destinata a contenere la replica. -Su 10.3.0.232 è installato il **DB** di MAAS (oltre al MAAS Region). +Le **due macchine** sui cui installeremo i componenti di Stolon sono container lxc ma potrebbero benissimo anche essere bare metal. -Entrambi i Region puntano al DB di MAAS e quindi a **10.3.0.232:5432**. +I nodi in questione sono (linux containers con ubuntu 18.04) : **10.3.0.232**, **10.2.0.232**. + +Il nodo 10.3.0.232 è situato nel datacenter di Catania mentre 10.2.0.232 in quello di Palermo. + +Su 10.3.0.232 è installato il **DB** di MAAS. Inoltre, sia su 10.3.0.232 che su 10.2.0.232 sono configurati due **MAAS Region Controller**. +Entrambi i controller utilizzano l'unico database che è installato, come detto in precedenza, su 10.3.0.232 **NOTA**: si presuppone che MAAS funzioni come ci si aspetti su entrambi i nodi -Nello scenario descritto qui sopra, MAAS ed il suo database sono già operativi ed in funzione. Bisogna quindi configurare Stolon **a partire da un database esistente**. Per fare questo, abbiamo bisogno di inizializzare un **cluster di standby** come descritto qui: https://github.com/sorintlab/stolon/blob/master/doc/standbycluster.md. +Nello scenario descritto qui sopra, MAAS ed il suo database sono già operativi ed in funzione. Il nostro scopo è quello di replicare il DB in esecuzione su 10.3.0.232 sul container 10.2.0.232. + +Bisogna quindi configurare Stolon **a partire da un database esistente**. Per fare questo, abbiamo bisogno di inizializzare un **cluster di standby** come descritto qui: https://github.com/sorintlab/stolon/blob/master/doc/standbycluster.md. Iniziamo con il **preparare entrambi i nodi** all'utilizzo di Stolon. -#### Creiamo un nuovo utente ed installiamo Stolon sul MAAS Region con ip 10.3.0.232 +#### Creiamo un nuovo utente ed installiamo Stolon su 10.3.0.232 1. Creaiamo un utente che verrà utilizzato per eseguire i comandi di Stolon: @@ -227,9 +248,9 @@ Iniziamo con il **preparare entrambi i nodi** all'utilizzo di Stolon. mkdir stolon-config; mkdir stolon-log; mkdir stolon-data; chmod 0700 stolon-data ``` -#### Creaiamo un nuovo utente ed installiamo Stolon sul MAAS Region con ip 10.2.0.232 +#### Creaiamo un nuovo utente ed installiamo Stolon su 10.2.0.232 -**NOTA**: questo è il region su cui non è installato il DB +**NOTA**: questo è il container su cui non è installato il DB e su cui vogliamo installare la replica 1. Creaiamo un utente che verrà utilizzato per eseguire i comandi di Stolon: @@ -268,7 +289,7 @@ Iniziamo con il **preparare entrambi i nodi** all'utilizzo di Stolon. apt install postgresql-10 ``` -#### Prepariamo il DB di MAAS ad essere replicato da Stolon (10.3.0.232) +#### Prepariamo il DB attualmente in esecuzione ad essere replicato da Stolon (10.3.0.232) 1. Creiamo un Superuser ed un Replication user in Postgresql (Stolon utilizzerà questi utenti per la replica): @@ -280,14 +301,15 @@ Iniziamo con il **preparare entrambi i nodi** all'utilizzo di Stolon. 2. Modifichiamo pg_hba: ```bash - add: host replication repluser 0.0.0.0/0 md5, remove any other replication type entries in the file + add: host replication repluser 0.0.0.0/0 md5 ``` + **Importante**: rimuovere ogni altra replication entry in pg_hba ad eccezione di quella appena inserita #### Inizializziamo il cluster Stolon di standby su **10.2.0.232** -Inizializziamo il **cluster Stolon di standby** sul **Region** dove non è presente il database di MAAS e creiamo la replica del DB. +Inizializziamo il **cluster Stolon di standby** sul container dove non è presente il database di MAAS e creiamo la replica del DB. -1. Stoppiamo PostgreSQL: +1. Stoppiamo PostgreSQL se in esecuzione: ```bash #quando lanciamo il keeper, Stolon lancerà un processo PostgreSQL. @@ -343,43 +365,57 @@ Inizializziamo il **cluster Stolon di standby** sul **Region** dove non è prese ```bash bin/stolonctl --cluster-name maas-test-cluster --store-backend etcdv3 --store-endpoints http://10.3.0.244:2379,http://10.2.0.243:2379,http://10.2.0.244:2379 status -Se tutto è andato a buon fine, ora sul MAAS Region dove prima non c'era nessun db abbiamo configurato una replica del DB di MAAS e che è in costante sincronizzazione (async replication). +Se tutto è andato a buon fine, ora su 10.2.0.232 dove prima non c'era nessun db abbiamo configurato una replica del DB di MAAS che è in costante sincronizzazione (async replication). + +Ci siamo quasi, quello che ci resta da fare ora è: -#### Migriamo i MAAS Regions sul cluster Stolon +1. Stoppare brevemente i nostri servizi in modo tale che non venga più scritto nulla di nuovo all'interno del database +2. Creare una replica su 10.3.0.232 a partire dalla replica presente su 10.2.0.232 +3. Far puntare entrambi i region controller allo stolon proxy +4. Avviare nuovamente i servizi -1. Stoppiamo il region su 10.2.0.232: +#### Stoppiamo i MAAS Region controller + +1. Stoppiamo il region controller su 10.2.0.232: ```bash exit; systemctl stop maas-regiond ``` -2. Stoppiamo il region su 10.3.0.232: +2. Stoppiamo il region controller su 10.3.0.232: ```bash exit; systemctl stop maas-regiond ``` + +Come risultato di queste operazioni non viene effettuata più nessuna nuova scrittura nel database. + +#### Creiamo una istanza PostgreSQL gestita da Stolon anche su 10.3.0.232 -3. Stoppiamo PostgreSQL su 10.3.0.232: +1. Stoppiamo PostgreSQL su 10.3.0.232: ```bash exit; systemctl stop postgresql; su stolonsu; cd ~/stolon ``` -4. Lanciamo **Keeper** su 10.3.0.232: +2. Lanciamo **Keeper** su 10.3.0.232: ```bash #verrà creata una copia del db presente su 10.2.0.232 e verrà tenuta in sync da Stolon bin/stolon-keeper --cluster-name maas-test-cluster --store-backend etcdv3 --store-endpoints http://10.3.0.244:2379,http://10.2.0.243:2379,http://10.2.0.244:2379 --pg-su-username stolonsu --pg-su-password 12@st0l0nsu#$ --pg-repl-username repluser --pg-repl-password 12@r3plus3r#$ --pg-listen-address=10.3.0.232 --pg-port 5432 --uid maas_ct1 --data-dir /home/stolonsu/stolon-data --pg-bin-path /usr/lib/postgresql/10/bin/ > ../stolon-log/keeper.log 2>&1 & - -5. Lanciamo **Sentinel** su 10.3.0.232: + ``` + +3. Lanciamo **Sentinel** su 10.3.0.232: ```bash bin/stolon-sentinel --cluster-name maas-test-cluster --store-backend etcdv3 --store-endpoints http://10.3.0.244:2379,http://10.2.0.243:2379,http://10.2.0.244:2379 > ../stolon-log/sentinel.log 2>&1 & - + ``` + 6. Lanciamo **Proxy** su 10.3.0.232: ```bash bin/stolon-proxy --cluster-name maas-test-cluster --port 25432 --store-backend etcdv3 --store-endpoints http://10.3.0.244:2379,http://10.2.0.243:2379,http://10.2.0.244:2379 > ../stolon-log/proxy.log 2>&1 & - + ``` + 7. Promuoviamo il cluster Stolon di standby a cluster di ruolo Master (indifferente se da 10.3.0.232 o da 10.2.0.232) ```bash @@ -389,11 +425,14 @@ Se tutto è andato a buon fine, ora sul MAAS Region dove prima non c'era nessun bin/stolonctl --cluster-name maas-test-cluster --store-backend etcdv3 --store-endpoints http://10.3.0.244:2379,http://10.2.0.243:2379,http://10.2.0.244:2379 update --patch '{ "standbyConfig": null }' ``` + +#### Facciamo puntare entrambi i frontend (maas region controllers) al relativo stolon proxy + restart dei servizi (region controllers) + 8. Modifichiamo **regiond.conf** su 10.3.0.232 ```bash exit; - #puntiamo al proxy di Stolon + #puntiamo al proxy locale di Stolon vi /etc/maas/regiond.confg --> db_host=localhost db_port=25432 systemctl restart maas-regiond ``` @@ -402,7 +441,7 @@ Se tutto è andato a buon fine, ora sul MAAS Region dove prima non c'era nessun ```bash exit; - #puntiamo al proxy di Stolon + #puntiamo al proxy locale di Stolon vi /etc/maas/regiond.confg --> db_host=localhost db_port=25432 systemctl restart maas-regiond ``` -- GitLab