{"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 erkennt ein Backend-Entwickler, dass eine SQL-Abfrage in der Produktionsumgebung gut funktionieren wird? In gro\u00dfen oder schnell wachsenden Unternehmen haben nicht alle Mitarbeiter Zugang zur Produktivumgebung. Und selbst mit Zugang lassen sich viele Abfragen nicht schmerzlos testen, und das Erstellen einer Kopie der Datenbank dauert oft Stunden. Um diese Probleme zu l\u00f6sen, haben wir einen k\u00fcnstlichen DBA \u2013 Joe \u2013 erschaffen. Er wurde bereits erfolgreich in mehreren Unternehmen implementiert und hilft mehreren Dutzend 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 sind darauf spezialisiert, den Entwicklungsprozess zu beschleunigen, indem wir Verz\u00f6gerungen im Zusammenhang mit der Arbeit von Postgres f\u00fcr Entwickler, DBAs und QA beseitigen.<\/p>\n<p><\/p>\n<p>Wir haben gro\u00dfartige Kunden, und heute wird ein Teil des Vortrags den F\u00e4llen gewidmet, die wir in der Zusammenarbeit mit ihnen erlebt haben. Ich werde dar\u00fcber berichten, 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 Entwicklungen durchf\u00fchren und komplexe migrationslastige Prozesse gestalten, stellen wir uns die Frage: \u201eWird diese Migration erfolgreich sein?\u201c. Wir nutzen Reviews, wir greifen auf das Wissen erfahrener Kollegen und DBA-Experten zur\u00fcck. Und sie k\u00f6nnen uns sagen \u2013 ob sie erfolgreich sein wird oder nicht. <\/p>\n<p><\/p>\n<p>Es w\u00e4re jedoch besser, wenn wir dies selbst an vollst\u00e4ndigen Kopien testen k\u00f6nnten. Heute werden wir dar\u00fcber sprechen, welche Ans\u00e4tze es derzeit f\u00fcr das Testen gibt und wie man dies am besten durchf\u00fchrt und mit welchen Tools. Auch werden wir die Vor- und Nachteile dieser Ans\u00e4tze er\u00f6rtern 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 Produktionsumgebung Indizes erstellt oder \u00c4nderungen vorgenommen? Ganz sch\u00f6n viele. Und wer hat dadurch Datenverluste oder Ausfallzeiten erlebt? Dann kennt ihr 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 Produktionsumgebung. Das bedeutet, dass der Entwickler von seinem lokalen Rechner aus arbeitet, Testdaten hat und eine eingeschr\u00e4nkte Auswahl hat. Dann gehen wir live und haben genau diese 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 tut weh und kostet viel. Wahrscheinlich sollte man das besser nicht so machen. <\/p>\n<p><\/p>\n<p>Wie kann 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 eine Staging-Umgebung einrichten und einen Teil der Produktionsumgebung dort hervorheben. Oder im besten Fall nehmen wir die echte Produktionsumgebung, alle Daten. Und nachdem wir lokal entwickelt haben, sollten wir zus\u00e4tzlich in der Staging-Umgebung pr\u00fcfen. <\/p>\n<p><\/p>\n<p>Das wird es uns erm\u00f6glichen, einige Fehler zu vermeiden, d.h. sie nicht in die Produktionsumgebung zu bringen. <\/p>\n<p><\/p>\n<p>Welche Probleme gibt es? <\/p>\n<p><\/p>\n<ul>\n<li>Das Problem ist, dass wir dieses Staging mit unseren Kollegen teilen. Und es passiert sehr oft, dass man eine \u00c4nderung vornimmt und pl\u00f6tzlich sind alle Daten weg, die Arbeit ist umsonst. Das Staging hatte mehrere Terabyte. Und man muss lange warten, bis es wieder hochgefahren wird. Wir entscheiden uns, das morgen zu \u00fcberarbeiten. Damit steht unsere Entwicklung still. <\/li>\n<li>Und nat\u00fcrlich arbeiten dort viele Kollegen, viele Teams. Man muss die \u00c4nderungen 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 sei gesagt, dass wir nur einen Versuch haben, einen Schuss, wenn wir \u00c4nderungen an der Datenbank vornehmen, die Daten anfassen oder die Struktur \u00e4ndern wollen. Wenn etwas schiefgeht, wenn es einen Fehler bei der Migration gibt, k\u00f6nnen wir nicht einfach zur\u00fcckrollen. <\/p>\n<p><\/p>\n<p>Das 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, zur Verf\u00fcgung zu stellen? Ich denke, es ist klar, was uns dabei hindert. <\/p>\n<p><\/p>\n<p>Wer hat eine Datenbank von mehr als einem Terabyte? Mehr als die H\u00e4lfte des Raumes. <\/p>\n<p><\/p>\n<p>Und es ist klar, dass es sehr teuer ist, Maschinen f\u00fcr jeden Entwickler zu betreiben, wenn man eine so gro\u00dfe Produktion hat, und es dauert dazu auch noch lange. <\/p>\n<p><\/p>\n<p>Wir haben Kunden, die erkannt haben, wie wichtig es ist, alle \u00c4nderungen auf vollst\u00e4ndigen Kopien zu testen. Aber ihre Datenbank ist kleiner als ein Terabyte, und sie verf\u00fcgen nicht \u00fcber die Ressourcen, um f\u00fcr jeden Entwickler eine Testumgebung zu erstellen. Daher m\u00fcssen sie Dumps lokal auf ihren Rechner herunterladen und auf diese Weise testen. Das kostet viel Zeit. <\/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 dies innerhalb der Infrastruktur tun, ist es bereits sehr gut, ein Terabyte Daten mit einer Geschwindigkeit von einer Stunde herunterzuladen. Aber sie verwenden logische Dumps; sie laden lokal aus der Cloud herunter. F\u00fcr sie betr\u00e4gt die Geschwindigkeit etwa 200 Gigabyte pro Stunde. Und man ben\u00f6tigt auch Zeit, um aus dem logischen Dump zu entpacken, Indizes anzuwenden usw.<\/p>\n<p><\/p>\n<p>Aber sie verwenden diesen Ansatz, weil er es erm\u00f6glicht, die Produktion zuverl\u00e4ssig zu halten. <\/p>\n<p><\/p>\n<p>Was k\u00f6nnen wir hier tun? Lassen Sie uns die Testumgebungen kosteng\u00fcnstig gestalten und jedem Entwickler seine eigene Testumgebung zur Verf\u00fcgung stellen.<\/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 mit diesem Ansatz, bei dem wir d\u00fcnne Klone f\u00fcr jeden Entwickler erstellen, k\u00f6nnen wir das auf einer Maschine teilen. Wenn Sie beispielsweise eine vier Terabyte gro\u00dfe Datenbank haben und diese zehn Entwicklern zur Verf\u00fcgung stellen m\u00f6chten, m\u00fcssen Sie nicht zehnmal vier Terabyte gro\u00dfe Datenbanken haben. Eine Maschine reicht aus, um d\u00fcnne isolierte Kopien f\u00fcr jeden Entwickler zu erstellen. <\/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>Ein konkretes Beispiel:<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>DB \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 deren Gr\u00f6\u00dfe abh\u00e4ngig sein. Sie k\u00f6nnen sie in Sekundenschnelle erhalten. Es werden vollst\u00e4ndig isolierte Umgebungen erstellt, die jedoch die Daten untereinander teilen. <\/p>\n<p><\/p>\n<p>Das ist genial. Hier sprechen wir von Magie und parallelen Universen. <\/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. Die Verwaltung ist extrem einfach. Es kann in nur zwei Befehlen bereitgestellt werden. <\/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>Storage-Systeme (z.B. Pure Storage).<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Die Database Lab, von der ich spreche, ist modular. Sie kann bei Verwendung solcher Varianten implementiert werden. Bisher haben wir uns jedoch 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 sp\u00e4ter, wenn wir zur\u00fcckrollen oder einen neuen Klon von einer \u00e4lteren Version erstellen m\u00f6chten, sagen wir einfach: \u201eOkay, geben Sie uns diese Datenbl\u00f6cke, die so gekennzeichnet sind.\u201c <\/p>\n<p><\/p>\n<p>Dieser Benutzer wird mit diesem Datensatz arbeiten. Er wird ihn schrittweise \u00e4ndern und eigene Snapshots machen. <\/p>\n<p><\/p>\n<p>Und es wird eine Verzweigung geben. Jeder Entwickler hat in unserem Fall die M\u00f6glichkeit, seinen eigenen Klon zu haben, den er bearbeitet, w\u00e4hrend die gemeinsamen Daten zwischen allen geteilt werden. <\/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 Quelle ist der Datenort, von dem Sie sie abrufen werden. Sie k\u00f6nnen eine Replikation mit der Produktionsumgebung einrichten. Sie k\u00f6nnen auch bereits vorhandene Backups nutzen, hoffe ich. WAL-E, WAL-G oder Barman. Selbst wenn Sie eine Cloud-L\u00f6sung wie RDS oder Cloud SQL verwenden, k\u00f6nnen Sie logische Dumps benutzen. Dennoch empfehlen wir Ihnen, Backups zu verwenden, da Sie auf diese Weise auch die physische Struktur der Dateien beibehalten, was Ihnen erlaubt, n\u00e4her an den Metriken zu sein, die Sie in der Produktion sehen w\u00fcrden, um die bestehenden Probleme zu identifizieren. <\/p>\n<p>\n<\/li>\n<li>\n<p>Die zweite Quelle ist der Ort, an dem Sie das Database Lab hosten m\u00f6chten. Das kann Cloud-basiert sein oder vor Ort. Es ist wichtig zu erw\u00e4hnen, dass ZFS die 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 Klon, abh\u00e4ngig von den Operationen, die wir mit der Datenbank durchf\u00fchren, einen gewissen Entwicklungsplatz einnehmen wird. Auch f\u00fcr diesen Entwicklungsplatz wird Platz ben\u00f6tigt. Aber da wir eine Datenbank von 4,5 Terabyte genommen haben, wird ZFS sie auf 3,5 Terabyte komprimieren. Je nach den Einstellungen kann dies variieren. Und es bleibt noch Platz f\u00fcr die Entwicklung. <\/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, DBA zur \u00dcberpr\u00fcfung von Abfragen zur Optimierung. <\/p>\n<p>\n<\/li>\n<li>\n<p>Dies kann im QA-Testing verwendet werden, um eine bestimmte Migration zu \u00fcberpr\u00fcfen, bevor wir sie in die Produktion bringen. Au\u00dferdem k\u00f6nnen wir spezielle Umgebungen f\u00fcr QA mit echten Daten bereitstellen, in denen sie neue Funktionen testen k\u00f6nnen. Das dauert Sekunden, statt Stunden oder sogar Tage in anderen F\u00e4llen, wenn keine d\u00fcnnen Duplikate verwendet werden. <\/p>\n<p>\n<\/li>\n<li>\n<p>Und noch ein separater Fall. Wenn im Unternehmen kein Analysesystem eingerichtet ist, k\u00f6nnen wir ein d\u00fcnnes Duplikat der Produktdatenbank erstellen und es f\u00fcr langwierige Abfragen oder spezielle Indizes nutzen, die in der Analyse verwendet werden k\u00f6nnen.<\/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 entwickeln eine Testkultur, da man nun nicht mehr stundenlang auf seine eigene Testumgebung warten muss. <\/p>\n<p>\n<\/li>\n<li>\n<p>Und es gibt keine Barrieren, kein Warten zwischen den Tests. Man kann wirklich loslegen und \u00fcberpr\u00fcfen. Und so wird es besser, da wir die Entwicklung beschleunigen. <\/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 refaktorisieren sie sp\u00e4ter weniger. <\/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, weil wir die Ressourcen der Testst\u00e4nde teilen. <\/li>\n<\/ol>\n<p><\/p>\n<p>Das ist schon gut, aber was k\u00f6nnte man noch beschleunigen?<\/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 f\u00fcr solche Tests erheblich senken. <\/p>\n<p><\/p>\n<p>Derzeit gibt es einen Teufelskreis, in dem der Entwickler, um Zugang zu realen Daten zu erhalten, zum Experten werden muss. Ihm muss dieser Zugang anvertraut werden. <\/p>\n<p><\/p>\n<p>Aber wie soll man wachsen, wenn das nicht der Fall ist? Und was, wenn dir nur ein sehr kleiner Satz an Testdaten zur Verf\u00fcgung steht? Dann wird es unm\u00f6glich sein, echte Erfahrungen zu sammeln. <\/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 kommt man aus diesem Kreis heraus? Als erste Benutzeroberfl\u00e4che, die f\u00fcr Entwickler jeder Erfahrungsstufe bequem ist, haben wir einen Slack-Bot gew\u00e4hlt. Aber es k\u00f6nnte jede andere Benutzeroberfl\u00e4che sein. <\/p>\n<p><\/p>\n<p>Was erm\u00f6glicht es? Eine spezifische Anfrage kann genommen und in einen speziellen Kanal f\u00fcr die Datenbank gesendet werden. Wir erstellen automatisch in wenigen Sekunden eine schlanke Kopie. Wir f\u00fchren diese Anfrage aus. Wir sammeln Metriken und Empfehlungen. Wir zeigen die Visualisierung an. Und diese Kopie bleibt dann, um die Anfrage zu optimieren, Indizes hinzuzuf\u00fcgen usw. <\/p>\n<p><\/p>\n<p>Slack bietet uns ebenfalls M\u00f6glichkeiten zur Zusammenarbeit direkt aus der Box. Da es sich einfach um einen Kanal handelt, kann man dort in einem Thread f\u00fcr eine bestimmte Anfrage mit den Kollegen und den DBAs im Unternehmen diskutieren und sie direkt 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>Nat\u00fcrlich gibt es auch Probleme. Da wir im realen Umfeld arbeiten und einen Server verwenden, auf dem viele Klone gleichzeitig gehostet werden, m\u00fcssen wir die verf\u00fcgbare Menge an Speicher und CPU-Leistung f\u00fcr die Klone begrenzen. <\/p>\n<p><\/p>\n<p>Um jedoch diese Tests glaubw\u00fcrdig zu gestalten, m\u00fcssen wir dieses Problem irgendwie l\u00f6sen. <\/p>\n<p><\/p>\n<p>Es ist klar, dass identische Daten ein wichtiger Punkt sind. Aber die haben wir bereits. Wir m\u00f6chten eine einheitliche Konfiguration erreichen. Und wir k\u00f6nnen eine praktisch 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>Lassen Sie uns daran erinnern, wie Postgres mit Speicher arbeitet. Wir haben zwei Caches. Einen von der Dateisystem und einen eigenen Postgres, also den Shared Buffer Cache. <\/p>\n<p><\/p>\n<p>Es ist wichtig zu beachten, dass der Shared Buffer Cache beim Start von Postgres entsprechend 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 Speicher. <\/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 allm\u00e4hlich den Speicher. Optimal w\u00e4ren 25 % des gesamten verf\u00fcgbaren Speichers auf der Maschine f\u00fcr den Shared Buffer Cache. <\/p>\n<p><\/p>\n<p>Das bedeutet, wenn wir diesen Parameter nicht \u00e4ndern, k\u00f6nnen wir auf einer Maschine nur 4 Instanzen, das hei\u00dft 4 solcher d\u00fcnnen Klone, starten. Und das ist nat\u00fcrlich schlecht, denn wir m\u00f6chten viel mehr davon haben. <\/p>\n<p><\/p>\n<p>Andererseits wird der Buffer Cache zur Ausf\u00fchrung von Abfragen, f\u00fcr Indizes verwendet, das hei\u00dft der Plan h\u00e4ngt von der Gr\u00f6\u00dfe unserer Caches ab. Wenn wir einfach diesen Parameter verringern, k\u00f6nnen sich unsere Pl\u00e4ne erheblich \u00e4ndern.<\/p>\n<p><\/p>\n<p>Wenn wir zum Beispiel in der Produktion einen gro\u00dfen Cache haben, wird Postgres bevorzugen, den Index zu verwenden. Wenn nicht, wird SeqScan verwendet. Und was w\u00e4re der 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 nicht von der spezifischen Gr\u00f6\u00dfe des im Shared Buffer definierten Caches abh\u00e4ngt, sondern von 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, d. h. die Summe aus Buffer Cache und dem Cache des Dateisystems. Dies wird \u00fcber die Konfiguration festgelegt. Dieser Speicher wird jedoch nicht zugewiesen. <\/p>\n<p><\/p>\n<p>Durch diesen Parameter k\u00f6nnen wir Postgres quasi t\u00e4uschen, indem wir behaupten, dass uns tats\u00e4chlich viele Daten zur Verf\u00fcgung stehen, auch wenn wir diese Daten nicht haben. Auf diese Weise werden die Pl\u00e4ne vollst\u00e4ndig mit der Produktionsumgebung \u00fcbereinstimmen. <\/p>\n<p><\/p>\n<p>Das kann jedoch die Timing-Werte beeinflussen. Wir optimieren die Anfragen nach Timing, aber wichtig ist, 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 in der Produktion ab. <\/p>\n<p>\n<\/li>\n<li>\n<p>Es h\u00e4ngt von den Eigenschaften der Maschine ab. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Und dies ist ein indirekter Parameter, aber tats\u00e4chlich k\u00f6nnen wir speziell nach der Menge der Daten optimieren, die diese Anfrage lesen wird, um ein Ergebnis zu erzielen. <\/p>\n<p><\/p>\n<p>Wenn wir m\u00f6chten, dass das Timing dem in der Produktion \u00e4hnelt, m\u00fcssen wir die am besten geeignete Hardware ausw\u00e4hlen und m\u00f6glicherweise sogar mehr, damit alle Klone Platz finden. Das ist jedoch ein Kompromiss, d. h. Sie erhalten die gleichen Pl\u00e4ne, sehen, wie viele Daten eine bestimmte Anfrage liest, und k\u00f6nnen entscheiden \u2013 ob diese Anfrage gut (oder die Migration) oder schlecht ist und noch optimiert werden muss. <\/p>\n<p><\/p>\n<p>Lassen Sie uns konkret untersuchen, wie die Optimierung 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 echten System. In diesem Fall betr\u00e4gt die Datenbankgr\u00f6\u00dfe 1 Terabyte. Wir m\u00f6chten die Anzahl der frischen Beitr\u00e4ge z\u00e4hlen, die mehr als 10 Likes erhalten haben. <\/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 schreiben eine Nachricht in den Kanal, ein Klon wurde f\u00fcr uns hochgefahren. Wir werden sehen, dass eine solche Anfrage in 2,5 Minuten bearbeitet wird. Das ist das erste, was uns auff\u00e4llt.<\/p>\n<p><\/p>\n<p>Bei Joe werden automatische Empfehlungen basierend auf dem Plan und den Metriken angezeigt. <\/p>\n<p><\/p>\n<p>Wir werden feststellen, dass die Anfrage zu viele Daten verarbeitet, um eine relativ geringe Anzahl von Zeilen zu erhalten. Es wird ein spezieller Index ben\u00f6tigt, da wir festgestellt haben, dass in der Anfrage zu viele gefilterte Zeilen vorhanden sind. <\/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 anschauen, 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 ideal, 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>Es schien, als h\u00e4tten wir hier einen Index-Scan, der schnell sein sollte, aber da wir zu viele Zeilen gefiltert haben (wir mussten sie z\u00e4hlen), hat die Abfrage langsam funktioniert. <\/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>Dies geschah im Plan, weil die Bedingungen in der Abfrage 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 sehen, wie sich die Ausf\u00fchrung der Abfrage 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 Abfrage und sehen, dass die Zeit anstelle von 2,5 Minuten nur noch 156 Millisekunden betr\u00e4gt, was recht 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>Jetzt verwenden wir einen Index-Only-Scan.<\/p>\n<p><\/p>\n<p>Eine weitere wichtige Geschichte ist, dass wir den Plan in einer verst\u00e4ndlicheren Weise pr\u00e4sentieren m\u00f6chten. Wir haben eine Visualisierung mit 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>Dies ist eine andere, anspruchsvollere Anfrage. Und Flame Graphs erstellen wir basierend auf zwei Parametern: der Menge an Daten, die ein bestimmter Knoten verarbeitet hat, und dem Timing, d. h. der Ausf\u00fchrungszeit des Knotens. <\/p>\n<p><\/p>\n<p>Hier k\u00f6nnen wir die spezifischen Knoten miteinander vergleichen. Es wird deutlich, welcher Knoten mehr oder weniger ben\u00f6tigt, was normalerweise schwierig ist mit anderen Visualisierungsmethoden. <\/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 kennen alle explain.depesz.com. Ein gutes Merkmal dieser Visualisierung ist, dass wir den Textplan speichern und einige wichtige Parameter in eine Tabelle auslagern, um diese sortieren zu k\u00f6nnen. <\/p>\n<p><\/p>\n<p>Und auch Entwickler, die sich in dieses Thema noch nicht vertieft haben, nutzen explain.depesz.com, da sie damit leichter verstehen 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 machen eine baumartige Visualisierung, aber hier ist es sehr schwierig, die Knoten miteinander zu vergleichen. Man kann die Struktur gut erkennen, aber wenn die Anfrage gro\u00df ist, muss man hin und her scrollen, was auch eine Option ist. <\/p>\n<p><\/p>\n<h2 id=\"kollaboraciya\">Kollaboration<\/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. Zum Beispiel, wenn wir auf eine komplexe Anfrage sto\u00dfen, die unklar ist, wie sie optimiert werden kann, k\u00f6nnen wir diese Frage im Thread in Slack 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 sind der Meinung, dass es wichtig ist, mit vollst\u00e4ndigen Daten zu testen. Dazu 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 mitnehmen und bei sich implementieren. Alle Anleitungen sind dort verf\u00fcgbar. <\/p>\n<p><\/p>\n<p>Es ist auch wichtig zu erw\u00e4hnen, dass die L\u00f6sung an sich nicht revolution\u00e4r ist, denn es gibt Delphix, aber dies ist eine Unternehmensl\u00f6sung. Sie ist vollst\u00e4ndig propriet\u00e4r und sehr teuer. Wir sind spezialisiert auf Postgres. Das sind alles Open-Source-Produkte. 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, weil ich vor einiger Zeit eine \u00e4hnliche Aufgabe gel\u00f6st habe. Daher habe ich eine ganze Reihe von Fragen. Ich hoffe, ich kann zumindest einige davon stellen.<\/em><\/p>\n<p><\/p>\n<p><em>Wie berechnen Sie den Speicherplatz f\u00fcr diese Umgebung? 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, ist es leicht, sich eine Situation vorzustellen, in der jeder Klon 10 einzigartige Daten beinhaltet. Wie berechnen Sie diesen Speicherplatz, d. h. 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, die spezifischen Klone im Auge zu behalten. Und wenn irgendeine klonbezogene \u00c4nderung zu gro\u00df ist und der Klon zu wachsen beginnt, 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 gew\u00e4hrleisten Sie den Lebenszyklus dieser Module? Das ist bei uns ein Problem und eine ganz eigene Geschichte. Wie funktioniert das?<\/em><\/p>\n<p><\/p>\n<p>Jeder Klon hat eine gewisse TTL. Im Grunde 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 es nicht verwendet wird, l\u00f6schen wir es. Aber hier gibt es keine \u00dcberraschung, da wir Klone in wenigen Sekunden hochfahren k\u00f6nnen. Und wenn wir es erneut ben\u00f6tigen, dann \u2013 bitte. <\/p>\n<p><\/p>\n<p><em>Ich bin auch an der Auswahl der Technologien interessiert, denn wir verwenden beispielsweise aus verschiedenen Gr\u00fcnden parallel mehrere Methoden. Warum gerade ZFS? Warum haben Sie nicht LVM verwendet? Sie erw\u00e4hnten, dass es Probleme mit LVM gab. Welche Probleme waren das? Meiner Meinung nach ist die Variante mit SAN in Bezug auf die Leistung am optimalsten.<\/em> <\/p>\n<p><\/p>\n<p><em>Was ist das Hauptproblem mit ZFS? Dass du es auf einem Host betreiben musst, d. h. alle Instanzen leben innerhalb eines Betriebssystems. Bei SAN kannst du jedoch unterschiedliche Hardware anschlie\u00dfen. Engp\u00e4sse entstehen nur bei den Bl\u00f6cken, die am SAN h\u00e4ngen. Und ich finde die Frage der Technologieauswahl interessant. Warum nicht LVM?<\/em><\/p>\n<p><\/p>\n<p>Speziell \u00fcber LVM k\u00f6nnen wir beim Meetup sprechen. Zu den Speicherl\u00f6sungen \u2013 das ist einfach zu teuer. Das ZFS-System k\u00f6nnen wir \u00fcberall implementieren. Sie k\u00f6nnen es auf Ihrem eigenen Rechner installieren. Sie k\u00f6nnen einfach das Repository herunterladen und es einrichten. ZFS l\u00e4sst sich praktisch \u00fcberall installieren, wenn wir von Linux sprechen. Das hei\u00dft, wir erhalten eine sehr flexible L\u00f6sung. Und ZFS bietet von Haus aus schon sehr viel. Man kann beliebig viele Daten dort laden, eine gro\u00dfe Anzahl von Festplatten anschlie\u00dfen und es gibt Snapshots. Und wie schon erw\u00e4hnt, es l\u00e4sst sich einfach verwalten. Das hei\u00dft, es scheint sehr benutzerfreundlich zu sein. Es ist erprobt und hat viele Jahre Erfahrung. Es gibt eine sehr gro\u00dfe Community, die w\u00e4chst. ZFS ist eine sehr zuverl\u00e4ssige L\u00f6sung. <\/p>\n<p><\/p>\n<p>Nikolai Samokhvalov: Darf ich noch einen Kommentar abgeben? Ich hei\u00dfe Nikolai und arbeite zusammen mit Anatolij. Ich stimme zu, dass Speicherl\u00f6sungen gro\u00dfartig sind. Einige unserer Kunden haben Pure Storage usw. <\/p>\n<p><\/p>\n<p>Anatolij hat richtig festgestellt, dass wir auf Modularit\u00e4t setzen. In Zukunft k\u00f6nnte man eine Schnittstelle umsetzen \u2013 Snapshot erstellen, Klon erstellen, Klon l\u00f6schen. Das ist alles ganz einfach. Und Speicherl\u00f6sungen sind gro\u00dfartig, wenn sie vorhanden sind.<\/p>\n<p><\/p>\n<p>Aber ZFS steht allen zur Verf\u00fcgung. Genug von DelPhix, die haben 300 Kunden. Davon sind 50 Kunden aus den Fortune 100, also richten sie sich an NASA und Co. Es ist an der Zeit, diese Technologie f\u00fcr alle zug\u00e4nglich zu machen. Deshalb haben wir einen Open-Source-Kern. Es gibt einen Teil der Benutzeroberfl\u00e4che, der nicht Open Source ist. Das ist die Plattform, die wir zeigen werden. Aber wir wollen, dass es f\u00fcr jeden zug\u00e4nglich ist. Wir wollen eine Revolution erzeugen, damit alle Tester aufh\u00f6ren, auf Laptops zu spekulieren. Wir sollten SELECT schreiben und sofort sehen, dass es langsam ist. Genug gewartet, bis der DBA dar\u00fcber spricht. Das ist das Hauptziel. Und ich glaube, dass wir das erreichen werden. Und dieses Tool machen wir f\u00fcr alle zug\u00e4nglich. Daher ZFS, weil es \u00fcberall verf\u00fcgbar sein wird. Danke an die Community f\u00fcr die Probleml\u00f6sung und dass es die Open-Source-Lizenz gibt und so weiter. <\/p>\n<p><\/p>\n<p><em>Hallo! Vielen Dank f\u00fcr den Vortrag! Ich hei\u00dfe Maxim. Wir haben die gleichen Probleme gel\u00f6st. Wir haben sie bei uns gel\u00f6st. Wie teilen Sie die Ressourcen zwischen diesen Klonen? Jeder Klon kann zu jedem Zeitpunkt das seine tun: der eine testet das eine, der andere ein anderes, einer baut einen Index auf, ein anderer f\u00fchrt einen schweren Job aus. Und wenn man die CPU noch aufteilen kann, wie machen Sie das mit dem I\/O? Das ist die erste Frage.<\/em><\/p>\n<p><\/p>\n<p><em>Und die zweite Frage zu den unterschiedlichen St\u00e4nden. Angenommen, ich habe hier ZFS und alles ist gro\u00dfartig, aber der Kunde hat im Produktionsbetrieb nicht ZFS, sondern ext4, zum Beispiel. Wie ist in diesem Fall der Verlauf?<\/em><\/p>\n<p><\/p>\n<p>Das sind sehr gute Fragen. Ich habe dieses Problem angesprochen, dass wir die Ressourcen teilen. Die L\u00f6sung besteht darin, sich Folgendes vorzustellen: Sie testen auf Staging. Es kann auch gleichzeitig so sein, dass jemand eine bestimmte Last erzeugt und jemand anderes eine andere. Und letztendlich sehen Sie unklare Metriken. Man kann ein \u00e4hnliches Problem im Produktionsbetrieb feststellen. Wenn Sie eine Anfrage \u00fcberpr\u00fcfen m\u00f6chten und sehen, dass es ein Problem gibt \u2013 sie wird langsam bearbeitet, liegt das Problem nicht an der Anfrage selbst, sondern daran, dass es eine parallele Last gibt. <\/p>\n<p><\/p>\n<p>Darum ist es hier wichtig, sich darauf zu konzentrieren, was der Plan sein wird, welche Schritte wir unternehmen werden und wie viele Daten wir daf\u00fcr sammeln werden. Dass unsere Festplatten zum Beispiel durch etwas belastet werden, wird sich direkt auf die Timing auswirken. Aber wir k\u00f6nnen an der Menge der Daten absch\u00e4tzen, wie belastend diese Anfrage ist. Es ist nicht so wichtig, dass gleichzeitig noch eine andere Ausf\u00fchrung erfolgt. <\/p>\n<p><\/p>\n<p><em>Ich habe zwei Fragen. Das ist eine wirklich coole Sache. Gab es F\u00e4lle, in denen die Daten im Produktionsumfeld kritisch wichtig waren, zum Beispiel Kreditkartennummern? Gibt es bereits etwas Fertiges oder ist das eine eigene Aufgabe? Und die zweite Frage \u2013 gibt es so etwas f\u00fcr MySQL?<\/em><\/p>\n<p><\/p>\n<p>Zu den Daten. Wir werden Obfuskation durchf\u00fchren, solange wir das nicht tun. Aber wenn Sie Joe genau bereitstellen und keinen Zugriff f\u00fcr die Entwickler gew\u00e4hren, dann gibt es keinen Zugriff auf die Daten. Warum? Weil Joe keine Daten anzeigt. Er zeigt nur Metriken, Pl\u00e4ne und alles. Das wurde absichtlich so gemacht, da es eine der Anforderungen unseres Kunden war. Sie wollten die M\u00f6glichkeit zur Optimierung haben, aber nicht jedem den Zugriff gew\u00e4hren. <\/p>\n<p><\/p>\n<p>Zu MySQL. Dieses System kann f\u00fcr alles verwendet werden, was den Zustand auf der Festplatte speichert. Und da wir uns mit Postgres besch\u00e4ftigen, konzentrieren wir uns zun\u00e4chst darauf, die gesamte Automatisierung f\u00fcr Postgres vollst\u00e4ndig zu implementieren. Wir m\u00f6chten die Datenwiederherstellung aus Backups automatisieren. Wir konfigurieren Postgres richtig. Wir wissen, wie wir sicherstellen k\u00f6nnen, dass die Pl\u00e4ne \u00fcbereinstimmen usw. <\/p>\n<p><\/p>\n<p>Da das System jedoch erweiterbar ist, kann es auch f\u00fcr MySQL genutzt werden. Es gibt \u00e4hnliche Beispiele. Eine solche L\u00f6sung gibt es bei Yandex, aber sie ver\u00f6ffentlichen sie nirgendwo. Sie nutzen sie intern in Yandex.Metrica. Dort geht es tats\u00e4chlich um MySQL. Aber die Technologie ist dieselbe: ZFS. <\/p>\n<p><\/p>\n<p><em>Danke f\u00fcr den Vortrag! Ich habe auch ein paar Fragen. Sie haben erw\u00e4hnt, dass Klonen f\u00fcr Analysen verwendet werden kann, um dort zus\u00e4tzliche Indizes zu erstellen. K\u00f6nnen Sie bitte etwas genauer erkl\u00e4ren, wie das funktioniert?<\/em><\/p>\n<p><\/p>\n<p><em>Und gleich die zweite Frage zur Gleichheit der St\u00e4nde und der Pl\u00e4ne. Der Plan h\u00e4ngt auch von den Statistiken ab, die Postgres sammelt. Wie gehen Sie mit diesem Problem um?<\/em><\/p>\n<p><\/p>\n<p>F\u00fcr spezifische Fallanalysen haben wir noch keine Erfahrung, aber die M\u00f6glichkeit besteht. Wenn wir von Indizes sprechen, stellen Sie sich vor, dass eine Abfrage \u00fcber eine Tabelle mit hundert Millionen Datens\u00e4tzen und \u00fcber eine Spalte durchgef\u00fchrt wird, die normalerweise in der Produktion nicht indiziert ist. Und wir m\u00f6chten einige Daten berechnen. Wenn man diese Abfrage in der Produktion laufen l\u00e4sst, besteht die M\u00f6glichkeit, dass es dort zu Verz\u00f6gerungen kommt, da die Abfrage dort eine Minute lange ben\u00f6tigt. <\/p>\n<p><\/p>\n<p>Okay, lass uns einen schlanken Klon erstellen, den man f\u00fcr ein paar Minuten problemlos anhalten kann. Um die Analytik komfortabler zu gestalten, 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, die Daten zu \u00e4ndern, Snapshots zu erstellen und dann von diesem Snapshot wiederherzustellen, um neue Abfragen durchzuf\u00fchren. Das hei\u00dft, wir k\u00f6nnen neue Klone mit bereits gesetzten Indizes erstellen.<\/p>\n<p><\/p>\n<p>Was die Statistik betrifft, so wird die Statistik identisch sein, wenn wir aus einem Backup wiederherstellen oder eine Replikation durchf\u00fchren. Denn wir \u00fcbertragen die gesamte physische Struktur der Daten, das hei\u00dft, die Daten mit allen Statistikmetriken werden ebenfalls mitgebracht. <\/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 physische Kopie bereitstellen. Das wird ein Problem sein. <\/p>\n<p><\/p>\n<p><em>Vielen Dank f\u00fcr den Vortrag. Es gab zwei gute Fragen zu MySQL und zur Ressourcenteilung. Im Grunde genommen geht es jedoch darum, dass dies kein spezifisches DBMS-Thema ist, sondern ein allgemeines Thema der Dateisysteme. Entsprechend sollten auch die Fragen zur Ressourcenteilung dort gel\u00f6st werden, nicht am Ende mit dem Hinweis, dass es sich um Postgres handelt, sondern im Dateisystem. <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 instance.<\/em> <\/p>\n<p><\/p>\n<p><em>Meine Frage handelt von etwas anderem. Sie ist eher auf die Mehrschichtigkeit von Datenbanken ausgerichtet, in denen sich mehrere Schichten befinden. Beispielsweise haben wir ein Update f\u00fcr ein zehn Terabyte gro\u00dfes Abbild konfiguriert, in dem die Replikation l\u00e4uft. Wir nutzen diese L\u00f6sung speziell f\u00fcr Datenbanken. Die Replikation findet statt; es erfolgt ein Datenupdate. Parallel arbeiten 100 Mitarbeiter, die st\u00e4ndig diese verschiedenen Schnappsch\u00fcsse ausf\u00fchren. Was tun? Wie kann man sicherstellen, dass es keine Konflikte gibt, wenn sie etwas ausl\u00f6sen und das Dateisystem dann ersetzt wird, sodass diese Schnappsch\u00fcsse durcheinander geraten?<\/em> <\/p>\n<p><\/p>\n<p>Sie werden nicht durcheinandergeraten, denn so funktioniert ZFS. Wir k\u00f6nnen \u00c4nderungen des Dateisystems in einem separaten Thread halten, die durch die Replikation kommen. Und alte Versionen der Daten k\u00f6nnen Klone halten, die die Entwickler benutzen. Und das funktioniert bei uns, damit ist alles in Ordnung.<\/p>\n<p><\/p>\n<p><em>Das bedeutet, dass das Update als zus\u00e4tzliche Schicht erfolgt und alle neuen Snapshots bereits auf dieser Schicht basieren, nicht wahr?<\/em> <\/p>\n<p><\/p>\n<p>Von den vorherigen Schichten, die aus den vorherigen Replikationen stammen. <\/p>\n<p><\/p>\n<p><em>Die vorherigen Schichten fallen weg, aber sie werden auf die alte Schicht verweisen, w\u00e4hrend die neuen Images von der letzten Schicht genommen werden, die im Update erhalten wurde?<\/em><\/p>\n<p><\/p>\n<p>Im Allgemeinen, ja. <\/p>\n<p><\/p>\n<p><em>Dann werden wir folglich viele Schichten haben. Und im Laufe der Zeit m\u00fcssen sie komprimiert werden?<\/em><\/p>\n<p><\/p>\n<p>Ja, genau. Es gibt ein bestimmtes Fenster. Wir speichern 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 einen langen Zeitraum aufbewahren. Sie werden nicht automatisch gel\u00f6scht. Es wird keine Datenbesch\u00e4digung geben. Wenn die Snapshots veraltet sind, wie wir denken, d.h. es h\u00e4ngt von der Unternehmenspolitik ab, k\u00f6nnen wir sie einfach l\u00f6schen und Platz freigeben. <\/p>\n<p><\/p>\n<p><em>Hallo, vielen Dank f\u00fcr den Bericht! Zum Thema Joe: Sie haben gesagt, dass der Kunde nicht wollte, dass jeder Zugang zu den Daten hat. Streng genommen kann eine Person, die das Ergebnis von Explain Analyze hat, die Daten einsehen.<\/em> <\/p>\n<p><\/p>\n<p>Das ist richtig. Zum Beispiel k\u00f6nnten wir schreiben: \u201eSELECT FROM WHERE email = jemand\u201c. Das hei\u00dft, wir sehen die Daten selbst nicht, aber wir k\u00f6nnen einige indirekte Hinweise betrachten. Das muss man verstehen. Auf der anderen Seite ist alles sichtbar. Wir haben ein Log-Audit, wir haben die Kontrolle anderer Kollegen, die auch sehen, was die Entwickler tun. Und wenn jemand versucht, so zu handeln, wird die Sicherheitsabteilung zu ihnen kommen und dieses Thema behandeln. <\/p>\n<p><\/p>\n<p><em>Guten Tag! Vielen Dank f\u00fcr den Vortrag! Ich habe eine kurze Frage. Wenn Slack im Unternehmen nicht verwendet wird, gibt es dann aktuell eine Verbindung dazu oder k\u00f6nnen die Entwickler Instanzen bereitstellen, um eine Testanwendung mit den Datenbanken zu verbinden?<\/em><\/p>\n<p><\/p>\n<p>Derzeit gibt es eine Verbindung zu Slack, das hei\u00dft, es gibt keinen anderen Messenger, aber wir m\u00f6chten sehr gerne Unterst\u00fctzung f\u00fcr andere Messenger einf\u00fchren. Was k\u00f6nnen Sie tun? Sie k\u00f6nnen DB Lab ohne Joe bei sich bereitstellen, mit dem REST API oder unserer Plattform arbeiten, Klone erstellen und sich \u00fcber PSQL verbinden. Aber das ist m\u00f6glich, wenn Sie bereit sind, Ihren Entwicklern Zugang zu den Daten zu geben, denn dann gibt es keine Trennung mehr. <\/p>\n<p><\/p>\n<p><em>Diese Zwischenschicht ben\u00f6tige ich nicht, ich brauche diese M\u00f6glichkeit.<\/em><\/p>\n<p><\/p>\n<p>Dann \u2013 ja, das l\u00e4sst sich umsetzen.<\/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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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\" \/>\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) 4.9.10\" \/>\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:description\" content=\"\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\" \/>\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. Anatolij Stansler (Postgres.ai) | ProHoster","description":"Wie erkennt ein Backend-Entwickler, dass die SQL-Anfrage in der Produktion gut funktioniert? In gro\u00dfen oder schnell wachsenden Unternehmen haben nicht alle Zugang zur Produktion. Und selbst mit Zugang k\u00f6nnen viele Anfragen nicht ohne Weiteres getestet werden, und die Erstellung einer Kopie der Datenbank kann oft Stunden dauern. Um diese Probleme zu l\u00f6sen, haben wir einen k\u00fcnstlichen DBA \u2013 Joe \u2013 geschaffen. Er hat bereits erfolgreich","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:description":"\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","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"},"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}]}}