{"id":48221,"date":"2023-01-24T07:30:07","date_gmt":"2023-01-24T06:30:07","guid":{"rendered":"https:\/\/kinsta.com\/dk\/?p=48221&#038;preview=true&#038;preview_id=48221"},"modified":"2023-08-24T10:36:37","modified_gmt":"2023-08-24T09:36:37","slug":"postgresql-replikation","status":"publish","type":"post","link":"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/","title":{"rendered":"PostgreSQL-replikering: En omfattende guide"},"content":{"rendered":"<p>Som enhver webstedsejer vil fort\u00e6lle dig, kan tab af data og nedetid, selv i minimale doser, v\u00e6re katastrofalt. De kan ramme den uforberedte n\u00e5r som helst og f\u00f8re til nedsat produktivitet, tilg\u00e6ngelighed og produkttillid.<\/p>\n<p>For at beskytte integriteten af dit websted er det vigtigt at opbygge sikkerhedsforanstaltninger mod muligheden for nedetid eller datatab.<\/p>\n<p>Det er her, datareplikering kommer ind i billedet.<\/p>\n\n<p>Datareplikering er en automatiseret sikkerhedskopieringsproces, hvor dine data gentagne gange kopieres fra hoveddatabasen til en anden fjernplacering til opbevaring. Det er en integreret teknologi for ethvert websted eller enhver app, der k\u00f8rer en <a href=\"https:\/\/kinsta.com\/dk\/blog\/wordpress-databasen\/\">databaseserver<\/a>. Du kan ogs\u00e5 udnytte den replikerede database til at behandle skrivebeskyttet SQL, hvilket g\u00f8r det muligt at k\u00f8re flere processer i systemet.<\/p>\n<p>Ops\u00e6tning af replikering mellem to databaser giver fejltolerance mod uventede uheld. Det anses for at v\u00e6re den bedste strategi til at opn\u00e5 h\u00f8j tilg\u00e6ngelighed under katastrofer.<\/p>\n<p>I denne artikel dykker vi ned i de forskellige strategier, der kan implementeres af <a href=\"https:\/\/kinsta.com\/blog\/backend-developer\/\">backend-udviklere<\/a> til problemfri PostgreSQL-replikation.<br \/>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc><\/p>\n<h2>Hvad er PostgreSQL replikering?<\/h2>\n<figure id=\"attachment_128034\" aria-describedby=\"caption-attachment-128034\" style=\"width: 945px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-128034 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/07\/PostgreSQL-Replication-Illustration.png\" alt=\"En illustration af PostgreSQL-replikering, der viser str\u00f8mmen af data fra den prim\u00e6re server til replikaen.\" width=\"945\" height=\"310\"><figcaption id=\"caption-attachment-128034\" class=\"wp-caption-text\">Illustration af PostgreSQL replikering (Billedkilde: <a href=\"https:\/\/www.enterprisedb.com\/postgres-tutorials\/postgresql-replication-and-automatic-failover-tutorial#continuous-wal\">EnterpriseDB<\/a>)<\/figcaption><\/figure>\n<p>PostgreSQL replikering er defineret som processen med at kopiere data fra en <a href=\"https:\/\/kinsta.com\/blog\/what-is-postgresql\/\">PostgreSQL-databaseserver<\/a> til en anden server. Kildedatabaseserveren er ogs\u00e5 kendt som den &#8220;prim\u00e6re&#8221; server, mens den databaseserver, der modtager de kopierede data, er kendt som &#8220;replika&#8221;-serveren.<\/p>\n<p>PostgreSQL-databasen f\u00f8lger en simpel replikationsmodel, hvor alle skrivninger g\u00e5r til en prim\u00e6r knude. Den prim\u00e6re knude kan derefter anvende disse \u00e6ndringer og sende dem til sekund\u00e6re knuder.<\/p>\n<h3>Hvad er automatisk fejlfinding?<\/h3>\n<p>Failover er en metode til at <a href=\"https:\/\/www.enterprisedb.com\/postgres-tutorials\/postgresql-replication-and-automatic-failover-tutorial\" target=\"_blank\" rel=\"noopener noreferrer\">genoprette data, hvis den prim\u00e6re server<\/a> af en eller anden grund giver op. S\u00e5 l\u00e6nge du har konfigureret PostreSQL til at administrere din fysiske streamingreplikation, vil du &#8211; og dine brugere &#8211; v\u00e6re beskyttet mod nedetid p\u00e5 grund af en fejl p\u00e5 den prim\u00e6re server.<\/p>\n<p>Bem\u00e6rk, at failover-processen kan tage noget tid at ops\u00e6tte og starte. Der er ingen indbyggede v\u00e6rkt\u00f8jer til overv\u00e5gning og omfang af serverfejl i PostgreSQL, s\u00e5 du bliver n\u00f8dt til at v\u00e6re kreativ.<\/p>\n<p>Heldigvis beh\u00f8ver du ikke at v\u00e6re afh\u00e6ngig af PostgreSQL til failover. Der findes dedikerede v\u00e6rkt\u00f8jer, der muligg\u00f8r automatisk failover og automatisk skift til standby, hvilket reducerer <a href=\"https:\/\/kinsta.com\/dk\/blog\/reparerer-wordpress-database\/\">nedetiden for databasen<\/a>.<\/p>\n<p>Ved at ops\u00e6tte failover-replikation garanterer du n\u00e6sten h\u00f8j tilg\u00e6ngelighed ved at sikre, at standbys er tilg\u00e6ngelige, hvis den prim\u00e6re server nogensinde bryder sammen.<\/p>\n<h2>Fordele ved at bruge PostgreSQL Replication<\/h2>\n<p>Her er et par vigtige fordele ved at udnytte PostgreSQL replikering:<\/p>\n<ul>\n<li><strong>Datamigrering:<\/strong> Du kan udnytte PostgreSQL replikering til datamigrering enten gennem en \u00e6ndring af databaseserverhardware eller gennem systemimplementering.<\/li>\n<li><strong>Fejltolerance:<\/strong> Hvis den prim\u00e6re server fejler, kan standby-serveren fungere som server, fordi de indeholdte data for b\u00e5de prim\u00e6re og standby-servere er de samme.<\/li>\n<li><strong>Ydelse ved online transaktionsbehandling (OLTP):<\/strong> Du kan forbedre transaktionsbehandlingstiden og foresp\u00f8rgselstiden for et OLTP-system ved at fjerne rapportering af foresp\u00f8rgselsbelastningen. Transaktionsbehandlingstiden er den tid, det tager for en given foresp\u00f8rgsel at blive udf\u00f8rt, f\u00f8r en transaktion er afsluttet.<\/li>\n<li><strong>Systemtestning parallelt:<\/strong> N\u00e5r du opgraderer et nyt system, skal du sikre dig, at systemet klarer sig godt med eksisterende data, og derfor er det n\u00f8dvendigt at teste med en produktionsdatabase-kopi f\u00f8r implementering.<\/li>\n<\/ul>\n<h2>S\u00e5dan fungerer PostgreSQL replikering<\/h2>\n<p>Generelt tror folk, at n\u00e5r man dribler med en prim\u00e6r og sekund\u00e6r arkitektur, er der kun \u00e9n m\u00e5de at <a href=\"https:\/\/kinsta.com\/dk\/blog\/backup-wordpress-websted\/\">ops\u00e6tte backups<\/a> og replikering p\u00e5. PostgreSQL-implementeringer kan imidlertid f\u00f8lge <a href=\"https:\/\/www.citusdata.com\/blog\/2018\/02\/21\/three-approaches-to-postgresql-replication\/\" target=\"_blank\" rel=\"noopener noreferrer\">en af disse tre metoder<\/a>:<\/p>\n<ol>\n<li><strong>Streaming replikering:<\/strong> Replikerer data fra den prim\u00e6re knude til den sekund\u00e6re, kopierer derefter data til Amazon S3 eller Azure Blob til backuplagring.<\/li>\n<li><strong>Replikering p\u00e5 volumenniveau:<\/strong> Replikerer data i lagringslaget, startende fra den prim\u00e6re knude til den sekund\u00e6re knude, og kopierer derefter data til Amazon S3 eller Azure Blob til backuplagring.<\/li>\n<li><strong>Inkrementelle backups:<\/strong> Replikerer data fra den prim\u00e6re knude, mens der oprettes en ny sekund\u00e6r knude fra Amazon S3- eller Azure Blob-lagring, hvilket giver mulighed for streaming direkte fra den prim\u00e6re knude.<\/li>\n<\/ol>\n<h3>Metode 1: Streaming<\/h3>\n<p>PostgreSQL-streamingreplikation, ogs\u00e5 kendt som WAL-replikation, kan ops\u00e6ttes problemfrit efter installation af PostgreSQL p\u00e5 alle servere. Denne tilgang til replikering er baseret p\u00e5 at flytte WAL-filerne fra den prim\u00e6re til m\u00e5ldatabasen.<\/p>\n<p>Du kan implementere PostgreSQL-streamingreplikation ved at bruge en prim\u00e6r-sekund\u00e6r konfiguration. Den prim\u00e6re server er den prim\u00e6re instans, der h\u00e5ndterer den prim\u00e6re database og alle dens operationer. Den sekund\u00e6re server fungerer som den supplerende instans og udf\u00f8rer alle \u00e6ndringer i den prim\u00e6re database p\u00e5 sig selv og genererer i den forbindelse en identisk kopi. Den prim\u00e6re server er en skrive\/l\u00e6se-server, mens den sekund\u00e6re server kun er skrivebeskyttet.<\/p>\n<p>Ved denne metode skal du konfigurere b\u00e5de den prim\u00e6re knude og standbyknuden. I de f\u00f8lgende afsnit forklares de trin, der er n\u00f8dvendige for at konfigurere dem nemt.<\/p>\n<h4>Konfiguration af den prim\u00e6re knude<\/h4>\n<p>Du kan konfigurere den prim\u00e6re knude til streamingreplikation ved at udf\u00f8re f\u00f8lgende trin:<\/p>\n<h5>Trin 1: Initialis\u00e9r databasen<\/h5>\n<p>For at <a href=\"https:\/\/hevodata.com\/learn\/postgresql-streaming-replication\/#master1\" target=\"_blank\" rel=\"noopener noreferrer\">initialisere databasen<\/a> kan du bruge kommandoen <code>initdb<\/code> utility command. Derefter kan du oprette en ny bruger med replikeringsrettigheder ved at bruge f\u00f8lgende kommando:<\/p>\n<pre><code class=\"language-bash\">CREATE USER 'example_username' REPLICATION LOGIN ENCRYPTED PASSWORD 'example_password';<\/code><\/pre>\n<p>Brugeren skal angive et password og et brugernavn til den givne foresp\u00f8rgsel. N\u00f8gleordet replikation bruges til at give brugeren de n\u00f8dvendige rettigheder. En eksempelforesp\u00f8rgsel ville se nogenlunde s\u00e5dan ud:<\/p>\n<pre><code class=\"language-bash\">CREATE USER 'rep_username' REPLICATION LOGIN ENCRYPTED PASSWORD 'rep_password';<\/code><\/pre>\n<h5>Trin 2: Konfigurer Streaming-egenskaber<\/h5>\n<p>Dern\u00e6st kan du konfigurere streamingegenskaberne med PostgreSQL-konfigurationsfilen (<strong>postgresql.conf<\/strong>), der kan \u00e6ndres som f\u00f8lger:<\/p>\n<pre><code class=\"bash\">wal_level = logical\nwal_log_hints = on\nmax_wal_senders = 8\nmax_wal_size = 1GB\nhot_standby = on<\/code><\/pre>\n<p>Her er lidt baggrund omkring de parametre, der blev brugt i det foreg\u00e5ende uddrag:<\/p>\n<ul>\n<li><strong><code>wal_log_hints<\/code>:<\/strong> Denne parameter er n\u00f8dvendig for <code>pg_rewind<\/code> -funktionen, som er praktisk, n\u00e5r standby-serveren ikke er synkroniseret med den prim\u00e6re server.<\/li>\n<li><strong><code>wal_level<\/code>:<\/strong> Du kan bruge denne parameter til at aktivere PostgreSQL streaming replikation, med mulige v\u00e6rdier, herunder <code>minimal<\/code>, <code>replica<\/code>, eller <code>logical<\/code>.<\/li>\n<li><strong><code>max_wal_size<\/code>:<\/strong> Dette kan bruges til at angive st\u00f8rrelsen af WAL-filer, der kan bevares i logfiler.<\/li>\n<li><strong><code>hot_standby<\/code>:<\/strong> Du kan udnytte denne parameter til en read-on-forbindelse med den sekund\u00e6re, n\u00e5r den er indstillet til ON.<\/li>\n<li><strong><code>max_wal_senders<\/code>:<\/strong> Du kan bruge <code>max_wal_senders<\/code> til at angive det maksimale antal samtidige forbindelser, der kan etableres med standbyserverne.<\/li>\n<\/ul>\n<h5>Trin 3: Opret ny post<\/h5>\n<p>N\u00e5r du har \u00e6ndret parametrene i filen <strong>postgresql.conf<\/strong>, kan en ny replikeringspost i filen <strong>pg_hba.conf<\/strong> give serverne mulighed for at etablere en forbindelse med hinanden med henblik p\u00e5 replikering.<\/p>\n<p>Du kan normalt finde denne fil i PostgreSQL&#8217;s datamappe. Du kan bruge f\u00f8lgende kodestump til det samme:<\/p>\n<pre><code class=\"language-bash\">host replication rep_user IPaddress md5<\/code><\/pre>\n<p>N\u00e5r kodeudsnittet er blevet udf\u00f8rt, tillader den prim\u00e6re server en bruger kaldet <code>rep_user<\/code> at oprette forbindelse og fungere som standby-server ved at bruge den angivne IP til replikation. F.eks:<\/p>\n<pre><code class=\"language-bash\">host replication rep_user 192.168.0.22\/32 md5<\/code><\/pre>\n<h4>Konfigurering af standby-knude<\/h4>\n<p>F\u00f8lg disse trin for at konfigurere standbyknuden til streamingreplikation:<\/p>\n<h5>Trin 1: Sikkerhedskopiering af prim\u00e6r knude<\/h5>\n<p>For at konfigurere standbyknuden skal du bruge v\u00e6rkt\u00f8jet <code>pg_basebackup<\/code> til at generere en sikkerhedskopi af den prim\u00e6re knude. Dette vil tjene som udgangspunkt for standbyknuden. Du kan bruge dette hj\u00e6lpeprogram med f\u00f8lgende syntaks:<\/p>\n<pre><code class=\"language-bash\">pg_basebackp -D  -h  -X stream -c fast -U rep_user -W<\/code><\/pre>\n<p>De parametre, der anvendes i ovenn\u00e6vnte syntaks, er f\u00f8lgende:<\/p>\n<ul>\n<li><strong><code>-h<\/code>:<\/strong> Du kan bruge dette til at n\u00e6vne den prim\u00e6re host.<\/li>\n<li><strong><code>-D<\/code>:<\/strong> Denne parameter angiver den mappe, du arbejder p\u00e5 i \u00f8jeblikket.<\/li>\n<li><strong><code>-C<\/code>:<\/strong> Du kan bruge denne parameter til at angive kontrolpunkterne.<\/li>\n<li><strong><code>-X<\/code>:<\/strong> Denne parameter kan bruges til at medtage de n\u00f8dvendige transaktionslogfiler.<\/li>\n<li><strong><code>-W<\/code>:<\/strong> Du kan bruge denne parameter til at bede brugeren om et password, f\u00f8r der oprettes en forbindelse til databasen.<\/li>\n<\/ul>\n<h5>Trin 2: Ops\u00e6tning af konfigurationsfil til replikering<\/h5>\n<p>Dern\u00e6st skal du kontrollere, om replikeringskonfigurationsfilen findes. Hvis den ikke g\u00f8r det, kan du generere replikeringskonfigurationsfilen som <strong>recovery.conf<\/strong>.<\/p>\n<p>Du skal oprette denne fil i datamappen i PostgreSQL-installationen. Du kan generere den automatisk ved at bruge indstillingen <code>-R<\/code> i v\u00e6rkt\u00f8jet <code>pg_basebackup<\/code>.<\/p>\n<p><strong>Recovery.conf<\/strong>-filen skal indeholde f\u00f8lgende kommandoer:<\/p>\n<pre><code class=\"bash\">standby_mode = 'on'\n\nprimary_conninfo = 'host=&lt;master_host&gt; port=&lt;postgres_port&gt; user=&lt;replication_user&gt; password=&lt;password&gt; application_name=\"host_name\"'\n\nrecovery_target_timeline = 'latest'<\/code><\/pre>\n<p>De parametre, der anvendes i ovenn\u00e6vnte kommandoer, er f\u00f8lgende:<\/p>\n<ul>\n<li><strong><code>primary_conninfo<\/code>:<\/strong> Du kan bruge dette til at oprette en forbindelse mellem den prim\u00e6re og den sekund\u00e6re server ved at udnytte en forbindelsesstreng.<\/li>\n<li><strong><code>standby_mode<\/code>:<\/strong> Denne parameter kan f\u00e5 den prim\u00e6re server til at starte som standby-server, n\u00e5r den t\u00e6ndes.<\/li>\n<li><strong><code>recovery_target_timeline<\/code>:<\/strong> Du kan bruge denne parameter til at indstille genoprettelsestiden.<\/li>\n<\/ul>\n<p>Hvis du vil oprette en forbindelse, skal du angive brugernavn, IP-adresse og password som v\u00e6rdier for parameteren primary_conninfo. F.eks:<\/p>\n<pre><code class=\"language-bash\">primary_conninfo = 'host=192.168.0.26 port=5432 user=rep_user password=rep_pass'<\/code><\/pre>\n<h5>Trin 3: Genstart sekund\u00e6r server<\/h5>\n<p>Endelig kan du genstarte den sekund\u00e6re server for at afslutte konfigurationsprocessen.<\/p>\n<p>Streaming replikering er dog forbundet med flere udfordringer, f.eks:<\/p>\n<ul>\n<li>Forskellige PostgreSQL-klienter (skrevet i forskellige programmeringssprog) konverserer med et enkelt slutpunkt. N\u00e5r den prim\u00e6re knude fejler, vil disse klienter blive ved med at fors\u00f8ge det samme DNS- eller IP-navn igen. Dette g\u00f8r failover synlig for applikationen.<\/li>\n<li>PostgreSQL-replikation leveres ikke med indbygget failover og overv\u00e5gning. N\u00e5r den prim\u00e6re knude fejler, skal du fremme en sekund\u00e6r knude til at v\u00e6re den nye prim\u00e6re knude. Denne forfremmelse skal udf\u00f8res p\u00e5 en m\u00e5de, hvor klienterne kun skriver til \u00e9n prim\u00e6r knude, og de observerer ikke datainkonsistens.<\/li>\n<li>PostgreSQL replikerer hele sin tilstand. N\u00e5r du skal udvikle en ny sekund\u00e6r knude, skal den sekund\u00e6re knude genopstille hele historikken for tilstands\u00e6ndringer fra den prim\u00e6re knude, hvilket er ressourcekr\u00e6vende og g\u00f8r det dyrt at fjerne knuder i hovedet og oprette nye.<\/li>\n<\/ul>\n<h3>Metode 2: Replikeret blokanordning<\/h3>\n<p>Metoden med replikeret blokanordning er afh\u00e6ngig af diskspejling (ogs\u00e5 kendt som volumenreplikation). I denne metode skrives \u00e6ndringer til et vedvarende volumen, som synkront spejles til et andet volumen.<\/p>\n<p>Den ekstra fordel ved denne metode er dens kompatibilitet og holdbarhed af data i cloud-milj\u00f8er med alle relationelle databaser, herunder PostgreSQL, MySQL og <a href=\"https:\/\/kinsta.com\/dk\/blog\/postgresql-vs-sql-server\/\">SQL Server<\/a>, for blot at n\u00e6vne nogle f\u00e5.<\/p>\n<p>Diskspejlingstilgangen til PostgreSQL-replikering kr\u00e6ver dog, at du replikerer b\u00e5de WAL-log- og tabeldata. Da hver skrivning til databasen nu skal g\u00e5 synkront over netv\u00e6rket, har du ikke r\u00e5d til at miste en enkelt byte, da det kan efterlade din database i en korrupt tilstand.<\/p>\n<p>Denne metode udnyttes normalt ved hj\u00e6lp af Azure PostgreSQL og Amazon RDS.<\/p>\n<h3>Metode 3: WAL<\/h3>\n<p>WAL best\u00e5r af segmentfiler (16 MB som standard). Hvert segment har en eller flere poster. En logsekvenspost (LSN) er en pegepind til en post i WAL, der fort\u00e6ller dig om positionen\/placeringen, hvor posten er blevet gemt i logfilen.<\/p>\n<p>En standby-server udnytter WAL-segmenter &#8211; ogs\u00e5 kendt som XLOGS i PostgreSQL-terminologi &#8211; til l\u00f8bende at replikere \u00e6ndringer fra den prim\u00e6re server. Du kan bruge write-ahead logging til at sikre holdbarhed og atomicitet i et DBMS ved at serialisere bidder af byte-array-data (hver med et unikt LSN) til stabil lagring, f\u00f8r de anvendes i en database.<\/p>\n<p>Anvendelse af en mutation p\u00e5 en database kan f\u00f8re til forskellige filsystemoperationer. Et relevant sp\u00f8rgsm\u00e5l er, hvordan en database kan sikre atomicitet i tilf\u00e6lde af en serverfejl som f\u00f8lge af str\u00f8mafbrydelse, mens den er midt i en filsystemopdatering. N\u00e5r en database starter op, starter den en opstarts- eller replay-proces, som kan l\u00e6se de tilg\u00e6ngelige WAL-segmenter og sammenligne dem med det LSN, der er gemt p\u00e5 hver dataside (hver dataside er markeret med LSN&#8217;et for den seneste WAL-record, der p\u00e5virker siden).<\/p>\n<h4>Log Shipping-baseret replikering (blokniveau)<\/h4>\n<p>Streamingreplikation forfiner logforsendelsesprocessen. I stedet for at vente p\u00e5 WAL-skiftet sendes posterne, efterh\u00e5nden som de oprettes, hvilket mindsker replikationsforsinkelsen.<\/p>\n<p>Streamingreplikation er ogs\u00e5 bedre end logforsendelse, fordi standby-serveren er forbundet med den prim\u00e6re server via netv\u00e6rket ved hj\u00e6lp af en replikationsprotokol. Den prim\u00e6re server kan derefter sende WAL-poster direkte over denne forbindelse uden at skulle v\u00e6re afh\u00e6ngig af scripts, der leveres af slutbrugeren.<\/p>\n<h4>Replikering baseret p\u00e5 logforsendelse (filniveau)<\/h4>\n<p>Logforsendelse er defineret som kopiering af logfiler til en anden PostgreSQL-server for at generere en anden standby-server ved at genindspille WAL-filer. Denne server er konfigureret til at arbejde i genoprettelsestilstand, og dens eneste form\u00e5l er at anvende alle nye WAL-filer, efterh\u00e5nden som de dukker op.<\/p>\n<p>Denne sekund\u00e6re server bliver derefter en varm backup af den prim\u00e6re PostgreSQL-server. Den kan ogs\u00e5 konfigureres til at v\u00e6re en l\u00e6sereplica, hvor den kan tilbyde foresp\u00f8rgsler med skrivebeskyttet l\u00e6sning, ogs\u00e5 kaldet hot standby.<\/p>\n<h4>Kontinuerlig WAL-arkivering<\/h4>\n<p>Duplikering af WAL-filer, efterh\u00e5nden som de oprettes, til en anden placering end undermappen <code>pg_wal<\/code> for at arkivere dem, kaldes WAL-arkivering. PostgreSQL kalder et script, som brugeren har angivet til arkivering, hver gang en WAL-fil oprettes.<\/p>\n<p>Scriptet kan udnytte kommandoen <code>scp<\/code> til at duplikere filen til et eller flere steder, f.eks. en NFS-montering. N\u00e5r de er arkiveret, kan WAL-segmentfilerne udnyttes til at gendanne databasen p\u00e5 et hvilket som helst tidspunkt.<\/p>\n<p>Andre logbaserede konfigurationer omfatter:<\/p>\n<ul>\n<li><strong>Synkron replikering:<\/strong> F\u00f8r hver synkron replikeringstransaktion bliver bekr\u00e6ftet, venter den prim\u00e6re server, indtil standbys bekr\u00e6fter, at de har f\u00e5et dataene. Fordelen ved denne konfiguration er, at der ikke opst\u00e5r konflikter p\u00e5 grund af parallelle skriveprocesser.<\/li>\n<li><strong>Synkron multi-master replikation:<\/strong> Her kan alle servere acceptere skriveanmodninger, og \u00e6ndrede data overf\u00f8res fra den oprindelige server til alle andre servere, f\u00f8r hver transaktion bliver bekr\u00e6ftet. Den udnytter 2PC-protokollen og overholder alt-eller-ingen-reglen.<\/li>\n<\/ul>\n<h4>Detaljer om WAL-streamingprotokollen<\/h4>\n<p>En proces kaldet WAL-modtager, der k\u00f8rer p\u00e5 standby-serveren, udnytter forbindelsesoplysningerne i parameteren <code>primary_conninfo<\/code> i <strong>recovery.conf<\/strong> og opretter forbindelse til den prim\u00e6re server ved hj\u00e6lp af en TCP\/IP-forbindelse.<\/p>\n<p>For at starte streamingreplikation kan frontend&#8217;en sende replikationsparameteren i startmeddelelsen. En boolsk v\u00e6rdi p\u00e5 true, yes, 1 eller ON lader <a href=\"https:\/\/kinsta.com\/blog\/backend-developer-salary\/\">backend&#8217;en<\/a> vide, at den skal g\u00e5 i fysisk replikering walsender-tilstand.<\/p>\n<p>WAL-sender er en anden proces, der k\u00f8rer p\u00e5 den prim\u00e6re server og er ansvarlig for at sende WAL-posterne til standby-serveren, efterh\u00e5nden som de bliver genereret. WAL-modtageren gemmer WAL-posterne i WAL, som om de blev oprettet af klientaktivitet fra lokalt tilsluttede klienter.<\/p>\n<p>N\u00e5r WAL-posterne n\u00e5r frem til WAL-segmentfilerne, bliver standby-serveren konstant ved med at afspille WAL-posterne igen, s\u00e5 prim\u00e6r- og standby-serveren er opdateret.<\/p>\n<figure id=\"attachment_128035\" aria-describedby=\"caption-attachment-128035\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-128035 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/07\/WAL-Streaming-Protocol-Details.png\" alt=\"Et flowdiagram, der viser de trin, der er involveret i WAL Streaming Protocol-processen mellem den prim\u00e6re og standby-serveren.\" width=\"1024\" height=\"1020\"><figcaption id=\"caption-attachment-128035\" class=\"wp-caption-text\">Flowdiagram for WAL-streamingprotokollen (Billedkilde: <a href=\"https:\/\/www.enterprisedb.com\/postgres-tutorials\/postgresql-replication-and-automatic-failover-tutorial#continuous-wal\">EnterpriseDB<\/a>)<\/figcaption><\/figure>\n<h2>Elementer af PostgreSQL-replikering<\/h2>\n<p>I dette afsnit f\u00e5r du en dybere forst\u00e5else af de almindeligt anvendte modeller (single-master og multi-master replikering), typer (fysisk og logisk replikering) og tilstande (synkron og asynkron) for PostgreSQL replikering.<\/p>\n<h3>Modeller for PostgreSQL-databasereplikering<\/h3>\n<p>Skalerbarhed betyder at tilf\u00f8je flere ressourcer\/hardware til eksisterende knudepunkter for at forbedre databasens evne til at lagre og behandle flere data, hvilket kan opn\u00e5s horisontalt og vertikalt. PostgreSQL-replikering er et eksempel p\u00e5 horisontal skalerbarhed, som er meget vanskeligere at implementere end vertikal skalerbarhed. Vi kan opn\u00e5 horisontal skalerbarhed hovedsageligt ved hj\u00e6lp af single-master replikation (SMR) og multi-master replikation (MMR).<\/p>\n<p>Ved single-master-replikation kan data kun \u00e6ndres p\u00e5 en enkelt knude, og disse \u00e6ndringer replikeres til en eller flere knudepunkter. De replikerede tabeller i replika-databasen m\u00e5 ikke acceptere nogen \u00e6ndringer, undtagen \u00e6ndringer fra den prim\u00e6re server. Selv hvis de g\u00f8r det, replikeres \u00e6ndringerne ikke tilbage til den prim\u00e6re server.<\/p>\n<p>Oftest er SMR tilstr\u00e6kkeligt til applikationen, fordi det er mindre kompliceret at konfigurere og administrere, og fordi der ikke er nogen risiko for konflikter. Single-master-replikering er ogs\u00e5 ensrettet, da replikeringsdata hovedsageligt str\u00f8mmer i \u00e9n retning, nemlig fra den prim\u00e6re til replika-databasen.<\/p>\n<p>I nogle tilf\u00e6lde er SMR alene m\u00e5ske ikke tilstr\u00e6kkeligt, og det kan v\u00e6re n\u00f8dvendigt at implementere MMR. MMR giver mulighed for, at mere end \u00e9n knude kan fungere som prim\u00e6r knude. \u00c6ndringer af tabelr\u00e6kker i mere end \u00e9n udpeget prim\u00e6r database replikeres til deres modstykke-tabeller i alle andre prim\u00e6re databaser. I denne model anvendes der ofte konfliktl\u00f8sningsordninger for at undg\u00e5 problemer som f.eks. duplikerede prim\u00e6re n\u00f8gler.<\/p>\n<p>Der er nogle f\u00e5 fordele ved at anvende MMR, nemlig<\/p>\n<ul>\n<li>I tilf\u00e6lde af v\u00e6rtssvigt kan andre v\u00e6rter stadig levere opdaterings- og inds\u00e6ttelsestjenester.<\/li>\n<li>De prim\u00e6re knudepunkter er spredt ud p\u00e5 flere forskellige steder, s\u00e5 risikoen for, at alle prim\u00e6re knudepunkter fejler, er meget lille.<\/li>\n<li>Mulighed for at anvende et Wide Area Network (WAN) af prim\u00e6re databaser, der kan v\u00e6re geografisk t\u00e6t p\u00e5 grupper af klienter, men alligevel bevare datakonsistens p\u00e5 tv\u00e6rs af nettet.<\/li>\n<\/ul>\n<p>Ulempen ved implementering af MMR er imidlertid kompleksiteten og vanskeligheden ved at l\u00f8se konflikter.<\/p>\n<p>Flere filialer og applikationer tilbyder MMR-l\u00f8sninger, da PostgreSQL ikke underst\u00f8tter det nativt. Disse l\u00f8sninger kan v\u00e6re <a href=\"https:\/\/kinsta.com\/blog\/open-source-database\/\">open source<\/a>-l\u00f8sninger, gratis eller betalte. En s\u00e5dan <a href=\"https:\/\/kinsta.com\/dk\/blog\/wordpress-database-plugin\/\">udvidelse<\/a> er bidirektionel replikering (BDR), som er asynkron og er baseret p\u00e5 PostgreSQL&#8217;s logiske afkodningsfunktion.<\/p>\n<p>Da BDR-applikationen gengiver transaktioner p\u00e5 andre knudepunkter, kan gengivelsesoperationen mislykkes, hvis der er en konflikt mellem den transaktion, der anvendes, og den transaktion, der er beg\u00e5et p\u00e5 den modtagende knudepunkt.<\/p>\n<h3>Typer af PostgreSQL-replikering<\/h3>\n<p>Der findes to typer PostgreSQL-replikering: logisk og fysisk replikering.<\/p>\n<p>En simpel <em>logisk<\/em> operation &#8211; <code>initdb<\/code> &#8211; ville udf\u00f8re den fysiske operation med at oprette en basismappe for en klynge. P\u00e5 samme m\u00e5de vil en simpel <em>logisk<\/em> operation <code>CREATE DATABASE<\/code> udf\u00f8re den <em>fysiske<\/em> operation med at oprette en undermappe i basismappen.<\/p>\n<p>Fysisk replikering vedr\u00f8rer normalt filer og mapper. Den ved ikke, hvad disse filer og mapper repr\u00e6senterer. Disse metoder bruges til at opretholde en fuld kopi af alle data i en enkelt klynge, typisk p\u00e5 en anden maskine, og de udf\u00f8res p\u00e5 filsystemniveau eller diskniveau og anvender n\u00f8jagtige blokadresser.<\/p>\n<p>Logisk replikation er en m\u00e5de at reproducere dataenheder og deres \u00e6ndringer p\u00e5, baseret p\u00e5 deres replikationsidentitet (normalt en prim\u00e6r n\u00f8gle). I mods\u00e6tning til fysisk replikering omhandler den databaser, tabeller og DML-operationer og udf\u00f8res p\u00e5 databaseklyngeniveau. Den anvender en <em>udgivelses-<\/em> og <em>abonnementsmodel<\/em>, hvor en eller flere <em>abonnenter<\/em> abonnerer p\u00e5 en eller flere <em>publikationer<\/em> p\u00e5 en <em>udgiverknude<\/em>.<\/p>\n<p>Replikationsprocessen starter med at tage et \u00f8jebliksbillede af dataene i udgiverdatabasen og derefter kopiere dem til abonnenten. Abonnenterne henter data fra de publikationer, de abonnerer p\u00e5, og kan senere genudgive data for at muligg\u00f8re kaskadeopdatering eller mere komplekse konfigurationer. Abonnenten anvender dataene i samme r\u00e6kkef\u00f8lge som udgiveren, s\u00e5ledes at der garanteres transaktionsm\u00e6ssig konsistens for publikationer inden for et enkelt abonnement, ogs\u00e5 kendt som transaktionsm\u00e6ssig replikering.<\/p>\n<p>De typiske anvendelsestilf\u00e6lde for logisk replikering er f\u00f8lgende:<\/p>\n<ul>\n<li>Sende inkrementelle \u00e6ndringer i en enkelt database (eller en delm\u00e6ngde af en database) til abonnenterne, efterh\u00e5nden som de sker.<\/li>\n<li>Deling af en delm\u00e6ngde af databasen mellem flere databaser.<\/li>\n<li>Udl\u00f8sning af individuelle \u00e6ndringer, n\u00e5r de ankommer til abonnenten.<\/li>\n<li>Konsolidering af flere databaser til \u00e9n.<\/li>\n<li>Adgang til replikerede data for forskellige grupper af brugere.<\/li>\n<\/ul>\n<p>Subscriber-databasen opf\u00f8rer sig p\u00e5 samme m\u00e5de som enhver anden PostgreSQL-instans og kan bruges som udgiver for andre databaser ved at definere dens publikationer.<\/p>\n<p>N\u00e5r abonnenten behandles som skrivebeskyttet af programmet, vil der ikke v\u00e6re nogen konflikter fra et enkelt abonnement. P\u00e5 den anden side, hvis der er andre skrivninger udf\u00f8rt enten af et program eller af andre abonnenter til det samme s\u00e6t tabeller, kan der opst\u00e5 konflikter.<\/p>\n<p>PostgreSQL underst\u00f8tter begge mekanismer samtidig. Logisk replikation giver mulighed for finkornet kontrol over b\u00e5de datareplikation og sikkerhed.<\/p>\n<h3>Replikationsformer<\/h3>\n<p>Der er hovedsageligt to tilstande for PostgreSQL-replikering: synkron og asynkron. Synkron replikering g\u00f8r det muligt at skrive data til b\u00e5de den prim\u00e6re og sekund\u00e6re server p\u00e5 samme tid, mens asynkron replikering sikrer, at dataene f\u00f8rst skrives til hosten og derefter kopieres til den sekund\u00e6re server.<\/p>\n<p>Ved synkron replikering anses transaktioner i den prim\u00e6re database f\u00f8rst for at v\u00e6re afsluttet, n\u00e5r \u00e6ndringerne er blevet replikeret til alle replikaer. Replikaserverne skal alle v\u00e6re tilg\u00e6ngelige hele tiden, for at transaktionerne kan afsluttes p\u00e5 den prim\u00e6re database. Den synkrone replikeringstilstand anvendes i avancerede transaktionsmilj\u00f8er med krav om \u00f8jeblikkelig failover.<\/p>\n<p>I asynkron tilstand kan transaktioner p\u00e5 den prim\u00e6re server erkl\u00e6res for afsluttet, n\u00e5r \u00e6ndringerne kun er blevet foretaget p\u00e5 den prim\u00e6re server. Disse \u00e6ndringer replikeres s\u00e5 senere i replikkerne. Replikaserverne kan forblive usynkroniserede i en vis periode, kaldet replikationsforsinkelse. I tilf\u00e6lde af et nedbrud kan der opst\u00e5 datatab, men det overhead, som asynkron replikering giver, er lille, s\u00e5 det er acceptabelt i de fleste tilf\u00e6lde (det overbelaster ikke hosten). Failover fra den prim\u00e6re database til den sekund\u00e6re database tager l\u00e6ngere tid end synkron replikering.<\/p>\n<h2>S\u00e5dan ops\u00e6ttes PostgreSQL replikering<\/h2>\n<p>I dette afsnit vil vi demonstrere hvordan PostgreSQL replikeringsprocessen ops\u00e6ttes p\u00e5 et Linux-operativsystem. I dette tilf\u00e6lde bruger vi Ubuntu 18.04 LTS og PostgreSQL 10.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-important\">\n            <h3>Important<\/h3>\n        <p>S\u00f8rg for, at du har installeret Linux Ubuntu-serveren. Trinene til installation af PostgreSQL p\u00e5 en Linux-server er n\u00e6vnt nedenfor, efterfulgt af ops\u00e6tning af replikering i den prim\u00e6re og sekund\u00e6re server.<\/p>\n<\/aside>\n\n<p>Lad os g\u00e5 i gang!<\/p>\n<h3>Installation<\/h3>\n<p>Du begynder med at installere PostgreSQL p\u00e5 Linux med disse trin:<\/p>\n<ol>\n<li>For det f\u00f8rste skal du importere PostgreSQL signeringsn\u00f8glen ved at skrive nedenst\u00e5ende kommando i terminalen:\n<pre><code class=\"language-bash\">wget -q https:\/\/www.postgresql.org\/media\/keys\/ACCC4CF8.asc -O- | sudo apt-key add -<\/code><\/pre>\n<\/li>\n<li>Derefter skal du tilf\u00f8je PostgreSQL-repositoriet ved at indtaste nedenst\u00e5ende kommando i terminalen:\n<pre><code class=\"language-bash\">echo \"deb http:\/\/apt.postgresql.org\/pub\/repos\/apt\/ bionic-pgdg main\" | sudo tee \/etc\/apt\/sources.list.d\/postgresql.list<\/code><\/pre>\n<\/li>\n<li>Opdat\u00e9r Repository Index ved at skrive f\u00f8lgende kommando i terminalen:\n<pre><code class=\"language-bash\">sudo apt-get update<\/code><\/pre>\n<\/li>\n<li>Installer PostgreSQL-pakken ved hj\u00e6lp af apt-kommandoen:\n<pre><code class=\"language-bash\">sudo apt-get install -y postgresql-10<\/code><\/pre>\n<\/li>\n<li>Endelig skal du indstille adgangskoden til PostgreSQL-brugeren ved hj\u00e6lp af f\u00f8lgende kommando:\n<pre><code class=\"language-bash\">sudo passwd postgres<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>Installation af PostgreSQL er obligatorisk for b\u00e5de den prim\u00e6re og den sekund\u00e6re server, f\u00f8r PostgreSQL-replikeringsprocessen startes.<\/p>\n<p>N\u00e5r du har konfigureret PostgreSQL p\u00e5 begge servere, kan du g\u00e5 videre til replikeringskonfigurationen af den prim\u00e6re og sekund\u00e6re server.<\/p>\n<h3>Ops\u00e6tning af replikering i den prim\u00e6re server<\/h3>\n<p>Udf\u00f8r disse trin, n\u00e5r du har installeret PostgreSQL p\u00e5 b\u00e5de den prim\u00e6re og sekund\u00e6re server.<\/p>\n<ol>\n<li>For det f\u00f8rste skal du logge ind p\u00e5 PostgreSQL-databasen med f\u00f8lgende kommando:\n<pre><code class=\"language-bash\">su - postgres<\/code><\/pre>\n<\/li>\n<li>Opret en replikationsbruger med f\u00f8lgende kommando:\n<pre><code class=\"language-bash\">psql -c \"CREATEUSER replication REPLICATION LOGIN CONNECTION LIMIT 1 ENCRYPTED PASSWORD'YOUR_PASSWORD';\"<\/code><\/pre>\n<\/li>\n<li>Rediger <strong>pg_hba.cnf<\/strong> med et nano program i Ubuntu og tilf\u00f8j f\u00f8lgende konfiguration:\n<pre><code class=\"language-bash\">nano \/etc\/postgresql\/10\/main\/pg_hba.conf<\/code><\/pre>\n<p>For at konfigurere filen skal du bruge f\u00f8lgende kommando:<\/p>\n<pre><code class=\"language-bash\">host replication  replication  MasterIP\/24  md5<\/code><\/pre>\n<\/li>\n<li>\u00c5bn og rediger <strong>postgresql.conf<\/strong>, og inds\u00e6t f\u00f8lgende konfiguration p\u00e5 den prim\u00e6re server:\n<pre><code class=\"language-bash\">nano \/etc\/postgresql\/10\/main\/postgresql.conf<\/code><\/pre>\n<p>Brug f\u00f8lgende konfigurationsindstillinger:<strong><br \/>\n<\/strong><\/p>\n<pre><code class=\"language-bash\">listen_addresses = 'localhost,MasterIP'\nwal_level = replica\nwal_keep_segments = 64\nmax_wal_senders = 10<\/code><\/pre>\n<\/li>\n<li>Endelig genstarter du PostgreSQL p\u00e5 den prim\u00e6re hovedserver:<\/li>\n<\/ol>\n<pre><code class=\"language-bash\">systemctl restart postgresql<\/code><\/pre>\n<p>Du har nu afsluttet ops\u00e6tningen p\u00e5 den prim\u00e6re server.<\/p>\n<h3>Ops\u00e6tning af replikering i sekund\u00e6r server<\/h3>\n<p>F\u00f8lg disse trin for at konfigurere replikering p\u00e5 den sekund\u00e6re server:<\/p>\n<ol>\n<li>Log ind p\u00e5 PostgreSQL RDMS med nedenst\u00e5ende kommando:\n<pre><code class=\"language-bash\">su - postgres<\/code><\/pre>\n<\/li>\n<li>Stop PostgreSQL-tjenesten fra at fungere, s\u00e5 vi kan arbejde p\u00e5 den med nedenst\u00e5ende kommando:\n<pre><code class=\"language-bash\">systemctl stop postgresql<\/code><\/pre>\n<\/li>\n<li>Rediger <strong>pg_hba.conf<\/strong>-filen med denne kommando og tilf\u00f8j f\u00f8lgende konfiguration:\n<pre><code class=\"language-bash\">\/\/ \"Edit\" command\nnano \/etc\/postgresql\/10\/main\/pg_hba.conf\n\/\/ \"Configuration\" command\nhost replication  replication  MasterIP\/24  md5<\/code><\/pre>\n<\/li>\n<li>\u00c5bn og rediger <strong>postgresql.conf<\/strong> p\u00e5 den sekund\u00e6re server, og inds\u00e6t f\u00f8lgende konfiguration eller fjern kommentaren, hvis den er kommenteret:\n<pre><code class=\"language-bash\">nano \/etc\/postgresql\/10\/main\/postgresql.conf\nlisten_addresses = 'localhost,SecondaryIP'\nwal_keep_segments = 64\nwal_level = replica\nhot_standby = on\nmax_wal_senders = 10<\/code><\/pre>\n<p><code>SecondaryIP<\/code> er adressen p\u00e5 den sekund\u00e6re server<\/li>\n<li>F\u00e5 adgang til PostgreSQL-datakataloget p\u00e5 den sekund\u00e6re server og fjern alt:\n<pre><code class=\"language-bash\">cd \/var\/lib\/postgresql\/10\/main\nrm -rfv *<\/code><\/pre>\n<\/li>\n<li>Kopier PostgreSQL prim\u00e6re server datakatalog filer til PostgreSQL sekund\u00e6re server datakatalog og skriv denne kommando i den sekund\u00e6re server:\n<pre><code class=\"language-bash\">pg_basebackup -h MasterIP -D \/var\/lib\/postgresql\/11\/main\/ -P -U\nreplication --wal-method=fetch<\/code><\/pre>\n<\/li>\n<li>Indtast PostgreSQL-password til den prim\u00e6re server og tryk p\u00e5 enter. Tilf\u00f8j derefter f\u00f8lgende kommando til genoprettelseskonfigurationen:\n<pre><code class=\"language-bash\">\/\/ \"Edit\" Command\nnano \/var\/lib\/postgresql\/10\/main\/recovery.conf\n\/\/ Configuration\nstandby_mode   = 'on'\nprimary_conninfo = 'host=MasterIP port=5432 user=replication password=YOUR_PASSWORD'\ntrigger_file = '\/tmp\/MasterNow'<\/code><\/pre>\n<p>Her er <code>YOUR_PASSWORD<\/code> adgangskoden til replikationsbrugeren i den prim\u00e6re server PostgreSQL oprettet<\/li>\n<li>N\u00e5r adgangskoden er blevet indstillet, skal du genstarte den sekund\u00e6re PostgreSQL-database, da den blev stoppet:<\/li>\n<\/ol>\n<pre><code class=\"language-bash\">systemctl start postgresql<\/code><\/pre>\n<h3>Test af din ops\u00e6tning<\/h3>\n<p>Nu hvor vi har udf\u00f8rt trinene, lad os teste replikationsprocessen og observere den sekund\u00e6re serverdatabase. Til dette form\u00e5l opretter vi en tabel p\u00e5 den prim\u00e6re server og observerer, om den samme tabel afspejles p\u00e5 den sekund\u00e6re server.<\/p>\n<p>Lad os komme i gang.<\/p>\n<ol>\n<li>Da vi opretter tabellen p\u00e5 den prim\u00e6re server, skal du logge ind p\u00e5 den prim\u00e6re server:\n<pre><code class=\"language-bash\">su - postgres\npsql<\/code><\/pre>\n<\/li>\n<li>Nu opretter vi en simpel tabel ved navn &#8216;testtable&#8217; og inds\u00e6tter data i tabellen ved at k\u00f8re f\u00f8lgende PostgreSQL foresp\u00f8rgsler i terminalen:\n<pre><code class=\"language-bash\">CREATE TABLE testtable (websites varchar(100));\nINSERT INTO testtable VALUES ('section.com');\nINSERT INTO testtable VALUES ('google.com');\nINSERT INTO testtable VALUES ('github.com');<\/code><\/pre>\n<\/li>\n<li>Overv\u00e5g PostgreSQL-databasen p\u00e5 den sekund\u00e6re server ved at logge ind p\u00e5 den sekund\u00e6re server:\n<pre><code class=\"language-bash\">su - postgres psql<\/code><\/pre>\n<\/li>\n<li>Nu kontrollerer vi, om tabellen &#8220;testtable&#8221; eksisterer, og kan returnere dataene ved at k\u00f8re f\u00f8lgende PostgreSQL foresp\u00f8rgsler i terminalen. Denne kommando viser i det v\u00e6sentlige hele tabellen.\n<pre><code class=\"language-bash\">select * from testtable;<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>Dette er resultatet af testtabellen:<\/p>\n<pre><code class=\"language-bash\">|  websites  |\n\n-------------------\n\n| section.com |\n\n| google.com |\n\n| github.com  |\n\n--------------------<\/code><\/pre>\n<p>Du b\u00f8r kunne observere de samme data som dem p\u00e5 den prim\u00e6re server.<\/p>\n<p>Hvis du ser ovenst\u00e5ende, s\u00e5 har du gennemf\u00f8rt replikeringsprocessen med succes!<\/p>\n<h2>Hvad er PostgreSQL Manual Failover trinene?<\/h2>\n<p>Lad os gennemg\u00e5 trinene for en PostgreSQL manuel failover:<\/p>\n<ol>\n<li>Crash den prim\u00e6re server.<\/li>\n<li>Promote standby-serveren ved at k\u00f8re f\u00f8lgende kommando p\u00e5 standby-serveren:\n<pre><code class=\"language-bash\">.\/pg_ctl promote -D ..\/sb_data\/\nserver promoting<\/code><\/pre>\n<\/li>\n<li>Opret forbindelse til den promoverede standby-server, og inds\u00e6t en r\u00e6kke:\n<pre><code class=\"language-bash\">-bash-4.2$ .\/edb-psql -p 5432 edb\n\nPassword:\n\npsql.bin (10.7)\n\nType \"help\" <strong>for<\/strong> help.\n\nedb=# <strong>insert<\/strong> <strong>into<\/strong> abc <strong>values<\/strong>(4,'Four');<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>Hvis inds\u00e6ttelsen fungerer fint, er standby-serveren, som tidligere var en skrivebeskyttet server, blevet forfremmet som den nye prim\u00e6re server.<\/p>\n<h2>S\u00e5dan automatiseres Failover i PostgreSQL<\/h2>\n<p>Det er nemt at ops\u00e6tte automatisk failover.<\/p>\n<p>Du skal bruge EDB PostgreSQL failover manager (EFM). N\u00e5r du har downloadet og installeret EFM p\u00e5 hver prim\u00e6r og standby-node, kan du oprette en EFM Cluster, som best\u00e5r af en prim\u00e6r node, en eller flere Standby-noder og en valgfri Witness-node, der bekr\u00e6fter assertions i tilf\u00e6lde af fejl.<\/p>\n<p>EFM overv\u00e5ger l\u00f8bende systemets tilstand og sender advarsler via e-mail baseret p\u00e5 systemh\u00e6ndelser. N\u00e5r der opst\u00e5r en fejl, skifter den automatisk over til den mest opdaterede standby-node og rekonfigurerer alle andre standby-servere til at genkende den nye prim\u00e6re knude.<\/p>\n<p>Den rekonfigurerer ogs\u00e5 load balancers (f.eks. pgPool) og forhindrer &#8220;split-brain&#8221; (n\u00e5r to knudepunkter hver is\u00e6r tror, at de er prim\u00e6re) i at forekomme.<\/p>\n<h2>Opsummering<\/h2>\n<p>P\u00e5 grund af store datam\u00e6ngder er skalerbarhed og sikkerhed blevet to af de vigtigste kriterier inden for <a href=\"https:\/\/kinsta.com\/dk\/wordpress-hosting\/dedikeret\/\">databaseadministration<\/a>, is\u00e6r i et transaktionsmilj\u00f8. Selv om vi kan forbedre skalerbarheden vertikalt ved at tilf\u00f8je flere ressourcer\/hardware til eksisterende knudepunkter, er det ikke altid muligt, ofte p\u00e5 grund af omkostningerne eller begr\u00e6nsningerne ved at tilf\u00f8je ny hardware.<\/p>\n<p>Derfor er der behov for horisontal skalerbarhed, hvilket betyder, at der skal tilf\u00f8jes flere knuder til eksisterende netv\u00e6rksknuder i stedet for at forbedre funktionaliteten af eksisterende knuder. Det er her, PostgreSQL-replikering kommer ind i billedet.<\/p>\n\n<p>I denne artikel har vi diskuteret typerne af PostgreSQL replikationer, fordele, replikationsformer, installation og PostgreSQL failover Mellem SMR og MMR. Lad os nu h\u00f8re fra dig.<\/p>\n<p>Hvilken af dem implementerer du normalt? Hvilken databasefunktion er den vigtigste for dig og hvorfor? Vi vil meget gerne l\u00e6se dine tanker! Del dem i kommentarfeltet nedenfor.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Som enhver webstedsejer vil fort\u00e6lle dig, kan tab af data og nedetid, selv i minimale doser, v\u00e6re katastrofalt. De kan ramme den uforberedte n\u00e5r som helst &#8230;<\/p>\n","protected":false},"author":117,"featured_media":48222,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[182,491,291,514],"topic":[728],"class_list":["post-48221","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-database","tag-databases","tag-development","tag-postgresql","topic-postgresql"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PostgreSQL-replikering: En omfattende guide<\/title>\n<meta name=\"description\" content=\"L\u00e6r om de vigtigste aspekter af PostgreSQL-replikering, herunder dets fordele, elementer, typer og strategier for problemfri data-backups.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/\" \/>\n<meta property=\"og:locale\" content=\"da_DK\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PostgreSQL-replikering: En omfattende guide\" \/>\n<meta property=\"og:description\" content=\"L\u00e6r om de vigtigste aspekter af PostgreSQL-replikering, herunder dets fordele, elementer, typer og strategier for problemfri data-backups.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-01-24T06:30:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-24T09:36:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/postgresql-replication.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Salman Ravoof\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"L\u00e6r om de vigtigste aspekter af PostgreSQL-replikering, herunder dets fordele, elementer, typer og strategier for problemfri data-backups.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/postgresql-replication.png\" \/>\n<meta name=\"twitter:creator\" content=\"@salmanravoof\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_dk\" \/>\n<meta name=\"twitter:label1\" content=\"Skrevet af\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salman Ravoof\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimeret l\u00e6setid\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 minutter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"PostgreSQL-replikering: En omfattende guide\",\"datePublished\":\"2023-01-24T06:30:07+00:00\",\"dateModified\":\"2023-08-24T09:36:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/\"},\"wordCount\":4483,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/postgresql-replication.png\",\"keywords\":[\"database\",\"databases\",\"development\",\"PostgreSQL\"],\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/\",\"url\":\"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/\",\"name\":\"PostgreSQL-replikering: En omfattende guide\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/postgresql-replication.png\",\"datePublished\":\"2023-01-24T06:30:07+00:00\",\"dateModified\":\"2023-08-24T09:36:37+00:00\",\"description\":\"L\u00e6r om de vigtigste aspekter af PostgreSQL-replikering, herunder dets fordele, elementer, typer og strategier for problemfri data-backups.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/#breadcrumb\"},\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/postgresql-replication.png\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/postgresql-replication.png\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/dk\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL\",\"item\":\"https:\/\/kinsta.com\/dk\/emner\/postgresql\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"PostgreSQL-replikering: En omfattende guide\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/dk\/#website\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Hurtig, sikker, premium hostingl\u00f8sninger\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/dk\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"da-DK\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\",\"https:\/\/x.com\/kinsta_dk\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\",\"name\":\"Salman Ravoof\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"caption\":\"Salman Ravoof\"},\"description\":\"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.\",\"sameAs\":[\"https:\/\/salmanravoof.com\",\"https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/\",\"https:\/\/x.com\/salmanravoof\"],\"url\":\"https:\/\/kinsta.com\/dk\/blog\/author\/salmanravoof\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"PostgreSQL-replikering: En omfattende guide","description":"L\u00e6r om de vigtigste aspekter af PostgreSQL-replikering, herunder dets fordele, elementer, typer og strategier for problemfri data-backups.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/","og_locale":"da_DK","og_type":"article","og_title":"PostgreSQL-replikering: En omfattende guide","og_description":"L\u00e6r om de vigtigste aspekter af PostgreSQL-replikering, herunder dets fordele, elementer, typer og strategier for problemfri data-backups.","og_url":"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","article_published_time":"2023-01-24T06:30:07+00:00","article_modified_time":"2023-08-24T09:36:37+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/postgresql-replication.png","type":"image\/png"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_description":"L\u00e6r om de vigtigste aspekter af PostgreSQL-replikering, herunder dets fordele, elementer, typer og strategier for problemfri data-backups.","twitter_image":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/postgresql-replication.png","twitter_creator":"@salmanravoof","twitter_site":"@kinsta_dk","twitter_misc":{"Skrevet af":"Salman Ravoof","Estimeret l\u00e6setid":"20 minutter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"PostgreSQL-replikering: En omfattende guide","datePublished":"2023-01-24T06:30:07+00:00","dateModified":"2023-08-24T09:36:37+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/"},"wordCount":4483,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/postgresql-replication.png","keywords":["database","databases","development","PostgreSQL"],"inLanguage":"da-DK","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/","url":"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/","name":"PostgreSQL-replikering: En omfattende guide","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/postgresql-replication.png","datePublished":"2023-01-24T06:30:07+00:00","dateModified":"2023-08-24T09:36:37+00:00","description":"L\u00e6r om de vigtigste aspekter af PostgreSQL-replikering, herunder dets fordele, elementer, typer og strategier for problemfri data-backups.","breadcrumb":{"@id":"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/#breadcrumb"},"inLanguage":"da-DK","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/"]}]},{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/#primaryimage","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/postgresql-replication.png","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/01\/postgresql-replication.png","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/dk\/blog\/postgresql-replikation\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/dk\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL","item":"https:\/\/kinsta.com\/dk\/emner\/postgresql\/"},{"@type":"ListItem","position":3,"name":"PostgreSQL-replikering: En omfattende guide"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/dk\/#website","url":"https:\/\/kinsta.com\/dk\/","name":"Kinsta\u00ae","description":"Hurtig, sikker, premium hostingl\u00f8sninger","publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/dk\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"da-DK"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/dk\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/dk\/","logo":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","https:\/\/x.com\/kinsta_dk","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987","name":"Salman Ravoof","image":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","caption":"Salman Ravoof"},"description":"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.","sameAs":["https:\/\/salmanravoof.com","https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/","https:\/\/x.com\/salmanravoof"],"url":"https:\/\/kinsta.com\/dk\/blog\/author\/salmanravoof\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/48221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/users\/117"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/comments?post=48221"}],"version-history":[{"count":8,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/48221\/revisions"}],"predecessor-version":[{"id":48278,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/48221\/revisions\/48278"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/48221\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/48221\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/48221\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/48221\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/48221\/translations\/de"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/48221\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/48221\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/48221\/translations\/jp"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/48221\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/48221\/translations\/dk"},{"href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/48221\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media\/48222"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media?parent=48221"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/tags?post=48221"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/topic?post=48221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}