{"id":67889,"date":"2023-12-14T13:12:30","date_gmt":"2023-12-14T12:12:30","guid":{"rendered":"https:\/\/kinqsta.com\/de\/?p=67889&#038;preview=true&#038;preview_id=67889"},"modified":"2023-12-18T13:28:05","modified_gmt":"2023-12-18T12:28:05","slug":"startup-ctos-handbuch-zum-einsatz-von-postgres","status":"publish","type":"post","link":"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/","title":{"rendered":"Das Handbuch f\u00fcr Startup-CTOs zum Einsatz von Postgres"},"content":{"rendered":"<p>Du beginnst also ein neues Projekt &#8211; oder Unternehmen &#8211; und hast dich f\u00fcr Postgres entschieden. Der schwierige Teil (die Wahl der Datenbank) ist vorbei, und jetzt beginnt der spa\u00dfige Teil: Du musst sicherstellen, dass du in den n\u00e4chsten Jahren nicht mehr dar\u00fcber nachdenken musst.<\/p>\n<p>In diesem Beitrag findest du einige weniger bekannte Tipps, wie du Postgres langfristig konfigurieren kannst: von Connection Pooling \u00fcber Sicherheitsgrundlagen bis hin zu Erweiterungen und Indizes.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Einrichten von Connection Pooling f\u00fcr Postgres mit PGBouncer<\/h2>\n<p>Standardm\u00e4\u00dfig gabelt Postgres <a href=\"https:\/\/www.postgresql.org\/docs\/current\/connect-estab.html\">f\u00fcr jede Client-Verbindung einen eigenen Prozess<\/a> vom Hauptprozess des Betriebssystems ab. Bei geringem Volumen spielt die Zeit, die f\u00fcr das Erstellen und Zerst\u00f6ren dieser Prozesse ben\u00f6tigt wird, keine Rolle &#8211; und auch nicht die Tatsache, dass sie nie wieder verwendet werden. Du kannst die Anzahl der max_connections <a href=\"https:\/\/www.postgresql.org\/docs\/current\/runtime-config-connection.html\" target=\"_blank\" rel=\"noopener noreferrer\">manuell<\/a> einstellen, aber wenn du die Anzahl der Verbindungen erh\u00f6hst, wirst du wahrscheinlich auf Probleme sto\u00dfen. <strong><a href=\"https:\/\/stackoverflow.blog\/2020\/10\/14\/improve-database-performance-with-connection-pooling\/\" target=\"_blank\" rel=\"noopener noreferrer\">Das Pooling von Verbindungen<\/a><\/strong> hilft dir dabei, diese Prozesse zwischenzuspeichern und sie <strong>wiederzuverwenden<\/strong>, wenn sich Kunden mit deiner Datenbank verbinden und die Verbindung trennen.<\/p>\n<p>Obwohl du das Connection Pooling in deine Anwendungslogik einbauen <em>kannst<\/em>, entscheiden sich die meisten f\u00fcr ein Tool eines Drittanbieters, im Fall von Postgres ist das <strong><a href=\"https:\/\/www.pgbouncer.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">PGBouncer<\/a><\/strong>. Dabei handelt es sich um einen leichtgewichtigen Open-Source-Verbindungspooler, den du <a href=\"https:\/\/www.pgbouncer.org\/faq.html\" target=\"_blank\" rel=\"noopener noreferrer\">entweder<\/a> auf deinem Datenbankserver oder auf deinem Anwendungsserver installieren kannst. Du hast die Wahl zwischen <a href=\"https:\/\/www.pgbouncer.org\/features.html\" target=\"_blank\" rel=\"noopener noreferrer\">3 Pooling-Stufen<\/a>:<\/p>\n<ul>\n<li><strong>Session-Pooling<\/strong>: Es bleibt dem Modell &#8222;Client-Verbindungen sind unbegrenzt&#8220; treu und h\u00e4lt eine Verbindung f\u00fcr die gesamte Zeit offen, in der ein Client verbunden ist.<\/li>\n<li><strong>Transaktions-Pooling<\/strong>: Verbindungen bleiben nur f\u00fcr eine einzige Transaktion bestehen und werden dann wieder an den Pool zur\u00fcckgegeben.<\/li>\n<li><strong>Statement-Pooling<\/strong>: Die Verbindungen bleiben nur f\u00fcr eine Abfrage bestehen. Wenn du also mehrere Abfragen als Teil einer Transaktion hast, funktioniert das \u00fcberhaupt nicht.<\/li>\n<\/ul>\n<p>Die meisten entscheiden sich f\u00fcr Session Pooling &#8211; es ist die konservativste L\u00f6sung und birgt das geringste Risiko f\u00fcr Verbindungsabbr\u00fcche &#8211; aber jede Anwendung ist anders und du musst den richtigen Modus f\u00fcr deine Anforderungen herausfinden.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Die meisten Web-Frameworks \u00fcberlassen dies Tools von Drittanbietern (siehe <a href=\"https:\/\/groups.google.com\/g\/django-developers\/c\/NwY9CHM4xpU\">diesen Django-Forumsthread<\/a> zu PGBouncer), aber Rails bietet sogar eine <a href=\"https:\/\/api.rubyonrails.org\/classes\/ActiveRecord\/ConnectionAdapters\/ConnectionPool.html\">native Verbindungspool-Funktion<\/a>.<\/p>\n<\/aside>\n\n<h3>Auswirkungen von Connection Pooling auf die Leistung<\/h3>\n<p>Die Millionen-Dollar-Frage ist jedoch: <strong>Funktioniert das wirklich?<\/strong> <a href=\"https:\/\/www.percona.com\/blog\/scaling-postgresql-with-pgbouncer-you-may-need-a-connection-pooler-sooner-than-you-expect\/\" target=\"_blank\" rel=\"noopener noreferrer\">Percona<\/a> hat eine Reihe von Benchmarks durchgef\u00fchrt, um herauszufinden, wie sich PGBouncer auf die Leistung auswirkt. Bei einer kleinen Anzahl von gleichzeitigen Clients (&lt;60) <em>verschlechtert<\/em> PGBouncer die Transaktionen pro Sekunde (TPS) aufgrund des Overheads des Poolings sogar um einiges. Aber wenn du auf &gt;100 skalierst, wirst du deutliche Leistungsvorteile sehen.<\/p>\n<figure style=\"width: 612px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2023\/10\/pgbouncer.png\" alt=\"PGBouncer\" width=\"612\" height=\"371\"><figcaption class=\"wp-caption-text\">PGBouncer<\/figcaption><\/figure>\n<p>Brauchst du also sofort einen Verbindungspooler, um deine ersten paar Nutzer zu unterst\u00fctzen? Wahrscheinlich nicht. Aber der Einsatz von PGBouncer wird dir helfen, sobald du auch nur geringen\/mittleren Traffic hast.<\/p>\n<h2>Postgres Sicherheit f\u00fcr Dummies<\/h2>\n<p>In den ersten Wochen, in denen du an deinem Projekt arbeitest, sind es meist nur ein oder zwei Entwickler, die an einer leeren Datenbank arbeiten; die Sicherheit steht nicht im Vordergrund. Aber wenn du deine Anwendung der Welt pr\u00e4sentierst, hat Sicherheit Priorit\u00e4t. Und bei Datenbanken scheint es manchmal so, als g\u00e4be es <a href=\"https:\/\/www.postgresql.org\/docs\/7.0\/security.htm\" target=\"_blank\" rel=\"noopener noreferrer\">eine Million verschiedene M\u00f6glichkeiten, sie zu sperren<\/a>.<\/p>\n<h3>Zugriffsbeschr\u00e4nkung auf der Host- oder Benutzerebene<\/h3>\n<p>Beginnen wir mit dem Zugriff. Postgres schr\u00e4nkt den Zugriff auf zwei Arten ein:<\/p>\n<ol start=\"1\">\n<li>Auf <strong>Host-Ebene<\/strong> &#8211; Definition von IP-Adressen und Dom\u00e4nen mit Zugriffsrechten<\/li>\n<li>Auf der <strong>Benutzerebene<\/strong> &#8211; Definition von Datenbankbenutzern und deren Berechtigungen<\/li>\n<\/ol>\n<p>In der <a href=\"https:\/\/www.postgresql.org\/docs\/current\/auth-pg-hba-conf.html\" target=\"_blank\" rel=\"noopener noreferrer\">Datei <strong>pg_hba.conf<\/strong><\/a> im PGDATA-Verzeichnis legst du fest, wer sich mit welchen Datenbanken verbinden darf. Wenn du dort keinen Eintrag f\u00fcr einen Kunden hast, kann dieser nicht auf die Datenbank zugreifen. Angenommen, dein Anwendungsserver l\u00e4uft woanders, dann k\u00f6nntest du ihm den Zugriff auf die Datenbank erlauben:<\/p>\n<pre><code class=\"language-bash\"># Trust any connection via TCP\/IP from this machine\nhost all 127.0.0.1 255.255.255.255 trust<\/code><\/pre>\n<p>Abgesehen von &#8222;vertraue allen Verbindungen von diesem Rechner&#8220; gibt es viele verschiedene M\u00f6glichkeiten, <a href=\"https:\/\/www.postgresql.org\/docs\/current\/client-authentication.html\" target=\"_blank\" rel=\"noopener noreferrer\">deinen Client gegen\u00fcber dem Datenbankserver zu authentifizieren<\/a>, vom Passwort \u00fcber die Identit\u00e4t bis hin zu Zertifikaten. Und wenn du auf die Annehmlichkeiten von RDS (oder Kinsta) verzichtest und dein Backend auf demselben Server wie deine Datenbank laufen l\u00e4sst, kannst du <a href=\"https:\/\/www.postgresql.org\/docs\/current\/runtime-config-connection.html\">dich \u00fcber Unix-Sockets statt \u00fcber TCP\/IP verbinden<\/a>.<\/p>\n<h3>Autorisierung und Privilegien<\/h3>\n<p>Sobald dein Client selbst authentifiziert ist, musst du dich mit der Frage der Autorisierung befassen. Der SQL-Standard definiert ein Berechtigungssystem, und jedes Objekt in Postgres (z. B. eine Tabelle, eine Zeile usw.) hat verschiedene Berechtigungen, die den Benutzern zugewiesen werden k\u00f6nnen: Dinge wie <code>SELECT<\/code> und <code>UPDATE<\/code>, aber auch <code>TRUNCATE<\/code>, <code>REFERENCES<\/code>, <code>TRIGGER<\/code> usw. Du vergibst die Privilegien an Benutzer mit dem <code><a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-grant.html\" target=\"_blank\" rel=\"noopener noreferrer\">GRANT<\/a><\/code> befehl.<\/p>\n<p>Am besten befolgst du das Prinzip der geringsten Berechtigung. Der Datenbankbenutzer, den du f\u00fcr deine(n) Client(s) anlegst, sollte also nur auf das zugreifen <em>k\u00f6nnen<\/em>, was er <em>braucht<\/em>.<\/p>\n<h3>Sicherheit auf Zeilenebene<\/h3>\n<p>Der letzte Punkt, den wir hier behandeln, ist die <strong><a href=\"https:\/\/www.postgresql.org\/docs\/current\/ddl-rowsecurity.html\" target=\"_blank\" rel=\"noopener noreferrer\">sicherheit auf Zeilenebene<\/a><\/strong>. RLS besteht aus der Perspektive der Tabelle (nicht des Benutzers) und schr\u00e4nkt ein, auf welche Zeilen zugegriffen werden kann, welche aktualisiert werden k\u00f6nnen usw. Standardm\u00e4\u00dfig ist RLS f\u00fcr Tabellen nicht aktiviert, so dass deine Nutzer alles tun k\u00f6nnen, was ihre Zugriffsrichtlinien vorschreiben. Um RLS f\u00fcr eine Tabelle zu aktivieren, beginnst du mit:<\/p>\n<pre><code class=\"language-sql\">ALTER TABLE [table_name] ENABLE ROW LEVEL SECURITY<\/code><\/pre>\n<p>Und f\u00fcge dann eine Richtlinie hinzu. Angenommen, du m\u00f6chtest den Lesezugriff auf deine Tabelle <strong>lightsaber_internals <\/strong>auf vertrauensw\u00fcrdige Personen beschr\u00e4nken, die bereits in der <strong>Jedi-Benutzergruppe<\/strong> definiert sind, so dass nur der Besitzer eines Lichtschwerts dessen interne Details sehen kann. So w\u00fcrdest du es machen:<\/p>\n<pre><code class=\"language-sql\">ALTER TABLE lightsaber_internals ENABLE ROW LEVEL SECURITY\nCREATE POLICY jedi_only ON lightsaber_internals TO jedi\n    USING (jedi = lightsaber_jedi);<\/code><\/pre>\n<p>RLS-Richtlinien wie diese sind n\u00fctzlich, wenn du Sicherheit auf einer detaillierteren Ebene als nur Tabellen brauchst (Situationen mit personenbezogenen Daten usw.).<\/p>\n<h2>Denke im Voraus \u00fcber Skalierungsprobleme nach<\/h2>\n<p>In jedem Startup, in dem ich je gearbeitet habe, gab es ein gewisses Ma\u00df an manueller Skalierung, wenn es um die Datenbank ging. Eines Tages wachst du auf und Datadog flippt aus, weil auf deinem Postgres-Server kein Platz mehr ist. Du gehst der Sache nach, aktualisierst die Vorfallsseite und erh\u00f6hst schlie\u00dflich die Festplattengr\u00f6\u00dfe, bis es wieder passiert (obwohl es beim n\u00e4chsten Mal vielleicht ein RAM-Problem ist). Diesen Dingen zuvorzukommen, kann helfen! Ein paar Vorschl\u00e4ge:<\/p>\n<h3>1. Datenbank\u00fcberwachung einrichten<\/h3>\n<p>Die meisten Unternehmen, bei denen ich gearbeitet habe, nutzen <a href=\"https:\/\/www.datadoghq.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Datadog<\/a> f\u00fcr ihre Datenbank\u00fcberwachung. Wenn du einen verwalteten Datenbankservice nutzt, kommst du wahrscheinlich auch mit deren eigenen Funktionen zurecht. Im Blog von Datadog findest du einen <a href=\"https:\/\/www.datadoghq.com\/blog\/postgresql-monitoring\/\" target=\"_blank\" rel=\"noopener noreferrer\">guten Beitrag<\/a> \u00fcber die wichtigsten Kennzahlen, die du beobachten solltest, wie z. B. Lese- und Schreibdurchsatz, sequentielle Scans, auf die Festplatte geschriebene Daten usw.<\/p>\n<h3>2. Erstelle Richtlinien f\u00fcr die vertikale Skalierung<\/h3>\n<p>Wenn dein Team angepiepst wird &#8211; und das wird passieren &#8211; ist das Letzte, was du willst, dass alle an Deck gehen m\u00fcssen, um das Problem zu l\u00f6sen, obwohl in den meisten F\u00e4llen eine einfache Skalierung das Problem l\u00f6st. Es ist gut, wenn du f\u00fcr dein Team einen Plan aufstellst, was alles m\u00f6glich ist, wenn dir der Platz oder die Rechenleistung ausgeht.<\/p>\n<h3>3. Vakuumieren und Abstimmen deines Autovakuums<\/h3>\n<p>Wenn du <code>DELETE<\/code> Daten in Postgres oder <code>UPDATE<\/code> Daten l\u00f6schst (was funktional dem L\u00f6schen und Einf\u00fcgen entspricht), l\u00f6scht Postgres <a href=\"https:\/\/www.2ndquadrant.com\/en\/blog\/autovacuum-tuning-basics\/\" target=\"_blank\" rel=\"noopener noreferrer\">diese Daten nicht<\/a> sofort (\ud83d\ude31). Stattdessen werden sie als gel\u00f6scht &#8222;markiert&#8220;, indem die Transaktions-ID der L\u00f6schung in einem <strong>xmax-Header<\/strong> gespeichert wird; der Grund daf\u00fcr ist, dass MVCC in Postgres dadurch einfacher wird. Wenn diese Zeilen aber nicht <em>wirklich<\/em> gel\u00f6scht werden, verschwenden sie Speicherplatz und bereiten dir Probleme.<\/p>\n<p>Der einfachste Weg, diese Zeilen loszuwerden, ist die Verwendung des <code><a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-vacuum.html\" target=\"_blank\" rel=\"noopener noreferrer\">VACUUM<\/a><\/code> befehl. Du k\u00f6nntest das Vakuum manuell ausf\u00fchren, wenn sich tote Zeilen ansammeln, oder es sogar so einstellen, dass es alle x Minuten ausgef\u00fchrt wird. Das Tuning deines Autovakuums ist ein komplexes Thema, das den Rahmen dieses Beitrags sprengen w\u00fcrde: Ich empfehle dir, den <a href=\"https:\/\/www.2ndquadrant.com\/en\/blog\/autovacuum-tuning-basics\/\">Beitrag von 2ndQuadrant dar\u00fcber zu lesen<\/a>.<\/p>\n<h3>4. Einrichten einer Read Replica (oder zwei)<\/h3>\n<p>Das ist ganz einfach. Wenn du mit einem erheblichen Anstieg des Datenverkehrs rechnest (z. B. bei einer bevorstehenden Markteinf\u00fchrung), kannst du ganz einfach nur lesende Repliken einrichten (oder zumindest eine), um die Haupt-DB-Instanz zu entlasten.<\/p>\n<p>Wenn du dich f\u00fcr mehrere Replikate entscheidest, hast du den zus\u00e4tzlichen Vorteil, dass du die Verf\u00fcgbarkeit verbesserst, falls eines der Replikate aus irgendeinem Grund ausf\u00e4llt. Das Hinzuf\u00fcgen von Replikaten ist bei den meisten DBaaS-Anbietern ziemlich einfach; achte nur auf die Kosten: Sie kosten oft genauso viel wie eine Haupt-DB-Instanz, obwohl sie nur lesend arbeiten.<\/p>\n<h2>F\u00fcge Indizes zu deinen (erwarteten) gr\u00f6\u00dften Tabellen hinzu<\/h2>\n<p>Datenbankindizes helfen dabei, Leseabfragen zu beschleunigen, indem sie zus\u00e4tzliche Datenstrukturen erstellen, die deine Scans schneller machen. F\u00fcr viele Anwendungsf\u00e4lle ist das Hinzuf\u00fcgen eines Indexes zu ein oder zwei Tabellen im Grunde ein Kinderspiel. In Postgres kannst du einen Index mit dem <code><a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-createindex.html\" target=\"_blank\" rel=\"noopener noreferrer\">CREATE INDEX<\/a><\/code> befehl erstellen (duh). Wenn du eine Tabelle abfragst, pr\u00fcft die Datenbank, ob ein Index vorhanden ist, und verwendet ihn, wenn dies der Fall ist (du kannst dies \u00fcbrigens mit <code><a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-explain.html\" target=\"_blank\" rel=\"noopener noreferrer\">EXPLAIN<\/a><\/code> \u00fcberpr\u00fcfen).<\/p>\n<p>Der beliebteste Index-Typ in Postgres &#8211; und der Standard-Index, wenn du <code>CREATE INDEX<\/code> verwendest &#8211; ist ein <strong>B-Tree-Index<\/strong>. Er nimmt die Spalte, f\u00fcr die du einen Index erstellen willst, sortiert sie und speichert Zeiger auf die sortierten Zeilen. Auf diese Weise kannst du die Effizienz der bin\u00e4ren Suche auf jede beliebige Spalte anwenden, nicht nur auf die Spalte, nach der die Tabelle sortiert ist (wenn es \u00fcberhaupt eine gibt). In den Postgres-Dokumenten kannst du <a href=\"https:\/\/www.postgresql.org\/docs\/current\/btree-implementation.html\" target=\"_blank\" rel=\"noopener noreferrer\">nachlesen<\/a>, wie diese B\u00e4ume implementiert sind.<\/p>\n<p>Obwohl sie n\u00fctzlich sind, sind Indizes kein reines Vergn\u00fcgen: Sie brauchen Platz und wenn du nicht darauf achtest, wie viele und welche Art von Indizes du erstellst, k\u00f6nnen sie die Leistung der Datenbank beeintr\u00e4chtigen. Niemand schildert das besser als die <a href=\"https:\/\/www.postgresql.org\/docs\/current\/sql-createindex.html\" target=\"_blank\" rel=\"noopener noreferrer\">Postgres-Dokumente<\/a> selbst:<\/p>\n<p><em>&#8222;Indizes werden in erster Linie verwendet, um die Leistung der Datenbank zu verbessern (obwohl eine unsachgem\u00e4\u00dfe Verwendung zu einer geringeren Leistung f\u00fchren kann).&#8220;<\/em><\/p>\n<p>Wenn du einen Index erstellst, erstellt Postgres eine Nachschlagetabelle, die den Index und einen Zeiger auf den Datensatz des Index enth\u00e4lt. Zu viele dieser Tabellen verbrauchen Speicherplatz, lassen INSERT-Abfragen l\u00e4nger dauern und zwingen die Abfrage-Engine, mehr Optionen in Betracht zu ziehen, bevor sie entscheidet, wie eine Abfrage ausgef\u00fchrt werden soll.<\/p>\n<h2>Bonus: F\u00fcge einige Postgres-Erweiterungen hinzu<\/h2>\n<p>Eine Sache, die Postgres einzigartig macht, ist die <a href=\"https:\/\/www.postgresql.org\/docs\/15\/external-extensions.html\" target=\"_blank\" rel=\"noopener noreferrer\">native Unterst\u00fctzung<\/a> f\u00fcr Erweiterungen von Drittanbietern. Du kannst sie aus SQL und C erstellen, und sie k\u00f6nnen so klein wie ein paar Anweisungen oder so gro\u00df wie eine ganze Software-Bibliothek sein. Die Verwendung von <a href=\"https:\/\/gist.github.com\/joelonsql\/e5aa27f8cc9bd22b8999b7de8aee9d47#file-postgresql-extensions-md\" target=\"_blank\" rel=\"noopener noreferrer\">\u00f6ffentlich verf\u00fcgbaren \/ Open-Source-Erweiterungen<\/a> hilft dir genauso wie die Verwendung eines Softwarepakets: Warum solltest du deinen eigenen Code schreiben, wenn du den von jemand anderem verwenden kannst? Hier sind ein paar der beliebtesten Postgres-Erweiterungen:<\/p>\n<h3>Timescale<\/h3>\n<p><a href=\"https:\/\/www.timescale.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Timescale<\/a> ist eine Postgres-Erweiterung f\u00fcr die Arbeit mit Zeitreihendaten. Kurz gesagt, sie macht deine Abfragen (viel) schneller und speichert Zeitreihendaten sehr effizient. Eine Installationsanleitung findest du <a href=\"https:\/\/docs.timescale.com\/self-hosted\/latest\/install\/\" target=\"_blank\" rel=\"noopener noreferrer\">hier<\/a>. Du kannst auch die Cloud-Hosting-Option von Timescale in Betracht ziehen, wenn du wirklich mit Zeitreihendaten arbeitest (obwohl du das wahrscheinlich schon wei\u00dft).<\/p>\n<h3>PostGIS<\/h3>\n<p><a href=\"https:\/\/postgis.net\/\" target=\"_blank\" rel=\"noopener noreferrer\">PostGIS<\/a> erweitert Postgres um die M\u00f6glichkeit, geografische Daten zu speichern, zu indizieren und abzufragen (z. B. Linien, Polygone, Orte usw.). Wenn du einen Cloud-Anbieter nutzt, ist PostGIS meist schon vorinstalliert. Wenn du es jedoch selbst installieren musst, findest du <a href=\"https:\/\/postgis.net\/documentation\/getting_started\/\" target=\"_blank\" rel=\"noopener noreferrer\">hier<\/a> eine Installationsanleitung.<\/p>\n<h3>pg_stat_staements<\/h3>\n<p><a href=\"https:\/\/www.postgresql.org\/docs\/current\/pgstatstatements.html\" target=\"_blank\" rel=\"noopener noreferrer\">pg_stat_statements<\/a> erstellt eine Ansicht in deiner Postgres-Datenbank mit Statistiken zu jeder Abfrage, die in der Datenbank ausgef\u00fchrt wird. Du kannst Statistiken sehen, wie lange die Abfrage dauert (Mittelwert, Median, Durchschnitt usw.), wer die Abfrage ausgef\u00fchrt hat, Block-Cache-Treffer, Anzahl der geschriebenen Bl\u00f6cke und vieles mehr (insgesamt 44 Spalten in dieser Ansicht). <a href=\"https:\/\/gist.github.com\/rcanepa\/535163dc249539912c25\" target=\"_blank\" rel=\"noopener noreferrer\">Zur Installation<\/a> f\u00fcgst du sie einfach zu deiner .conf-Datei hinzu und startest den Server neu.<\/p>\n<h3>pg_audit<\/h3>\n<p><a href=\"https:\/\/www.pgaudit.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">pg_audit<\/a> hilft bei Unternehmen, die einer detaillierten Pr\u00fcfung unterliegen (z. B. Beh\u00f6rden, Finanzinstitute usw.). Du kannst Postgres dazu bringen, jede einzelne Anweisung in der Datenbank zu protokollieren, indem du `log_statement=all` einstellst, aber das bedeutet nicht, dass die ben\u00f6tigten Informationen leicht zu finden sind. pg_audit nutzt die internen Protokollierungsfunktionen von Postgres, um das Auffinden und die Arbeit mit den Protokollen zu erleichtern, die ein Pr\u00fcfer m\u00f6glicherweise ben\u00f6tigt. Eine Installationsanleitung findest du <a href=\"https:\/\/github.com\/pgaudit\/pgaudit\" target=\"_blank\" rel=\"noopener noreferrer\">hier<\/a>.<\/p>\n<h2>Zusammenfassung<\/h2>\n<p>Postgres ist eine gro\u00dfartige (und <a href=\"https:\/\/clearbit.com\/resources\/books\/data-driven-marketing\/b2b-seo-content-that-ranks\" target=\"_blank\" rel=\"noopener noreferrer\">sehr beliebte<\/a>) Option, um dein Unternehmen darauf aufzubauen, und wir sind stolz darauf, sie bei Kinsta zu unterst\u00fctzen. Wir hoffen, dass diese Tipps dir dabei helfen, dein Unternehmen auf die Beine zu stellen und zu skalieren. Hast du weitere Tipps oder Gedanken aus deiner Erfahrung? Lass es uns hier wissen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Du beginnst also ein neues Projekt &#8211; oder Unternehmen &#8211; und hast dich f\u00fcr Postgres entschieden. Der schwierige Teil (die Wahl der Datenbank) ist vorbei, und &#8230;<\/p>\n","protected":false},"author":310,"featured_media":67890,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[973],"class_list":["post-67889","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","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>Das Handbuch f\u00fcr Startup-CTOs zum Einsatz von Postgres - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Hier erf\u00e4hrst du einige weniger bekannte Tipps f\u00fcr die langfristige Konfiguration von Postgres, von Connection Pooling \u00fcber Sicherheitsgrundlagen bis hin zu Erweiterungen und Indizes.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Das Handbuch f\u00fcr Startup-CTOs zum Einsatz von Postgres\" \/>\n<meta property=\"og:description\" content=\"Hier erf\u00e4hrst du einige weniger bekannte Tipps f\u00fcr die langfristige Konfiguration von Postgres, von Connection Pooling \u00fcber Sicherheitsgrundlagen bis hin zu Erweiterungen und Indizes.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-12-14T12:12:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-18T12:28:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\" \/>\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\/jpeg\" \/>\n<meta name=\"author\" content=\"Justin Gage\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Hier erf\u00e4hrst du einige weniger bekannte Tipps f\u00fcr die langfristige Konfiguration von Postgres, von Connection Pooling \u00fcber Sicherheitsgrundlagen bis hin zu Erweiterungen und Indizes.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Justin Gage\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"9\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/\"},\"author\":{\"name\":\"Justin Gage\",\"@id\":\"https:\/\/kinqsta.com\/de\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f\"},\"headline\":\"Das Handbuch f\u00fcr Startup-CTOs zum Einsatz von Postgres\",\"datePublished\":\"2023-12-14T12:12:30+00:00\",\"dateModified\":\"2023-12-18T12:28:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/\"},\"wordCount\":2099,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\",\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/\",\"url\":\"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/\",\"name\":\"Das Handbuch f\u00fcr Startup-CTOs zum Einsatz von Postgres - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\",\"datePublished\":\"2023-12-14T12:12:30+00:00\",\"dateModified\":\"2023-12-18T12:28:05+00:00\",\"description\":\"Hier erf\u00e4hrst du einige weniger bekannte Tipps f\u00fcr die langfristige Konfiguration von Postgres, von Connection Pooling \u00fcber Sicherheitsgrundlagen bis hin zu Erweiterungen und Indizes.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/#primaryimage\",\"url\":\"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\",\"contentUrl\":\"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinqsta.com\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL\",\"item\":\"https:\/\/kinqsta.com\/de\/thema\/postgresql\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Das Handbuch f\u00fcr Startup-CTOs zum Einsatz von Postgres\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinqsta.com\/de\/#website\",\"url\":\"https:\/\/kinqsta.com\/de\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen\",\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinqsta.com\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinqsta.com\/de\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinqsta.com\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinqsta.com\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\",\"https:\/\/x.com\/Kinsta_DE\",\"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:\/\/kinqsta.com\/de\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f\",\"name\":\"Justin Gage\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinqsta.com\/de\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/204874e8a52203e297ea240336c356ba?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/204874e8a52203e297ea240336c356ba?s=96&d=mm&r=g\",\"caption\":\"Justin Gage\"},\"description\":\"Justin is a technical writer and author of the popular Technically newsletter. He did his B.S. in Data Science before a stint in full-stack engineering and now focuses on making complex technical concepts accessible to everyone.\",\"sameAs\":[\"https:\/\/technically.substack.com\/\"],\"url\":\"https:\/\/kinqsta.com\/de\/blog\/author\/justingage\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Das Handbuch f\u00fcr Startup-CTOs zum Einsatz von Postgres - Kinsta\u00ae","description":"Hier erf\u00e4hrst du einige weniger bekannte Tipps f\u00fcr die langfristige Konfiguration von Postgres, von Connection Pooling \u00fcber Sicherheitsgrundlagen bis hin zu Erweiterungen und Indizes.","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:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/","og_locale":"de_DE","og_type":"article","og_title":"Das Handbuch f\u00fcr Startup-CTOs zum Einsatz von Postgres","og_description":"Hier erf\u00e4hrst du einige weniger bekannte Tipps f\u00fcr die langfristige Konfiguration von Postgres, von Connection Pooling \u00fcber Sicherheitsgrundlagen bis hin zu Erweiterungen und Indizes.","og_url":"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","article_published_time":"2023-12-14T12:12:30+00:00","article_modified_time":"2023-12-18T12:28:05+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","type":"image\/jpeg"}],"author":"Justin Gage","twitter_card":"summary_large_image","twitter_description":"Hier erf\u00e4hrst du einige weniger bekannte Tipps f\u00fcr die langfristige Konfiguration von Postgres, von Connection Pooling \u00fcber Sicherheitsgrundlagen bis hin zu Erweiterungen und Indizes.","twitter_image":"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","twitter_creator":"@Kinsta_DE","twitter_site":"@Kinsta_DE","twitter_misc":{"Verfasst von":"Justin Gage","Gesch\u00e4tzte Lesezeit":"9\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/#article","isPartOf":{"@id":"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/"},"author":{"name":"Justin Gage","@id":"https:\/\/kinqsta.com\/de\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f"},"headline":"Das Handbuch f\u00fcr Startup-CTOs zum Einsatz von Postgres","datePublished":"2023-12-14T12:12:30+00:00","dateModified":"2023-12-18T12:28:05+00:00","mainEntityOfPage":{"@id":"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/"},"wordCount":2099,"commentCount":0,"publisher":{"@id":"https:\/\/kinqsta.com\/de\/#organization"},"image":{"@id":"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/","url":"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/","name":"Das Handbuch f\u00fcr Startup-CTOs zum Einsatz von Postgres - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinqsta.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/#primaryimage"},"image":{"@id":"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","datePublished":"2023-12-14T12:12:30+00:00","dateModified":"2023-12-18T12:28:05+00:00","description":"Hier erf\u00e4hrst du einige weniger bekannte Tipps f\u00fcr die langfristige Konfiguration von Postgres, von Connection Pooling \u00fcber Sicherheitsgrundlagen bis hin zu Erweiterungen und Indizes.","breadcrumb":{"@id":"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/#primaryimage","url":"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","contentUrl":"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/the-startup-ctos-handbook-to-running-on-postgres.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinqsta.com\/de\/blog\/startup-ctos-handbuch-zum-einsatz-von-postgres\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinqsta.com\/de\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL","item":"https:\/\/kinqsta.com\/de\/thema\/postgresql\/"},{"@type":"ListItem","position":3,"name":"Das Handbuch f\u00fcr Startup-CTOs zum Einsatz von Postgres"}]},{"@type":"WebSite","@id":"https:\/\/kinqsta.com\/de\/#website","url":"https:\/\/kinqsta.com\/de\/","name":"Kinsta\u00ae","description":"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen","publisher":{"@id":"https:\/\/kinqsta.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinqsta.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/kinqsta.com\/de\/#organization","name":"Kinsta","url":"https:\/\/kinqsta.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinqsta.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinqsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinqsta.com\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","https:\/\/x.com\/Kinsta_DE","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:\/\/kinqsta.com\/de\/#\/schema\/person\/9c79ef0f55180723ff2b31baffe9070f","name":"Justin Gage","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinqsta.com\/de\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/204874e8a52203e297ea240336c356ba?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/204874e8a52203e297ea240336c356ba?s=96&d=mm&r=g","caption":"Justin Gage"},"description":"Justin is a technical writer and author of the popular Technically newsletter. He did his B.S. in Data Science before a stint in full-stack engineering and now focuses on making complex technical concepts accessible to everyone.","sameAs":["https:\/\/technically.substack.com\/"],"url":"https:\/\/kinqsta.com\/de\/blog\/author\/justingage\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/posts\/67889","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/users\/310"}],"replies":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/comments?post=67889"}],"version-history":[{"count":6,"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/posts\/67889\/revisions"}],"predecessor-version":[{"id":67953,"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/posts\/67889\/revisions\/67953"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinqsta.com\/de\/wp-json\/kinsta\/v1\/posts\/67889\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinqsta.com\/de\/wp-json\/kinsta\/v1\/posts\/67889\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinqsta.com\/de\/wp-json\/kinsta\/v1\/posts\/67889\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinqsta.com\/de\/wp-json\/kinsta\/v1\/posts\/67889\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinqsta.com\/de\/wp-json\/kinsta\/v1\/posts\/67889\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinqsta.com\/de\/wp-json\/kinsta\/v1\/posts\/67889\/translations\/jp"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinqsta.com\/de\/wp-json\/kinsta\/v1\/posts\/67889\/translations\/es"},{"href":"https:\/\/kinqsta.com\/de\/wp-json\/kinsta\/v1\/posts\/67889\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/media\/67890"}],"wp:attachment":[{"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/media?parent=67889"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/tags?post=67889"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinqsta.com\/de\/wp-json\/wp\/v2\/topic?post=67889"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}