{"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\/fr\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","title":{"rendered":"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/3bb5cc6d6be1699fc72342a74aa4020a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Comment un d\u00e9veloppeur backend sait-il qu'une requ\u00eate SQL fonctionnera bien en production ? Dans les grandes entreprises ou celles en forte croissance, tout le monde n'a pas acc\u00e8s \u00e0 la production. De plus, m\u00eame avec un acc\u00e8s, toutes les requ\u00eates ne peuvent pas \u00eatre v\u00e9rifi\u00e9es sans cons\u00e9quences, et la cr\u00e9ation d'une copie de la base de donn\u00e9es prend souvent des heures. Pour r\u00e9soudre ces probl\u00e8mes, nous avons cr\u00e9\u00e9 un DBA artificiel \u2014 Joe. Il a d\u00e9j\u00e0 \u00e9t\u00e9 int\u00e9gr\u00e9 avec succ\u00e8s dans plusieurs entreprises et aide plus d'une dizaine de d\u00e9veloppeurs. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Vid\u00e9o :<\/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=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/48e63de499e46be4be19aa8c926e5716.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bonjour \u00e0 tous ! Je m'appelle Anatoly Stansler. Je travaille pour l'entreprise <noindex><a rel=\"nofollow\" href=\"https:\/\/postgres.ai\/\">Postgres.ai<\/a><\/noindex>. Nous nous concentrons sur l'acc\u00e9l\u00e9ration du processus de d\u00e9veloppement en \u00e9liminant les retards li\u00e9s au travail avec Postgres, pour les d\u00e9veloppeurs, les DBA et les QA.<\/p>\n<p><\/p>\n<p>Nous avons des clients formidables et aujourd'hui, une partie de ma pr\u00e9sentation sera consacr\u00e9e aux cas que nous avons rencontr\u00e9s en travaillant avec eux. Je vais expliquer comment nous les avons aid\u00e9s \u00e0 r\u00e9soudre des probl\u00e8mes assez s\u00e9rieux.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5bd7d2538a4940afb28d6375a9516760.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lorsque nous d\u00e9veloppons et effectuons des migrations complexes et charg\u00e9es, nous nous posons la question : \u00ab Cette migration va-t-elle passer ? \u00bb. Nous utilisons les revues, nous nous appuyons sur les connaissances de coll\u00e8gues plus exp\u00e9riment\u00e9s, des experts DBA. Et ils peuvent dire \u2014 elle va passer ou non. <\/p>\n<p><\/p>\n<p>Mais peut-\u00eatre qu'il serait pr\u00e9f\u00e9rable que nous puissions tester cela nous-m\u00eames sur des copies compl\u00e8tes. Et aujourd'hui, nous allons justement parler des diff\u00e9rentes approches de test qui existent actuellement, comment les faire au mieux et avec quels outils. Nous discuterons \u00e9galement des avantages et des inconv\u00e9nients de ces approches, et ce que nous pouvons am\u00e9liorer ici. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/aca9f4c4fbbfc6db9c24f862216fb5d4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qui a d\u00e9j\u00e0 cr\u00e9\u00e9 des index ou apport\u00e9 des modifications directement en production ? Beaucoup de personnes. Et qui cela a-t-il conduit \u00e0 perdre des donn\u00e9es ou \u00e0 des temps d'arr\u00eat ? Dans ce cas, vous connaissez cette douleur. Heureusement, il y a des sauvegardes. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7795bf3cb1f3f6f9919ca42758fa51e9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La premi\u00e8re approche consiste \u00e0 tester en production. Ou, lorsqu'un d\u00e9veloppeur est assis sur sa machine locale, avec des donn\u00e9es de test, il y a un certain \u00e9chantillon limit\u00e9. Et nous d\u00e9ployons en production, et cela nous m\u00e8ne \u00e0 une telle situation.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/05b120bf57904f553422f419337d5220.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C'est douloureux, c'est co\u00fbteux. Ce n'est probablement pas la meilleure m\u00e9thode. <\/p>\n<p><\/p>\n<p>Alors, comment le faire au mieux ? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a8727bc2cd217d89edaf9df8588306d9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prenons un environnement de staging et prenons une partie de la production. Ou, dans le meilleur des cas, utilisons la v\u00e9ritable production, toutes les donn\u00e9es. Et apr\u00e8s avoir d\u00e9velopp\u00e9 localement, nous effectuerons des v\u00e9rifications suppl\u00e9mentaires sur le staging. <\/p>\n<p><\/p>\n<p>Cela nous permettra d'\u00e9liminer une partie des erreurs, c'est-\u00e0-dire de ne pas les introduire en production. <\/p>\n<p><\/p>\n<p>Quelles sont les probl\u00e8mes ? <\/p>\n<p><\/p>\n<ul>\n<li>Le probl\u00e8me est que nous partageons ce staging avec des coll\u00e8gues. Et tr\u00e8s souvent, il arrive que vous apportiez une modification, bam \u2013 et plus aucune donn\u00e9e, le travail est perdu. Le staging faisait plusieurs t\u00e9raoctets. Et il faut longtemps attendre qu'il red\u00e9marre. Nous d\u00e9cidons donc de le retravailler demain. Voil\u00e0, notre d\u00e9veloppement est bloqu\u00e9. <\/li>\n<li>Et bien s\u00fbr, de nombreux coll\u00e8gues et \u00e9quipes y travaillent. Il faut donc tout synchroniser manuellement. Ce n'est pas pratique. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/ad4612f2b06ac09e666e33196d898a79.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il convient de mentionner que nous n'avons qu'une seule tentative, un seul coup, si nous voulons apporter des modifications \u00e0 la base de donn\u00e9es, toucher aux donn\u00e9es, changer la structure. Et si quelque chose ne se passe pas comme pr\u00e9vu, si une erreur s'est gliss\u00e9e dans la migration, nous ne pourrons pas revenir en arri\u00e8re rapidement. <\/p>\n<p><\/p>\n<p>C'est mieux que l'approche pr\u00e9c\u00e9dente, mais il y a quand m\u00eame un grand risque qu'une erreur passe en production.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/73faffc3ef6e368a0901145c48b903b1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qu'est-ce qui nous emp\u00eache de donner \u00e0 chaque d\u00e9veloppeur un banc d'essai, une copie pleine grandeur ? Je pense qu'il est \u00e9vident ce qui nous en emp\u00eache. <\/p>\n<p><\/p>\n<p>Qui a une base de donn\u00e9es de plus d'un t\u00e9raoctet ? Plus de la moiti\u00e9 de la salle. <\/p>\n<p><\/p>\n<p>Il est clair que maintenir des machines pour chaque d\u00e9veloppeur, quand la production est aussi grande, co\u00fbte tr\u00e8s cher et prend du temps. <\/p>\n<p><\/p>\n<p>Nous avons des clients qui ont compris qu'il est tr\u00e8s important de tester toutes les modifications sur des copies grandeur nature, mais leur base est inf\u00e9rieure \u00e0 un t\u00e9raoctet, et ils n'ont pas les ressources pour maintenir un banc d'essai pour chaque d\u00e9veloppeur. Ils doivent donc t\u00e9l\u00e9charger des dumps localement sur leur machine et tester de cette mani\u00e8re. Cela prend \u00e9norm\u00e9ment de temps. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/8c1c804db71ffb5b79b5284670b3427b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M\u00eame si vous le faites \u00e0 l'int\u00e9rieur de l'infrastructure, t\u00e9l\u00e9charger un t\u00e9raoctet de donn\u00e9es en une heure, c'est d\u00e9j\u00e0 tr\u00e8s bien. Mais ils utilisent des dumps logiques, ils t\u00e9l\u00e9chargent localement depuis le cloud. Pour eux, la vitesse est d'environ 200 gigaoctets par heure. Et il leur faut encore du temps pour d\u00e9ployer \u00e0 partir du dump logique, appliquer les index, etc.<\/p>\n<p><\/p>\n<p>Mais ils adoptent cette approche car cela permet de garder la production fiable. <\/p>\n<p><\/p>\n<p>Que pouvons-nous faire ici ? Rendons les bancs d'essai peu co\u00fbteux et donnons \u00e0 chaque d\u00e9veloppeur son propre banc d'essai.<\/p>\n<p><\/p>\n<p>Et c'est possible. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a763fc2677fe93df884b80561b5270a2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et dans cette approche, lorsque nous faisons des clones minces pour chaque d\u00e9veloppeur, nous pouvons les partager sur une seule machine. Par exemple, si vous avez une base de 4 t\u00e9raoctets et que vous souhaitez la donner \u00e0 10 d\u00e9veloppeurs, il n'est pas n\u00e9cessaire d'avoir 10 bases de 4 t\u00e9raoctets. Une seule machine suffit pour cr\u00e9er des copies isol\u00e9es et minces pour chaque d\u00e9veloppeur en utilisant une seule machine. Je vous expliquerai comment cela fonctionne un peu plus tard. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/e8e9df7effb0d0241d90315f92b994c6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un exemple concret :<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>BD \u2013 4,5 t\u00e9raoctets. <\/p>\n<p>\n<\/li>\n<li>\n<p>Nous pouvons obtenir des copies ind\u00e9pendantes en 30 secondes. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Vous n'avez pas besoin d'attendre un environnement de test ou de d\u00e9pendre de sa taille. Vous pouvez l'obtenir en quelques secondes. Ce seront des environnements totalement isol\u00e9s, mais qui partagent les donn\u00e9es entre eux. <\/p>\n<p><\/p>\n<p>C'est g\u00e9nial. Ici, nous parlons de magie et de multivers. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/87e6a7e45548ed5dabd4fad01ea70616.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dans notre cas, cela fonctionne gr\u00e2ce au syst\u00e8me OpenZFS. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/e75fed43703e26152a5a85f807064cb4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>OpenZFS est un syst\u00e8me de fichiers copy-on-write qui prend en charge les instantan\u00e9s et les clones d\u00e8s la sortie de la bo\u00eete. Il est fiable et \u00e9volutif. Sa gestion est tr\u00e8s simple. Vous pouvez le d\u00e9ployer litt\u00e9ralement en deux commandes. <\/p>\n<p><\/p>\n<p>Il existe d'autres options :<\/p>\n<p><\/p>\n<ul>\n<li>\n<p>LVM,<\/p>\n<p>\n<\/li>\n<li>\n<p>Stockage (par exemple, Pure Storage).<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Database Lab, dont je parle, est modulaire. Il peut \u00eatre mis en \u0153uvre en utilisant ces options. Mais jusqu'\u00e0 pr\u00e9sent, nous nous sommes concentr\u00e9s sur OpenZFS, car il y avait des probl\u00e8mes sp\u00e9cifiques avec LVM. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/41a49f6760ee96b55f49606f8e453992.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Comment \u00e7a fonctionne ? Au lieu de r\u00e9\u00e9crire les donn\u00e9es chaque fois que nous les modifions, nous les sauvegardons simplement en marquant que ces nouvelles donn\u00e9es se r\u00e9f\u00e8rent \u00e0 un nouveau moment dans le temps, \u00e0 un nouvel instantan\u00e9. <\/p>\n<p><\/p>\n<p>Et plus tard, lorsque nous voulons revenir en arri\u00e8re ou cr\u00e9er un nouveau clone \u00e0 partir d'une version plus ancienne, nous disons simplement : \u00ab D'accord, donnez-nous ces blocs de donn\u00e9es qui sont marqu\u00e9s comme tels \u00bb. <\/p>\n<p><\/p>\n<p>Et cet utilisateur travaillera avec cet ensemble de donn\u00e9es. Il les modifiera progressivement en cr\u00e9ant ses propres instantan\u00e9s. <\/p>\n<p><\/p>\n<p>Et nous aurons un embranchement. Chaque d\u00e9veloppeur dans notre cas aura la possibilit\u00e9 d'avoir son propre clone qu'il \u00e9dite, et les donn\u00e9es communes seront partag\u00e9es entre tous. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/78efd8b87f6559839af20a939b7c89d7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pour d\u00e9ployer un tel syst\u00e8me, il faut r\u00e9soudre deux probl\u00e8mes : <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>La premi\u00e8re est la source de donn\u00e9es d'o\u00f9 vous allez les r\u00e9cup\u00e9rer. Vous pouvez configurer la r\u00e9plication \u00e0 partir de la production. Vous pouvez \u00e9galement utiliser les sauvegardes que vous avez configur\u00e9es, je l'esp\u00e8re. WAL-E, WAL-G ou Barman. Et m\u00eame si vous utilisez une solution Cloud, comme RDS ou Cloud SQL, vous pouvez utiliser des dumps logiques. Mais nous vous conseillons tout de m\u00eame d'utiliser des sauvegardes, car avec cette approche, vous conservez \u00e9galement la structure physique des fichiers, ce qui vous permettra d'\u00eatre encore plus proche des m\u00e9triques que vous pourriez voir en production, afin de d\u00e9tecter les probl\u00e8mes qui existent. <\/p>\n<p>\n<\/li>\n<li>\n<p>La deuxi\u00e8me est l'endroit o\u00f9 vous souhaitez h\u00e9berger Database Lab. Cela peut \u00eatre dans le Cloud ou sur site. Il est important de mentionner que ZFS prend en charge la compression des donn\u00e9es. Et il le fait assez bien. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Imaginez qu'\u00e0 partir de chaque clone, en fonction des op\u00e9rations que nous effectuons sur la base, un certain dev va s'accumuler. Cet espace dev devra \u00e9galement \u00eatre provisionn\u00e9. Cependant, gr\u00e2ce au fait que nous avons pris une base de 4,5 t\u00e9raoctets, ZFS la compressera \u00e0 3,5 t\u00e9raoctets. En fonction des param\u00e8tres, cela peut varier. De plus, il nous restera de l'espace pour le dev. <\/p>\n<p><\/p>\n<p>Vous pouvez utiliser un tel syst\u00e8me pour diff\u00e9rents cas d'utilisation. <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Cela concerne les d\u00e9veloppeurs et les DBA pour le contr\u00f4le des requ\u00eates et l'optimisation. <\/p>\n<p>\n<\/li>\n<li>\n<p>Cela peut \u00e9galement \u00eatre utilis\u00e9 dans les tests QA pour v\u00e9rifier une migration sp\u00e9cifique avant de la d\u00e9ployer en production. Nous pouvons \u00e9galement cr\u00e9er des environnements sp\u00e9ciaux pour QA avec de vraies donn\u00e9es, o\u00f9 ils peuvent tester de nouvelles fonctionnalit\u00e9s. Cela prendra des secondes au lieu d'attendre des heures, voire des jours, dans d'autres cas o\u00f9 des copies fines ne sont pas utilis\u00e9es. <\/p>\n<p>\n<\/li>\n<li>\n<p>Et encore un cas sp\u00e9cifique. Si l'entreprise n'a pas mis en place de syst\u00e8me d'analytique, nous pouvons cr\u00e9er un clone fin de la base de donn\u00e9es produit et le fournir pour des requ\u00eates longues ou des index sp\u00e9ciaux qui pourraient \u00eatre utilis\u00e9s en analytique.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5fb0944f063c981f27449d948a59b73b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Avec cette approche :<\/p>\n<p><\/p>\n<ol>\n<li>\n<p>La probabilit\u00e9 d'erreurs en production est faible, car nous avons test\u00e9 toutes les modifications sur des donn\u00e9es compl\u00e8tes. <\/p>\n<p>\n<\/li>\n<li>\n<p>Nous d\u00e9veloppons une culture de test, car il n'est plus n\u00e9cessaire d'attendre des heures pour avoir son propre environnement. <\/p>\n<p>\n<\/li>\n<li>\n<p>Et il n'y a plus d'obstacles, plus d'attentes entre les tests. Vous pouvez vraiment aller v\u00e9rifier. Cela sera mieux, car nous acc\u00e9l\u00e9rerons le d\u00e9veloppement. <\/p>\n<p>\n<\/li>\n<\/ol>\n<p><\/p>\n<ul>\n<li>\n<p>Il y aura moins de refactoring. Moins de bugs atteindront la production. Nous en ferons moins par la suite. <\/p>\n<p>\n<\/li>\n<li>\n<p>Nous pouvons effectuer des modifications irr\u00e9versibles. Cela n'existe pas dans les approches standards. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<ol>\n<li>C'est avantageux, car nous partageons les ressources des environnements de test. <\/li>\n<\/ol>\n<p><\/p>\n<p>C'est d\u00e9j\u00e0 bien, mais qu'est-ce qui pourrait encore \u00eatre acc\u00e9l\u00e9r\u00e9 ?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/d692f76b865c18ed4c178d1a1440774b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Gr\u00e2ce \u00e0 ce syst\u00e8me, nous pouvons consid\u00e9rablement r\u00e9duire le seuil d'entr\u00e9e \u00e0 ce type de test. <\/p>\n<p><\/p>\n<p>Il y a actuellement un cercle vicieux o\u00f9 le d\u00e9veloppeur, pour acc\u00e9der \u00e0 des donn\u00e9es r\u00e9elles et compl\u00e8tes, doit devenir un expert. On doit lui faire confiance pour cet acc\u00e8s. <\/p>\n<p><\/p>\n<p>Mais comment grandir s'il n'y en a pas ? Et si tu n'as acc\u00e8s qu'\u00e0 un tr\u00e8s petit ensemble de donn\u00e9es de test ? Dans ce cas, il n'est pas possible d'obtenir une exp\u00e9rience r\u00e9elle. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/221f7b02294878aea1d0ebe6df5d9717.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Comment sortir de ce cercle ? En tant que premi\u00e8re interface, adapt\u00e9e aux d\u00e9veloppeurs de tous niveaux, nous avons choisi un bot Slack. Mais cela peut \u00eatre n'importe quelle autre interface. <\/p>\n<p><\/p>\n<p>Que permet-il de faire ? Nous pouvons prendre une requ\u00eate sp\u00e9cifique et l'envoyer dans un canal sp\u00e9cial pour la base de donn\u00e9es. Nous d\u00e9ploierons automatiquement un clone l\u00e9ger en quelques secondes. Nous ex\u00e9cuterons cette requ\u00eate. Collecterons des m\u00e9triques et des recommandations. Nous montrerons une visualisation. Et ensuite, ce clone restera pour que cette requ\u00eate puisse \u00eatre optimis\u00e9e, avec des index ajout\u00e9s, etc. <\/p>\n<p><\/p>\n<p>Et Slack nous offre \u00e9galement des fonctionnalit\u00e9s de collaboration pr\u00eates \u00e0 l'emploi. Puisque c'est simplement un canal, on peut directement commencer \u00e0 discuter cette requ\u00eate dans le fil de discussion, en pingant ses coll\u00e8gues, DBA, pr\u00e9sents dans l'entreprise. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/b4a6410b625107c5bbbf57c021159914.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mais il y a, bien s\u00fbr, des probl\u00e8mes. Puisque c'est le monde r\u00e9el, et que nous utilisons un serveur qui h\u00e9berge plusieurs clones en m\u00eame temps, nous devons r\u00e9duire la quantit\u00e9 de m\u00e9moire et de puissance processeur disponibles pour les clones. <\/p>\n<p><\/p>\n<p>Mais pour que ces tests soient cr\u00e9dibles, il faut r\u00e9soudre ce probl\u00e8me d'une mani\u00e8re ou d'une autre. <\/p>\n<p><\/p>\n<p>Il est clair qu'un point important est d'avoir des donn\u00e9es identiques. Mais cela, nous l'avons d\u00e9j\u00e0. Et nous souhaitons atteindre une configuration identique. Et nous pouvons offrir une configuration pratiquement identique. <\/p>\n<p><\/p>\n<p>Ce serait super d'avoir le m\u00eame mat\u00e9riel que celui en production, mais cela peut diff\u00e9rer. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5efae55189175262d56a33b89c55ed29.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rappelons comment Postgres g\u00e8re la m\u00e9moire. Nous avons deux caches. Un provenant du syst\u00e8me de fichiers et l'autre est le cache buffer partag\u00e9 de Postgres. <\/p>\n<p><\/p>\n<p>Il est important de noter que le Shared Buffer Cache est allou\u00e9 au d\u00e9marrage de Postgres en fonction de la taille que vous d\u00e9finissez dans la configuration. <\/p>\n<p><\/p>\n<p>Le deuxi\u00e8me cache utilise tout l'espace disponible. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/f1f3c85e786649f83d5c17e6724086a9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et quand nous faisons plusieurs clones sur une m\u00eame machine, il semble que nous remplissons progressivement la m\u00e9moire. En th\u00e9orie, le Shared Buffer Cache devrait repr\u00e9senter 25 % de l'ensemble de la m\u00e9moire disponible sur la machine. <\/p>\n<p><\/p>\n<p>Ainsi, si nous ne modifions pas ce param\u00e8tre, nous pourrons ex\u00e9cuter seulement 4 instances sur une seule machine, c\u2019est-\u00e0-dire seulement 4 clones l\u00e9gers. Et c'est bien s\u00fbr un inconv\u00e9nient, car nous souhaitons en avoir beaucoup plus. <\/p>\n<p><\/p>\n<p>D'un autre c\u00f4t\u00e9, le Buffer Cache est utilis\u00e9 pour ex\u00e9cuter les requ\u00eates, pour les index, c\u2019est-\u00e0-dire que le plan d\u00e9pend de la taille de nos caches. Si nous r\u00e9duisons simplement ce param\u00e8tre, nos plans peuvent changer radicalement.<\/p>\n<p><\/p>\n<p>Par exemple, si nous avons un gros cache sur la production, alors Postgres pr\u00e9f\u00e9rera utiliser l'index. Sinon, il usera de SeqScan. Quel serait l'int\u00e9r\u00eat si nos plans ne correspondaient pas ? <\/p>\n<p><\/p>\n<p>Nous arrivons donc \u00e0 cette conclusion : en r\u00e9alit\u00e9, le plan dans Postgres ne d\u00e9pend pas de la taille sp\u00e9cifi\u00e9e dans le Shared Buffer, mais d\u00e9pend de l'effective_cache_size.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/1457fd7b65c342f64733b952130125cf.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L'effective_cache_size est le volume de cache estim\u00e9 qui est \u00e0 notre disposition, c\u2019est-\u00e0-dire la somme du Buffer Cache et du cache du syst\u00e8me de fichiers. Cela est d\u00e9fini dans la configuration. Et cette m\u00e9moire n'est pas allou\u00e9e. <\/p>\n<p><\/p>\n<p>Gr\u00e2ce \u00e0 ce param\u00e8tre, nous pouvons quelque sorte duper Postgres, en lui disant qu'il nous est en fait accessible une grande quantit\u00e9 de donn\u00e9es, m\u00eame si nous n'avons pas ces donn\u00e9es. Ainsi, les plans co\u00efncideront compl\u00e8tement avec ceux de la production. <\/p>\n<p><\/p>\n<p>Mais cela peut affecter le timing. Nous optimisons les requ\u00eates en fonction du timing, mais il est important de noter que le timing d\u00e9pend de nombreux facteurs : <\/p>\n<p><\/p>\n<ul>\n<li>\n<p>Il d\u00e9pend de la charge actuelle sur la production. <\/p>\n<p>\n<\/li>\n<li>\n<p>Il d\u00e9pend des caract\u00e9ristiques de la machine elle-m\u00eame. <\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>C'est un param\u00e8tre indirect, mais en r\u00e9alit\u00e9, nous pouvons optimiser en fonction de la quantit\u00e9 de donn\u00e9es que cette requ\u00eate devra lire pour obtenir le r\u00e9sultat. <\/p>\n<p><\/p>\n<p>Et si vous souhaitez que le timing soit proche de ce que nous verrons en production, nous devons utiliser du mat\u00e9riel aussi similaire que possible, et peut-\u00eatre m\u00eame plus, afin que tous les clones puissent tenir. Mais c'est un compromis, c'est-\u00e0-dire que vous obtiendrez des plans similaires, vous pourrez voir combien de donn\u00e9es une requ\u00eate sp\u00e9cifique lira et en d\u00e9duire si cette requ\u00eate est bonne (ou une migration) ou mauvaise, et qu'elle doit encore \u00eatre optimis\u00e9e. <\/p>\n<p><\/p>\n<p>Voyons comment l'optimisation se passe concr\u00e8tement avec Joe. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/26c892a0b2d417f9806cfb77d2ea47f6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prenons une requ\u00eate d'un syst\u00e8me r\u00e9el. Dans ce cas, la base de donn\u00e9es fait 1 To. Et nous voulons compter le nombre de nouveaux posts ayant re\u00e7u plus de 10 likes. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/befd651abed6688127f52db39138a4be.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous \u00e9crivons un message dans le canal, un clone s'est d\u00e9ploy\u00e9 pour nous. Et nous verrons que cette requ\u00eate sera ex\u00e9cut\u00e9e en 2,5 minutes. C'est la premi\u00e8re chose que nous allons remarquer.<\/p>\n<p><\/p>\n<p>B Joe affichera des recommandations automatiques bas\u00e9es sur le plan et les m\u00e9triques. <\/p>\n<p><\/p>\n<p>Nous verrons que la requ\u00eate traite trop de donn\u00e9es pour obtenir un nombre relativement restreint de lignes. Et il faut un index sp\u00e9cialis\u00e9, car nous avons remarqu\u00e9 qu'il y a trop de lignes filtr\u00e9es dans la requ\u00eate. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7f40e41314ebc682a1a64a2958dec16c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Examinons de plus pr\u00e8s ce qui s'est pass\u00e9. En effet, nous voyons que nous avons lu presque un giga et demi de donn\u00e9es depuis le cache de fichiers ou m\u00eame depuis le disque. Et ce n'est pas bon, puisque nous n'avons obtenu que 142 lignes. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/30aaff5da2536fa27efc6591f645d6f9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et, apparemment, nous avons ici un index scan qui aurait d\u00fb \u00eatre rapide, mais, comme nous avons filtr\u00e9 trop de lignes (nous avons d\u00fb les compter), la requ\u00eate a \u00e9t\u00e9 ex\u00e9cut\u00e9e lentement. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/40958fbc04d4eb738f6a16488647bd8c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cela est d\u00fb au fait que les conditions de la requ\u00eate et celles de l'index ne correspondent pas enti\u00e8rement. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/196ca5116e641c72bc1009e97c390bc7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Essayons de rendre l'index plus pr\u00e9cis et voyons comment l'ex\u00e9cution de la requ\u00eate changera apr\u00e8s cela. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/646a73964f0b6d3615eedb8acb3aa216.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La cr\u00e9ation de l'index a pris assez de temps, mais maintenant nous v\u00e9rifions la requ\u00eate et voyons que le temps est pass\u00e9 de 2,5 minutes \u00e0 seulement 156 millisecondes, ce qui est assez bon. Et nous lisons seulement 6 m\u00e9gaoctets de donn\u00e9es.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/5cce2d6ecf2314c0575c0fed107f6d5a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et maintenant, nous utilisons un index only scan.<\/p>\n<p><\/p>\n<p>Une autre histoire importante est que nous souhaitons pr\u00e9senter le plan d'une mani\u00e8re plus compr\u00e9hensible. Nous avons int\u00e9gr\u00e9 une visualisation \u00e0 l'aide des Flame Graphs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/f4f545bfbf52fd66b6cbe45e1d6d0b6c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C'est une autre requ\u00eate, plus riche. Et nous construisons les Flame Graphs selon deux param\u00e8tres : la quantit\u00e9 de donn\u00e9es que n\u0153ud sp\u00e9cifique dans le plan a lue et le timing, c'est-\u00e0-dire le temps d'ex\u00e9cution du n\u0153ud. <\/p>\n<p><\/p>\n<p>Ici, nous pouvons comparer les n\u0153uds sp\u00e9cifiquement entre eux. Il sera alors clair lequel d'entre eux occupe plus ou moins d'espace, ce qui est g\u00e9n\u00e9ralement difficile \u00e0 faire avec d'autres m\u00e9thodes de visualisation. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/c477d2f32241c69eb0b38ef45ff4708b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bien s\u00fbr, tout le monde conna\u00eet explain.depesz.com. Une bonne fonctionnalit\u00e9 de cette visualisation est qu'elle conserve le plan textuel tout en affichant certains param\u00e8tres principaux dans un tableau, afin que l'on puisse trier. <\/p>\n<p><\/p>\n<p>Et les d\u00e9veloppeurs qui ne se sont pas encore plong\u00e9s dans ce sujet utilisent \u00e9galement explain.depesz.com, car il leur est plus facile de comprendre quelles m\u00e9triques sont importantes et lesquelles ne le sont pas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/a7352b5b9abf27294375c78bec69d4d4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il existe une nouvelle approche de visualisation \u2013 explain.dalibo.com. Ils r\u00e9alisent une visualisation arborescente, mais ici, il est tr\u00e8s difficile de comparer les n\u0153uds entre eux. On peut bien comprendre la structure, cependant, si la requ\u00eate est importante, il faudra faire d\u00e9filer de haut en bas, mais c'est aussi une option. <\/p>\n<p><\/p>\n<h2 id=\"kollaboraciya\">Collaboration<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/7101c0b95eafed8fd9305a4630399e3b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et comme je l'ai d\u00e9j\u00e0 mentionn\u00e9, Slack nous offre la possibilit\u00e9 de collaborer. Par exemple, si nous sommes confront\u00e9s \u00e0 une requ\u00eate complexe que nous ne savons pas comment optimiser, nous pouvons clarifier cette question avec nos coll\u00e8gues dans un fil de discussion sur Slack. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Le bot DBA Joe. Anatoly Stansler (Postgres.ai)\" src=\"\/wp-content\/uploads\/2020\/10\/14b8f9c3401ecb68ac1ef56bc0cb0fa5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous pensons qu'il est important de tester sur des donn\u00e9es compl\u00e8tes. Pour cela, nous avons cr\u00e9\u00e9 l'outil Update Database Lab, qui est disponible en open source. Vous pouvez \u00e9galement utiliser le bot Joe. Vous pouvez l'utiliser d\u00e8s maintenant et l'int\u00e9grer chez vous. Tous les guides sont disponibles. <\/p>\n<p><\/p>\n<p>Il est \u00e9galement important de noter que la solution en elle-m\u00eame n'est pas r\u00e9volutionnaire, car il existe Delphix, mais c'est une solution d'entreprise. Elle est enti\u00e8rement ferm\u00e9e et co\u00fbte tr\u00e8s cher. Nous nous sp\u00e9cialisons pr\u00e9cis\u00e9ment sur Postgres. Tous nos produits sont open source. Rejoignez-nous ! <\/p>\n<p><\/p>\n<p>Je vais m'arr\u00eater l\u00e0. Merci !<\/p>\n<p><\/p>\n<h2 id=\"voprosy\">Questions<\/h2>\n<p><\/p>\n<p><em>Bonjour ! Merci pour la pr\u00e9sentation ! C'\u00e9tait tr\u00e8s int\u00e9ressant, surtout pour moi, car j'ai r\u00e9solu un probl\u00e8me similaire il y a un certain temps. J'ai donc tout un tas de questions. J'esp\u00e8re pouvoir en poser au moins une partie.<\/em><\/p>\n<p><\/p>\n<p><em>C'est intriguant, comment calculez-vous l'espace pour cet environnement ? La technologie suppose que dans certaines circonstances, vos clones peuvent atteindre leur taille maximale. Grossi\u00e8rement, si vous avez une base de dix t\u00e9raoctets et 10 clones, il est facile de simuler une situation o\u00f9 chaque clone p\u00e8se des donn\u00e9es uniques. Comment calculez-vous cet espace, c'est-\u00e0-dire le delta dont vous avez parl\u00e9, o\u00f9 ces clones vont vivre ?<\/em><\/p>\n<p><\/p>\n<p>Bonne question. Il est important de surveiller les clones sp\u00e9cifiques. Et si un clone subit un trop grand changement et commence \u00e0 cro\u00eetre, nous pouvons d'abord avertir l'utilisateur \u00e0 ce sujet, ou arr\u00eater imm\u00e9diatement ce clone afin d'\u00e9viter une situation de d\u00e9faillance. <\/p>\n<p><\/p>\n<p><em>Oui, j'ai une question compl\u00e9mentaire. C'est-\u00e0-dire, comment assurez-vous le cycle de vie de ces modules ? Pour nous, c'est un probl\u00e8me et une histoire \u00e0 part enti\u00e8re. Comment cela se passe-t-il ?<\/em><\/p>\n<p><\/p>\n<p>Chaque clone a un certain TTL. En principe, nous avons un TTL fixe. <\/p>\n<p><\/p>\n<p><em>Lequel, si ce n'est pas un secret ?<\/em><\/p>\n<p><\/p>\n<p>1 heure, c'est-\u00e0-dire inactif \u2013 1 heure. S'il n'est pas utilis\u00e9, nous le supprimons. Mais il n'y a rien d'\u00e9tonnant ici, puisque nous pouvons cr\u00e9er un clone en quelques secondes. Et s'il est \u00e0 nouveau n\u00e9cessaire, pas de probl\u00e8me. <\/p>\n<p><\/p>\n<p><em>Je suis \u00e9galement int\u00e9ress\u00e9 par le choix des technologies, car nous utilisons par exemple plusieurs m\u00e9thodes en parall\u00e8le pour diverses raisons. Pourquoi ZFS ? Pourquoi n'avez-vous pas utilis\u00e9 LVM ? Vous avez mentionn\u00e9 avoir eu des probl\u00e8mes avec LVM. Quels probl\u00e8mes y aviez-vous ? \u00c0 mon avis, la solution avec SAN est la plus optimale en termes de performance.<\/em> <\/p>\n<p><\/p>\n<p><em>Quel est le principal probl\u00e8me avec ZFS ? C'est que vous devez l'ex\u00e9cuter sur un seul h\u00f4te, c'est-\u00e0-dire que tous les instances vivront sous un seul syst\u00e8me d'exploitation. Alors qu'avec un SAN, vous pouvez connecter diff\u00e9rents \u00e9quipements. Et le goulot d'\u00e9tranglement n'est constitu\u00e9 que des blocs sur le SAN. Et la question du choix des technologies est pertinente. Pourquoi pas LVM ?<\/em><\/p>\n<p><\/p>\n<p>Nous pourrons discuter sp\u00e9cifiquement de LVM lors du meetup. Concernant le SAN \u2013 c'est simplement co\u00fbteux. Nous pouvons d\u00e9ployer le syst\u00e8me ZFS n'importe o\u00f9. Vous pouvez l'installer sur votre machine. Vous pouvez simplement t\u00e9l\u00e9charger le d\u00e9p\u00f4t et le d\u00e9ployer. ZFS s'installe pratiquement partout, si nous parlons de Linux. C'est-\u00e0-dire que nous obtiennons une solution tr\u00e8s flexible. Et ZFS, en soi, offre beaucoup d\u00e8s la sortie de la bo\u00eete. Vous pouvez y charger autant de donn\u00e9es que vous le souhaitez, connecter un grand nombre de disques, il y a des snapshots. Et, comme je l'ai d\u00e9j\u00e0 dit, il est facile \u00e0 administrer. C'est-\u00e0-dire qu'il semble tr\u00e8s agr\u00e9able \u00e0 utiliser. Il a \u00e9t\u00e9 \u00e9prouv\u00e9, il existe depuis de nombreuses ann\u00e9es. Il a une tr\u00e8s grande communaut\u00e9 qui grandit. ZFS est une solution tr\u00e8s fiable. <\/p>\n<p><\/p>\n<p>Nikolai Samokhvalov : Puis-je ajouter un commentaire ? Je m'appelle Nikolai, je travaille avec Anatoly. Je suis d'accord que le SAN est excellent. Et certains de nos clients ont du Pure Storage, etc. <\/p>\n<p><\/p>\n<p>Anatoli a raison de souligner que nous visons la modularit\u00e9. \u00c0 l'avenir, il sera possible de disposer d'une seule interface : prenez un snapshot, faites un clone, supprimez le clone. C'est facile. Et le stockage est super, si nous en avons un.<\/p>\n<p><\/p>\n<p>Mais ZFS est accessible \u00e0 tous. Delphix a d\u00e9j\u00e0 300 clients, et parmi eux 50 dans le fortune 100, c'est-\u00e0-dire qu'ils ciblent la NASA, etc. Il est temps que cette technologie soit accessible \u00e0 tous. C'est pourquoi nous avons un Core open source. Nous avons une partie de l'interface qui n'est pas open source. C'est une plateforme que nous allons montrer. Mais nous voulons que cela soit disponible pour chacun. Nous souhaitons r\u00e9volutionner le secteur pour que tous les testeurs cessent de deviner sur des ordinateurs portables. Nous devons \u00e9crire SELECT et voir imm\u00e9diatement s'il est lent. Il est temps d'arr\u00eater d'attendre que le DBA en parle. Voil\u00e0 le principal objectif. Et je pense que nous y parviendrons tous. Et cette solution, nous la concevons pour qu'elle soit accessible \u00e0 tous. C'est pourquoi ZFS, car il sera disponible partout. Merci \u00e0 la communaut\u00e9 pour la r\u00e9solution des probl\u00e8mes et pour le respect de la licence open source, etc. <\/p>\n<p><\/p>\n<p><em>Bonjour ! Merci pour la pr\u00e9sentation ! Je m'appelle Maxim. Nous avons rencontr\u00e9 des probl\u00e8mes similaires. Nous les avons r\u00e9solus chez nous. Comment r\u00e9partissez-vous les ressources entre ces clones ? Chaque clone peut \u00e0 un moment donn\u00e9 travailler sur sa propre charge : l'un teste une chose, un autre teste autre chose, l'un construit un index, un autre ex\u00e9cute une t\u00e2che lourde. Et si l'on peut encore r\u00e9partir par CPU, comment faites-vous pour l'IO ? C'est la premi\u00e8re question.<\/em><\/p>\n<p><\/p>\n<p><em>Et ma deuxi\u00e8me question concerne la dissimilarit\u00e9 des environnements. Supposons que j'ai ZFS ici et que tout fonctionne bien, mais que le client en production n\u2019a pas ZFS, mais ext4 par exemple. Que faire dans ce cas ?<\/em><\/p>\n<p><\/p>\n<p>Ces questions sont tr\u00e8s pertinentes. J'ai bri\u00e8vement abord\u00e9 le probl\u00e8me concernant la r\u00e9partition des ressources. La solution est la suivante. Imaginez que vous testez en staging. Vous pouvez \u00e9galement rencontrer une situation o\u00f9 quelqu'un g\u00e9n\u00e8re une charge et quelqu'un d'autre en g\u00e9n\u00e8re une autre. Au final, vous voyez des m\u00e9triques incompr\u00e9hensibles. M\u00eame le m\u00eame probl\u00e8me peut survenir en production. Lorsque vous voulez v\u00e9rifier une certaine requ\u00eate et que vous constatez qu'il y a un probl\u00e8me avec elle - elle s'ex\u00e9cute lentement, il s'agit en r\u00e9alit\u00e9 d'une charge parall\u00e8le qui pose probl\u00e8me, pas de la requ\u00eate elle-m\u00eame. <\/p>\n<p><\/p>\n<p>C'est pourquoi il est important de se concentrer sur le plan, les \u00e9tapes \u00e0 suivre dans ce plan et combien de donn\u00e9es nous allons mobiliser. Le fait que nos disques soient, par exemple, charg\u00e9s par quelque chose affectera particuli\u00e8rement le timing. Mais nous pouvons estimer la charge de cette requ\u00eate en fonction de la quantit\u00e9 de donn\u00e9es. Ce n'est pas si important que d'autres processus s'ex\u00e9cutent en m\u00eame temps. <\/p>\n<p><\/p>\n<p><em>J'ai deux questions. C'est un concept tr\u00e8s int\u00e9ressant. Avez-vous d\u00e9j\u00e0 rencontr\u00e9 des cas o\u00f9 les donn\u00e9es en production sont critiques, par exemple, les num\u00e9ros de carte de cr\u00e9dit ? Existe-t-il quelque chose de pr\u00eat \u00e0 l'emploi ou est-ce une t\u00e2che distincte ? Et ma deuxi\u00e8me question \u2013 existe-t-il quelque chose de similaire pour MySQL ?<\/em><\/p>\n<p><\/p>\n<p>Concernant les donn\u00e9es. Nous allons proc\u00e9der \u00e0 un obfuscation, m\u00eame si cela n'est pas encore fait. Mais si vous d\u00e9ployez sp\u00e9cifiquement Joe, et si vous ne donnez pas acc\u00e8s aux d\u00e9veloppeurs, alors il n'y a pas d'acc\u00e8s aux donn\u00e9es. Pourquoi ? Parce que Joe ne montre pas les donn\u00e9es. Il n'affiche que des m\u00e9triques, des plans, et c'est tout. Cela a \u00e9t\u00e9 con\u00e7u ainsi car c'est une des exigences de notre client. Ils voulaient avoir la possibilit\u00e9 d'optimiser, tout en ne donnant pas acc\u00e8s \u00e0 tout le monde. <\/p>\n<p><\/p>\n<p>En ce qui concerne MySQL. Ce syst\u00e8me peut \u00eatre utilis\u00e9 pour n'importe quoi qui stocke l'\u00e9tat sur le disque. Et comme nous travaillons avec Postgres, notre priorit\u00e9 actuelle est d'automatiser totalement Postgres. Nous voulons automatiser l'extraction des donn\u00e9es des sauvegardes. Nous configurons Postgres correctement. Nous savons comment faire en sorte que les plans correspondent, etc. <\/p>\n<p><\/p>\n<p>Mais comme le syst\u00e8me est extensible, il pourra \u00e9galement \u00eatre utilis\u00e9 pour MySQL. Des exemples existent d\u00e9j\u00e0. Il y a un syst\u00e8me similaire utilis\u00e9 par Yandex, mais ils ne le publient nulle part. Ils l'utilisent \u00e0 l'int\u00e9rieur de Yandex.Metrics. Et c'est pr\u00e9cis\u00e9ment une histoire li\u00e9e \u00e0 MySQL. Mais les technologies sont les m\u00eames, ZFS. <\/p>\n<p><\/p>\n<p><em>Merci pour votre pr\u00e9sentation ! J'ai aussi quelques questions. Vous avez mentionn\u00e9 que le clonage peut \u00eatre utilis\u00e9 pour l'analytique, par exemple, pour y construire des index suppl\u00e9mentaires. Pourriez-vous expliquer plus en d\u00e9tail comment cela fonctionne ?<\/em><\/p>\n<p><\/p>\n<p><em>Et je vais poser ma deuxi\u00e8me question concernant l'uniformit\u00e9 des environnements et des plans. Le plan d\u00e9pend \u00e9galement des statistiques collect\u00e9es par Postgres. Comment r\u00e9solvez-vous ce probl\u00e8me ?<\/em><\/p>\n<p><\/p>\n<p>Il n'y a pas d'analytique sp\u00e9cifique pour ces cas, car nous ne l'avons pas encore utilis\u00e9e de cette mani\u00e8re, mais cette possibilit\u00e9 existe. Si nous parlons des index, imaginez qu'une requ\u00eate est ex\u00e9cut\u00e9e sur une table contenant des centaines de millions d'enregistrements et sur une colonne qui n'est g\u00e9n\u00e9ralement pas index\u00e9e en production. Et nous voulons proc\u00e9der \u00e0 certains calculs. Si cette requ\u00eate est ex\u00e9cut\u00e9e en production, il y a un risque de temps d'attente, car la requ\u00eate pourrait prendre une minute \u00e0 s'ex\u00e9cuter. <\/p>\n<p><\/p>\n<p>D'accord, faisons un clone l\u00e9ger, que l'on n'a pas peur d'arr\u00eater pendant quelques minutes. Et pour rendre l'analyse plus confortable, nous ajouterons des index sur les colonnes qui nous int\u00e9ressent. <\/p>\n<p><\/p>\n<p><em>L'index sera-t-il cr\u00e9\u00e9 \u00e0 chaque fois ?<\/em><\/p>\n<p><\/p>\n<p>Nous pouvons faire en sorte de manipuler les donn\u00e9es, de cr\u00e9er des instantan\u00e9s, puis de se restaurer \u00e0 partir de cet instantan\u00e9 et d'ex\u00e9cuter de nouvelles requ\u00eates. C'est-\u00e0-dire qu'il est possible d'\u00e9lever de nouveaux clones avec des index d\u00e9j\u00e0 en place.<\/p>\n<p><\/p>\n<p>En ce qui concerne la question sur la statistique, si nous restaurons \u00e0 partir d'une sauvegarde, si nous faisons de la r\u00e9plication, nos statistiques resteront exactement les m\u00eames. Parce que nous aurons enti\u00e8rement la structure physique des donn\u00e9es, c'est-\u00e0-dire que nous ram\u00e8nerons \u00e9galement les donn\u00e9es telles quelles avec toutes les m\u00e9triques statistiques. <\/p>\n<p><\/p>\n<p>C'est un autre probl\u00e8me. Si vous utilisez une solution cloud, seuls des dumps logiques sont disponibles, car Google et Amazon ne vous permettent pas de prendre une copie physique. Cela posera donc probl\u00e8me. <\/p>\n<p><\/p>\n<p><em>Merci pour la pr\u00e9sentation. Deux bonnes questions ont \u00e9t\u00e9 pos\u00e9es ici concernant MySQL et la r\u00e9partition des ressources. Mais en r\u00e9alit\u00e9, tout se r\u00e9sume \u00e0 une question qui n'est pas sp\u00e9cifique aux SGBD, mais plut\u00f4t au syst\u00e8me de fichiers dans son ensemble. Par cons\u00e9quent, les questions de r\u00e9partition des ressources doivent \u00e9galement \u00eatre r\u00e9solues \u00e0 ce niveau, et non \u00e0 la fin, en consid\u00e9rant cela comme Postgres, mais plut\u00f4t dans le syst\u00e8me de fichiers. <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/fr\/server\/dts-dronten\/\"   title=\"le serveur\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2602\">le serveur<\/a>, dans l'instance.<\/em> <\/p>\n<p><\/p>\n<p><em>Ma question porte l\u00e9g\u00e8rement sur un autre sujet. Elle est plus ax\u00e9e sur la multidimensionnalit\u00e9 de la base de donn\u00e9es, o\u00f9 plusieurs couches interviennent. Par exemple, nous avons configur\u00e9 la mise \u00e0 jour d'une image de dix t\u00e9raoctets qui fait l'objet d'une r\u00e9plication. Nous utilisons sp\u00e9cifiquement cette solution pour des bases de donn\u00e9es. La r\u00e9plication s'effectue, les donn\u00e9es sont mises \u00e0 jour. Parall\u00e8lement, 100 employ\u00e9s travaillent en continu, ex\u00e9cutant ces diff\u00e9rents instantan\u00e9s. Que faire ? Comment \u00e9viter les conflits, car ils peuvent ex\u00e9cuter une t\u00e2che, puis le syst\u00e8me de fichiers change et ces instantan\u00e9s deviennent erron\u00e9s ?<\/em> <\/p>\n<p><\/p>\n<p>Ils ne partiront pas, car c'est ainsi que fonctionne ZFS. Nous pouvons maintenir s\u00e9par\u00e9ment dans un seul flux les modifications du syst\u00e8me de fichiers, qui arrivent gr\u00e2ce \u00e0 la r\u00e9plication. Et conserver des clones des anciennes versions des donn\u00e9es, que les d\u00e9veloppeurs utilisent. Et cela fonctionne pour nous, tout va bien avec \u00e7a.<\/p>\n<p><\/p>\n<p><em>Donc, la mise \u00e0 jour se fera comme une couche suppl\u00e9mentaire, et toutes les nouvelles instantan\u00e9s seront bas\u00e9es sur cette couche, n'est-ce pas ?<\/em> <\/p>\n<p><\/p>\n<p>Des couches pr\u00e9c\u00e9dentes, qui \u00e9taient issues des pr\u00e9c\u00e9dentes r\u00e9plications. <\/p>\n<p><\/p>\n<p><em>Les couches pr\u00e9c\u00e9dentes seront supprim\u00e9es, mais elles feront r\u00e9f\u00e9rence \u00e0 l'ancienne couche, et les nouvelles images seront prises de la derni\u00e8re couche obtenue lors de la mise \u00e0 jour ?<\/em><\/p>\n<p><\/p>\n<p>En g\u00e9n\u00e9ral, oui. <\/p>\n<p><\/p>\n<p><em>Alors, en cons\u00e9quence, nous aurons beaucoup de couches. Et avec le temps, il faudra les compresser ?<\/em><\/p>\n<p><\/p>\n<p>Oui, tout \u00e0 fait. Il y a une certaine fen\u00eatre. Nous conservons des snapshots hebdomadaires. Cela d\u00e9pend de la capacit\u00e9 que vous avez. Si vous avez la possibilit\u00e9 de conserver beaucoup de donn\u00e9es, vous pouvez garder des snapshots pendant longtemps. Ils ne s'effaceront pas d'eux-m\u00eames. Il n'y aura pas de corruption des donn\u00e9es. Si des snapshots deviennent obsol\u00e8tes, comme nous le pensons, c'est-\u00e0-dire que cela d\u00e9pend de la politique de l'entreprise, nous pouvons simplement les supprimer et lib\u00e9rer de l'espace. <\/p>\n<p><\/p>\n<p><em>Bonjour, merci pour la pr\u00e9sentation ! Concernant la question de Joe. Vous avez dit que le client ne voulait pas donner un acc\u00e8s g\u00e9n\u00e9ral aux donn\u00e9es. Stricte parlant, si quelqu'un a le r\u00e9sultat d'Explain Analyze, il peut voir les donn\u00e9es.<\/em> <\/p>\n<p><\/p>\n<p>C'est tout \u00e0 fait cela. Par exemple, nous pouvons \u00e9crire : \u00ab SELECT FROM WHERE email = quelque chose \u00bb. C'est-\u00e0-dire que nous ne verrons pas les donn\u00e9es elles-m\u00eames, mais nous pouvons voir certains indices indirects. Il faut comprendre cela. Mais d'un autre c\u00f4t\u00e9, tout cela est visible. Nous avons une audit des logs, nous avons le contr\u00f4le d'autres coll\u00e8gues qui voient aussi ce que font les d\u00e9veloppeurs. Et si quelqu'un essaie de faire cela, le service de s\u00e9curit\u00e9 viendra et s'occupera de cette question. <\/p>\n<p><\/p>\n<p><em>Bonjour ! Merci pour la pr\u00e9sentation ! J'ai une courte question. Si Slack n'est pas utilis\u00e9 dans l'entreprise, y a-t-il actuellement un lien avec cela ou les d\u00e9veloppeurs peuvent-ils d\u00e9ployer des instances pour connecter une application de test aux bases de donn\u00e9es ?<\/em><\/p>\n<p><\/p>\n<p>Actuellement, il y a une int\u00e9gration avec Slack, c'est-\u00e0-dire qu'il n'y a aucun autre messager, mais nous aimerions vraiment ajouter la prise en charge d'autres messagers \u00e9galement. Que pouvez-vous faire ? Vous pouvez d\u00e9ployer DB Lab sans Joe, utiliser l'API REST ou notre plateforme pour cr\u00e9er des clones et vous connecter avec PSQL. Mais cela n\u00e9cessite de donner \u00e0 vos d\u00e9veloppeurs un acc\u00e8s aux donn\u00e9es, car il n'y aura pas d'\u00e9cran ici. <\/p>\n<p><\/p>\n<p><em>Je n'ai pas besoin de cet interm\u00e9diaire, mais d'une telle possibilit\u00e9.<\/em><\/p>\n<p><\/p>\n<p>Alors oui, cela peut \u00eatre fait.<\/p>\n<p>Source : <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.2 - 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\/fr\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47Bot DBA Joe. Anatoly Stansler (Postgres.ai) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/dba-bot-joe-anatolij-stansler-postgres-ai","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/97939","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=97939"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/97939\/revisions"}],"predecessor-version":[{"id":159884,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/97939\/revisions\/159884"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/97940"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=97939"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=97939"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=97939"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}