{"id":96515,"date":"2020-10-12T19:43:02","date_gmt":"2020-10-12T17:43:02","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019"},"modified":"2020-10-12T19:43:02","modified_gmt":"2020-10-12T17:43:02","slug":"odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019","title":{"rendered":"Feuille de route d'Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6c445191705a4c96939cd094bc457a53.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dans son rapport, Andre\u00ef Borodin expliquera comment ils ont pris en compte l'exp\u00e9rience de mise \u00e0 l'\u00e9chelle de PgBouncer lors de la conception du pooler de connexions. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\">Odyssey<\/a><\/noindex>, comment ils l'ont d\u00e9ploy\u00e9 en production. De plus, nous discuterons des fonctionnalit\u00e9s que nous aimerions voir dans les nouvelles versions du pooler : il est important pour nous non seulement de satisfaire nos besoins, mais aussi de faire \u00e9voluer la communaut\u00e9 des utilisateurs. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\">Odyss\u00e9e<\/a><\/noindex>.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Vid\u00e9o :<\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"OUx40ABHFZY\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/OUx40ABHFZY\/hqdefault.jpg\" alt=\"Lire la vid\u00e9o\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/dd2ea50b72e3d9c4e795aecbf9afdd25.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bonjour \u00e0 tous ! Je m'appelle Andre\u00ef. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0a2f1880005bec1f61b72fb23b555adc.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Chez Yandex, je travaille sur le d\u00e9veloppement de bases de donn\u00e9es open source. Aujourd'hui, notre sujet porte sur le pooler de connexions. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c18e7c937423d2514faa12e820e78e70.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si vous savez comment appeler un pooler de connexions en russe, faites-le moi savoir. Je suis vraiment d\u00e9sireux de trouver un bon terme technique qui devrait s'\u00e9tablir dans la litt\u00e9rature technique. <\/p>\n<p><\/p>\n<p>Le sujet est assez complexe, car dans de nombreuses bases de donn\u00e9es, le pooler de connexions est int\u00e9gr\u00e9 et il n'est m\u00eame pas n\u00e9cessaire d'en \u00eatre inform\u00e9. Certaines configurations existent partout, mais cela ne fonctionne pas ainsi dans Postgres. En parall\u00e8le (\u00e0 HighLoad++ 2019), il y a une pr\u00e9sentation de Nikolai Samokhvalov sur la configuration des requ\u00eates dans Postgres. Je comprends que les personnes ici ont d\u00e9j\u00e0 configur\u00e9 les requ\u00eates de mani\u00e8re optimale, et ce sont des personnes qui rencontrent des probl\u00e8mes syst\u00e8me plus rares li\u00e9s au r\u00e9seau et \u00e0 l'utilisation des ressources. Parfois, cela peut \u00eatre assez compliqu\u00e9 au niveau de la clart\u00e9 des probl\u00e8mes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/89c660dd530575e2938e6bf312b83e95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Yandex dispose de Postgres. Dans Yandex.Cloud, vivent de nombreux services de Yandex. Nous avons plusieurs p\u00e9taoctets de donn\u00e9es, qui g\u00e9n\u00e8rent pas moins d'un million de requ\u00eates par seconde dans Postgres. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/288bfa37b9dcd60acd22ba48f0ef8a39.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous fournissons un cluster assez typique \u00e0 tous les services \u2013 il s'agit de la n\u0153ud principal primaire, de deux r\u00e9pliques ordinaires (synchrones et asynchrones), d'une sauvegarde et de la mise \u00e0 l'\u00e9chelle des requ\u00eates de lecture sur la r\u00e9plique. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c249ca55bb387e25a5560324024cc523.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Chaque n\u0153ud du cluster est un Postgres, sur lequel, en plus de Postgres et des syst\u00e8mes de surveillance, un pooler de connexions est \u00e9galement install\u00e9. Le pooler de connexions est utilis\u00e9 pour le fencing et pour sa fonction principale. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0e29be55cc048007db21c80bbb08a9d4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quelle est la fonction principale d'un pooler de connexions ? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e2fbbd440c2781573cb35deeef358f20.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dans Postgres, un mod\u00e8le de processus est adopt\u00e9 pour travailler avec la base de donn\u00e9es. Cela signifie qu'une connexion \u00e9quivaut \u00e0 un processus, un backend Postgres. Et dans ce backend, il y a de nombreux caches diff\u00e9rents, qui sont assez co\u00fbteux \u00e0 cr\u00e9er de mani\u00e8re distincte pour diff\u00e9rentes connexions. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/587498063b1af8fac4a845961c654bc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En outre, dans le code de Postgres, il y a un tableau appel\u00e9 procArray. Il contient les principales informations sur les connexions r\u00e9seau. Et presque tous les algorithmes de traitement de procArray ont une complexit\u00e9 lin\u00e9aire, parcourant l'ensemble du tableau des connexions r\u00e9seau. C'est une boucle assez rapide, mais avec un grand nombre de connexions r\u00e9seau entrantes, cela devient un peu plus co\u00fbteux. Et quand cela devient un peu plus co\u00fbteux, au final, on peut payer un tr\u00e8s gros prix pour un grand nombre de connexions r\u00e9seau. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b534a38d0bfae7a65fc4258155a50280.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il existe trois approches possibles :<\/p>\n<p><\/p>\n<ul>\n<li>Du c\u00f4t\u00e9 de l'application. <\/li>\n<li>Du c\u00f4t\u00e9 de la base de donn\u00e9es. <\/li>\n<li>Et entre les deux, c'est-\u00e0-dire toutes sortes de combinaisons. <\/li>\n<\/ul>\n<p><\/p>\n<p>Malheureusement, le pooler int\u00e9gr\u00e9 est actuellement en cours de d\u00e9veloppement. Les amis de l'entreprise PostgreSQL Professional s'en occupent principalement. Quand il sera disponible, il est difficile de le pr\u00e9dire. Et en fait, l'architecte a deux solutions \u00e0 choisir. C'est un pool d'application et un pool proxy. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/702527a09e9fc86dd39b7fd69dcf1fc9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le pool d'application est la m\u00e9thode la plus simple. Et presque tous les pilotes clients vous fournissent un moyen de repr\u00e9senter des millions de vos connexions dans le code sous forme de quelques dizaines de connexions \u00e0 la base de donn\u00e9es. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7b66b9e20d22f472ca5ac39f6b9e0ba4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le probl\u00e8me se pose lorsque, \u00e0 un moment donn\u00e9, vous voulez faire \u00e9voluer le backend, vous voulez le d\u00e9ployer sur plusieurs machines virtuelles. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f216fd7a8c01c2b07891e2242c48b06a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ensuite, vous r\u00e9alisez \u00e9galement que vous avez plusieurs zones de disponibilit\u00e9, plusieurs centres de donn\u00e9es. Et l'approche de pooling c\u00f4t\u00e9 client conduit \u00e0 de grands chiffres. De grands chiffres, c'est environ 10 000 connexions. C'est la limite qui peut fonctionner normalement. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e5bc5f284fd8ff568bbe16c3895b7ac6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En ce qui concerne les poolers proxy, il existe deux poolers qui savent faire beaucoup de choses. Ce ne sont pas seulement des poolers. Ce sont des poolers + d'autres fonctionnalit\u00e9s int\u00e9ressantes. Ce sont <noindex><a rel=\"nofollow\" href=\"https:\/\/www.pgpool.net\/\">Pgpool<\/a><\/noindex> et <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/crunchy-proxy\">Crunchy-Proxy<\/a><\/noindex>. <\/p>\n<p><\/p>\n<p>Mais, malheureusement, cette fonctionnalit\u00e9 suppl\u00e9mentaire n'est pas n\u00e9cessaire pour tout le monde. Et cela conduit \u00e0 ce que les poolers ne prennent en charge que le pooling par session, c'est-\u00e0-dire un client entrant, un client sortant vers la base de donn\u00e9es. <\/p>\n<p><\/p>\n<p>Pour nos besoins, ce n'est pas tr\u00e8s adapt\u00e9, c'est pourquoi nous utilisons PgBouncer, qui met en \u0153uvre le pooling de transactions, c'est-\u00e0-dire que les connexions serveur sont associ\u00e9es aux connexions clients uniquement pendant la transaction. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e5fedbe14656d2ac2cde8d1878a950e2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et sous notre charge, c'est vrai. <strong>Mais il y a quelques probl\u00e8mes.<\/strong>.<img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/61fd36cadcd9948d624dafa711777307.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Les probl\u00e8mes commencent lorsque vous voulez diagnostiquer une session, car toutes les connexions entrantes sont locales. Elles proviennent toutes du loopback et il devient difficile de tracer la session. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/36108c4956c410a1b1f286a88bc393d6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bien s\u00fbr, vous pouvez utiliser application_name_add_host. C'est une m\u00e9thode c\u00f4t\u00e9 Bouncer pour ajouter une adresse IP \u00e0 application_name. Mais application_name est \u00e9tabli par une connexion suppl\u00e9mentaire. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b4cec483aa776f48db7ad3966c3b78e4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dans ce graphique, o\u00f9 la ligne jaune repr\u00e9sente les requ\u00eates r\u00e9elles, tandis que la ligne bleue montre les requ\u00eates qui atteignent la base de donn\u00e9es. Et cette diff\u00e9rence repr\u00e9sente l'\u00e9tablissement de application_name, qui est n\u00e9cessaire uniquement pour le suivi, mais qui n'est pas gratuit du tout. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c02ea73a6f1a2a4cd6af6c621f321ab4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De plus, dans Bouncer, il n'est pas possible de limiter un pool, c'est-\u00e0-dire de restreindre le nombre de connexions \u00e0 la base de donn\u00e9es pour un utilisateur sp\u00e9cifique, pour une base de donn\u00e9es sp\u00e9cifique. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3431a463e04106066e2799aead66f571.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c0 quoi cela m\u00e8ne-t-il ? Vous avez un service sous forte charge, \u00e9crit en C++, et juste \u00e0 c\u00f4t\u00e9, un petit service en Node qui ne fait rien de grave avec la base, mais son driver devient fou. Il ouvre 20 000 connexions, et le reste attendra. Votre code est m\u00eame correct. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d7fa321714dc017b017945dffcf79bc6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Bien s\u00fbr, nous avons \u00e9crit un petit correctif pour Bouncer qui a ajout\u00e9 ce param\u00e8tre, c'est-\u00e0-dire la limitation des clients sur le pool. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d58884fc5ac0f90ff8442f126972157a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>On pourrait le faire c\u00f4t\u00e9 Postgres, c'est-\u00e0-dire limiter les r\u00f4les dans la base de donn\u00e9es par le nombre de connexions.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8d6ff70db72964ed4eae5eaa47309931.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mais alors, vous perdez la possibilit\u00e9 de comprendre pourquoi vous n'avez pas de connexions avec le serveur. PgBouncer ne passe pas l'erreur de connexion ; il renvoie toujours la m\u00eame information. Et vous ne pouvez pas comprendre : peut-\u00eatre que votre mot de passe a chang\u00e9, peut-\u00eatre que la base est simplement en panne, peut-\u00eatre que quelque chose ne va pas. Mais il n'y a aucun diagnostic. Si la session ne peut pas \u00eatre \u00e9tablie, vous ne saurez pas pourquoi cela ne peut pas \u00eatre fait. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cb3048344a94f2953bf403485d28e69f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c0 un moment donn\u00e9, vous regardez les graphiques de l'application et vous constatez que l'application ne fonctionne pas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e67c6680bb9a7f41242af9f9e4920916.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vous regardez le top et voyez que Bouncer est monoculture. C'est un moment charni\u00e8re dans la vie du service. Vous r\u00e9alisez que vous vous pr\u00e9pariez \u00e0 l'\u00e9volutivit\u00e9 de la base de donn\u00e9es dans un an et demi, mais vous devez \u00e9voluer le pooler. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4c140c4ba6db19cb9939c1148638fb73.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous en sommes venus \u00e0 la conclusion qu'il nous fallait davantage de PgBouncer. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d369f572a66c16a8917e13393324a644.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/542629\/\">https:\/\/lwn.net\/Articles\/542629\/<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Nous avons l\u00e9g\u00e8rement corrig\u00e9 Bouncer. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/97755489a25ebfe38efd56ff897bd8fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et nous avons mis en place la possibilit\u00e9 de d\u00e9marrer plusieurs Bouncers en r\u00e9utilisant le port TCP. Et d\u00e9j\u00e0, le syst\u00e8me d'exploitation g\u00e8re automatiquement les connexions TCP entrantes entre eux en round-robin.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ac30d3f067de2a8cd66ad2325c3a3b58.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C'est transparent pour les clients, c'est-\u00e0-dire que tout semble comme si vous aviez un seul Bouncer, mais vous avez une fragmentation des connexions idle entre les Bouncers en cours d'ex\u00e9cution. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/53825f075db00b026c12013a610be456.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et \u00e0 un certain moment, vous pouvez remarquer que ces 3 Bouncers consomment chacun leur c\u0153ur \u00e0 100 %. Vous avez besoin d'un nombre assez important de Bouncers. Pourquoi ? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/66c17883a043e157cd7ceab2c2a4e326.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Parce que vous avez TLS. Vous avez une connexion chiffr\u00e9e. Et si vous faites un benchmark de Postgres avec TLS et sans TLS, vous constaterez que le nombre de connexions \u00e9tablies chute de presque deux ordres de grandeur avec l'activation du chiffrement, car la poign\u00e9e de main TLS consomme des ressources CPU. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6101121ebe136af16e5eb1a484c65d66.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et en haut, vous pouvez voir pas mal de fonctions cryptographiques qui s'ex\u00e9cutent lors d'une vague de connexions entrantes. Puisque notre primaire peut basculer entre les zones de disponibilit\u00e9, une vague de connexions entrantes est une situation assez typique. C'est-\u00e0-dire que pour une raison quelconque, l'ancien primaire \u00e9tait inaccessible, et toute la charge a \u00e9t\u00e9 envoy\u00e9e vers un autre centre de donn\u00e9es. Ils viendront tous en m\u00eame temps saluer avec TLS. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c238ac2f511568590dc275e01c192c00.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et un grand nombre de poign\u00e9es de main TLS peut ne pas saluer le Bouncer, mais plut\u00f4t lui serrer la gorge. En raison du d\u00e9lai d'expiration, la vague de connexions entrantes peut devenir persistante. Si vous avez un nouveau essai dans la base sans retour exponentiel, elles n'arriveront pas encore et encore comme une vague coh\u00e9rente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f42d0b210174d4d172254603ae6b834a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Voici un exemple de 16 PgBouncer, qui chargent 16 c\u0153urs \u00e0 100 %.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8d048d3774c09e5b6a3fb3c7bff62084.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous avons abouti \u00e0 un PgBouncer en cascade. C'est la meilleure configuration que l'on puisse atteindre avec notre charge de Bouncer. Les Bouncers externes sont l\u00e0 pour la poign\u00e9e de main TCP, tandis que les Bouncers internes sont l\u00e0 pour le pooling r\u00e9el, afin de ne pas trop fragmenter les connexions externes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3a4ee4ea46d5fe8479a5a7222ee134da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Avec cette configuration, un red\u00e9marrage en douceur est possible. Vous pouvez red\u00e9marrer ces 18 Bouncers un par un. Mais maintenir une telle configuration est assez difficile. Les administrateurs syst\u00e8me, DevOps, et les personnes qui portent vraiment la responsabilit\u00e9 de ce serveur ne seront pas tr\u00e8s heureux de ce sch\u00e9ma. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5291fe67dbe02036f3ff8e98bdd84d1b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il semblerait que nous pouvons promouvoir toutes nos am\u00e9liorations en open source, mais le Bouncer n'est pas tr\u00e8s bien support\u00e9. Par exemple, la possibilit\u00e9 de lancer plusieurs PgBouncers sur un m\u00eame port a \u00e9t\u00e9 engag\u00e9e il y a un mois. Et la demande de tirage pour cette fonctionnalit\u00e9 date de quelques ann\u00e9es. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2059d7f49649d136249103db4aa3ec19.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/docs\/current\/libpq-cancel.html\">https:\/\/www.postgresql.org\/docs\/current\/libpq-cancel.html<\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgbouncer\/pgbouncer\/pull\/79\">https:\/\/github.com\/pgbouncer\/pgbouncer\/pull\/79<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Ou un autre exemple. Dans Postgres, vous pouvez annuler une requ\u00eate en cours en envoyant un secret par une autre connexion sans authentification suppl\u00e9mentaire. Mais certains clients envoient simplement un reset TCP, ce qui signifie qu'ils coupent la connexion r\u00e9seau. Que fera alors Bouncer ? Il ne fera rien. Il continuera d'ex\u00e9cuter la requ\u00eate. Si vous avez un grand nombre de connexions qui, avec des petites requ\u00eates, ont mis la base \u00e0 l'arr\u00eat, il ne suffira pas de couper la connexion avec Bouncer, il faudra \u00e9galement terminer les requ\u00eates en cours dans la base. <\/p>\n<p><\/p>\n<p>Cela a \u00e9t\u00e9 corrig\u00e9 et ce probl\u00e8me n'a toujours pas \u00e9t\u00e9 fusionn\u00e9 dans l'upstream de Bouncer. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a9695b6d9e640a5543dc73429eb0050b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ainsi, nous en sommes venus \u00e0 la n\u00e9cessit\u00e9 de disposer de notre propre pool de connexions, qui pourra \u00e9voluer, \u00eatre corrig\u00e9, dans lequel nous pourrons rapidement r\u00e9soudre les probl\u00e8mes et qui, bien s\u00fbr, devra \u00eatre multithread. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e755cd9b06a004f0eced1dc12fd3a6fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le multithreading a \u00e9t\u00e9 d\u00e9fini comme notre objectif principal. Nous devons pouvoir g\u00e9rer efficacement une vague d'entr\u00e9es de connexions TLS. <\/p>\n<p><\/p>\n<p>Pour cela, nous avons d\u00fb d\u00e9velopper une biblioth\u00e8que distincte, appel\u00e9e Machinarium, qui sert \u00e0 d\u00e9crire les \u00e9tats de la machine de connexion r\u00e9seau sous forme de code s\u00e9quentiel. Si vous regardez dans le code source de libpq, vous verrez des appels assez complexes qui peuvent vous renvoyer un r\u00e9sultat et dire : \u00ab Appelez-moi un peu plus tard. J'ai actuellement une op\u00e9ration d'E\/S en cours, mais lorsque l'E\/S sera termin\u00e9e, j'aurai une charge pour le processeur \u00bb. Et c'est un sch\u00e9ma \u00e0 plusieurs niveaux. L'interaction r\u00e9seau est g\u00e9n\u00e9ralement d\u00e9crite par une machine d'\u00e9tats. Un ensemble de r\u00e8gles de type \u00ab Si j'ai re\u00e7u un en-t\u00eate de paquet de taille N, j'attends alors N octets \u00bb, \u00ab Si j'ai envoy\u00e9 un paquet SYNC, j'attends alors un paquet avec les m\u00e9tadonn\u00e9es du r\u00e9sultat \u00bb. Cela donne un code assez difficile contre-intuitif, comme si un labyrinthe \u00e9tait transform\u00e9 en un d\u00e9pliement lin\u00e9aire. Nous avons fait en sorte que, au lieu d'une machine d'\u00e9tats, le programmeur d\u00e9crive le chemin principal de l'interaction sous la forme d'un code imp\u00e9ratif classique. Il suffit que dans ce code imp\u00e9ratif, il faille ins\u00e9rer des endroits o\u00f9 la s\u00e9quence d'ex\u00e9cution doit \u00eatre interrompue pour attendre des donn\u00e9es du r\u00e9seau, en transmettant le contexte d'ex\u00e9cution \u00e0 une autre coroutine (green thread). Cette approche est similaire \u00e0 celle o\u00f9 nous enregistrons le chemin le plus attendu dans le labyrinthe en s\u00e9rie, puis ajoutons des embranchements. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a6bfb4b11961c7db3a7c7184674e3bc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Au final, nous avons un seul fil d'ex\u00e9cution qui effectue un accept TCP et transmet de mani\u00e8re round-robin plusieurs connexions TPC aux workers. <\/p>\n<p><\/p>\n<p>Chaque connexion client fonctionne toujours sur un seul processeur. Cela permet de le rendre plus adapt\u00e9 \u00e0 la gestion du cache. <\/p>\n<p><\/p>\n<p>De plus, nous avons l\u00e9g\u00e8rement am\u00e9lior\u00e9 la collecte des petits paquets en un seul grand paquet afin de d\u00e9charger la pile TCP syst\u00e8me.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7d740c23baecdd2f993c83cd54a0a8e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Par ailleurs, nous avons am\u00e9lior\u00e9 le pooling transactionnel en permettant \u00e0 Odyssey, avec la configuration appropri\u00e9e, d'envoyer CANCEL et ROLLBACK en cas de rupture de la connexion r\u00e9seau, c'est-\u00e0-dire que si personne n'attend la requ\u00eate, Odyssey demande \u00e0 la base de ne pas ex\u00e9cuter cette requ\u00eate qui pourrait consommer des ressources pr\u00e9cieuses.<\/p>\n<p><\/p>\n<p>Dans la mesure du possible, nous maintenons les connexions avec le m\u00eame client. Cela \u00e9vite la r\u00e9initialisation de application_name_add_host. Si possible, nous n'avons pas de r\u00e9initialisation suppl\u00e9mentaire des param\u00e8tres n\u00e9cessaires pour le diagnostic. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/afb2fb7fb16d65c9ea73a8978d1eb83c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous travaillons dans l'int\u00e9r\u00eat de Yandex.Cloud. Si vous utilisez PostgreSQL g\u00e9r\u00e9 et avez install\u00e9 un pool de connexions, vous pouvez \u00e9tablir une r\u00e9plication logique externe, c'est-\u00e0-dire vous \u00e9loigner de nous si vous le souhaitez, \u00e0 l'aide de la r\u00e9plication logique. Le Bouncer ne transmettra pas le flux de r\u00e9plication logique vers l'ext\u00e9rieur. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c53defc92ebd8f3bec57ce64d97b9f72.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Voici un exemple de configuration de r\u00e9plication logique. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a37d9d1abf288d17fa646b642e8b62ab.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De plus, nous supportons la r\u00e9plication physique vers l'ext\u00e9rieur. Dans le Cloud, cela est bien s\u00fbr impossible, car alors votre cluster communiquerait trop d'informations sur lui-m\u00eame. Mais dans vos installations, si vous avez besoin d'une r\u00e9plication physique via un pool de connexions dans Odyssey, c'est possible. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/572934ce5b08115e57ab4b55d2153c6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Odyssey est enti\u00e8rement compatible avec la surveillance de PgBouncer. Nous avons une console qui ex\u00e9cute presque toutes les m\u00eames commandes. Si quelque chose manque, envoyez une demande de tirage ou m\u00eame un probl\u00e8me sur GitHub, nous compl\u00e9terons les commandes n\u00e9cessaires. Mais la fonctionnalit\u00e9 principale de la console PgBouncer est d\u00e9j\u00e0 disponible chez nous. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/451dd798fb3523a7a174ebfe00a14bc5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et bien s\u00fbr, nous avons le transfert d'erreurs. Nous renverrons l'erreur signal\u00e9e par la base. Vous obtiendrez des informations sur les raisons pour lesquelles vous n'acc\u00e9dez pas \u00e0 la base, et pas seulement que vous n'y acc\u00e9dez pas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/14b4cb0efa33a2658dfc528349a5382f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cette fonctionnalit\u00e9 peut \u00eatre d\u00e9sactiv\u00e9e si vous avez besoin d'une compatibilit\u00e9 \u00e0 100 % avec PgBouncer. Nous pouvons nous comporter de la m\u00eame mani\u00e8re que Bouncer, juste par pr\u00e9caution. <\/p>\n<p><\/p>\n<p><strong>D\u00e9veloppement<\/strong><\/p>\n<p><\/p>\n<p>Quelques mots sur le code source d'Odyssey. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6055d5ec9676c331a83592916a6a292f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\/pull\/66\">https:\/\/github.com\/yandex\/odyssey\/pull\/66<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Par exemple, il existe des commandes \u00ab Pause \/ Reprendre \u00bb. Elles sont g\u00e9n\u00e9ralement utilis\u00e9es pour mettre \u00e0 jour la base de donn\u00e9es. Si vous devez mettre \u00e0 jour Postgres, vous pouvez le mettre en pause dans le pool de connexions, effectuer un pg_upgrade, puis le reprendre. Du c\u00f4t\u00e9 client, cela ressemblera \u00e0 une simple lenteur de la base de donn\u00e9es. Cette fonctionnalit\u00e9 nous a \u00e9t\u00e9 apport\u00e9e par des membres de la communaut\u00e9. Elle n'est pas encore fusionn\u00e9e, mais cela viendra bient\u00f4t. (D\u00e9j\u00e0 fusionn\u00e9e)<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d2f7c57e0ae3e466ec2a701bbdb8eb3f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\/pull\/73\">https:\/\/github.com\/yandex\/odyssey\/pull\/73<\/a><\/noindex> \u2014 d\u00e9j\u00e0 fusionn\u00e9e<\/p>\n<p><\/p>\n<p>De plus, l'une des nouvelles fonctionnalit\u00e9s de PgBouncer est la prise en charge de l'authentification SCRAM, \u00e9galement apport\u00e9e par quelqu'un qui ne travaille pas chez Yandex.Cloud. Les deux sont des fonctionnalit\u00e9s complexes et importantes. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f39346a543c88d17728233d05c2dff19.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C'est pourquoi je souhaite expliquer comment Odyssey est con\u00e7u, peut-\u00eatre que vous souhaitez \u00e9galement \u00e9crire un peu de code. <\/p>\n<p><\/p>\n<p>Vous avez une base Odyssey de base qui repose sur deux biblioth\u00e8ques principales. La biblioth\u00e8que Kiwi est une impl\u00e9mentation du protocole de message de Postgres. C'est-\u00e0-dire que le proto natif 3 de Postgres repr\u00e9sente les messages standards que les frontaux et les backends peuvent \u00e9changer. Ils sont impl\u00e9ment\u00e9s dans la biblioth\u00e8que Kiwi.<\/p>\n<p><\/p>\n<p>La biblioth\u00e8que Machinarium est une biblioth\u00e8que d'impl\u00e9mentation de flux. Un petit fragment de ce Machinarium est \u00e9crit en assembleur. Mais, ne vous inqui\u00e9tez pas, cela ne fait que 15 lignes. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cd18f250af50eabd53536b2c0d7f12b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Architecture d'Odyssey. Il y a une machine principale o\u00f9 des coroutines sont ex\u00e9cut\u00e9es. Dans cette machine, l'acceptation des connexions TCP entrantes et la r\u00e9partition vers des workers sont r\u00e9alis\u00e9es. <\/p>\n<p><\/p>\n<p>\u00c0 l'int\u00e9rieur d'un worker, un gestionnaire de plusieurs clients peut fonctionner. De plus, le fil principal g\u00e8re la console et le traitement des t\u00e2ches cron pour supprimer les connexions qui ne sont plus n\u00e9cessaires dans le pool.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7072fb20f406f2ee5788542860ccdf50.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pour tester Odyssey, nous utilisons un ensemble standard de tests de Postgres. Il suffit de lancer install-check via Bouncer et via Odyssey, nous obtenons un div nul. Certains tests li\u00e9s \u00e0 la formatage des dates ne passent pas de la m\u00eame mani\u00e8re dans Bouncer et dans Odyssey.<\/p>\n<p><\/p>\n<p>De plus, il existe de nombreux pilotes qui ont leurs propres tests. Nous utilisons leurs tests pour tester Odyssey.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/fb01cc9a0e9724ddcd3cc3d088afb182.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En outre, en raison de notre configuration en cascade, nous devons tester diff\u00e9rentes combinaisons : Postgres + Odyssey, PgBouncer + Odyssey, Odyssey + Odyssey, pour nous assurer que si Odyssey se trouve \u00e0 un moment donn\u00e9 dans une partie de la cascade, il continue de fonctionner comme pr\u00e9vu. <\/p>\n<p><\/p>\n<p><strong>Rake<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/25855b691180bca083025b9e8b611c09.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous utilisons Odyssey en production. Il ne serait pas juste de dire que tout fonctionne parfaitement. Non, c'est-\u00e0-dire oui, mais pas toujours. Par exemple, en production, tout fonctionnait simplement, puis nos amis de PostgreSQL Professional sont venus et ont dit que nous avions une fuite de m\u00e9moire. C'\u00e9tait vrai, nous l'avons corrig\u00e9e. Mais c'\u00e9tait juste. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e638d88397b32b1ca0b74c9c1b905f81.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ensuite, nous avons d\u00e9couvert qu'il y avait des connexions TLS entrantes et sortantes dans le pool de connexions. Et pour ces connexions, des certificats clients et des certificats serveurs sont n\u00e9cessaires.<\/p>\n<p><\/p>\n<p>Les certificats serveurs Bouncer et Odyssey les relisent \u00e0 partir de leur pcache, mais il n'est pas n\u00e9cessaire de relire les certificats clients \u00e0 partir de pcache, car notre Odyssey scalable se heurte finalement \u00e0 la performance syst\u00e8me de lecture de ce certificat. Cela a \u00e9t\u00e9 une surprise pour nous, car cela ne s'est pas produit imm\u00e9diatement. Au d\u00e9but, il \u00e9voluait de mani\u00e8re lin\u00e9aire, mais apr\u00e8s 20 000 connexions simultan\u00e9es entrantes, ce probl\u00e8me s'est manifest\u00e9.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6cff094cd59a990e448b82fa0b1572b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La m\u00e9thode d'authentification pluggable est la possibilit\u00e9 de s'authentifier avec les outils int\u00e9gr\u00e9s \u00e0 Linux. Dans PgBouncer, elle est impl\u00e9ment\u00e9e de telle mani\u00e8re qu'il y a un thread s\u00e9par\u00e9 pour attendre la r\u00e9ponse de PAM, et il y a le thread principal de PgBouncer qui g\u00e8re la connexion en cours et peut demander d'attendre dans le thread PAM. <\/p>\n<p><\/p>\n<p>Nous ne l'avons pas mise en \u0153uvre pour une raison assez simple. Nous avons beaucoup de threads. Pourquoi en aurions-nous besoin ?<\/p>\n<p><\/p>\n<p>Cela peut finalement poser des probl\u00e8mes, car si vous avez une authentification PAM et une authentification non-PAM, une grande vague d'authentification PAM peut consid\u00e9rablement retarder l'authentification non-PAM. C'est l'une des choses que nous n'avons pas corrig\u00e9es. Mais si vous voulez le corriger, vous pouvez vous en occuper. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c7bd9e9980ff7298b30a59c130f03dbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un autre souci \u00e9tait que nous avons un thread qui accepte toutes les connexions entrantes. Et ensuite, il les transmet \u00e0 un pool de workers, o\u00f9 se d\u00e9roulera la poign\u00e9e de main TLS.<\/p>\n<p><\/p>\n<p>Ainsi, si vous avez une vague coh\u00e9rente de 20 000 connexions r\u00e9seau, elles seront toutes accept\u00e9es. Et du c\u00f4t\u00e9 client, libpq commencera \u00e0 compter les d\u00e9lais d'attente. Par d\u00e9faut, il semble que cela soit r\u00e9gl\u00e9 sur 3 secondes. <\/p>\n<p><\/p>\n<p>S'ils ne peuvent pas tous acc\u00e9der simultan\u00e9ment \u00e0 la base de donn\u00e9es, ils ne peuvent pas y acc\u00e9der, car tout cela peut \u00eatre couvert par des essais non exponentiels. <\/p>\n<p><\/p>\n<p>Nous en sommes arriv\u00e9s \u00e0 copier ici le sch\u00e9ma de PgBouncer en limitant le nombre de connexions TCP que nous acceptons. <\/p>\n<p><\/p>\n<p>Si nous constatons que nous acceptons des connexions, mais qu'elles ne parviennent finalement pas \u00e0 \u00e9tablir le handshake, nous les pla\u00e7ons dans une file d'attente afin qu'elles ne consomment pas les ressources du processeur central. Cela entra\u00eene le fait que le handshake simultan\u00e9 peut ne pas \u00eatre effectu\u00e9 pour toutes les connexions arriv\u00e9es. Mais au moins, certaines seront ajout\u00e9es \u00e0 la base, m\u00eame si la charge est suffisamment \u00e9lev\u00e9e.<\/p>\n<p><\/p>\n<p><strong>feuille de route<\/strong><\/p>\n<p><\/p>\n<p>Que souhaiteriez-vous voir \u00e0 l'avenir dans Odyssey ? Quelles sont nos comp\u00e9tences en d\u00e9veloppement et quelles attentes avons-nous vis-\u00e0-vis de la communaut\u00e9 ?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4719437d80b33efc3da6572af9a4dedb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>En ao\u00fbt 2019.<\/strong><\/p>\n<p><\/p>\n<p>Voici \u00e0 quoi ressemblait la feuille de route d'Odyssey en ao\u00fbt :<\/p>\n<p><\/p>\n<ul>\n<li>Nous voulions une authentification SCRAM et PAM.<\/li>\n<li>Nous voulions transmettre les requ\u00eates de lecture \u00e0 standby. <\/li>\n<li>Nous aimerions un red\u00e9marrage en ligne. <\/li>\n<li>Et la possibilit\u00e9 de faire une pause sur le serveur. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/455c92f92df826257c2c57dc2b034e22.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La moiti\u00e9 de cette feuille de route est r\u00e9alis\u00e9e, et cela ne vient pas de nous. Et c'est bien. Maintenant, discutons de ce qui reste \u00e0 faire et ajoutons encore. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4a1daafbfe8d65ba0dd3e1ebdae8dd94.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\/issues\/12\">Concernant la transmission des requ\u00eates en lecture seule \u00e0 standby<\/a><\/noindex>? \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0440\u0435\u043f\u043b\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0435\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0433\u0440\u0435\u0442\u044c \u0432\u043e\u0437\u0434\u0443\u0445. \u041e\u043d\u0438 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f failover \u0438 switchover. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0438\u0445 \u0437\u0430\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0439. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b, \u0442\u0443 \u0436\u0435 \u0441\u0430\u043c\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u043d\u0430\u0447\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0873cffd4f1ae15d9ffa6d080671051b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En gros, dans Postgres, \u00e0 partir de la version 10, il est possible de sp\u00e9cifier des session_attrs lors de la connexion. Vous pouvez lister tous les h\u00f4tes de bases de donn\u00e9es dans la connexion et indiquer pourquoi vous allez dans la base de donn\u00e9es : pour \u00e9crire ou uniquement lire. Et le driver choisira automatiquement le premier h\u00f4te de la liste qui convient \u00e0 ses exigences. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0693d1327fe5826502a01c21d05d5b4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mais le probl\u00e8me de cette approche est qu'elle ne contr\u00f4le pas le retard de r\u00e9plication. Vous pourriez avoir une r\u00e9plique qui est en retard d'un temps inacceptable pour votre service. Pour permettre l'ex\u00e9cution fonctionnelle des requ\u00eates de lecture sur la r\u00e9plique, nous devons essentiellement prendre en charge dans Odyssey la possibilit\u00e9 de ne pas fonctionner lorsque la lecture n'est pas possible. <\/p>\n<p><\/p>\n<p>Odyssey doit parfois interroger la base de donn\u00e9es et demander la distance de r\u00e9plication par rapport au primaire. Et si elle atteint une valeur limite, de nouvelles requ\u00eates \u00e0 la base ne doivent pas \u00eatre autoris\u00e9es, il faut dire au client de r\u00e9initialiser les connexions et \u00e9ventuellement choisir un autre h\u00f4te pour ex\u00e9cuter les requ\u00eates. Cela permettra \u00e0 la base de r\u00e9cup\u00e9rer plus rapidement le retard de r\u00e9plication et de revenir pour r\u00e9pondre aux requ\u00eates. <\/p>\n<p><\/p>\n<p>Il est difficile d'estimer les d\u00e9lais d'impl\u00e9mentation, car c'est open source. Mais j'esp\u00e8re que ce ne sera pas 2,5 ans comme pour mes coll\u00e8gues de PgBouncer. Cette fonctionnalit\u00e9 serait bienvenue dans Odyssey. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4ec3cd2ff7b2298927cccfe8e0ba890a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\/issues\/16\">Dans la communaut\u00e9, les gens ont pos\u00e9 des questions sur la prise en charge des instructions pr\u00e9par\u00e9es.<\/a><\/noindex>Vous pouvez maintenant cr\u00e9er une instruction pr\u00e9par\u00e9e de deux mani\u00e8res. Tout d'abord, vous pouvez ex\u00e9cuter la commande SQL, \u00e0 savoir \u00ab pr\u00e9par\u00e9e \u00bb. Pour comprendre cette commande SQL, nous devons apprendre \u00e0 comprendre SQL c\u00f4t\u00e9 Bouncer. Ce serait excessif, car nous avons besoin d'un analyseur complet. Nous ne pouvons pas analyser chaque commande SQL. <\/p>\n<p><\/p>\n<p>Mais il existe une instruction pr\u00e9par\u00e9e au niveau du protocole de messages sur proto3. Et c'est \u00e0 ce moment que l'information selon laquelle une instruction pr\u00e9par\u00e9e est cr\u00e9\u00e9e arrive sous une forme structur\u00e9e. Nous pourrions soutenir la compr\u00e9hension que, lors d'une connexion serveur, le client a demand\u00e9 \u00e0 cr\u00e9er des instructions pr\u00e9par\u00e9es. Et m\u00eame si la transaction est cl\u00f4tur\u00e9e, nous devons toujours maintenir la coh\u00e9sion entre le serveur et le client. <\/p>\n<p><\/p>\n<p>Mais il y a un d\u00e9saccord dans le dialogue, car quelqu'un dit qu'il faut comprendre quelle instruction pr\u00e9par\u00e9e a \u00e9t\u00e9 cr\u00e9\u00e9e par le client et s\u00e9parer la connexion serveur entre tous les clients qui ont cr\u00e9\u00e9 cette connexion serveur, c'est-\u00e0-dire ceux qui ont cr\u00e9\u00e9 une telle instruction pr\u00e9par\u00e9e. <\/p>\n<p><\/p>\n<p>Andres Freund a dit que si un client est arriv\u00e9, qui avait d\u00e9j\u00e0 cr\u00e9\u00e9 une telle instruction pr\u00e9par\u00e9e dans une autre connexion serveur, alors cr\u00e9ez-la pour lui. Mais, il semble que ce soit un peu incorrect d'ex\u00e9cuter des requ\u00eates dans la base de donn\u00e9es \u00e0 la place du client, mais du point de vue du d\u00e9veloppeur qui \u00e9crit le protocole d'interaction avec la base, ce serait pratique si on lui fournissait simplement une connexion r\u00e9seau, dans laquelle il y a cette requ\u00eate pr\u00e9par\u00e9e. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cd56b3ad015195d86a64e52be365b16a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et une autre fonctionnalit\u00e9 que nous devons mettre en \u0153uvre. Nous avons actuellement un monitoring compatible avec PgBouncer. Nous pouvons retourner le temps moyen d'ex\u00e9cution des requ\u00eates. Mais le temps moyen, c'est comme une temp\u00e9rature moyenne dans un h\u00f4pital : certains sont froids, certains sont ti\u00e8des - en moyenne, tous sont en bonne sant\u00e9. Ce n'est pas vrai. <\/p>\n<p><\/p>\n<p>Nous devons impl\u00e9menter le support des percentiles, qui indiqueraient qu'il y a des requ\u00eates lentes qui consomment des ressources, et rendraient le monitoring plus acceptable. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6f285f3eb0d79e7f25d42f0e792b85b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le plus important, c'est que nous voulons la version 1.0 (La version 1.1 est d\u00e9j\u00e0 sortie). La r\u00e9alit\u00e9 est qu'actuellement Odyssey est en version 1.0rc, c'est-\u00e0-dire le candidat \u00e0 la sortie. Et tous les probl\u00e8mes que j'ai \u00e9num\u00e9r\u00e9s ont \u00e9t\u00e9 corrig\u00e9s avec cette version, \u00e0 l'exception des fuites de m\u00e9moire. <\/p>\n<p><\/p>\n<p>Que signifie pour nous la version 1.0 ? Nous d\u00e9ployons Odyssey sur nos bases. Il fonctionne d\u00e9j\u00e0 sur nos bases, mais quand il atteindra le seuil de 1 000 000 de requ\u00eates par seconde, nous pourrons dire que c'est une version de production, que l'on peut appeler 1.0. <\/p>\n<p><\/p>\n<p>Dans la communaut\u00e9, plusieurs personnes ont demand\u00e9 que la version 1.0 contienne \u00e9galement une pause et SCRAM. Mais cela signifierait que nous devrions d\u00e9j\u00e0 d\u00e9ployer la prochaine version en production, car ni SCRAM ni la pause ne sont encore fusionn\u00e9s. Cependant, il est probable que ce probl\u00e8me sera r\u00e9solu assez rapidement. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Feuille de route d&#039;Odyssey : que voulons-nous encore du pooler de connexions. Andre\u00ef Borodine (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2f50de9f51f653a7396965239bd545e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>J'attends vos pull requests. J'aimerais aussi savoir quels probl\u00e8mes vous rencontrez avec Bouncer. Discutons-en. Peut-\u00eatre pourrons-nous r\u00e9aliser certaines fonctionnalit\u00e9s dont vous avez besoin. <\/p>\n<p><\/p>\n<p>Sur cela, ma part est termin\u00e9e, j'aimerais vous \u00e9couter. Merci !<\/p>\n<p><\/p>\n<p>Questions<\/p>\n<p><\/p>\n<p><em>Si je mets application_name, sera-t-il correctement transmis, y compris dans le pooling de transaction dans Odyssey ?<\/em><\/p>\n<p><\/p>\n<p>Dans Odyssey ou dans Bouncer ?<\/p>\n<p><\/p>\n<p><em>Dans Odyssey. Cela se passe dans Bouncer.<\/em> <\/p>\n<p><\/p>\n<p>Nous allons \u00e9tablir un ensemble. <\/p>\n<p><\/p>\n<p><em>Et si ma connexion r\u00e9elle change entre d'autres connexions, sera-t-elle transf\u00e9r\u00e9e ?<\/em><\/p>\n<p><\/p>\n<p>Nous \u00e9tablirons un ensemble de tous les param\u00e8tres \u00e9num\u00e9r\u00e9s dans la liste. Je ne peux pas dire si application_name figure dans cette liste. Je crois l'avoir vu. Nous d\u00e9finirons tous les m\u00eames param\u00e8tres. Une seule requ\u00eate r\u00e9alisera tout ce qui a \u00e9t\u00e9 configur\u00e9 par le client au d\u00e9marrage. <\/p>\n<p><\/p>\n<p><em>Merci, Andre\u00ef, pour la pr\u00e9sentation ! Bonne pr\u00e9sentation ! Je suis heureux qu'Odyssey se d\u00e9veloppe de plus en plus vite chaque minute. Je vous souhaite de continuer ainsi. Nous vous avons d\u00e9j\u00e0 contact\u00e9 pour avoir une connexion multi-source de donn\u00e9es, afin qu'Odyssey puisse se connecter simultan\u00e9ment \u00e0 diff\u00e9rentes bases de donn\u00e9es, c'est-\u00e0-dire ma\u00eetre-esclave, et ensuite se reconnecter automatiquement au nouveau ma\u00eetre apr\u00e8s un failover.<\/em> <\/p>\n<p><\/p>\n<p>Oui, je me souviens de cette discussion. Il y a actuellement plusieurs stockages. Mais il n'y a pas de commutation entre eux. Nous devons interroger le serveur de notre c\u00f4t\u00e9 pour savoir s'il est toujours vivant et comprendre qu'un failover s'est produit, qui appelera pg_recovery. J'ai un moyen standard de savoir que nous ne sommes pas sur le ma\u00eetre. Et nous devons comprendre cela par des erreurs ou comment ? C'est-\u00e0-dire que l'id\u00e9e est int\u00e9ressante, elle est en discussion. \u00c9crivez plus de commentaires. Si vous avez des personnes qui savent travailler en C, c'est vraiment formidable. <\/p>\n<p><\/p>\n<p>La question de la mise \u00e0 l'\u00e9chelle par r\u00e9plication nous int\u00e9resse \u00e9galement, car nous souhaitons rendre l'adoption des clusters r\u00e9pliqu\u00e9s aussi simple que possible pour les d\u00e9veloppeurs d'applications. Cependant, nous aimerions avoir plus de commentaires, c'est-\u00e0-dire des d\u00e9tails sur la fa\u00e7on de proc\u00e9der et de le faire correctement. <\/p>\n<p><\/p>\n<p><em>La question concerne \u00e9galement les r\u00e9pliques. Il s'av\u00e8re que vous avez un ma\u00eetre et plusieurs r\u00e9pliques. Il est clair que les connexions vers la r\u00e9plique sont moins fr\u00e9quentes que vers le ma\u00eetre, car elles peuvent avoir des diff\u00e9rences. Vous avez mentionn\u00e9 que les diff\u00e9rences dans les donn\u00e9es peuvent \u00eatre telles qu'elles ne satisferont pas votre entreprise et que vous n'irez pas vers elles tant qu'elles ne seront pas r\u00e9pliqu\u00e9es. En outre, si vous n'\u00eates pas all\u00e9 l\u00e0-bas depuis longtemps et commencez \u00e0 y aller, alors les donn\u00e9es dont vous avez besoin ne seront pas imm\u00e9diatement disponibles. C'est-\u00e0-dire que si nous allons constamment vers le ma\u00eetre, le cache y sera chaud, alors que dans la r\u00e9plique, le cache sera l\u00e9g\u00e8rement en retard.<\/em> <\/p>\n<p><\/p>\n<p>Oui, c'est vrai. Il n'y aura pas de blocs de donn\u00e9es dans le pcache que vous voulez, dans le cache r\u00e9el, il n'y aura pas d'informations sur les tables que vous voulez, il n'y aura pas de requ\u00eates analys\u00e9es dans les plans, il n'y aura rien en fait. <\/p>\n<p><\/p>\n<p><em>Et quand vous avez un certain cluster et que vous ajoutez une nouvelle r\u00e9plique, tant qu'elle d\u00e9marre, tout va mal, c'est-\u00e0-dire qu'elle accumule son cache.<\/em> <\/p>\n<p><\/p>\n<p>J'ai compris l'id\u00e9e. La bonne approche serait de lancer d'abord un petit pourcentage de requ\u00eates sur la r\u00e9plique, afin de r\u00e9chauffer le cache. En gros, nous avons pour condition de ne pas \u00eatre en retard de plus de 10 secondes par rapport au ma\u00eetre. Et cette condition ne pas l'activer d'un coup, mais progressivement pour certains clients. <\/p>\n<p><\/p>\n<p><em>Oui, augmenter le poids.<\/em><\/p>\n<p><\/p>\n<p>C'est une bonne id\u00e9e. Mais d'abord, il faut r\u00e9aliser cette coupure. Il faut d'abord se d\u00e9connecter, puis penser \u00e0 comment se reconnecter. C'est une excellente fonctionnalit\u00e9 pour se reconnecter en douceur.<\/p>\n<p><\/p>\n<p><em>Il y a une telle option dans nginx <code>d\u00e9marrer lentement<\/code> dans le cluster pour le serveur. Et il augmente progressivement la charge.<\/em> <\/p>\n<p><\/p>\n<p>Oui, excellente id\u00e9e, nous essaierons lorsque nous y arriverons.<\/p>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/522734\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u0410\u043d\u0434\u0440\u0435\u0439 \u0411\u043e\u0440\u043e\u0434\u0438\u043d \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442, \u043a\u0430\u043a \u043e\u043d\u0438 \u0443\u0447\u043b\u0438 \u043e\u043f\u044b\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f PgBouncer \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0443\u043b\u0435\u0440\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 Odyssey, \u043a\u0430\u043a \u0432\u044b\u043a\u0430\u0442\u044b\u0432\u0430\u043b\u0438 \u0435\u0433\u043e \u0432 production. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043e\u0431\u0441\u0443\u0434\u0438\u043c \u043a\u0430\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0443\u043b\u0435\u0440\u0430 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u043d\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445: \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u041e\u0434\u0438\u0441\u0441\u0435\u044f. \u0412\u0438\u0434\u0435\u043e: \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043d\u0434\u0440\u0435\u0439. \u0412 \u042f\u043d\u0434\u0435\u043a\u0441\u0435 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":96516,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-96515","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\/odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019\" \/>\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\udd47Odyssey roadmap: \u0447\u0442\u043e \u0435\u0449\u0451 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0442 \u043f\u0443\u043b\u0435\u0440\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439. \u0410\u043d\u0434\u0440\u0435\u0439 \u0411\u043e\u0440\u043e\u0434\u0438\u043d (2019) | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019\" \/>\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-12T17:43:02+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-12T17:43:02+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\udd47Feuille de route Odyssey : ce que nous attendons encore du pooler de connexions. Andre\u00ef Borodine (2019) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019","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\udd47Odyssey roadmap: \u0447\u0442\u043e \u0435\u0449\u0451 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0442 \u043f\u0443\u043b\u0435\u0440\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439. \u0410\u043d\u0434\u0440\u0435\u0439 \u0411\u043e\u0440\u043e\u0434\u0438\u043d (2019) | ProHoster","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019","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-12T17:43:02+00:00","article:modified_time":"2020-10-12T17:43:02+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"96515","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:41:30","updated":"2022-10-01 00:02:14","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\/96515","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=96515"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/96515\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/96516"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=96515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=96515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=96515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}