{"id":92570,"date":"2020-08-28T19:42:21","date_gmt":"2020-08-28T17:42:21","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker"},"modified":"2020-08-28T19:42:21","modified_gmt":"2020-08-28T17:42:21","slug":"modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","title":{"rendered":"Modellazione di cluster resistenti ai guasti basati su PostgreSQL e Pacemaker.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"vvedenie\">Introduzione<\/h1>\n<p><\/p>\n<p>Non molto tempo fa mi \u00e8 stato chiesto di sviluppare un cluster ad alta disponibilit\u00e0 per <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\">PostgreSQL<\/a><\/noindex>, operante in diversi data center collegati tramite fibra ottica all'interno di una stessa citt\u00e0 e in grado di sostenere il guasto (ad esempio, l'interruzione di corrente) di un data center. Come software responsabile della resilienza, ho scelto <noindex><a rel=\"nofollow\" href=\"https:\/\/clusterlabs.org\">Pacemaker<\/a><\/noindex>, poich\u00e9 \u00e8 la soluzione ufficiale di RedHat per la creazione di cluster ad alta disponibilit\u00e0. \u00c8 vantaggioso perch\u00e9 RedHat offre supporto per questa tecnologia e inoltre \u00e8 una soluzione versatile (modulare). Con essa \u00e8 possibile garantire l'alta disponibilit\u00e0 non solo per PostgreSQL, ma anche per altri servizi, sia utilizzando moduli standard che creandone di specifici per esigenze particolari.<\/p>\n<p><\/p>\n<p>A questo proposito sorge una domanda ragionevole: quanto \u00e8 davvero affidabile un cluster resiliente? Per indagare, ho creato un banco di prova che simula vari guasti nei nodi del cluster, attende il ripristino della funzionalit\u00e0, recupera il nodo guasto e continua a testare in ciclo. Inizialmente, questo progetto si chiamava hapgsql, ma col tempo mi sono stancato di un nome con solo una vocale. Pertanto, le basi di dati resilienti (e gli IP float associati) li ho chiamati <strong>krogan<\/strong> (un personaggio di un videogioco, che ha tutti gli organi vitali duplicati), e i nodi, i cluster e il progetto stesso \u2014 <strong>tuchanka<\/strong> (il pianeta abitato dai krogan).<\/p>\n<p><\/p>\n<p>Attualmente, la direzione ha autorizzato <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/domclick\/tuchanka\">l'apertura del progetto alla comunit\u00e0 open source sotto la licenza MIT<\/a><\/noindex>. Il README sar\u00e0 tradotto in inglese a breve (poich\u00e9 ci si aspetta che i principali utilizzatori siano sviluppatori di Pacemaker e PostgreSQL), e la vecchia versione russa del README ho deciso di presentarla (parzialmente) in forma di questo articolo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellazione di cluster resistenti ai guasti basati su PostgreSQL e Pacemaker.\" src=\"\/wp-content\/uploads\/2020\/08\/7ebb04b3e56337060e981da319192a28.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>I cluster vengono distribuiti su macchine virtuali <noindex><a rel=\"nofollow\" href=\"https:\/\/www.virtualbox.org\">VirtualBox<\/a><\/noindex>. Saranno distribuite 12 macchine virtuali (per un totale di 36GiB), che formeranno 4 cluster ridondanti (varie opzioni). I primi due cluster consistono in due server PostgreSQL, situati in diversi data center, e un server condiviso <em>testimone<\/em> c <strong>dispositivo di quorum<\/strong> (collocato su una macchina virtuale economica in un terzo data center), che risolve l'incertezza <strong>50%\/50%<\/strong>, esprimendo il suo voto per una delle parti. Il terzo cluster si trova in tre data center: un master, due schiavi, senza <strong>dispositivo di quorum<\/strong>. Il quarto cluster \u00e8 composto da quattro server PostgreSQL, due per data center: uno master, le altre repliche, e utilizza anche <em>testimone<\/em> c <strong>dispositivo di quorum<\/strong>. Il quarto resiste al guasto di due server o di un data center. Questa soluzione pu\u00f2, se necessario, essere scalata a un numero maggiore di repliche.<\/p>\n<p><\/p>\n<p>Servizio di sincronizzazione dell'ora <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ntp.org\">ntpd<\/a><\/noindex> \u00e8 stato anche riconfigurato per la ridondanza, ma utilizza il metodo di <code>ntpd<\/code> (<em>orphan mode<\/em>). Il server centrale <em>testimone<\/em> funge da server NTP centrale, distribuendo il proprio tempo a tutti i cluster, sincronizzando cos\u00ec tutti i server tra loro. Se <em>testimone<\/em> si guasta o viene isolato, uno dei server del cluster inizier\u00e0 a distribuire il proprio tempo (all'interno del cluster). Un cache ausiliario <strong>proxy HTTP<\/strong> \u00e8 anch'esso attivo su <em>testimone<\/em>, tramite il quale le altre macchine virtuali hanno accesso ai repository Yum. In realt\u00e0, servizi come l'ora esatta e il proxy saranno sicuramente ospitati su server dedicati, mentre nel banco sono ospitati su <em>testimone<\/em> solo per risparmiare sul numero di macchine virtuali e spazio.<\/p>\n<p><\/p>\n<h1 id=\"versii\">Versioni<\/h1>\n<p><\/p>\n<p>v0. Funziona con CentOS 7 e PostgreSQL 11 su VirtualBox 6.1.<\/p>\n<p><\/p>\n<h1 id=\"struktura-klasterov\">Struttura dei cluster<\/h1>\n<p><\/p>\n<p>Tutti i cluster sono progettati per essere ospitati in diversi data center, uniti in una rete piatta e devono resistere al fallimento o all'isolamento di rete di un data center. Pertanto <strong>non \u00e8 possibile<\/strong> utilizzare per la protezione da <strong>split-brain<\/strong> la tecnologia standard Pacemaker, che si chiama <em>STONITH<\/em> (Shoot The Other Node In The Head) o <em>fencing<\/em>. La sua essenza: se i nodi nel cluster iniziano a sospettare che ci sia qualcosa di strano con un nodo, che non risponde o si comporta in modo anomalo, lo scollegano forzatamente tramite dispositivi \"esterni\", come la scheda di gestione IPMI o l'UPS. Tuttavia, questo funzioner\u00e0 solo nei casi in cui, in caso di guasto singolo del server, IPMI o UPS continuino a funzionare. Qui \u00e8 prevista una protezione da un guasto molto pi\u00f9 catastrofico, quando fallisce (ad esempio, si interrompe l'alimentazione) l'intero data center. E in caso di tale guasto, tutto <em>stonith<\/em>-i dispositivi (IPMI, UPS, ecc.) non funzioneranno nemmeno.<\/p>\n<p><\/p>\n<p>Invece, il sistema si basa sull'idea del quorum. Tutti i nodi hanno diritto di voto e possono lavorare solo quelli che vedono pi\u00f9 della met\u00e0 di tutti i nodi. Questa quantit\u00e0 \"met\u00e0+1\" \u00e8 chiamata <strong>quorum<\/strong>. Se il quorum non viene raggiunto, il nodo decide che si trova in isolamento di rete e deve disattivare le proprie risorse, cio\u00e8 \u00e8 una sorta di <strong>protezione da split-brain<\/strong>. Se il software che gestisce questo comportamento non funziona, si deve attivare un watchdog, ad esempio basato su IPMI.<\/p>\n<p><\/p>\n<p>Se il numero di nodi \u00e8 pari (cluster in due data center), pu\u00f2 verificarsi quella che viene chiamata incertezza <strong>50%\/50%<\/strong> (<em>cinquanta-cinquanta<\/em>), quando l'isolamento di rete divide il cluster esattamente a met\u00e0. Pertanto, per un numero pari di nodi, si aggiunge <strong>dispositivo di quorum<\/strong> \u2014 un demone poco esigente che pu\u00f2 essere avviato sulla virtual machine pi\u00f9 economica nel terzo data center. Esso d\u00e0 il suo voto a uno dei segmenti (che vede), risolvendo cos\u00ec l'incertezza 50%\/50%. Il server su cui verr\u00e0 eseguito il quorum device l'ho chiamato <em>testimone<\/em> (terminologia di repmgr, mi \u00e8 piaciuta).<\/p>\n<p><\/p>\n<p>Le risorse possono spostarsi da un posto all'altro, ad esempio, da server guasti a server funzionanti, o su comando degli amministratori di sistema. Per informare i clienti su dove si trovano le risorse di cui hanno bisogno (a quale punto connettersi?), vengono utilizzati <em>IP galleggianti<\/em> (<strong>float IP<\/strong>). Questi IP possono essere spostati da Pacemaker tra i nodi (tutto si trova in una rete piatta). Ognuno di essi rappresenta una risorsa (servizio) e sar\u00e0 posizionato dove \u00e8 necessario connettersi per accedere a questo servizio (nel nostro caso, al DB).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka1-shema-s-uplotneniem\">Tuchanka1 (schema di compressione)<\/h2>\n<p><\/p>\n<h3 id=\"struktura\">Struttura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellazione di cluster resistenti ai guasti basati su PostgreSQL e Pacemaker.\" src=\"\/wp-content\/uploads\/2020\/08\/5651238e36f4af1c32f117191cf30261.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L'idea era quella di avere molti piccoli database con un basso carico, per i quali non \u00e8 conveniente mantenere un server slave dedicato in modalit\u00e0 hot standby per transazioni in sola lettura (non c'\u00e8 bisogno di uno spreco di risorse del genere).<\/p>\n<p><\/p>\n<p>In ogni data center c'\u00e8 un server. Ogni server ha due istanze di PostgreSQL (nella terminologia di PostgreSQL si chiamano claster, ma per evitare confusione le chiamer\u00f2 istanze, analogamente ad altre DB, e chiamer\u00f2 cluster solo i cluster Pacemaker). Un'istanza funziona in modalit\u00e0 master e solo essa fornisce servizi (solo su di essa \u00e8 presente un IP fluttuante). L'altra istanza funziona come slave per il secondo data center e fornir\u00e0 servizi solo se il suo master dovesse andare offline. Poich\u00e9 la maggior parte del tempo fornir\u00e0 servizi (eseguir\u00e0 query) solo un'istanza su due (il master), tutte le risorse del server vengono ottimizzate per il master (viene allocata memoria per il cache shared_buffers, ecc.), ma in modo tale da garantire risorse anche per la seconda istanza (anche se con prestazioni non ottimali tramite la cache del filesystem) nel caso in cui uno dei data center dovesse fallire. Lo slave non fornisce servizi (non esegue query di sola lettura) durante il normale funzionamento del cluster, per evitare di competere per le risorse con il master sulla stessa macchina.<\/p>\n<p><\/p>\n<p>Nel caso di due nodi, l'affidabilit\u00e0 \u00e8 possibile solo con la replicazione asincrona, in quanto con la replicazione sincronizzata il guasto dello slave porter\u00e0 alla fermata del master.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-witness\">Guasto witness<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellazione di cluster resistenti ai guasti basati su PostgreSQL e Pacemaker.\" src=\"\/wp-content\/uploads\/2020\/08\/3c046d13c0c6839de297827ca3a8928b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Guasto witness (<em>dispositivo di quorum<\/em>) lo considero solo per il cluster Tuchanka1, per tutti gli altri sar\u00e0 la stessa storia. In caso di guasto del witness nella struttura del cluster, nulla cambier\u00e0, tutto continuer\u00e0 a funzionare come prima. Tuttavia, il quorum diventer\u00e0 2 su 3, e quindi qualsiasi successivo guasto diventer\u00e0 fatale per il cluster. Sar\u00e0 comunque necessario ripararlo rapidamente.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka1\">Guasto Tuchanka1<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellazione di cluster resistenti ai guasti basati su PostgreSQL e Pacemaker.\" src=\"\/wp-content\/uploads\/2020\/08\/112957293bd682428115e4e93c9f1a96.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Guasto di uno dei data center per Tuchanka1. In questo caso <em>testimone<\/em> vota per il secondo nodo nel secondo data center. Qui l'ex slave si trasforma in master, quindi entrambi i master funzionano su un server e entrambi puntano al loro float IP.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka2-klassicheskaya\">Tuchanka2 (classico)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-1\">Struttura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellazione di cluster resistenti ai guasti basati su PostgreSQL e Pacemaker.\" src=\"\/wp-content\/uploads\/2020\/08\/c3af368f823fbd580b4ebb14cc87c750.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Schema classico composto da due nodi. Uno ospita il master, l'altro lo slave. Entrambi possono gestire le richieste (lo slave \u00e8 solo read only), quindi entrambi puntano al float IP: krogan2 \u2014 per il master, krogan2s1 \u2014 per lo slave. L'affidabilit\u00e0 sar\u00e0 sia per il master che per lo slave.<\/p>\n<p><\/p>\n<p>Nel caso di due nodi, la tolleranza ai guasti \u00e8 possibile solo con la replicazione asincrona, poich\u00e9 con la replicazione sincrona un guasto del server secondario porter\u00e0 all'arresto del master.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka2\">Guasto Tuchanka2<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellazione di cluster resistenti ai guasti basati su PostgreSQL e Pacemaker.\" src=\"\/wp-content\/uploads\/2020\/08\/79bfcaf88c96d8ee16767dcef53741c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In caso di guasto di uno dei data center <em>testimone<\/em> voterebbe per il secondo. Nel data center attivo verr\u00e0 avviato il master, e entrambi gli IP float: quello master e quello secondario, punteranno su di esso. Naturalmente, l'istanza deve essere configurata in modo tale da avere risorse sufficienti (limiti di connessione, ecc.) per accettare simultaneamente tutte le connessioni e le richieste dagli IP float master e secondario. Cio\u00e8, in condizioni normali, deve avere un margine sufficiente sui limiti.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka4-mnogo-rabov\">Tuchanka4 (molti secondari)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-2\">Struttura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellazione di cluster resistenti ai guasti basati su PostgreSQL e Pacemaker.\" src=\"\/wp-content\/uploads\/2020\/08\/17819fd97847f0573d429e422d799bc1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Gi\u00e0 un'altra estremit\u00e0. Ci sono database che ricevono molte richieste in sola lettura (caso tipico di un sito ad alto carico). Tuchanka4 \u00e8 la situazione in cui possono esserci tre o pi\u00f9 secondari per gestire tali richieste, ma comunque non troppi. Con un numero eccessivo di secondari, sar\u00e0 necessaria l'ideazione di un sistema gerarchico di replicazione. Nel caso minimo (nell'immagine) ci sono due server in ciascuno dei due data center, ognuno con un'istanza di PostgreSQL.<\/p>\n<p><\/p>\n<p>Un'altra caratteristica di questo schema \u00e8 che qui \u00e8 possibile organizzare una replica sincrona. \u00c8 configurata per replicare, se possibile, in un altro data center, e non su una replica nello stesso data center del master. Il master e ogni slave sono indicati da un IP float. Idealmente, tra gli slave si dovrebbe effettuare il bilanciamento delle richieste tramite qualche <em>sql proxy<\/em>, per esempio, sul lato client. A diversi tipi di client potrebbe servire un tipo diverso <em>sql proxy<\/em>, e solo gli sviluppatori dei client sanno quale sia necessario per ognuno. Questa funzionalit\u00e0 pu\u00f2 essere implementata sia come demone esterno, sia come libreria client (connection pool), ecc. Tutto ci\u00f2 esula dal tema del cluster DB ad alta disponibilit\u00e0 (l'alta disponibilit\u00e0 <em>SQL proxy<\/em> pu\u00f2 essere implementata indipendentemente, insieme all'alta disponibilit\u00e0 del client).<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka4\">Guasto Tuchanka4<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellazione di cluster resistenti ai guasti basati su PostgreSQL e Pacemaker.\" src=\"\/wp-content\/uploads\/2020\/08\/e005ae90ffd63abdb272012b94735618.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In caso di malfunzionamento di un data center (ovvero di due server), il witness vota per il secondo. Di conseguenza, in quest'ultimo data center operano due server: su uno si trova il master, al quale corrisponde un float IP master (per ricevere richieste read-write); mentre sull'altro server opera uno slave con replica sincrona, al quale corrisponde uno dei float IP slave (per richieste read only).<\/p>\n<p><\/p>\n<p>La prima cosa da notare \u00e8 che il float IP slave attivo non sar\u00e0 tutti, ma solo uno. E per funzionare correttamente, \u00e8 necessario che <em>sql proxy<\/em> reindirizzi tutte le richieste all'unico float IP rimanente; e se <em>sql proxy<\/em> no, \u00e8 possibile elencare tutti i float IP degli slave separati da una virgola nell'URL per la connessione. In tal caso, con <em>libpq<\/em> la connessione avverr\u00e0 al primo IP operativo, come previsto nel sistema di test automatici. Potrebbe non funzionare allo stesso modo in altre librerie, ad esempio JDBC, e potrebbe essere necessario <em>sql proxy<\/em>. Questo perch\u00e9 per i float IP degli slave \u00e8 vietato attivarsi contemporaneamente su un server, affinch\u00e9 siano distribuiti uniformemente tra i server slave, se ce ne sono diversi attivi.<\/p>\n<p><\/p>\n<p>In secondo luogo: anche in caso di guasto del data center, la replica sincrona sar\u00e0 mantenuta. E anche se si verifica un guasto secondario, ovvero uno dei due server nel data center rimanente si guasta, il cluster smetter\u00e0 di fornire servizi, ma manterr\u00e0 comunque informazioni su tutte le transazioni impegnate per le quali ha fornito conferma di commit (non ci sar\u00e0 perdita di informazioni in caso di guasto secondario).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka3-3-data-centra\">Tuchanka3 (3 data center)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-3\">Struttura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellazione di cluster resistenti ai guasti basati su PostgreSQL e Pacemaker.\" src=\"\/wp-content\/uploads\/2020\/08\/e11f9884b92fe20a63b5080ae8c7f82b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questo \u00e8 un cluster per la situazione in cui ci sono tre data center completamente operativi, ciascuno con un server di database completamente funzionante. In questo caso <em>dispositivo di quorum<\/em> non \u00e8 necessario. In un data center opera il master, mentre negli altri due ci sono i server slave. La replica \u00e8 sincrona, tipo ANY (slave1, slave2), il che significa che il cliente ricever\u00e0 conferma del commit quando uno degli slave risponder\u00e0 per primo di aver accettato il commit. Le risorse indicano un IP float per il master e due per gli slave. A differenza di Tuchanka4, tutti e tre gli IP float sono a prova di guasto. Per bilanciare le richieste SQL in sola lettura \u00e8 possibile utilizzare <em>sql proxy<\/em> (con affidabilit\u00e0 separata), oppure si pu\u00f2 assegnare un IP float a un gruppo di clienti e un altro a un secondo gruppo.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka3\">Guasto Tuchanka3<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellazione di cluster resistenti ai guasti basati su PostgreSQL e Pacemaker.\" src=\"\/wp-content\/uploads\/2020\/08\/1e61158be3c23742384d3621e8f7896b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se uno dei data center dovesse crollare, ne rimarrebbero due. In uno \u00e8 attivato il master e l'IP flottante dal master, nell'altro \u2014 lo slave e entrambi gli IP flottanti slave (l'istanza deve avere una riserva doppia di risorse per accettare tutte le connessioni da entrambi gli IP flottanti slave). Tra master e slave c'\u00e8 una replica sincrona. Inoltre, il cluster manterr\u00e0 le informazioni sulle transazioni impegnate e confermate (non ci sar\u00e0 perdita di informazioni) in caso di distruzione di due data center (se distrutti non contemporaneamente).<\/p>\n<p><\/p>\n<p><em>Ho deciso di non includere una descrizione dettagliata della struttura dei file e del deployment. Chi desidera sperimentare pu\u00f2 leggere tutto nel README. Fornisco solo la descrizione del test automatico.<\/em><\/p>\n<p><\/p>\n<h1 id=\"sistema-avtomaticheskogo-testirovaniya\">Sistema di test automatico<\/h1>\n<p><\/p>\n<p>Per verificare la tolleranza ai guasti dei cluster simulando vari difetti, \u00e8 stato creato un sistema di test automatico. Viene avviato tramite script <code>test\/failure<\/code>. Lo script pu\u00f2 accettare come parametri i numeri dei cluster che si desidera testare. Ad esempio, il comando \u00e8:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">test\/failure 2 3<\/code><\/pre>\n<p><\/p>\n<p>verr\u00e0 testato solo il secondo e il terzo cluster. Se i parametri non sono specificati, verranno testati tutti i cluster. Tutti i cluster vengono testati in parallelo e il risultato viene visualizzato nel pannello tmux. Tmux utilizza un server tmux dedicato, quindi lo script pu\u00f2 essere eseguito all'interno del tmux predefinito, creando un tmux annidato. Consiglio di utilizzare il terminale in una finestra grande e con un carattere piccolo. Prima dell'inizio dei test, tutte le macchine virtuali vengono ripristinate a uno snapshot al momento del completamento dello script. <code>setup<\/code>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellazione di cluster resistenti ai guasti basati su PostgreSQL e Pacemaker.\" src=\"\/wp-content\/uploads\/2020\/08\/b546bab1ebbbe365991e1ff3d1667237.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il terminale \u00e8 suddiviso in colonne in base al numero di cluster testati, di default (nello screenshot) sono quattro. Contenuto delle colonne che descriver\u00f2 usando l'esempio Tuchanka2. I pannelli nello screenshot sono numerati:<\/p>\n<p><\/p>\n<ol>\n<li>Qui viene visualizzata la statistica dei test. Colonne:\n<ul>\n<li><strong>failure<\/strong> \u2014 il nome del test (funzioni nello script) che simula un guasto.<\/li>\n<li><strong>reaction<\/strong> \u2014 la media aritmetica del tempo in secondi, necessario perch\u00e9 il cluster ripristini la sua operativit\u00e0. Viene misurata dal momento in cui inizia l'esecuzione di uno script che emula un guasto fino al momento in cui il cluster ripristina la sua operativit\u00e0 e pu\u00f2 continuare a fornire servizi. Se il tempo \u00e8 molto breve, ad esempio sei secondi (come avviene nei cluster con pi\u00f9 schiavi (Tuchanka3 e Tuchanka4)), significa che il guasto \u00e8 avvenuto in uno schiavo asincrono e non ha influenzato l'operativit\u00e0; non ci sono stati cambiamenti di stato nel cluster.<\/li>\n<li><strong>deviazione<\/strong> \u2014 mostra la dispersione (accuratezza) del valore <strong>reaction<\/strong> utilizzando il metodo della \u00abdeviazione standard\u00bb.<\/li>\n<li><strong>conteggio<\/strong> \u2014 quante volte \u00e8 stato eseguito questo test.<\/li>\n<\/ul>\n<\/li>\n<li>Il registro di sintesi consente di valutare cosa stia facendo attualmente il cluster. Viene riportato il numero dell'iterazione (del test), il timestamp e il nome dell'operazione. Un tempo di esecuzione troppo lungo (&gt; 5 minuti) indica un problema.<\/li>\n<li><strong>cuore<\/strong> (heart) \u2014 il tempo attuale. Per una valutazione visiva dell'operativit\u00e0 <em>del master<\/em> il tempo attuale viene continuamente registrato nella sua tabella utilizzando l'IP float del master. In caso di successo, il risultato viene visualizzato in questo pannello.<\/li>\n<li><strong>battito<\/strong> (pulse) \u2014 \u00abtempo corrente\u00bb, precedentemente registrato dallo script <strong>cuore<\/strong> in master, ora letto da <em>slave<\/em> tramite il suo IP flottante. Permette di valutare visivamente il funzionamento dello slave e della replicazione. In Tuchanka1 non ci sono slave con IP flottante (nessuno slave offre servizi), ma ci sono due istanze (DB), quindi qui verr\u00e0 mostrato non <strong>battito<\/strong>, e <strong>cuore<\/strong> la seconda istanza.<\/li>\n<li>Monitoraggio dello stato del cluster tramite l'utility <code>pcs mon<\/code>. Mostra la struttura, la distribuzione delle risorse tra i nodi e altre informazioni utili.<\/li>\n<li>Qui viene visualizzato il monitoraggio di sistema da ogni virtual machine del cluster. Ci possono essere pi\u00f9 di questi pannelli \u2014 quanti sono i virtual machines del cluster. Due grafici <em>CPU Load<\/em> (nelle virtual machines ci sono due processori), nome della virtual machine, <em>System Load<\/em> (chiamato Load Average, perch\u00e9 \u00e8 mediato su 5, 10 e 15 minuti), dati sui processi e distribuzione della memoria.<\/li>\n<li>Tracciamento dello script che esegue i test. In caso di malfunzionamento \u2014 interruzione improvvisa del lavoro o ciclo di attesa infinito \u2014 qui sar\u00e0 possibile vedere la causa di tale comportamento.<\/li>\n<\/ol>\n<p><\/p>\n<p>Il test viene eseguito in due fasi. Inizialmente, lo script attraversa tutte le variazioni di test, selezionando casualmente la macchina virtuale a cui applicare il test. Successivamente, viene eseguito un ciclo infinito di test, in cui le macchine virtuali e i malfunzionamenti vengono scelti casualmente ogni volta. Un'improvvisa chiusura dello script di test (nella barra inferiore) o un ciclo infinito in attesa di qualcosa (&gt; 5 minuti di tempo per l'esecuzione di un'operazione, visibile nello stack trace) indica che uno dei test su questo cluster \u00e8 fallito.<\/p>\n<p><\/p>\n<p>Ogni test consiste nelle seguenti operazioni:<\/p>\n<p><\/p>\n<ol>\n<li>Avvio di una funzione che simula un malfunzionamento.<\/li>\n<li><strong>Pronto?<\/strong> \u2014 attesa del ripristino delle funzionalit\u00e0 del cluster (quando tutti i servizi sono disponibili).<\/li>\n<li>Viene mostrato il tempo di attesa per il ripristino del cluster (<em>reaction<\/em>).<\/li>\n<li><strong>Fix<\/strong> \u2014 il cluster 'viene riparato'. Dopodich\u00e9, dovrebbe tornare a uno stato completamente operativo e pronto per il prossimo malfunzionamento.<\/li>\n<\/ol>\n<p><\/p>\n<p>Ecco un elenco dei test con una descrizione di cosa fanno:<\/p>\n<p><\/p>\n<ul>\n<li><strong>ForkBomb<\/strong>: crea un'eccezione &quot;Out of memory&quot; utilizzando un fork bomb.<\/li>\n<li><strong>OutOfSpace<\/strong>: il disco rigido \u00e8 pieno. Ma il test \u00e8 pi\u00f9 simbolico, dato il carico trascurabile che si crea durante il test; in caso di sovraccarico del disco rigido, PostgreSQL solitamente non va in errore.<\/li>\n<li><strong>Postgres-KILL<\/strong>: termina PostgreSQL con il comando <code>killall -KILL postgres<\/code>.<\/li>\n<li><strong>Postgres-STOP<\/strong>: sospende PostgreSQL con il comando <code>killall -STOP postgres<\/code>.<\/li>\n<li><strong>PowerOff<\/strong>: \u00abspegne\u00bb la VM con il comando <code>VBoxManage controlvm &quot;macchina virtuale&quot; poweroff<\/code>.<\/li>\n<li><strong>Reset<\/strong>: riavvia la VM con il comando <code>VBoxManage controlvm &quot;macchina virtuale&quot; reset<\/code>.<\/li>\n<li><strong>SBD-STOP<\/strong>: sospende il demone SBD con il comando <code>killall -STOP sbd<\/code>.<\/li>\n<li><strong>ShutDown<\/strong>: invia alla VM il comando via SSH <code>systemctl poweroff<\/code>, il sistema termina correttamente.<\/li>\n<li><strong>UnLink<\/strong>: isolamento di rete, comando <code>VBoxManage controlvm &quot;macchina virtuale&quot; setlinkstate1 off<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Termina il test o utilizzando il comando standard tmux &quot;kill-window&quot; <strong>Ctrl-b &amp;<\/strong>, o con il comando &quot;detach-client&quot; <strong>Ctrl-b d<\/strong>: in questo caso il test si conclude, tmux si chiude e le VM vengono spente.<\/p>\n<p><\/p>\n<h1 id=\"vyyavlennye-pri-testirovanii-problemy\">Problemi riscontrati durante il test<\/h1>\n<p><\/p>\n<ul>\n<li>\n<p>Attualmente <em>il demone watchdog sbd<\/em> gestisce l'arresto dei demoni osservati, ma non il loro blocco. E, di conseguenza, le anomalie che portano al blocco vengono gestite in modo errato, determinando <em>Corosync<\/em> e <em>Pacemaker<\/em>, ma senza bloccare <em>sbd<\/em>. Per la verifica <em>Corosync<\/em> \u00e8 gi\u00e0 presente <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClusterLabs\/sbd\/pull\/83\"><strong>PR#83<\/strong> (su GitHub, <em>sbd<\/em>)<\/a><\/noindex>, accettato nel ramo <em>master<\/em>. Hanno promesso (in PR#83) che ci sar\u00e0 qualcosa di simile per Pacemaker, spero che a <em>RedHat 8<\/em> lo faranno. Tuttavia, tali \"malfunzionamenti\" sono teorici e possono essere facilmente simulati artificialmente, ad esempio, <code>killall -STOP corosync<\/code>, ma non si verificano mai nella vita reale.<\/p>\n<p>\n<\/li>\n<li>\n<p>A <em>Pacemaker<\/em> nella versione per <em>CentOS 7<\/em> \u00e8 impostato in modo errato <em>sync_timeout<\/em> a <em>dispositivo di quorum<\/em>, di conseguenza <noindex><a rel=\"nofollow\" href=\"https:\/\/lists.clusterlabs.org\/pipermail\/users\/2019-August\/026145.html\">in caso di guasto di un nodo, con una certa probabilit\u00e0 anche il secondo nodo<\/a><\/noindex>, su cui avrebbe dovuto spostarsi il master, si riavviava. \u00c8 stato risolto aumentando <em>sync_timeout<\/em> a <em>dispositivo di quorum<\/em> durante il deployment (nello script <code>setup\/setup1<\/code>). Questa correzione non \u00e8 stata accettata dagli sviluppatori <em>Pacemaker<\/em>, invece hanno promesso di riprogettare l'infrastruttura in modo tale (in un futuro indefinito) che questo timeout venga calcolato automaticamente.<\/p>\n<p>\n<\/li>\n<li>\n<p>Se durante la configurazione del database viene indicato che in <code>LC_MESSAGES<\/code> (messaggi di testo) pu\u00f2 essere utilizzato Unicode, ad esempio, <code>ru_RU.UTF-8<\/code>, allora all'avvio <em>postgres<\/em> in un ambiente dove il locale non \u00e8 UTF-8, ad esempio, in un ambiente vuoto (qui <em>pacemaker<\/em>+<em>pgsqlms<\/em>(paf) avvia <em>postgres<\/em>), allora <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/13FE0F7C-5140-499C-8C2E-0BE64BC3A48B%40ya.ru\">nel log invece dei caratteri UTF-8 ci saranno punti interrogativi<\/a><\/noindex>. Gli sviluppatori di PostgreSQL non hanno ancora raggiunto un accordo su cosa fare in questo caso. Si pu\u00f2 aggirare il problema impostando <code>LC_MESSAGES=en_US.UTF-8<\/code> durante la configurazione (creazione) di un'istanza DB.<\/p>\n<p>\n<\/li>\n<li>\n<p>Se \u00e8 impostato wal_receiver_timeout (di default 60s), durante il test PostgreSQL-STOP sul master nei cluster tuchanka3 e tuchanka4 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">non si verifica la riconnessione della replica al nuovo master.<\/a><\/noindex>La replica \u00e8 sincrona, quindi si interrompe non solo il lavoro, ma anche il nuovo master. Si risolve impostando wal_receiver_timeout=0 durante la configurazione di PostgreSQL.<\/p>\n<p>\n<\/li>\n<li>\n<p>Ho osservato raramente il congelamento della replica in PostgreSQL durante il test ForkBomb (overflow di memoria). <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/60590EC6-4062-4F25-A49C-3948ED2A7D47%40ya.ru\">Dopo ForkBomb, a volte gli schiavi possono non riconnettersi al nuovo master.<\/a><\/noindex>Ho riscontrato questo solo nei cluster tuchanka3 e tuchanka4, dove, a causa della replica sincrona, il master si bloccava. Il problema si risolveva da solo dopo un certo periodo (circa due ore). \u00c8 necessaria un'ulteriore indagine per risolverlo. Per sintomi sembra un bug precedente causato da un'altra ragione, ma con le stesse conseguenze.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>L'immagine del krogan \u00e8 tratta da <noindex><a rel=\"nofollow\" href=\"http:\/\/fav.me\/d8fo42n\">Deviant Art<\/a><\/noindex> con il permesso dell'autore:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellazione di cluster resistenti ai guasti basati su PostgreSQL e Pacemaker.\" src=\"\/wp-content\/uploads\/2020\/08\/ded1ead387814d97d84d0fb89e025386.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/domclick\/blog\/516538\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430\u0445, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0442\u043e\u0432\u043e\u043b\u043e\u043a\u043d\u043e\u043c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0433\u043e\u0440\u043e\u0434\u0430, \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0439 \u0432\u044b\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u0435\u0441\u0442\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435) \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043e\u0444\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c, \u0432\u044b\u0431\u0440\u0430\u043b Pacemaker, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442 RedHat \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432. \u041e\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0442\u0435\u043c, \u0447\u0442\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":92571,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-92570","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043d\u0430 \u0431\u0430\u0437\u0435 PostgreSQL \u0438 Pacemaker | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-28T17:42:21+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-28T17:42:21+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Modellazione di cluster ad alta disponibilit\u00e0 basati su PostgreSQL e Pacemaker | ProHoster","description":"Introduzione Qualche tempo fa, mi \u00e8 stato chiesto di sviluppare un cluster ad alta disponibilit\u00e0 per PostgreSQL.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u043d\u0430 \u0431\u0430\u0437\u0435 PostgreSQL \u0438 Pacemaker | ProHoster","og:description":"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043b\u044f PostgreSQL.","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/modelirovanie-otkazoustojchivyh-klasterov-na-baze-postgresql-i-pacemaker","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-28T17:42:21+00:00","article:modified_time":"2020-08-28T17:42:21+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"92570","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:06:03","updated":"2022-09-29 15:28:29","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/92570","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=92570"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/92570\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/92571"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=92570"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=92570"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=92570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}