{"id":97939,"date":"2020-10-23T08:42:49","date_gmt":"2020-10-23T06:42:49","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai"},"modified":"2020-10-23T08:42:49","modified_gmt":"2020-10-23T06:42:49","slug":"dba-bot-joe-anatolij-stansler-postgres-ai","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","title":{"rendered":"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/3bb5cc6d6be1699fc72342a74aa4020a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wie versteht ein Backend-Entwickler, dass eine SQL-Abfrage in der Produktion gut funktionieren wird? In gro\u00dfen oder schnell wachsenden Unternehmen haben nicht alle Zugang zur Produktion. Und auch mit Zugang k\u00f6nnen viele Abfragen nicht schmerzfrei getestet werden, und das Erstellen einer Kopie der Datenbank dauert oft Stunden. Um diese Probleme zu l\u00f6sen, haben wir einen k\u00fcnstlichen DBA geschaffen \u2013 Joe. Er wurde bereits erfolgreich in mehreren Unternehmen implementiert und hilft nicht nur einem Dutzend von Entwicklern. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Video:<\/p>\n<p>\n<center><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5f913081905dc4e15aeed783\" frameborder=\"0\" allowfullscreen><\/iframe><\/center><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/48e63de499e46be4be19aa8c926e5716.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hallo zusammen! Mein Name ist Anatoli Stansler. Ich arbeite bei <noindex><a rel=\"nofollow\" href=\"https:\/\/postgres.ai\/\">Postgres.ai<\/a><\/noindex>. Wir k\u00fcmmern uns darum, den Entwicklungsprozess zu beschleunigen, indem wir Verz\u00f6gerungen, die mit der Nutzung von Postgres verbunden sind, f\u00fcr Entwickler, DBAs und QA eliminieren.<\/p>\n<p><\/p>\n<p>Wir haben gro\u00dfartige Kunden, und heute wird ein Teil des Vortrags den F\u00e4llen gewidmet sein, die wir in der Zusammenarbeit mit ihnen erlebt haben. Ich werde erz\u00e4hlen, wie wir ihnen geholfen haben, ernsthafte Probleme zu l\u00f6sen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5bd7d2538a4940afb28d6375a9516760.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wenn wir entwickeln und komplexe belastete Migrationen durchf\u00fchren, stellen wir uns die Frage: \u201eWird diese Migration gelingen?\u201c. Wir nutzen Reviews, wir profitieren vom Wissen erfahrenerer Kollegen, DBA-Experten. Und sie k\u00f6nnen sagen, ob es funktionieren wird oder nicht. <\/p>\n<p><\/p>\n<p>Aber es w\u00e4re vielleicht besser, wenn wir dies selbst auf vollst\u00e4ndigen Kopien testen k\u00f6nnten. Heute werden wir genau dar\u00fcber sprechen, welche Ans\u00e4tze es derzeit f\u00fcr Tests gibt und wie man es besser machen kann und mit welchen Tools. Au\u00dferdem werden wir die Vor- und Nachteile solcher Ans\u00e4tze besprechen und was wir hier verbessern k\u00f6nnen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/aca9f4c4fbbfc6db9c24f862216fb5d4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wer hat jemals direkt in der Produktion Indizes erstellt oder \u00c4nderungen vorgenommen? Ziemlich viele. Und bei wem hat das dazu gef\u00fchrt, dass Daten verloren gingen oder es zu Ausf\u00e4llen kam? Dann kennen Sie diesen Schmerz. Gott sei Dank gibt es Backups. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7795bf3cb1f3f6f9919ca42758fa51e9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Der erste Ansatz ist das Testen in der Produktion. Oder wenn ein Entwickler von seinem lokalen Rechner aus arbeitet, hat er Testdaten, es gibt eine begrenzte Auswahl. Und wir bringen es in die Produktion und erhalten so eine Situation.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/05b120bf57904f553422f419337d5220.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es ist schmerzhaft, es ist kostspielig. Wahrscheinlich sollte man das besser nicht tun. <\/p>\n<p><\/p>\n<p>Wie k\u00f6nnte man es besser machen? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a8727bc2cd217d89edaf9df8588306d9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lassen Sie uns Staging nehmen und einen Teil der Produktion dorthin auslagern. Oder, im besten Fall, nehmen wir die echte Produktion, alle Daten. Und nachdem wir lokal entwickelt haben, sollten wir auch auf Staging zus\u00e4tzliche Pr\u00fcfungen durchf\u00fchren. <\/p>\n<p><\/p>\n<p>Das wird uns helfen, einen Teil der Fehler zu beseitigen, d.h. sie in der Produktion zu vermeiden. <\/p>\n<p><\/p>\n<p>Welche Probleme gibt es? <\/p>\n<p><\/p>\n<ul>\n<li>Das Problem ist, dass wir diese Staging-Umgebung mit Kollegen teilen. Und es kommt sehr oft vor, dass du eine \u00c4nderung vornimmst, zack \u2013 und keine Daten mehr da sind, die Arbeit ist umsonst. Das Staging war mehrere Terabyte gro\u00df. Und es dauert lange, bis es wieder online ist. Und wir entscheiden, dass wir es morgen weiterbearbeiten. Das hei\u00dft, unsere Entwicklung steht still. <\/li>\n<li>Und nat\u00fcrlich arbeiten dort viele Kollegen, viele Teams. Und das muss man manuell abstimmen. Das ist unpraktisch. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/ad4612f2b06ac09e666e33196d898a79.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es ist erw\u00e4hnenswert, dass wir nur einen Versuch haben, einen Schuss, wenn wir \u00c4nderungen an der Datenbank vornehmen, Daten anpassen oder die Struktur \u00e4ndern wollen. Und wenn etwas schiefgeht, wenn ein Fehler bei der Migration auftritt, k\u00f6nnen wir uns nicht schnell zur\u00fcckziehen. <\/p>\n<p><\/p>\n<p>Es ist besser als der vorherige Ansatz, aber es besteht immer noch eine hohe Wahrscheinlichkeit, dass ein Fehler in die Produktion gelangt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/73faffc3ef6e368a0901145c48b903b1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was hindert uns daran, jedem Entwickler eine Testumgebung, eine vollwertige Kopie zu geben? Ich denke, das ist klar. <\/p>\n<p><\/p>\n<p>Wer hat eine Datenbank, die gr\u00f6\u00dfer als ein Terabyte ist? Mehr als die H\u00e4lfte des Raums. <\/p>\n<p><\/p>\n<p>Und es ist klar, dass es sehr teuer und zudem zeitaufwendig ist, Maschinen f\u00fcr jeden Entwickler bereitzustellen, wenn die Produktionsumgebung so gro\u00df ist. <\/p>\n<p><\/p>\n<p>Wir haben Kunden, die erkannt haben, dass es sehr wichtig ist, alle \u00c4nderungen an vollwertigen Kopien zu testen, aber ihre Datenbanken sind kleiner als ein Terabyte und sie haben nicht die Ressourcen, um f\u00fcr jeden Entwickler eine Testumgebung bereitzustellen. Deshalb m\u00fcssen sie die Dumps lokal auf ihren Rechner herunterladen und auf diese Weise testen. Das nimmt eine Menge Zeit in Anspruch. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/8c1c804db71ffb5b79b5284670b3427b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Selbst wenn Sie das innerhalb der Infrastruktur erledigen, ist es schon sehr gut, einen Terabyte Daten in einer Stunde herunterzuladen. Aber sie verwenden logische Dumps, sie laden lokal aus der Cloud herunter. F\u00fcr sie liegt die Geschwindigkeit bei etwa 200 Gigabyte pro Stunde. Und es dauert auch Zeit, um aus dem logischen Dump zu entpacken, Indizes aufzuspielen usw.<\/p>\n<p><\/p>\n<p>Aber sie verwenden diesen Ansatz, weil es hilft, die Produktion stabil zu halten. <\/p>\n<p><\/p>\n<p>Was k\u00f6nnen wir hier tun? Lassen Sie uns daf\u00fcr sorgen, dass die Testumgebungen kosteng\u00fcnstig sind und jedem Entwickler seine eigene Testumgebung zur Verf\u00fcgung gestellt wird.<\/p>\n<p><\/p>\n<p>Und das ist m\u00f6glich. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a763fc2677fe93df884b80561b5270a2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und bei diesem Ansatz, wenn wir d\u00fcnne Klone f\u00fcr jeden Entwickler erstellen, k\u00f6nnen wir das auf einem Ger\u00e4t teilen. Wenn Sie beispielsweise eine vier Terabyte gro\u00dfe Datenbank haben und diese 10 Entwicklern zur Verf\u00fcgung stellen m\u00f6chten, m\u00fcssen Sie nicht 10 mal eine vier Terabyte gro\u00dfe Datenbank haben. Eine Maschine reicht aus, um d\u00fcnne, isolierte Kopien f\u00fcr jeden Entwickler zu erstellen, indem Sie eine Maschine verwenden. Wie das funktioniert, werde ich sp\u00e4ter erl\u00e4utern. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/e8e9df7effb0d0241d90315f92b994c6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Echtes Beispiel:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Datenbank \u2013 4,5 Terabyte. <\/p>\n<p>\n<\/li>\n<li>\n<p>Wir k\u00f6nnen unabh\u00e4ngige Kopien in 30 Sekunden erhalten. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Sie m\u00fcssen nicht auf eine Testumgebung warten und von ihrer Gr\u00f6\u00dfe abh\u00e4ngig sein. Sie k\u00f6nnen sie in Sekundenschnelle erhalten. Dies werden vollst\u00e4ndig isolierte Umgebungen sein, die jedoch die Daten untereinander teilen. <\/p>\n<p><\/p>\n<p>Das ist cool. Hier sprechen wir von Magie und Paralleluniversen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/87e6a7e45548ed5dabd4fad01ea70616.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In unserem Fall funktioniert das mit dem OpenZFS-System. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/e75fed43703e26152a5a85f807064cb4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>OpenZFS ist ein Copy-on-Write-Dateisystem, das von Haus aus Snapshots und Klone unterst\u00fctzt. Es ist zuverl\u00e4ssig und skalierbar. Es l\u00e4sst sich ganz einfach verwalten. Man kann es mit nur zwei Befehlen bereitstellen. <\/p>\n<p><\/p>\n<p>Es gibt andere Optionen:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>LVM,<\/p>\n<p>\n<\/li>\n<li>\n<p>Speichersysteme (z. B. Pure Storage).<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Die Datenbanklabors, \u00fcber die ich spreche, sind modular. Man kann sie unter Verwendung solcher Optionen implementieren. Aber bisher haben wir uns auf OpenZFS konzentriert, da es speziell mit LVM Probleme gab. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/41a49f6760ee96b55f49606f8e453992.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wie funktioniert das? Anstatt die Daten jedes Mal neu zu schreiben, wenn wir sie \u00e4ndern, speichern wir sie, indem wir einfach kennzeichnen, dass diese neuen Daten zu einem neuen Zeitpunkt, zu einem neuen Snapshot geh\u00f6ren. <\/p>\n<p><\/p>\n<p>Und wenn wir sp\u00e4ter zur\u00fcckrollen oder einen neuen Klon von einer \u00e4lteren Version erstellen m\u00f6chten, sagen wir einfach: \u201eOk, geben Sie uns die Datenbl\u00f6cke, die so gekennzeichnet sind\u201c. <\/p>\n<p><\/p>\n<p>Und der Benutzer wird mit diesem Datensatz arbeiten. Er wird diese nach und nach \u00e4ndern und seine Snapshots erstellen. <\/p>\n<p><\/p>\n<p>Und wir werden Verzweigungen haben. Jeder Entwickler hat in unserem Fall die M\u00f6glichkeit, seinen eigenen Klon zu haben, den er bearbeitet, und die gemeinsamen Daten werden unter allen geteilt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/78efd8b87f6559839af20a939b7c89d7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Um ein solches System bei sich zu implementieren, m\u00fcssen zwei Probleme gel\u00f6st werden: <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Die erste ist die Datenquelle, von der Sie sie abrufen. Sie k\u00f6nnen die Replikation von der Produktion einstellen. Sie k\u00f6nnen bereits konfigurierte Backups verwenden, hoffe ich. WAL-E, WAL-G oder Barman. Und selbst wenn Sie eine Cloud-L\u00f6sung wie RDS oder Cloud SQL verwenden, k\u00f6nnen Sie logische Dumps nutzen. Aber wir empfehlen Ihnen dennoch, Backups zu verwenden, denn bei diesem Ansatz bleibt Ihnen auch die physische Struktur der Dateien erhalten, was es erm\u00f6glicht, n\u00e4her an den Metriken zu sein, die Sie in der Produktion sehen w\u00fcrden, um die Probleme zu erkennen, die es gibt. <\/p>\n<p>\n<\/li>\n<li>\n<p>Die zweite ist der Ort, an dem Sie Database Lab hosten m\u00f6chten. Das kann in der Cloud sein oder vor Ort. Hier ist wichtig zu erw\u00e4hnen, dass ZFS Datenkompression unterst\u00fctzt. Und das macht es ziemlich gut. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Stellen Sie sich vor, dass jeder solcher Klone, abh\u00e4ngig von den Operationen, die wir mit der Datenbank durchf\u00fchren, eine Art Dev-Ressource aufbauen wird. Daf\u00fcr ben\u00f6tigt dieser Dev ebenfalls Platz. Aber da wir eine Datenbank von 4,5 Terabyte \u00fcbernommen haben, wird ZFS sie auf 3,5 Terabyte komprimieren. Das kann je nach Einstellungen variiert werden. Und wir haben noch Platz f\u00fcr Dev. <\/p>\n<p><\/p>\n<p>Ein solches System kann f\u00fcr verschiedene Anwendungsf\u00e4lle genutzt werden. <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Das sind Entwickler, DBAs zur \u00dcberpr\u00fcfung von Abfragen, zur Optimierung. <\/p>\n<p>\n<\/li>\n<li>\n<p>Das kann im QA-Testen verwendet werden, um eine spezifische Migration zu pr\u00fcfen, bevor wir sie in die Produktion bringen. Au\u00dferdem k\u00f6nnen wir spezielle Umgebungen f\u00fcr QA mit echten Daten hochfahren, in denen sie neue Funktionen testen k\u00f6nnen. Und das wird Sekunden dauern anstatt Stunden, vielleicht sogar Tage in anderen F\u00e4llen, wo d\u00fcnne Kopien nicht verwendet werden. <\/p>\n<p>\n<\/li>\n<li>\n<p>Und noch ein zus\u00e4tzlicher Anwendungsfall. Wenn im Unternehmen kein Analysesystem eingerichtet ist, k\u00f6nnen wir einen d\u00fcnnen Klon der Produktionsdatenbank erstellen und ihn f\u00fcr langwierige Abfragen oder spezielle Indizes, die m\u00f6glicherweise in der Analyse Verwendung finden, zur Verf\u00fcgung stellen.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5fb0944f063c981f27449d948a59b73b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mit diesem Ansatz:<\/p>\n<p><\/p>\n<ol>\n<li>\n<p>Geringe Fehlerwahrscheinlichkeit in der Produktion, da wir alle \u00c4nderungen mit vollst\u00e4ndigen Daten getestet haben. <\/p>\n<p>\n<\/li>\n<li>\n<p>Wir schaffen eine Testkultur, da man nun nicht stundenlang auf seine eigene Umgebung warten muss. <\/p>\n<p>\n<\/li>\n<li>\n<p>Es gibt keine Barriere, kein Warten zwischen den Tests. Man kann tats\u00e4chlich gehen und alles \u00fcberpr\u00fcfen. Und das wird besser sein, da wir die Entwicklung beschleunigen werden. <\/p>\n<p>\n<\/li>\n<\/ol>\n<p><\/p>\n<ul>\n<li>\n<p>Es wird weniger Refactoring geben. Weniger Bugs gelangen in die Produktion. Wir werden sie sp\u00e4ter weniger refaktorisieren. <\/p>\n<p>\n<\/li>\n<li>\n<p>Wir k\u00f6nnen irreversible \u00c4nderungen vornehmen. Das gibt es in den Standardans\u00e4tzen nicht. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<ol>\n<li>Das ist vorteilhaft, da wir die Ressourcen der Testst\u00e4nde teilen. <\/li>\n<\/ol>\n<p><\/p>\n<p>Das ist schon gut, aber was k\u00f6nnte noch beschleunigt werden?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/d692f76b865c18ed4c178d1a1440774b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dank eines solchen Systems k\u00f6nnen wir die Einstiegsh\u00fcrde zu solchen Tests erheblich senken. <\/p>\n<p><\/p>\n<p>Aktuell gibt es einen Teufelskreis, bei dem Entwickler, um Zugriff auf echte, vollst\u00e4ndige Daten zu erhalten, Experten werden m\u00fcssen. Sie m\u00fcssen diesen Zugang vertrauensvoll erhalten. <\/p>\n<p><\/p>\n<p>Aber wie soll man wachsen, wenn dieser Zugang fehlt? Was ist, wenn dir nur eine sehr kleine Menge an Testdaten zur Verf\u00fcgung steht? Dann wirst du keine reale Erfahrung sammeln k\u00f6nnen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/221f7b02294878aea1d0ebe6df5d9717.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wie kommen wir aus diesem Kreis heraus? Als erste Schnittstelle, die f\u00fcr Entwickler aller Level bequem ist, haben wir einen Slack-Bot gew\u00e4hlt. Aber es k\u00f6nnte auch jede andere Schnittstelle sein. <\/p>\n<p><\/p>\n<p>Was erlaubt er? Man kann eine spezifische Abfrage nehmen und sie in einen speziellen Kanal f\u00fcr die Datenbank senden. Wir werden automatisch in wenigen Sekunden einen schlanken Klon bereitstellen. Wir f\u00fchren diese Abfrage aus. Sammeln Metriken und Empfehlungen. Zeigen eine Visualisierung an. Und dieser Klon bleibt dann vorhanden, damit diese Abfrage optimiert, Indizes hinzugef\u00fcgt usw. werden kann. <\/p>\n<p><\/p>\n<p>Und au\u00dferdem bietet uns Slack out-of-the-box Kollaboration M\u00f6glichkeiten. Da es sich einfach um einen Kanal handelt, kann man direkt dort im Thread mit dieser Abfrage beginnen, diese Abfrage diskutieren, seine Kollegen und DBAs, die innerhalb des Unternehmens sind, anpingen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/b4a6410b625107c5bbbf57c021159914.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aber es gibt nat\u00fcrlich auch Probleme. Da dies die reale Welt ist und wir einen Server nutzen, auf dem viele Klone gleichzeitig gehostet werden, m\u00fcssen wir die Speichermenge und die verf\u00fcgbare Rechenleistung f\u00fcr die Klone einschr\u00e4nken. <\/p>\n<p><\/p>\n<p>Um diese Tests aber glaubw\u00fcrdig zu gestalten, m\u00fcssen wir dieses Problem auf irgendeine Weise l\u00f6sen. <\/p>\n<p><\/p>\n<p>Es ist klar, dass identische Daten ein wichtiger Punkt sind. Aber das haben wir bereits. Und wir streben eine identische Konfiguration an. Und wir k\u00f6nnen eine nahezu identische Konfiguration bereitstellen. <\/p>\n<p><\/p>\n<p>Es w\u00e4re gro\u00dfartig, die gleiche Hardware wie in der Produktion zu haben, aber sie kann abweichen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5efae55189175262d56a33b89c55ed29.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lass uns daran erinnern, wie Postgres mit Speicher arbeitet. Wir haben zwei Caches. Einen von der Dateisystem- und einen eigenen Postgres, d.h. Shared Buffer Cache. <\/p>\n<p><\/p>\n<p>Es ist wichtig zu beachten, dass der Shared Buffer Cache beim Start von Postgres abh\u00e4ngig von der Gr\u00f6\u00dfe, die Sie in der Konfiguration festlegen, zugewiesen wird. <\/p>\n<p><\/p>\n<p>Der zweite Cache nutzt den gesamten verf\u00fcgbaren Speicherplatz. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/f1f3c85e786649f83d5c17e6724086a9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und wenn wir mehrere Klone auf einer Maschine erstellen, f\u00fcllen wir nach und nach den Speicher. Optimalerweise sollte der Shared Buffer Cache 25 % des gesamten Speichers betragen, der auf der Maschine verf\u00fcgbar ist. <\/p>\n<p><\/p>\n<p>Das bedeutet, dass wir, wenn wir diesen Parameter nicht \u00e4ndern, nur 4 Instanzen auf einer Maschine ausf\u00fchren k\u00f6nnen, also insgesamt 4 solcher schlanken Klone. Das ist nat\u00fcrlich nicht ideal, da wir gerne viel mehr h\u00e4tten. <\/p>\n<p><\/p>\n<p>Andererseits wird der Buffer Cache zur Ausf\u00fchrung von Abfragen, f\u00fcr Indizes verwendet; das bedeutet, der Plan h\u00e4ngt von der Gr\u00f6\u00dfe unserer Caches ab. Wenn wir diesen Parameter einfach verringern, k\u00f6nnten sich unsere Pl\u00e4ne erheblich \u00e4ndern.<\/p>\n<p><\/p>\n<p>Zum Beispiel, wenn wir auf prod einen gro\u00dfen Cache haben, wird Postgres bevorzugen, den Index zu verwenden. Andernfalls wird SeqScan verwendet. Was h\u00e4tte es f\u00fcr einen Sinn, wenn unsere Pl\u00e4ne nicht \u00fcbereinstimmen w\u00fcrden? <\/p>\n<p><\/p>\n<p>Hier kommen wir zu der Erkenntnis, dass der Plan in Postgres tats\u00e4chlich nicht von der spezifischen Gr\u00f6\u00dfe des Shared Buffers abh\u00e4ngt, sondern vom effective_cache_size.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/1457fd7b65c342f64733b952130125cf.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Effective_cache_size ist das gesch\u00e4tzte Cache-Volumen, das uns zur Verf\u00fcgung steht, also die Summe aus Buffer Cache und Dateisystem-Cache. Dies wird in der Konfiguration festgelegt. Dieser Speicher wird nicht zugewiesen. <\/p>\n<p><\/p>\n<p>Anhand dieses Parameters k\u00f6nnen wir Postgres gewisserma\u00dfen t\u00e4uschen, indem wir sagen, dass uns tats\u00e4chlich viele Daten zur Verf\u00fcgung stehen, auch wenn wir diese Daten nicht haben. So werden die Pl\u00e4ne vollst\u00e4ndig mit der Produktionsumgebung \u00fcbereinstimmen. <\/p>\n<p><\/p>\n<p>Dies k\u00f6nnte jedoch Auswirkungen auf das Timing haben. Wir optimieren unsere Anfragen nach dem Timing, aber es ist wichtig, dass das Timing von vielen Faktoren abh\u00e4ngt: <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Es h\u00e4ngt von der aktuellen Last auf prod ab. <\/p>\n<p>\n<\/li>\n<li>\n<p>Es h\u00e4ngt von den Eigenschaften der Maschine selbst ab. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Und das ist ein indirekter Parameter, aber wir k\u00f6nnen tats\u00e4chlich basierend auf der Menge an Daten optimieren, die diese Abfrage liest, um ein Ergebnis zu erzielen. <\/p>\n<p><\/p>\n<p>Und wenn wir m\u00f6chten, dass das Timing dem entspricht, was wir in der Prod sehen, m\u00fcssen wir die \u00e4hnlichste Hardware nehmen und m\u00f6glicherweise sogar mehr, damit alle Klone Platz finden. Aber das ist ein Kompromiss, d. h. Sie erhalten die gleichen Pl\u00e4ne, Sie sehen, wie viele Daten eine bestimmte Anfrage liest und k\u00f6nnen Schlussfolgerungen ziehen \u2013 diese Anfrage ist gut (oder die Migration) oder schlecht, sie muss weiter optimiert werden. <\/p>\n<p><\/p>\n<p>Lassen Sie uns analysieren, wie die Optimierung konkret mit Joe abl\u00e4uft. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/26c892a0b2d417f9806cfb77d2ea47f6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nehmen wir eine Anfrage aus einem realen System. In diesem Fall betr\u00e4gt die Datenbank 1 Terabyte. Und wir m\u00f6chten die Anzahl der frischen Beitr\u00e4ge z\u00e4hlen, die mehr als 10 Likes hatten. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/befd651abed6688127f52db39138a4be.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir senden eine Nachricht in den Kanal, ein Klon wurde f\u00fcr uns bereitgestellt. Und wir sehen, dass eine solche Anfrage in 2,5 Minuten bearbeitet wird. Das ist das Erste, was wir bemerken.<\/p>\n<p><\/p>\n<p>B Joe zeigt automatisierte Empfehlungen basierend auf dem Plan und den Metriken. <\/p>\n<p><\/p>\n<p>Wir werden sehen, dass die Anfrage zu viele Daten verarbeitet, um relativ wenige Zeilen zu erhalten. Und es ist ein spezieller Index erforderlich, da wir bemerkt haben, dass der Anfrage zu viele gefilterte Zeilen vorliegen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7f40e41314ebc682a1a64a2958dec16c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lassen Sie uns genauer betrachten, was passiert ist. Tats\u00e4chlich sehen wir, dass wir fast anderthalb Gigabyte Daten aus dem Dateicache oder sogar von der Festplatte gelesen haben. Das ist nicht gut, da wir nur 142 Zeilen abgerufen haben. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/30aaff5da2536fa27efc6591f645d6f9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und es scheint, dass wir hier einen Index-Scan haben sollten, der schnell ablaufen m\u00fcsste; aber da wir zu viele Zeilen gefiltert haben (wir mussten sie z\u00e4hlen), hat die Anfrage langsam gearbeitet. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/40958fbc04d4eb738f6a16488647bd8c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und das geschah im Plan, weil die Bedingungen in der Anfrage und die Bedingungen im Index teilweise nicht \u00fcbereinstimmen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/196ca5116e641c72bc1009e97c390bc7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lassen Sie uns versuchen, den Index pr\u00e4ziser zu gestalten, und schauen, wie sich die Ausf\u00fchrung der Anfrage danach ver\u00e4ndert. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/646a73964f0b6d3615eedb8acb3aa216.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Die Erstellung des Index hat viel Zeit in Anspruch genommen, aber jetzt \u00fcberpr\u00fcfen wir die Anfrage und sehen, dass die Zeit anstelle von 2,5 Minuten nur 156 Millisekunden betr\u00e4gt, was ziemlich gut ist. Und wir lesen nur 6 Megabyte Daten.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5cce2d6ecf2314c0575c0fed107f6d5a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und jetzt verwenden wir einen Index-Only-Scan.<\/p>\n<p><\/p>\n<p>Eine weitere wichtige Sache ist, dass wir den Plan auf eine verst\u00e4ndlichere Weise pr\u00e4sentieren m\u00f6chten. Wir haben bei uns eine Visualisierung mit Hilfe von Flame Graphs implementiert. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/f4f545bfbf52fd66b6cbe45e1d6d0b6c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das ist eine andere Anfrage, die reichhaltiger ist. Und die Flame Graphs bauen wir anhand von zwei Parametern auf: das ist die Menge an Daten, die ein bestimmter Knoten im Plan gelesen hat, und das Timing, d. h. die Ausf\u00fchrungszeit des Knotens. <\/p>\n<p><\/p>\n<p>Hier k\u00f6nnen wir die Knoten konkret untereinander vergleichen. Es wird deutlich, welcher von ihnen mehr oder weniger Platz ben\u00f6tigt, was normalerweise bei anderen Visualisierungsmethoden schwierig zu realisieren ist. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/c477d2f32241c69eb0b38ef45ff4708b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nat\u00fcrlich kennt jeder explain.depesz.com. Ein gutes Feature dieser Visualisierung ist, dass wir den textbasierten Plan speichern und auch einige Hauptparameter in eine Tabelle auslagern, um sie sortieren zu k\u00f6nnen. <\/p>\n<p><\/p>\n<p>Und auch Entwickler, die sich mit diesem Thema noch nicht tiefgehend besch\u00e4ftigt haben, nutzen explain.depesz.com, da sie leichter herausfinden k\u00f6nnen, welche Metriken wichtig sind und welche nicht. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a7352b5b9abf27294375c78bec69d4d4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es gibt einen neuen Ansatz zur Visualisierung \u2013 explain.dalibo.com. Sie erstellen eine baumartige Visualisierung, aber es ist sehr schwierig, die Knoten untereinander zu vergleichen. Hier kann man die Struktur gut verstehen, aber wenn die Abfrage gro\u00df ist, muss man hin und her scrollen, was auch eine Option ist. <\/p>\n<p><\/p>\n<h2 id=\"kollaboraciya\">Zusammenarbeit<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7101c0b95eafed8fd9305a4630399e3b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und, wie ich bereits sagte, bietet uns Slack die M\u00f6glichkeit zur Zusammenarbeit. Wenn wir beispielsweise auf eine komplizierte Abfrage sto\u00dfen, die schwer zu optimieren ist, k\u00f6nnen wir in einem Thread in Slack diese Frage mit unseren Kollegen kl\u00e4ren. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"DBA-Bot Joe. Anatolij Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/14b8f9c3401ecb68ac1ef56bc0cb0fa5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir halten es f\u00fcr wichtig, mit volllastf\u00e4higen Daten zu testen. Zu diesem Zweck haben wir das Tool Update Database Lab entwickelt, das als Open Source verf\u00fcgbar ist. Sie k\u00f6nnen auch den Bot Joe verwenden. Sie k\u00f6nnen ihn jetzt gleich nehmen und in Ihrem eigenen Umfeld implementieren. Alle Anleitungen sind dort verf\u00fcgbar. <\/p>\n<p><\/p>\n<p>Es ist auch wichtig zu beachten, dass die L\u00f6sung an sich nicht revolution\u00e4r ist, denn es gibt Delphix, aber das ist eine Unternehmensl\u00f6sung. Sie ist komplett geschlossen und sehr teuer. Wir spezialisieren uns speziell auf Postgres. Alle unsere Produkte sind Open Source. Schlie\u00dfen Sie sich uns an! <\/p>\n<p><\/p>\n<p>Damit beende ich. Vielen Dank!<\/p>\n<p><\/p>\n<h2 id=\"voprosy\">Fragen<\/h2>\n<p><\/p>\n<p><em>Hallo! Vielen Dank f\u00fcr den Vortrag! Sehr interessant, besonders f\u00fcr mich, da ich vor einiger Zeit eine \u00e4hnliche Aufgabe gel\u00f6st habe. Daher habe ich eine Reihe von Fragen. Ich hoffe, ich kann zumindest einige davon stellen.<\/em><\/p>\n<p><\/p>\n<p><em>Es interessiert mich, wie Sie den Platz f\u00fcr diese Umgebung berechnen? Die Technologie impliziert, dass unter bestimmten Umst\u00e4nden Ihre Klone auf die maximale Gr\u00f6\u00dfe anwachsen k\u00f6nnen. Grob gesagt: Wenn Sie eine zehn Terabyte gro\u00dfe Datenbank und 10 Klone haben, l\u00e4sst sich leicht eine Situation simulieren, in der jeder Klon 10 eindeutige Daten enth\u00e4lt. Wie berechnen Sie diesen Platz, also die Delta, von der Sie gesprochen haben, in der diese Klone leben werden?<\/em><\/p>\n<p><\/p>\n<p>Gute Frage. Hier ist es wichtig, auf die spezifischen Klone zu achten. Wenn ein Klon zu stark w\u00e4chst, k\u00f6nnen wir zun\u00e4chst eine Warnung an den Benutzer ausgeben oder diesen Klon sofort stoppen, um eine Fehlersituation zu vermeiden. <\/p>\n<p><\/p>\n<p><em>Ja, ich habe eine erg\u00e4nzende Frage. Wie stellen Sie den Lebenszyklus dieser Module sicher? Bei uns ist das ein Problem und eine ganz eigene Geschichte. Wie funktioniert das?<\/em><\/p>\n<p><\/p>\n<p>Jeder Klon hat eine Art TTL. Prinzipiell haben wir eine feste TTL. <\/p>\n<p><\/p>\n<p><em>Welche, wenn ich fragen darf?<\/em><\/p>\n<p><\/p>\n<p>1 Stunde, d. h. im Leerlauf \u2013 1 Stunde. Wenn er nicht verwendet wird, l\u00f6schen wir ihn. Aber da gibt es nichts \u00dcberraschendes, da wir den Klon innerhalb von Sekunden hochfahren k\u00f6nnen. Und wenn er wieder ben\u00f6tigt wird, bitte sehr. <\/p>\n<p><\/p>\n<p><em>Ich finde die Wahl der Technologien interessant, denn auch wir verwenden aus verschiedenen Gr\u00fcnden mehrere Ans\u00e4tze parallel. Warum gerade ZFS? Warum haben Sie nicht LVM verwendet? Sie haben erw\u00e4hnt, dass es Probleme mit LVM gab. Welche Probleme gab es? Meiner Meinung nach ist die Variante mit dem SAN bez\u00fcglich der Leistung am optimalsten.<\/em> <\/p>\n<p><\/p>\n<p><em>Was ist das Hauptproblem mit ZFS? Dass man es auf einem Host ausf\u00fchren muss, d. h. alle Instanzen leben innerhalb eines Betriebssystems. Im Fall eines SAN k\u00f6nnen Sie verschiedene Hardware anschlie\u00dfen. Der Engpass sind nur die Bl\u00f6cke, die auf dem SAN sind. Und die Frage der Technologieauswahl ist interessant. Warum nicht LVM?<\/em><\/p>\n<p><\/p>\n<p>\u00dcber LVM k\u00f6nnen wir beim Meetup sprechen. Bei SAN ist es einfach teuer. Das ZFS-System k\u00f6nnen wir \u00fcberall implementieren. Sie k\u00f6nnen es auf Ihrem eigenen Rechner einrichten. Sie k\u00f6nnen einfach das Repository herunterladen und es aufsetzen. ZFS kann quasi \u00fcberall installiert werden, wenn wir von Linux sprechen. Das hei\u00dft, wir bekommen eine sehr flexible L\u00f6sung. Und ZFS selbst bietet aus der Box schon sehr viel. Sie k\u00f6nnen unbegrenzt viele Daten laden, viele Festplatten anschlie\u00dfen und es gibt Snapshots. Wie ich schon sagte, ist es einfach zu verwalten. Das hei\u00dft, es ist sehr angenehm in der Nutzung. Es ist bew\u00e4hrt, es hat viele Jahre Bestand. Es gibt eine sehr gro\u00dfe Community, die w\u00e4chst. ZFS ist eine sehr zuverl\u00e4ssige L\u00f6sung. <\/p>\n<p><\/p>\n<p>Nikolaj Samokhvalov: Darf ich noch einen Kommentar abgeben? Ich hei\u00dfe Nikolaj, ich arbeite zusammen mit Anatolij. Ich stimme zu, dass SAN gro\u00dfartig ist. Einige unserer Kunden haben Pure Storage usw. <\/p>\n<p><\/p>\n<p>Anatoli hat richtig bemerkt, dass wir auf Modularit\u00e4t abzielen. In Zukunft k\u00f6nnte man eine einheitliche Schnittstelle implementieren \u2013 mache einen Snapshot, mache einen Klon, zerst\u00f6re den Klon. Das ist alles einfach. Und eine SAN ist gro\u00dfartig, wenn man eine hat.<\/p>\n<p><\/p>\n<p>Aber ZFS ist f\u00fcr alle verf\u00fcgbar. Es reicht schon mit DelPhix, die haben 300 Kunden. Davon sind 50 in den Fortune 100, d. h. sie zielen auf NASA usw. Es ist Zeit, dass diese Technologie allen zug\u00e4nglich gemacht wird. Deshalb haben wir den Open-Source-Core. Wir haben einen Teil der Schnittstelle, der nicht Open Source ist. Das ist eine Plattform, die wir zeigen werden. Aber wir wollen, dass es f\u00fcr jeden verf\u00fcgbar ist. Wir wollen eine Revolution bewirken, damit alle Tester nicht mehr auf ihren Laptops raten m\u00fcssen. Wir sollten SELECT schreiben und sofort sehen, dass es langsam ist. Es reicht, darauf zu warten, dass der DBA uns dar\u00fcber informiert. Das ist das Hauptziel. Und ich denke, dass wir das alle erreichen werden. Und dieses Tool entwickeln wir, damit es f\u00fcr alle verf\u00fcgbar ist. Deshalb ZFS, weil es \u00fcberall verf\u00fcgbar sein wird. Danke an die Community f\u00fcr die Probleml\u00f6sungen und f\u00fcr die open-source Lizenz usw. <\/p>\n<p><\/p>\n<p><em>Hallo! Danke f\u00fcr den Vortrag! Ich hei\u00dfe Maxim. Wir hatten \u00e4hnliche Probleme. Bei uns haben wir sie gel\u00f6st. Wie teilen Sie die Ressourcen zwischen diesen Klonen auf? Jeder Klon kann zu jedem Zeitpunkt an seinen eigenen Aufgaben arbeiten: der eine testet das eine, der andere das andere, einer baut einen Index auf, der andere f\u00fchrt einen intensiven Job aus. Und wenn man die CPU noch aufteilen kann, wie teilen Sie das bei IO auf? Das ist die erste Frage.<\/em><\/p>\n<p><\/p>\n<p><em>Und die zweite Frage betrifft die unterschiedlichen St\u00e4nde. Angenommen, ich habe hier ZFS und es l\u00e4uft gro\u00dfartig, aber der Kunde hat in der Produktion nicht ZFS, sondern beispielsweise ext4. Wie gehen Sie in diesem Fall vor?<\/em><\/p>\n<p><\/p>\n<p>Das sind sehr gute Fragen. Ich habe dieses Problem, das wir beim Teilen von Ressourcen haben, schon etwas erw\u00e4hnt. Die L\u00f6sung ist wie folgt: Stellen Sie sich vor, Sie testen im Staging. Auch dort kann die Situation gleichzeitig so aussehen, dass jemand eine Belastung erzeugt, jemand anderes eine andere. Und am Ende sehen Sie unklare Metriken. Das gleiche Problem k\u00f6nnte auch in der Produktion auftreten. Wenn Sie einen bestimmten Query \u00fcberpr\u00fcfen und feststellen, dass es ein Problem damit gibt \u2013 dass er langsam ist \u2013, dann liegt das Problem eigentlich nicht am Query selbst, sondern an einer parallel auftretenden Belastung. <\/p>\n<p><\/p>\n<p>Und deshalb ist es hier wichtig, sich darauf zu konzentrieren, wie der Plan aussehen wird, welche Schritte wir im Plan unternehmen werden und wie viele Daten wir daf\u00fcr hochladen werden. Dass unsere Laufwerke zum Beispiel mit etwas beladen werden, wird konkret den Zeitrahmen beeinflussen. Aber wir k\u00f6nnen an der Datenmenge absch\u00e4tzen, wie belastend diese Anfrage ist. Es ist nicht so wichtig, dass gleichzeitig noch eine Ausf\u00fchrung stattfinden wird. <\/p>\n<p><\/p>\n<p><em>Ich habe zwei Fragen. Das ist eine sehr coole Sache. Gab es F\u00e4lle, in denen die Daten in der Produktion kritisch wichtig waren, zum Beispiel Kreditkartennummern? Gibt es bereits etwas Fertiges oder ist das eine separate Aufgabe? Und die zweite Frage \u2013 gibt es so etwas f\u00fcr MySQL?<\/em><\/p>\n<p><\/p>\n<p>Was die Daten betrifft. Wir werden Obfuskation durchf\u00fchren, w\u00e4hrend wir das noch nicht tun. Aber wenn Sie speziell Joe bereitstellen, und wenn Sie Entwicklern keinen Zugang gew\u00e4hren, dann gibt es keinen Zugriff auf die Daten. Warum? Weil Joe keine Daten anzeigt. Er zeigt nur Metriken, Pl\u00e4ne und so weiter. Das wurde absichtlich so gemacht, weil es eine der Anforderungen unseres Kunden war. Sie wollten die M\u00f6glichkeit haben, zu optimieren, aber gleichzeitig nicht jedem Zugang gew\u00e4hren. <\/p>\n<p><\/p>\n<p>Was MySQL betrifft. Dieses System kann f\u00fcr alles verwendet werden, was den Zustand auf der Festplatte speichert. Und da wir uns mit Postgres befassen, automatisieren wir derzeit vorrangig alles vollst\u00e4ndig f\u00fcr Postgres. Wir m\u00f6chten den Datenabruf aus Backups automatisieren. Wir konfigurieren Postgres korrekt. Wir wissen, wie wir sicherstellen k\u00f6nnen, dass die Pl\u00e4ne \u00fcbereinstimmen usw. <\/p>\n<p><\/p>\n<p>Aber da das System erweiterbar ist, wird es auch f\u00fcr MySQL verwendet werden k\u00f6nnen. Und solche Beispiele gibt es. Eine \u00e4hnliche L\u00f6sung gibt es bei Yandex, aber sie wird nirgendwo ver\u00f6ffentlicht. Sie verwenden sie intern in Yandex.Metrica. Und dort geht es genau um MySQL. Aber die Technologien sind dieselben, ZFS. <\/p>\n<p><\/p>\n<p><em>Danke f\u00fcr den Vortrag! Ich habe auch ein paar Fragen. Sie erw\u00e4hnten, dass Klonen f\u00fcr Analysen verwendet werden kann, zum Beispiel um dort zus\u00e4tzliche Indizes zu erstellen. K\u00f6nnen Sie ein bisschen detaillierter erkl\u00e4ren, wie das funktioniert?<\/em><\/p>\n<p><\/p>\n<p><em>Und gleich die zweite Frage zur Einheitlichkeit der St\u00e4nde, zur Einheitlichkeit der Pl\u00e4ne. Der Plan h\u00e4ngt unter anderem von der Statistik ab, die Postgres gesammelt hat. Wie l\u00f6sen Sie dieses Problem?<\/em><\/p>\n<p><\/p>\n<p>In Bezug auf die Analyse gibt es keine spezifischen F\u00e4lle, da wir es bisher noch nicht so verwendet haben, aber diese M\u00f6glichkeit existiert. Wenn wir \u00fcber Indizes sprechen, stellen Sie sich vor, dass eine Abfrage \u00fcber eine Tabelle mit hundert Millionen Datens\u00e4tzen ausgef\u00fchrt wird, und zwar \u00fcber eine Spalte, die normalerweise in der Produktionsumgebung nicht indiziert ist. Und wir m\u00f6chten einige Daten berechnen. Wenn wir diese Abfrage in der Produktionsumgebung ausf\u00fchren, besteht die M\u00f6glichkeit, dass es zu Verz\u00f6gerungen kommt, da die Abfrage dort eine Minute lang bearbeitet wird. <\/p>\n<p><\/p>\n<p>Okay, lassen Sie uns einen d\u00fcnnen Klon erstellen, den wir f\u00fcr einige Minuten stoppen k\u00f6nnen, ohne Angst zu haben. Um die Analyse komfortabler durchzuf\u00fchren, f\u00fcgen wir Indizes f\u00fcr die Spalten hinzu, die uns interessieren. <\/p>\n<p><\/p>\n<p><em>Wird der Index jedes Mal erstellt?<\/em><\/p>\n<p><\/p>\n<p>Es ist m\u00f6glich, dass wir die Daten anfassen, Schnappsch\u00fcsse machen und dann von diesem Schnappschuss wiederherstellen und neue Abfragen durchf\u00fchren. Das hei\u00dft, wir k\u00f6nnen es so machen, dass wir neue Klone mit bereits gesetzten Indizes erstellen.<\/p>\n<p><\/p>\n<p>Was die Statistik betrifft, so wird unsere Statistik genau gleich sein, wenn wir aus einem Backup wiederherstellen oder Replikation durchf\u00fchren. Denn wir bringen die gesamte physische Struktur der Daten mit, d.h. die Daten liegen so vor, wie sie sind, einschlie\u00dflich aller Statistikmetriken. <\/p>\n<p><\/p>\n<p>Hier gibt es ein anderes Problem. Wenn Sie eine Cloud-L\u00f6sung verwenden, sind nur logische Dumps verf\u00fcgbar, da Google und Amazon keine physikalischen Kopien herausgeben. Das wird ein Problem darstellen. <\/p>\n<p><\/p>\n<p><em>Danke f\u00fcr den Bericht. Es wurden zwei gute Fragen zu MySQL und zur Ressourcenteilung gestellt. Aber letztlich l\u00e4uft alles darauf hinaus, dass es sich nicht um spezifische DBMS-Themen handelt, sondern um die Dateien im Allgemeinen. Entsprechend sollten auch die Fragen zur Ressourcenteilung dort geregelt werden, nicht am Ende, dass es Postgres ist, sondern in der Dateisystem, in <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/de\/server\/dts-dronten\/\"   title=\"Server\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2602\">Server<\/a>, in der Instanz.<\/em> <\/p>\n<p><\/p>\n<p><em>Meine Frage betrifft etwas anderes. Sie ist st\u00e4rker an der Schichtung der Datenbank orientiert, wo es mehrere Schichten gibt. Wir haben beispielsweise ein Update eines Zehn-Terabyte-Images eingerichtet, und wir f\u00fchren die Replikation durch. Wir verwenden diese L\u00f6sung konkret f\u00fcr Datenbanken. Es l\u00e4uft die Replikation, und die Daten werden aktualisiert. Parallel arbeiten hierbei 100 Mitarbeiter, die st\u00e4ndig diese unterschiedlichen Schnappsch\u00fcsse ausf\u00fchren. Was sollen wir tun? Wie k\u00f6nnen wir sicherstellen, dass es keine Konflikte gibt, wenn sie eins gestartet haben und dann das Dateisystem ausgetauscht wurde und diese Schnappsch\u00fcsse durcheinander geraten sind?<\/em> <\/p>\n<p><\/p>\n<p>Sie werden nicht fahren, weil ZFS so funktioniert. Wir k\u00f6nnen \u00c4nderungen am Dateisystem in einem separaten Stream aufbewahren, die durch Replikation kommen. Und wir halten Klone von alten Versionen der Daten, die von den Entwicklern verwendet werden. Und das funktioniert bei uns, damit ist alles in Ordnung.<\/p>\n<p><\/p>\n<p><em>Das bedeutet, das Update erfolgt als zus\u00e4tzliche Schicht, und alle neuen Snapshots werden dann basierend auf dieser Schicht erstellt, richtig?<\/em> <\/p>\n<p><\/p>\n<p>Aus den vorherigen Schichten, die von vorherigen Replikationen stammen. <\/p>\n<p><\/p>\n<p><em>Die vorherigen Schichten werden verloren gehen, aber sie werden auf die alte Schicht verweisen, w\u00e4hrend die neuen Bilder von der letzten Schicht genommen werden, die durch das Update erhalten wurde?<\/em><\/p>\n<p><\/p>\n<p>Im Gro\u00dfen und Ganzen, ja. <\/p>\n<p><\/p>\n<p><em>Dann werden wir als Folge viele Schichten haben. Und im Laufe der Zeit m\u00fcssen sie komprimiert werden?<\/em><\/p>\n<p><\/p>\n<p>Ja, das ist richtig. Es gibt ein bestimmtes Zeitfenster. Wir behalten w\u00f6chentliche Snapshots. Das h\u00e4ngt davon ab, welche Ressourcen Sie haben. Wenn Sie die M\u00f6glichkeit haben, viele Daten zu speichern, k\u00f6nnen Sie Snapshots \u00fcber l\u00e4ngere Zeitr\u00e4ume aufbewahren. Sie werden nicht automatisch gel\u00f6scht. Es wird keine Datenkorruption geben. Wenn die Snapshots veraltet sind, wie wir denken, d.h. das h\u00e4ngt von der Unternehmenspolitik ab, k\u00f6nnen wir sie einfach l\u00f6schen und Platz schaffen. <\/p>\n<p><\/p>\n<p><em>Hallo, danke f\u00fcr den Vortrag! Zu Joes Frage: Sie sagten, dass der Kunde nicht wollte, dass allen ohne weiteres Zugang zu den Daten gegeben wird. Streng genommen, wenn jemand ein Ergebnis von Explain Analyze hat, kann er die Daten einsehen.<\/em> <\/p>\n<p><\/p>\n<p>Das ist richtig. Zum Beispiel k\u00f6nnten wir schreiben: \u201eSELECT FROM WHERE email = etwas\u201c. D.h. wir w\u00fcrden die Daten selbst nicht sehen, aber einige indirekte Hinweise k\u00f6nnten wir einsehen. Das muss man verstehen. Aber andererseits ist alles sichtbar. Wir haben ein Audit der Protokolle, wir haben die Kontrolle anderer Kollegen, die auch sehen, womit die Entwickler besch\u00e4ftigt sind. Und wenn jemand versucht, so etwas zu tun, wird die Sicherheitsabteilung zu ihnen kommen und sich um das Problem k\u00fcmmern. <\/p>\n<p><\/p>\n<p><em>Guten Tag! Danke f\u00fcr die Pr\u00e4sentation! Ich habe eine kurze Frage. Wenn in der Firma kein Slack genutzt wird, gibt es dann derzeit eine Bindung daran oder k\u00f6nnen Entwickler Instanzen bereitstellen, um eine Testanwendung mit den Datenbanken zu verbinden?<\/em><\/p>\n<p><\/p>\n<p>Derzeit gibt es eine Bindung an Slack, d. h. es gibt keinen anderen Messenger, aber es w\u00e4re sehr w\u00fcnschenswert, auch andere Messenger zu unterst\u00fctzen. Was k\u00f6nnen Sie tun? Sie k\u00f6nnen DB Lab ohne Joe bei sich bereitstellen, \u00fcber die REST API oder \u00fcber unsere Plattform arbeiten und Klone erstellen sowie sich mit PSQL verbinden. Das kann jedoch nur gemacht werden, wenn Sie bereit sind, Ihren Entwicklern Zugang zu den Daten zu gew\u00e4hren, da es dann keinen Bildschirm mehr geben wird. <\/p>\n<p><\/p>\n<p><em>Ich brauche diese Schicht nicht, sondern eine solche M\u00f6glichkeit.<\/em><\/p>\n<p><\/p>\n<p>Dann \u2013 ja, das kann gemacht werden.<\/p>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/524542\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u0430\u043a backend-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0442\u043e SQL-\u0437\u0430\u043f\u0440\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u00ab\u043f\u0440\u043e\u0434\u0435\u00bb? \u0412 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u0438\u043b\u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0430\u0441\u0442\u0443\u0449\u0438\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f\u0445 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u00ab\u043f\u0440\u043e\u0434\u0443\u00bb \u0435\u0441\u0442\u044c \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0443 \u0432\u0441\u0435\u0445. \u0414\u0430 \u0438 \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437\u0431\u043e\u043b\u0435\u0437\u043d\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043f\u0438\u0438 \u0411\u0414 \u0447\u0430\u0441\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0447\u0430\u0441\u044b. \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e DBA \u2014 Joe. \u041e\u043d \u0443\u0436\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":97940,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-97939","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47DBA-\u0431\u043e\u0442 Joe. \u0410\u043d\u0430\u0442\u043e\u043b\u0438\u0439 \u0421\u0442\u0430\u043d\u0441\u043b\u0435\u0440 (Postgres.ai) | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-23T06:42:49+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-23T06:42:49+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47DBA-Bot Joe. Anatoliy Stansler (Postgres.ai) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47DBA-\u0431\u043e\u0442 Joe. \u0410\u043d\u0430\u0442\u043e\u043b\u0438\u0439 \u0421\u0442\u0430\u043d\u0441\u043b\u0435\u0440 (Postgres.ai) | ProHoster","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-10-23T06:42:49+00:00","article:modified_time":"2020-10-23T06:42:49+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"97939","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:09:26","updated":"2026-02-09 21:38:06","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/97939","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=97939"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/97939\/revisions"}],"predecessor-version":[{"id":159884,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/97939\/revisions\/159884"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/97940"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=97939"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=97939"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=97939"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}