{"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 ad alta disponibilit\u00e0 basati su PostgreSQL e Pacemaker","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"vvedenie\">Introduzione<\/h1>\n<p><\/p>\n<p>Qualche tempo fa, mi \u00e8 stato affidato il compito di sviluppare un cluster resiliente per <noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\">PostgreSQL<\/a><\/noindex>, che opera in diversi data center collegati da fibra ottica all'interno della stessa citt\u00e0 e in grado di resistere a un guasto (come un'interruzione di corrente) di un data center. Ho scelto come software per la resilienza <noindex><a rel=\"nofollow\" href=\"https:\/\/clusterlabs.org\">Pacemaker<\/a><\/noindex>, perch\u00e9 \u00e8 la soluzione ufficiale di RedHat per creare cluster resilienti. \u00c8 vantaggioso poich\u00e9 RedHat fornisce supporto e perch\u00e9 \u00e8 una soluzione versatile (modulare). Con esso sar\u00e0 possibile garantire la resilienza non solo di PostgreSQL, ma anche di altri servizi, sia utilizzando moduli standard, sia creandoli per esigenze specifiche.<\/p>\n<p><\/p>\n<p>A questo punto \u00e8 sorto un legittimo interrogativo: quanto sar\u00e0 resiliente il cluster resiliente? Per esplorare questo aspetto, ho sviluppato un banco di prova che simula vari guasti sui nodi del cluster, attende il ripristino della funzionalit\u00e0, riporta online il nodo guasto e continua il test in ciclo. Inizialmente questo progetto si chiamava hapgsql, ma col tempo mi sono stancato di un nome con solo una vocale. Pertanto, ho iniziato a chiamare i database resilienti (e l'IP fluttuante che li indica) <strong>krogan<\/strong> (un personaggio di un videogioco, il cui corpo ha tutti gli organi principali duplicati), mentre nodi, cluster e il progetto stesso sono stati denominati <strong>tuchanka<\/strong> (il pianeta dove vivono i 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 con licenza MIT<\/a><\/noindex>. Il README sar\u00e0 presto tradotto in inglese (poich\u00e9 ci si aspetta che i principali utilizzatori siano gli sviluppatori di Pacemaker e PostgreSQL), mentre il precedente README in russo lo sistemer\u00f2 (parzialmente) sotto forma di questo articolo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellazione di cluster ad alta disponibilit\u00e0 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>. In totale saranno distribuite 12 macchine virtuali (per un totale di 36 GiB), che formeranno 4 cluster resilienti (diverse configurazioni). I primi due cluster sono composti da due server PostgreSQL, che si trovano in diversi data center, e da un server comune <em>witness<\/em> c <strong>quorum device<\/strong> (ospitato su una macchina virtuale economica in un terzo data center), che risolve l'incertezza <strong>50%\/50%<\/strong>, esprimendo il proprio voto a favore di una delle parti. Il terzo cluster \u00e8 distribuito su tre data center: un master, due slave, senza <strong>quorum device<\/strong>. Il quarto cluster \u00e8 composto da quattro server PostgreSQL, due per centro dati: uno master, gli altri repliche, e utilizza anche <em>witness<\/em> c <strong>quorum device<\/strong>. Il quarto supporta il guasto di due server o di un centro dati. Questa soluzione pu\u00f2 essere, se necessario, scalata a un maggior numero di repliche.<\/p>\n<p><\/p>\n<p>Servizio di ora esatta <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ntp.org\">ntpd<\/a><\/noindex> \u00e8 anch'esso configurato per la tolleranza ai guasti, ma utilizza il metodo stesso <code>ntpd<\/code> (<em>orphan mode<\/em>). Il server generale <em>witness<\/em> svolge il ruolo di server NTP centrale, distribuisce il suo tempo a tutti i cluster, sincronizzando cos\u00ec tutti i server tra loro. Se <em>witness<\/em> si guasta o risulta isolato, allora uno dei server del cluster (all'interno del cluster) inizier\u00e0 a distribuire il suo tempo. Un proxy di caching <strong>HTTP<\/strong> \u00e8 anch'esso attivo su <em>witness<\/em>, grazie al quale le altre macchine virtuali hanno accesso ai repository Yum. Nella realt\u00e0, servizi come l'ora esatta e il proxy saranno sicuramente ospitati su server dedicati, mentre nello stand sono ospitati su <em>witness<\/em> soltanto per risparmiare il 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 centri dati, uniti in una rete piatta e devono tollerare il guasto o l'isolamento di rete di un centro dati. Pertanto <strong>non \u00e8 possibile<\/strong> utilizzare per proteggersi da <strong>split-brain<\/strong> la tecnologia standard Pacemaker, chiamata <em>STONITH<\/em> (Shoot The Other Node In The Head) oppure <em>fencing<\/em>. Il principio \u00e8: se i nodi nel cluster iniziano a sospettare che un certo nodo possa avere dei problemi, non risponde o si comporta in modo anomalo, allora lo disattivano forzatamente tramite dispositivi \u201cesterni\u201d, ad esempio, una scheda di controllo IPMI o un UPS. Ma questo funziona solo se, in caso di guasto di un server singolo, IPMI o UPS continuano a funzionare. Qui si prevede una protezione contro un guasto molto pi\u00f9 catastrofico, quando fallisce (ad esempio, viene disalimentato) l'intero centro dati. E in caso di tale guasto, tutti <em>dispositivi stonith<\/em>(IPMI, UPS, ecc.) non funzioneranno nemmeno.<\/p>\n<p><\/p>\n<p>Invece, il sistema si basa sull'idea di quorum. Tutti i nodi hanno diritto di voto e possono lavorare solo quelli che vedono pi\u00f9 della met\u00e0 di tutti i nodi. Questo numero di 'met\u00e0+1' \u00e8 chiamato <strong>quorum<\/strong>. Se non si raggiunge il quorum, il nodo decide che si trova in isolamento di rete e deve disattivare le proprie risorse, cio\u00e8 \u00e8 una sorta di <strong>protezione contro lo split-brain<\/strong>. Se il software che gestisce questo comportamento non funziona, allora dovrebbe attivarsi il watchdog, ad esempio, sulla base di IPMI.<\/p>\n<p><\/p>\n<p>Se il numero di nodi \u00e8 pari (cluster in due data center), pu\u00f2 sorgere quella che viene chiamata incertezza. <strong>50%\/50%<\/strong> (<em>cinquanta e cinquanta<\/em>), quando l'isolamento di rete divide il cluster esattamente a met\u00e0. Pertanto, per un numero pari di nodi si aggiunge <strong>quorum device<\/strong> \u2014 un demone non esigente, che pu\u00f2 essere eseguito sulla virtual machine pi\u00f9 economica nel terzo data center. Esso d\u00e0 la propria voce a uno dei segmenti (che vede), e in tal modo risolve l'incertezza 50%\/50%. Il server su cui verr\u00e0 eseguito il dispositivo di quorum l'ho chiamato <em>witness<\/em> (terminologia di repmgr, mi \u00e8 piaciuta).<\/p>\n<p><\/p>\n<p>Le risorse possono spostarsi da un luogo all'altro, ad esempio, dai server guasti a quelli funzionanti, o su comando degli amministratori di sistema. Affinch\u00e9 i clienti sappiano dove si trovano le risorse di cui hanno bisogno (dove collegarsi?), si utilizzano <em>IP fluttuanti<\/em> (<strong>float IP<\/strong>). Questi sono IP che Pacemaker pu\u00f2 spostare tra i nodi (tutto si trova in una rete piatta). Ognuno di essi simboleggia una risorsa (servizio) e si trover\u00e0 l\u00ec dove \u00e8 necessario collegarsi per accedere a questo servizio (nel nostro caso al DB).<\/p>\n<p><\/p>\n<h2 id=\"tuchanka1-shema-s-uplotneniem\">Tuchanka1 (schema di sigillatura)<\/h2>\n<p><\/p>\n<h3 id=\"struktura\">Struttura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellazione di cluster ad alta disponibilit\u00e0 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 che abbiamo molte piccole banche dati con un carico basso, per le quali non \u00e8 conveniente mantenere un server slave dedicato in modalit\u00e0 hot standby per le transazioni in sola lettura (non c'\u00e8 bisogno di uno spreco di risorse simile).<\/p>\n<p><\/p>\n<p>In ogni data center c'\u00e8 un server. Su ogni server ci sono due istanze di PostgreSQL (nella terminologia di PostgreSQL si chiamano cluster, ma per evitare confusione li chiamer\u00f2 istanze (analogamente ad altri database), e solo i cluster di Pacemaker saranno definiti cluster). Un'istanza opera in modalit\u00e0 master e solo essa fornisce servizi (su di essa c'\u00e8 un float IP). La seconda istanza opera come slave per il secondo data center e fornir\u00e0 servizi solo se il suo master dovesse guastarsi. Poich\u00e9 per la maggiore parte del tempo fornir\u00e0 servizi (eseguendo query) solo un'istanza su due (il master), tutte le risorse del server sono ottimizzate per il master (viene allocata memoria per il cache shared_buffers, ecc.), ma in modo che anche la seconda istanza abbia sufficienti risorse (anche se per un'operazione non ottimale tramite la cache del filesystem) nel caso di un guasto di uno dei data center. Lo slave non fornisce servizi (non esegue query in sola lettura) durante il normale funzionamento del cluster, per evitare conflitti per le risorse con il master sulla stessa macchina.<\/p>\n<p><\/p>\n<p>Nel caso di due nodi, la tolleranza ai guasti \u00e8 possibile solo con la replica asincrona, poich\u00e9 con la replica sincrona il guasto dello slave porter\u00e0 all'arresto 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 ad alta disponibilit\u00e0 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>quorum device<\/em>) considerer\u00f2 solo per il cluster Tuchanka1, con tutti gli altri sar\u00e0 la stessa storia. In caso di guasto del witness, la struttura del cluster non cambier\u00e0, continuer\u00e0 a funzionare come ha sempre fatto. Ma il quorum diventer\u00e0 2 su 3, e quindi qualsiasi guasto successivo diventer\u00e0 fatale per il cluster. Sar\u00e0 comunque necessario ripararlo urgentemente.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka1\">Guasto Tuchanka1<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellazione di cluster ad alta disponibilit\u00e0 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>witness<\/em> d\u00e0 il suo voto al secondo nodo nel secondo data center. Qui l'ex slave si trasforma in master, quindi su un server funzionano entrambi i master e su di essi puntano entrambi i 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 ad alta disponibilit\u00e0 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 di due nodi. Su uno funziona il master, sull'altro lo slave. Entrambi possono eseguire query (lo slave solo in sola lettura), quindi su entrambi ci sono float IP: krogan2 \u2014 sul master, krogan2s1 \u2014 sullo slave. La tolleranza ai guasti 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 replica asincrona, poich\u00e9 con la replica sincrona il guasto dello slave 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 ad alta disponibilit\u00e0 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>witness<\/em> vota per il secondo. Sul data center attualmente funzionante verr\u00e0 attivato un master, e su di esso verranno puntati entrambi gli IP float: quello master e quello slave. Ovviamente, l'istanza deve essere configurata in modo tale da avere risorse sufficienti (limiti per connessione, ecc.) per gestire simultaneamente tutte le connessioni e le richieste provenienti dall'IP float master e slave. Quindi, durante il normale funzionamento, deve avere un adeguato margine sui limiti.<\/p>\n<p><\/p>\n<h2 id=\"tuchanka4-mnogo-rabov\">Tuchanka4 (molti schiavi)<\/h2>\n<p><\/p>\n<h3 id=\"struktura-2\">Struttura<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellazione di cluster ad alta disponibilit\u00e0 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>\u00c8 gi\u00e0 un'altra estremit\u00e0. Ci sono DB che ricevono un numero molto elevato di richieste in sola lettura (un caso tipico di un sito ad alta capacit\u00e0). Tuchanka4 \u00e8 una situazione in cui possono esserci tre o pi\u00f9 schiavi per gestire tali richieste, ma comunque non troppi. Con un numero molto elevato di schiavi sar\u00e0 necessario inventare un sistema gerarchico di replica. Nel caso minimo (nella figura), in ciascuno dei due data center ci sono due server, ciascuno con un'istanza di PostgreSQL.<\/p>\n<p><\/p>\n<p>Un'altra caratteristica di questo schema \u00e8 che qui si pu\u00f2 organizzare una replica sincrona. Essa \u00e8 configurata per replicare, se possibile, in un altro data center, piuttosto che su una replica nello stesso data center dove si trova il master. Sia il master che ogni schiavo hanno un IP float. A dire il vero, tra gli schiavi bisogna implementare un bilanciamento delle richieste con qualche <em>sql proxy<\/em>, ad esempio, lato cliente. Diversi tipi di clienti possono avere bisogno di un diverso tipo <em>sql proxy<\/em>, e solo gli sviluppatori dei client sanno chi ha bisogno di cosa. Questa funzionalit\u00e0 pu\u00f2 essere realizzata sia come demone esterno, sia come libreria client (connection pool), ecc. Tutto ci\u00f2 esula dall'argomento del cluster DB altamente disponibile (l'alta disponibilit\u00e0 <em>SQL proxy<\/em> pu\u00f2 essere realizzata indipendentemente, insieme all'alta disponibilit\u00e0 del client).<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka4\">Guasto di Tuchanka4<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellazione di cluster ad alta disponibilit\u00e0 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 guasto di un data center (cio\u00e8 di due server), il testimone vota per il secondo. Di conseguenza, nel secondo data center operano due server: su uno c'\u00e8 il master, e su di esso punta l'IP float master (per ricevere richieste read-write); sull'altro server opera uno schiavo con replica sincrona, e su di esso punta uno degli IP float slave (per richieste in sola lettura).<\/p>\n<p><\/p>\n<p>La prima cosa da notare \u00e8 che l'IP float slave non sar\u00e0 solo uno, ma solo uno. E per un funzionamento corretto con esso sar\u00e0 necessario che <em>sql proxy<\/em> reindirizzava tutte le richieste all'unico float IP rimanente; e se <em>sql proxy<\/em> no, \u00e8 possibile elencare tutti i float IP dei server slave separandoli con una virgola nell'URL di connessione. In questo caso con <em>libpq<\/em> la connessione avverr\u00e0 al primo IP funzionante, come impostato nel sistema di test automatico. Potrebbe non funzionare in altre librerie, ad esempio JDBC, e sar\u00e0 necessario <em>sql proxy<\/em>. Questo \u00e8 stato fatto perch\u00e9 per gli float IP dei server slave \u00e8 vietato essere attivi contemporaneamente su un singolo server, in modo che vengano distribuiti uniformemente tra i server slave, qualora ce ne siano pi\u00f9 di uno attivo.<\/p>\n<p><\/p>\n<p>Secondo: anche in caso di guasto del data center verr\u00e0 mantenuta la replica sincrona. E anche se si verifica un guasto secondario, cio\u00e8 se uno dei due server nel data center rimanente si guasta, il cluster, pur smettendo di fornire servizi, manterr\u00e0 comunque le informazioni su tutte le transazioni confermate, per le quali ha dato 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 ad alta disponibilit\u00e0 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 situazioni in cui ci sono tre data center completamente operativi, ognuno dei quali ha un server DB completamente funzionante. In questo caso <em>quorum device<\/em> non \u00e8 necessario. In un data center opera il master, negli altri due \u2014 gli slave. La replica \u00e8 sincrona, di tipo ANY (slave1, slave2), cio\u00e8 al cliente verr\u00e0 fornita una conferma di commit quando uno qualsiasi degli slave risponder\u00e0 per primo di aver accettato il commit. Le risorse sono indicate da un float IP per il master e due per gli slave. A differenza di Tuchanka4, tutti e tre gli float IP sono a prova di guasto. Per bilanciare le query SQL read-only \u00e8 possibile utilizzare <em>sql proxy<\/em> (con resistenza individuale), oppure si pu\u00f2 assegnare un float IP slave a met\u00e0 dei clienti e un altro float IP slave all'altra met\u00e0.<\/p>\n<p><\/p>\n<h3 id=\"otkaz-tuchanka3\">Guasto Tuchanka3<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modellazione di cluster ad alta disponibilit\u00e0 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>In caso di guasto di uno dei data center, ne rimangono due. In uno \u00e8 attivo il master e il float IP del master, nell'altro \u2014 lo slave e entrambi i float IP slave (l'istanza deve avere una riserva di risorse doppia, per accettare tutte le connessioni da entrambi i float IP slave). Tra il master e lo slave c'\u00e8 replica sincrona. Inoltre, il cluster manterr\u00e0 le informazioni sulle transazioni confermate e registrate (non ci sar\u00e0 perdita di informazioni) in caso di distruzione di due data center (se non vengono distrutti contemporaneamente).<\/p>\n<p><\/p>\n<p><em>Ho deciso di non inserire una descrizione dettagliata della struttura dei file e del deployment. Chi vuole sperimentare, pu\u00f2 leggere tutto questo nel README. Riporto solo la descrizione dei test automatici.<\/em><\/p>\n<p><\/p>\n<h1 id=\"sistema-avtomaticheskogo-testirovaniya\">Sistema di test automatici<\/h1>\n<p><\/p>\n<p>Per verificare la resilienza dei cluster con simulazione di vari guasti, \u00e8 stato creato un sistema di test automatici. 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, questo comando:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">test\/failure 2 3<\/code><\/pre>\n<p><\/p>\n<p>tester\u00e0 solo il secondo e il terzo cluster. Se i parametri non sono specificati, verranno testati tutti i cluster. Tutti i cluster vengono testati parallelamente e il risultato viene visualizzato nel pannello tmux. Tmux utilizza un server tmux dedicato, quindi lo script pu\u00f2 essere eseguito da tmux predefinito, risultando in un tmux annidato. Consiglio di utilizzare un terminale in una finestra grande e con un carattere piccolo. Prima di iniziare i 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 ad alta disponibilit\u00e0 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 diviso in colonne in base al numero di cluster in fase di test, di default (nello screenshot) ce ne sono quattro. Il contenuto delle colonne verr\u00e0 descritto con l'esempio di 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 nome del test (funzione nello script) che simula un guasto.<\/li>\n<li><strong>reaction<\/strong> \u2014 tempo medio in secondi, che indica quanto tempo ha impiegato il cluster a ripristinare le sue funzionalit\u00e0. Viene misurato dall'inizio dell'esecuzione dello script che simula il guasto fino a quando il cluster ripristina le sue capacit\u00e0 e pu\u00f2 continuare a fornire servizi. Se il tempo \u00e8 molto breve, ad esempio sei secondi (cosa che accade nei cluster con pi\u00f9 schiavi (Tuchanka3 e Tuchanka4)), significa che il guasto ha interessato un slave asincrono e non ha influenzato affatto il funzionamento, non ci sono stati cambiamenti nello stato del cluster.<\/li>\n<li><strong>deviation<\/strong> \u2014 indica la dispersione (precisione) del valore <strong>reaction<\/strong> attraverso il \"metodo della deviazione standard\".<\/li>\n<li><strong>count<\/strong> \u2014 quante volte \u00e8 stato eseguito questo test.<\/li>\n<\/ul>\n<\/li>\n<li>Il diario sintetico consente di valutare cosa sta facendo il cluster in questo momento. Viene visualizzato il numero dell'iterazione (test), un timestamp e il nome dell'operazione. Un'esecuzione troppo lunga (&gt; 5 minuti) indica un qualche problema.<\/li>\n<li><strong>heart<\/strong> (cuore) \u2014 tempo attuale. Per valutare visivamente le prestazioni <em>maestro<\/em> nella sua tabella viene continuamente scritto il tempo attuale utilizzando l'IP float del maestro. In caso di successo, il risultato viene mostrato in questo pannello.<\/li>\n<li><strong>battito<\/strong> (pulsazione) \u2014 \u00abtempo attuale\u00bb, che era stato precedentemente registrato dallo script <strong>heart<\/strong> nel maestro, ora letto da <em>schiavo<\/em> attraverso il suo IP float. Permette di valutare visivamente le prestazioni dello schiavo e la replica. In Tuchanka1 non ci sono schiavi con IP float (nessuno schiavo che offre servizi), ma ci sono due istanze (DB), quindi qui non verr\u00e0 mostrato <strong>battito<\/strong>, ma <strong>heart<\/strong> la seconda istanza.<\/li>\n<li>Monitoraggio dello stato del cluster utilizzando 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 pannelli \u2014 quanti virtual machine ha il cluster. Due grafici <em>Carico CPU<\/em> (nelle virtual machine ci sono due processori), nome della virtual machine, <em>Carico di Sistema<\/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 o ciclo di attesa infinito \u2014 qui sar\u00e0 possibile vedere la causa di questo comportamento.<\/li>\n<\/ol>\n<p><\/p>\n<p>I test vengono eseguiti in due fasi. Prima lo script passa attraverso tutte le variet\u00e0 di test, scegliendo casualmente la virtual machine a cui applicare il test. Poi viene eseguito un ciclo di test infinito, le virtual machine e il malfunzionamento vengono ogni volta scelti casualmente. Un'interruzione improvvisa dello script di test (pannello inferiore) o un ciclo di attesa infinito per qualcosa (&gt; 5 minuti di tempo di esecuzione per un'operazione, questo \u00e8 visibile nel tracciamento) 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 emula un malfunzionamento.<\/li>\n<li><strong>Pronto?<\/strong> \u2014 attesa del ripristino delle prestazioni del cluster (quando vengono forniti tutti i servizi).<\/li>\n<li>Viene mostrato il tempo di attesa per il ripristino del cluster (<em>reaction<\/em>).<\/li>\n<li><strong>Riparare<\/strong> \u2014 il cluster \u00ab\u00e8 in riparazione\u00bb. Dopo di che dovrebbe tornare a uno stato completamente operativo e pronto per il prossimo malfunzionamento.<\/li>\n<\/ol>\n<p><\/p>\n<p>Ecco l'elenco dei test con la descrizione di ci\u00f2 che fanno:<\/p>\n<p><\/p>\n<ul>\n<li><strong>ForkBomb<\/strong>: crea un errore &quot;Out of memory&quot; con una fork bomb.<\/li>\n<li><strong>OutOfSpace<\/strong>: il disco \u00e8 pieno. Tuttavia, il test \u00e8 piuttosto simbolico, data la leggera carico generato durante il test; di solito, quando il disco \u00e8 pieno, PostgreSQL non va in errore.<\/li>\n<li><strong>Postgres-KILL<\/strong>: uccide 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>: <code>VBoxManage controlvm &quot;macchina virtuale&quot; poweroff<\/code>.<\/li>\n<li><strong>Reset<\/strong>: riavvia la macchina virtuale 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 macchina virtuale un comando via SSH <code>systemctl poweroff<\/code>, il sistema termina correttamente l'operazione.<\/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>Terminazione del test utilizzando il comando standard tmux &quot;kill-window&quot; <strong>Ctrl-b &amp;<\/strong>, oppure con il comando &quot;detach-client&quot; <strong>Ctrl-b d<\/strong>: in questo modo il test si completa, tmux si chiude, le macchine virtuali si spengono.<\/p>\n<p><\/p>\n<h1 id=\"vyyavlennye-pri-testirovanii-problemy\">Problemi rilevati 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 i loro blocchi. E, di conseguenza, gestisce in modo errato i malfunzionamenti che portano a blocchi solo <em>Corosync<\/em> e <em>Pacemaker<\/em>, ma che non li sospendono <em>sbd<\/em>. Per verifica <em>Corosync<\/em> gi\u00e0 un <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClusterLabs\/sbd\/pull\/83\"><strong>PR#83<\/strong> (su GitHub da <em>sbd<\/em>)<\/a><\/noindex>, \u00e8 stato accettato nel ramo <em>master<\/em>. \u00c8 stato promesso (in PR#83) che ci sar\u00e0 qualcosa di simile anche per Pacemaker, spero che entro <em>RedHat 8<\/em> lo faranno. Ma tali \"malfunzionamenti\" sono ipotetici 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 stata impostata in modo errato <em>sync_timeout<\/em> a <em>quorum device<\/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 si riavviava anche il secondo nodo<\/a><\/noindex>, su cui il master avrebbe dovuto migrare. Questo \u00e8 stato risolto aumentando <em>sync_timeout<\/em> a <em>quorum device<\/em> durante il deploy (allo 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 indeterminato), che questo timeout venga calcolato automaticamente.<\/p>\n<p>\n<\/li>\n<li>\n<p>Se, durante la configurazione del database, \u00e8 stato specificato che <code>LC_MESSAGES<\/code> (messaggi di testo) pu\u00f2 utilizzare Unicode, ad esempio, <code>ru_RU.UTF-8<\/code>, allora, durante l'esecuzione <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 verranno visualizzati dei punti interrogativi al posto dei caratteri UTF-8.<\/a><\/noindex>Gli sviluppatori PostgreSQL non hanno mai deciso cosa fare in questo caso. Si risolve impostando <code>LC_MESSAGES=en_US.UTF-8<\/code> configurando (creando) un'istanza del DB.<\/p>\n<p>\n<\/li>\n<li>\n<p>Se \u00e8 impostato wal_receiver_timeout (di default \u00e8 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 ferma non solo il worker, ma anche il nuovo master. Si aggira impostando wal_receiver_timeout=0 durante la configurazione di PostgreSQL.<\/p>\n<p>\n<\/li>\n<li>\n<p>Raramente ho notato un'impasse della replica su PostgreSQL nel 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 i worker 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 di tempo (circa due ore). \u00c8 necessaria un'ulteriore indagine per risolvere questo problema. Dai sintomi sembra un bug precedente, causato da un'altra motivazione, ma con le stesse conseguenze.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>L'immagine del krogan \u00e8 stata presa 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 ad alta disponibilit\u00e0 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.1.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.1.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 Alcuni 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}]}}