{"id":198,"date":"2018-12-11T20:31:15","date_gmt":"2018-12-11T19:31:15","guid":{"rendered":"http:\/\/linuxboxen2.dk\/?p=198"},"modified":"2018-12-11T20:31:15","modified_gmt":"2018-12-11T19:31:15","slug":"postgresql-replication-og-hot-standby","status":"publish","type":"post","link":"https:\/\/www.linuxboxen.dk\/?p=198","title":{"rendered":"PostgreSQL Replication og Hot Standby"},"content":{"rendered":"\n<p>Denne artikel beskriver, hvordan setup PostgreSQL Replication og Hot Standby p\u00e5 to Amazon EC2 forekomster, der k\u00f8rer Ubuntu. Jeg tilbragte god luns af tid p\u00e5 at l\u00e6re disse tricks i sidste to uger, for at gennemf\u00f8re High Availability l\u00f8sning til 3DTin databaseserver. Standby node kan tage over, n\u00e5r main node g\u00e5r ned, som den gjorde sidste m\u00e5ned under elektrisk udfald p\u00e5 Amazon EC2 \u00f8stkyst datacentre. 3DTin var nede i 6 timer under nedbruddet, og siden da har vi v\u00e6ret gennemf\u00f8relsen foranstaltninger for at undg\u00e5, at det sker igen i fremtiden. Dette indl\u00e6g kan hj\u00e6lpe andre web-udviklere at bygge robuste cloud backends s\u00e5 godt.<\/p>\n\n<p>Replikation teknik, der anvendes her, er blevet tilg\u00e6ngelige i PostgreSQL kun siden version 9.1. Der er flere blogindl\u00e6g og f\u00e5 b\u00f8ger, der beskriver det, men de forklarer ikke alt, hvad der er n\u00f8dvendigt. Jeg fandt en forklaring af disse ops\u00e6tninger i &#8220;PostgreSQL 9 Administration Kogebog&#8221; meget nyttig. Jeg pr\u00f8vede alle de replikation opskrifter er beskrevet i denne bog om to VM&#8217;er p\u00e5 min b\u00e6rbare computer. Efter at have g\u00e5et gennem 7 forskellige database klynger, der hver bruges til at teste anden opskrift, jeg fik en god styr p\u00e5 de ting. I dag har vi med succes oprettet denne replikering l\u00f8sning p\u00e5 3DTin produktions-database. Med detaljerne frisk i tankerne vil jeg gerne dokumentere alle trinene for fremtidig reference, og i h\u00e5b om at det ogs\u00e5 kan hj\u00e6lpe andre, eftersom dokumentationen om dette emne endnu ikke er rigelige.<br>\nOps\u00e6tning<\/p>\n\n<p>Instruktionerne her bruger Ubuntu 11.10 32-bit server med PostgreSQL 9.1.4 (Ubuntu 12.04 vil g\u00f8re det s\u00e5 godt med alle PostgreSQL versionen 9.1.x).<\/p>\n\n<p>Vi kommer til at forberede 2 v\u00e6rter, en master og en anden standby. Hvis du bruger Amazon EC2 ligesom os, du \u00f8nsker at k\u00f8re disse to v\u00e6rter i to forskellige Tilg\u00e6ngelighed zoner. Det er vigtigt, hvis dit m\u00e5l er h\u00f8j tilg\u00e6ngelighed. Enhver utilsigtet nedetid er ikke meningen at ber\u00f8re mere end \u00e9n Amazon EC2 tilg\u00e6ngelighed zoner samtidigt. Derfor, hvis en af \u200b\u200bv\u00e6rten g\u00e5r ned, kan du bringe dine applikationsservere i en anden zone, hvor dit standby DB server k\u00f8rer. Du kan ogs\u00e5 s\u00e6tte dem i to forskellige regioner, men det vil koste dig mere i netv\u00e6rk b\u00e5ndbredde.<br>\nForberedelse<\/p>\n\n<p>Installer f\u00f8lgende pakker p\u00e5 Ubuntu 11.10\/12.04<\/p>\n\n<p>postgresql-9.1<br>\npostgresql-client-9.1<br>\npostgresql-bidraget 9.1<\/p>\n\n<p>Postgres brugerkonto<\/p>\n\n<p>Installation disse pakker vil automatisk skabe Postgres brugerkonto.<\/p>\n\n<p>Alle f\u00f8lgende kommandoer formodes at blive henrettet som Postgres bruger. Af sikkerhedsm\u00e6ssige \u00e5rsager denne konto ikke har nogen adgangskode (ligesom root-kontoen p\u00e5 Ubuntu). Hvis du arbejder i testmilj\u00f8, kan du angive en adgangskode for Postgres med<\/p>\n\n<p>sudo passwd Postgres<\/p>\n\n<p>Derefter udf\u00f8re alle f\u00f8lgende kommandoer ved at logge ind som Postgres<\/p>\n\n<p>su &#8211; Postgres<\/p>\n\n<p>Hvis du er p\u00e5 produktions server selv, kan du \u00f8nsker at forlade Postgres passwordless. I stedet k\u00f8re alle f\u00f8lgende kommandoer med sudo-u Postgres forangivet. Jeg kommer til at udelade det fra alle kommando for bekvemmelighed.<br>\nPassword-mindre ssh logins<\/p>\n\n<p>MASTER server skal kunne f\u00e5 adgang til STANDBY l\u00f8bet ssh uden password. Mere pr\u00e6cist &#8211; Postgres konto p\u00e5 MASTER b\u00f8r v\u00e6re i stand til at f\u00e5 adgang Postgres konto p\u00e5 STANDBY uden password. Dette er n\u00f8dvendigt for rsync operation i bunden-backup trin (forklares nedenfor)<\/p>\n\n<p>Du kan g\u00f8re det ved hj\u00e6lp af ssh-copy-id nytte.<\/p>\n\n<p>P\u00e5 Master l\u00f8b<br>\nssh-copy-id &lt;IP_OF_STANDBY_SERVER&gt;<\/p>\n\n<p>Du kan ogs\u00e5 angive brugeren i ovenst\u00e5ende kommando, men jeg bevidst udeladt det, fordi det anbefales, at p\u00e5 begge maskiner du g\u00f8r disse operationer under samme brugerkonto Postgres. Ikke at n\u00e6vne, at brugeren vil g\u00f8re kommandoen login til remote maskine med samme brugernavn, som du i \u00f8jeblikket er logget ind p\u00e5 denne maskine (eller n\u00e6vnt i sudo-u).<\/p>\n\n<p>I tilf\u00e6lde af failover, MASTER server og STANDBY server vil v\u00e6re at skifte roller, derfor l\u00f8be ssh-copy-id fra den nuv\u00e6rende STANDBY server, s\u00e5 den kan f\u00e5 adgang til aktuelle MASTER server uden password ogs\u00e5.<br>\nUbuntu specifikke PostgreSQL konventioner<\/p>\n\n<p>P\u00e5 ubuntu en PostgreSQL database instans kaldes klynge. M\u00e5 ikke forveksle det med multi-node konfiguration af servere eller endda en vis SQL s\u00f8geord. Det er simpelthen en forekomst af PostgreSQL-server, der k\u00f8rer p\u00e5 en bestemt port og gemmer sine data i sin egen mappe (standard er \/ var\/lib\/postgresql\/9.1 \/ &lt;cluster-name&gt; &#8211; ogs\u00e5 indstillet til PGDATA milj\u00f8variabel i forskellige scripts).<\/p>\n\n<p>Ubuntu kommer med pg_createcluster, pg_ctlcluster, pg_lscluster CLI kommandoer til at hj\u00e6lpe dig med at administrere disse klynger. Du skal bruge pg_ctlcluster til at starte, stoppe, genindl\u00e6se databasen instans.<\/p>\n\n<p>Hver klynge har ogs\u00e5 sit eget s\u00e6t af konfigurationsfiler gemt i \/ etc\/postgresql\/9.1 \/ &lt;cluster-name&gt;. Vi bliver n\u00f8dt til at \u00e6ndre kun to af dem: pg_hba.conf og postgresql.conf.<\/p>\n\n<p>For at holde tingene enkle, er det bedre, hvis du s\u00f8rge for, at $ PGDATA er ens p\u00e5 b\u00e5de MASTER-og standby-servere. (Side note: Om produktion server $ PGDATA forventes at blive monteret p\u00e5 en separat bog)<br>\nReplication med streaming Log Shipping og Hot Standby<\/p>\n\n<p>Der er mange forskellige konfigurationer, som du kan f\u00f8lge for at opn\u00e5 replikation p\u00e5 tv\u00e6rs af to PostgreSQL tilf\u00e6lde. Hver har sine egne fordele og faldgruber. Den teknik, vi vil bruge, er kendt som &#8216;streaming Log Shipping &#8220;og&#8221; Hot Standby &#8220;i Admin kogebog jeg n\u00e6vnte tidligere. Denne ops\u00e6tning virker mest optimalt i form af umiddelbar replikation (dvs. mindste vindue for tab af data), og minimum networking trafik (og dermed billigere).<\/p>\n\n<p>Denne konfiguration er Master-Slave art. Slaven eller STANDBY server kan bruges til at s\u00f8ge i databasen, men du kan ikke g\u00f8re nogen skriver til den. Denne konfiguration er ikke, hvad der er kendt som &#8220;Multi Master&#8221; konfiguration. Mesteren vil acceptere alle l\u00e6se og skrive foresp\u00f8rgsler fra dine applikationsservere. Standby server vil kopiere nye \u00e6ndringer fra Master med minimal forsinkelse. Det vil kun v\u00e6re tilg\u00e6ngelig for read-only foresp\u00f8rgsler i Standby-tilstand. N\u00e5r Master g\u00e5r ned, eller vi bringer det ned af andre \u00e5rsager, kan vi fort\u00e6lle Standby server til at blive Master ved at oprette en touch-fil (forklaret senere). Efter dette punkt ab Standby server vil stoppe efter den oprindelige master og vil nu v\u00e6re klar til at acceptere l\u00e6se-skrive foresp\u00f8rgsler, vil det s\u00e5 v\u00e6re den nye Master.<br>\nLad os starte<\/p>\n\n<p>Hvis du allerede har en PostgreSQL-database, der k\u00f8rer p\u00e5 produktions-server, vil det v\u00e6re din nuv\u00e6rende MASTER server. Men bem\u00e6rk, at vi kommer til at konfigurere b\u00e5de MASTER og standbytiden maskiner identisk som muligt, fordi du \u00f8nsker at g\u00f8re en af \u200b\u200bdem MASTER i tilf\u00e6lde anden g\u00e5r ned og skifte tilbage, n\u00e5r det kommer op igen.<\/p>\n\n<p>Lad os starte med den nuv\u00e6rende MASTER l\u00f8be og STANDBY stoppet.<\/p>\n\n<p>P\u00e5 MASTER skaber replicator bruger. STANDBY server vil logge p\u00e5 MASTER ved hj\u00e6lp af denne konto til at l\u00e6se seneste \u00e6ndringer, som det har at replikere. Du b\u00f8r ikke g\u00f8re dette skridt p\u00e5 nuv\u00e6rende STANDBY server, selv om det m\u00e5ske engang blive en ny mester. Det er fordi i l\u00f8bet af basen backup trin Replicator brugerrolle vil blive kopieret til STANDBY server automatisk.<\/p>\n\n<p>psql-c &#8220;CREATE USER duplikatorer superbruger LOG FORBINDELSE LIMIT 1 krypterede password &#8216;changeme\u00ab &#8220;<\/p>\n\n<p>Rediger pg_hba.conf p\u00e5 b\u00e5de MASTER og STANDBY server ved at tilf\u00f8je denne linje. Det fort\u00e6ller de respektive PostgreSQL forekomster til at acceptere forbindelse fra andet knudepunkt for replikation form\u00e5l.<\/p>\n\n<p>host replikation replikator &lt;IP_OF_OTHER_HOST&gt; \/ 32 md5<\/p>\n\n<p>Rediger postgresql.conf p\u00e5 b\u00e5de MASTER og standbytiden servere og f\u00f8je f\u00f8lgende linjer til det. (Check, om disse muligheder allerede er indstillet til forskellige v\u00e6rdier andre steder i filen)<\/p>\n\n<p>hot_standby = on<br>\nmax_wal_senders = 1<br>\nwal_level = &#8216;hot_standby&#8217;<br>\narchive_mode = on<br>\narchive_command = &#8216;cd&#8217;.<br>\nlisten_addresses = &#8216;localhost, &lt;IP_ADDRESS_OF_THIS_NODE&gt;&#8217;<\/p>\n\n<p>P\u00e5 dette tidspunkt genstart MASTER. M\u00e5 ikke begynde STANDBY endnu<\/p>\n\n<p>N\u00e6ste vi kommer til at udf\u00f8re basen backup fra MASTER til STANDBY<\/p>\n\n<p>BACKUP_LABEL = &#8220;base-backup&#8221;<\/p>\n\n<p>psql-p $ PORT-c &#8220;select pg_start_backup (&#8216;$ BACKUP_LABEL&#8217;);&#8221;<br>\nrsync-CVA &#8211; inplace &#8211; exclude = * pg_xlog * $ PGDATA \/ &lt;IP_OF_OTHER_HOST&gt;: $ PGDATA \/<br>\npsql-p $ PORT-c &#8220;select pg_stop_backup ();&#8221;<\/p>\n\n<p>Det anbefales, at du s\u00e6tte dette i et bash script, s\u00e5 det kan k\u00f8res hurtigt og gentagne gange uden fejl.<\/p>\n\n<p>P\u00e5 STANDBY oprette en recovery.conf fil i $ PGDATA og tilf\u00f8je f\u00f8lgende linier til det.<\/p>\n\n<p>standby_mode = &#8216;on&#8217;<br>\nprimary_conninfo = &#8216;host = &lt;IP_OF_OTHER_HOST&gt; port = $ PORT user = replikator password = changeme&#8217;<br>\ntrigger_file = &#8216;\/ tmp \/ postgresql.trigger. $ PORT&#8217;<\/p>\n\n<p>Nu starter STANDBY server.<\/p>\n\n<p>P\u00e5 dette tidspunkt kan du tjekke logfilen (\/ var\/log\/postgresql\/postgresql-9.1- &lt;cluster-name&gt;. Log) for at kontrollere tingene<\/p>\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;P\u00e5 STANDBY kigge efter en beskeden &#8220;streaming replikation forbundet til prim\u00e6r&#8221;.<br>\n&nbsp;&nbsp;&nbsp;&nbsp;Ligeledes b\u00f8r du se &#8220;wal receiver-processen&#8221; p\u00e5 standby og &#8220;wal afsender processen&#8221; p\u00e5 MASTER.<br>\n&nbsp;&nbsp;&nbsp;&nbsp;Endelig k\u00f8re nogle foresp\u00f8rgsler mod STANDBY server for at verificere den indeholder samme data som MASTER.<\/p>\n\n<p>Hvis det ikke virker, skal du kontrollere firewall regler i Amazon EC2 Security Groups.<br>\nS\u00e5dan g\u00f8r Failover \/ Switchover<\/p>\n\n<p>Ops\u00e6tning af systemet til h\u00f8j tilg\u00e6ngelighed er til nogen nytte, hvis du kommer til at vente til selve katastrofen til at strejke, f\u00f8r du pr\u00f8ver inddrivelsen. Derfor b\u00f8r du pr\u00f8ve ovenst\u00e5ende trin i testmilj\u00f8et og simulere katastrofer.<\/p>\n\n<p>Hvis MASTER ikke er nede, skal du s\u00f8rge for at stoppe det f\u00f8rst, f\u00f8r du fort\u00e6ller STANDBY at tage den rolle. Dette er for at undg\u00e5, at MASTER fra at behandle yderligere sp\u00f8rgsm\u00e5l, der f\u00f8rer til en split-hjerne problem.<\/p>\n\n<p>Du kan sl\u00e5 STANDBY til en MASTER ved blot at r\u00f8re en trigger-fil, der blev n\u00e6vnt i recovery.conf, \/ tmp \/ postgresql.trigger. $ PORT.<\/p>\n\n<p>Nu, STANDBY har forvandlet til MASTER, punkt dine applikationsservere til det. Selv hvis din gamle MASTER k\u00f8rer p\u00e5 dette tidspunkt, er den nye MASTER ikke kommer til at replikere eventuelle \u00e6ndringer fra det. Derfor er det n\u00f8dvendigt, at du stopper den gamle mester, f\u00f8r du sp\u00f8rger STANDBY at blive den nye MASTER.<\/p>\n\n<p>Du kan fort\u00e6lle, at STANDBY blevet MASTER fra meddelelserne i logfilen, der l\u00e6ser &#8220;arkiv recovery f\u00e6rdig. database system er klar til at acceptere forbindelser. &#8220;<br>\nS\u00e5dan g\u00f8r Switchback<\/p>\n\n<p>Efter nogle nedetid eller vedligeholdelse periode er din master-node op igen, og du \u00f8nsker at g\u00f8re rutschebane. Du kommer til at f\u00f8rst dreje denne knude i standby. I denne tilstand vil det hamle op med den aktuelle MASTER kopiere de \u00e6ndringer, der fandt sted, mens det var nede. S\u00e5 vi henvise til det som den nuv\u00e6rende STANDBY nu.<\/p>\n\n<p>Peform Base backup fra den aktuelle MASTER til aktuelle STANDBY<\/p>\n\n<p>BACKUP_LABEL = &#8220;base-backup&#8221;<\/p>\n\n<p>psql-p $ PORT-c &#8220;select pg_start_backup (&#8216;$ BACKUP_LABEL&#8217;);&#8221;<br>\nrsync-CVA &#8211; inplace &#8211; exclude = * pg_xlog * $ PGDATA \/ &lt;IP_OF_OTHER_HOST&gt;: $ PGDATA \/<br>\npsql-p $ PORT-c &#8220;select pg_stop_backup ();&#8221;<\/p>\n\n<p>Opret recovery.conf i $ PGDATA p\u00e5 aktuel STANDBY<\/p>\n\n<p>standby_mode = &#8216;on&#8217;<br>\nprimary_conninfo = &#8216;host = &lt;IP_OF_OTHER_HOST&gt; port = $ PORT user = replikator password = changeme&#8217;<br>\ntrigger_file = &#8216;\/ tmp \/ postgresql.trigger. $ PORT&#8217;<\/p>\n\n<p>Efter fangsten op er overst\u00e5et, kan du sl\u00e5 den aktuelle STANDBY ind MASTER ved at f\u00f8lge ovenst\u00e5ende overgangen procedure &#8211; ved udl\u00f8seren fil.<\/p>\n\n<p>Ud over at v\u00e6re en forsikring mod katastrofer, kan STANDBY server ogs\u00e5 bruges til load balancing form\u00e5l. Du kan konfigurere app servere for at sprede deres l\u00e6se foresp\u00f8rgsler p\u00e5 tv\u00e6rs af Mesteren og Standby servere. V\u00e6rkt\u00f8jer som pgpool giver den slags anl\u00e6g.<\/p>\n\n<p>N\u00e5r du f\u00e5r behagelige omgivelser op en grundl\u00e6ggende to node replikation og hot standby-ordningen, kan du g\u00e5 videre til avancerede konfigurationer ogs\u00e5.<\/p>\n\n<p>Hvis du finder nogen fejl eller forslag til forbedringer i denne artikel kan du efterlade en kommentar.<\/p>\n\n<p>Har du tjekket ud Repmgr. (Http:\/\/<a href=\"http:\/\/www.repmgr.org\/\">www.repmgr.org\/<\/a>).<\/p>\n\n<p>Selvom PostgreSQL 9 + underst\u00f8tter replikeret Hot Standby servere, som vi kan foresp\u00f8rge og \/ eller bruge til h\u00f8j tilg\u00e6ngelighed., Er brugeren forventes at styre h\u00f8j tilg\u00e6ngelighed del af det.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Denne artikel beskriver, hvordan setup PostgreSQL Replication og Hot Standby p\u00e5 to Amazon EC2 forekomster, der k\u00f8rer Ubuntu. Jeg tilbragte god luns af tid p\u00e5 at l\u00e6re disse tricks i sidste to uger, for at gennemf\u00f8re High Availability l\u00f8sning til 3DTin databaseserver. Standby node kan tage over, n\u00e5r main node g\u00e5r ned, som den gjorde [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_sitemap_exclude":false,"_sitemap_priority":"","_sitemap_frequency":"","footnotes":""},"categories":[2],"tags":[],"class_list":["post-198","post","type-post","status-publish","format-standard","hentry","category-tips"],"a3_pvc":{"activated":false,"total_views":0,"today_views":0},"_links":{"self":[{"href":"https:\/\/www.linuxboxen.dk\/index.php?rest_route=\/wp\/v2\/posts\/198","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxboxen.dk\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxboxen.dk\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.linuxboxen.dk\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxboxen.dk\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=198"}],"version-history":[{"count":0,"href":"https:\/\/www.linuxboxen.dk\/index.php?rest_route=\/wp\/v2\/posts\/198\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.linuxboxen.dk\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=198"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxboxen.dk\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=198"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxboxen.dk\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=198"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}