{"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\/it\/blog\/administrirovanie\/odyssey-roadmap-chto-eshhyo-my-hotim-ot-pulera-soedinenij-andrej-borodin-2019","title":{"rendered":"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6c445191705a4c96939cd094bc457a53.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nella presentazione, Andrei Borodin parler\u00e0 di come hanno considerato l'esperienza di scalabilit\u00e0 di PgBouncer nella progettazione del connection pooler. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\">Odyssey<\/a><\/noindex>, e come \u00e8 stato implementato in produzione. Inoltre, discuteremo quali funzionalit\u00e0 vorremmo vedere nelle nuove versioni del pooler: \u00e8 importante per noi non solo soddisfare le esigenze, ma anche sviluppare la comunit\u00e0 degli utenti. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yandex\/odyssey\">Odyssey<\/a><\/noindex>.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Video:<\/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=\"Riproduci video\" 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=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/dd2ea50b72e3d9c4e795aecbf9afdd25.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ciao a tutti! Mi chiamo Andrei. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0a2f1880005bec1f61b72fb23b555adc.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In Yandex mi occupo dello sviluppo di database open source. E oggi discuteremo del tema del connection pooler. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c18e7c937423d2514faa12e820e78e70.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se sai come si chiama connection pooler in russo, fammelo sapere. Vorrei davvero trovare un buon termine tecnico che si stabilisca nella letteratura tecnica. <\/p>\n<p><\/p>\n<p>L'argomento \u00e8 piuttosto complesso, perch\u00e9 in molti database il connection pooler \u00e8 integrato e non \u00e8 nemmeno necessario saperlo. Certamente ci sono alcune impostazioni ovunque, ma in Postgres non funziona cos\u00ec. E parallelamente (al HighLoad++ 2019) si tiene una relazione di Nikolai Samokhvalov sulla configurazione delle query in Postgres. E da quello che capisco, qui sono venute persone che hanno gi\u00e0 configurato perfettamente le query, e queste persone affrontano problemi sistemici pi\u00f9 rari legati alla rete e all'utilizzo delle risorse. E in alcuni casi potrebbe essere stata piuttosto difficile, nel senso che i problemi sono poco evidenti.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/89c660dd530575e2938e6bf312b83e95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In Yandex c'\u00e8 Postgres. Molti servizi di Yandex vivono nell'Yandex.Cloud. E abbiamo diversi petabyte di dati che generano non meno di un milione di query al secondo in Postgres. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/288bfa37b9dcd60acd22ba48f0ef8a39.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E forniamo un cluster piuttosto standard a tutti i servizi \u2013 questa \u00e8 la principale nodo primaria del nodo, due repliche comuni (sincrona e asincrona), backup, scalabilit\u00e0 delle query di lettura sulla replica. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c249ca55bb387e25a5560324024cc523.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ogni nodo del cluster \u00e8 un Postgres, su cui oltre a Postgres e ai sistemi di monitoraggio \u00e8 stato installato anche il connection pooler. Il connection pooler \u00e8 utilizzato per il fencing e per il suo scopo principale. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0e29be55cc048007db21c80bbb08a9d4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qual \u00e8 lo scopo principale del connection pooler? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e2fbbd440c2781573cb35deeef358f20.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In Postgres si adotta un modello di processo per la gestione del database. Ci\u00f2 significa che una connessione corrisponde a un processo, un backend di Postgres. In questo backend ci sono molteplici cache diverse, e crearne di differenti per ciascuna connessione \u00e8 piuttosto costoso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/587498063b1af8fac4a845961c654bc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Inoltre, nel codice di Postgres esiste un array chiamato procArray. Esso contiene dati fondamentali sulle connessioni di rete. Quasi tutti gli algoritmi che elaborano procArray hanno una complessit\u00e0 lineare, poich\u00e9 attraversano l'intero array delle connessioni di rete. Questo \u00e8 un ciclo abbastanza veloce, ma con un elevato numero di connessioni in ingresso, i costi aumentano leggermente. Quando i costi aumentano, si potrebbe finire per pagare un prezzo molto elevato per un numero considerevole di connessioni di rete. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b534a38d0bfae7a65fc4258155a50280.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Esistono 3 approcci possibili:<\/p>\n<p><\/p>\n<ul>\n<li>Lato applicazione. <\/li>\n<li>Lato database. <\/li>\n<li>E tra i due, cio\u00e8 varie combinazioni. <\/li>\n<\/ul>\n<p><\/p>\n<p>Purtroppo, il pooler integrato \u00e8 attualmente in fase di sviluppo. I colleghi della PostgreSQL Professional se ne stanno occupando principalmente. \u00c8 difficile prevedere quando sar\u00e0 disponibile. E in effetti, l'architetto ha davanti due soluzioni. Si tratta del pooling lato applicazione e del proxy pool. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/702527a09e9fc86dd39b7fd69dcf1fc9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il pooling lato applicazione \u00e8 il modo pi\u00f9 semplice. Quasi tutti i driver client vi offrono un modo per rappresentare milioni delle vostre connessioni nel codice come alcune decine di connessioni al database. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7b66b9e20d22f472ca5ac39f6b9e0ba4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si presenta il problema che, a un certo punto, si desidera scalare il backend, si vuole distribuirlo su molte macchine virtuali. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f216fd7a8c01c2b07891e2242c48b06a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Poi vi rendete conto che avete anche diverse zone di disponibilit\u00e0, diversi data center. E l'approccio con il pooling client-side porta a numeri elevati. Elevati sono circa 10.000 connessioni. Questo \u00e8 il limite per ci\u00f2 che pu\u00f2 funzionare normalmente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e5bc5f284fd8ff568bbe16c3895b7ac6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Parlando di proxy pooler, ci sono due pooler che sanno fare molte cose. Non sono solo pooler. Sono pooler + altra funzionalit\u00e0 interessante. Questi sono <noindex><a rel=\"nofollow\" href=\"https:\/\/www.pgpool.net\/\">Pgpool<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/crunchy-proxy\">Crunchy-Proxy<\/a><\/noindex>. <\/p>\n<p><\/p>\n<p>Tuttavia, sfortunatamente, questa funzionalit\u00e0 aggiuntiva non \u00e8 necessaria per tutti. Questo porta a una situazione in cui i pooler supportano solo il pooling delle sessioni, ossia un cliente in entrata e un cliente in uscita nel database. <\/p>\n<p><\/p>\n<p>Per i nostri scopi, non \u00e8 molto adatto, quindi utilizziamo PgBouncer, che implementa il transaction pooling, ossia le connessioni server sono associate alle connessioni client solo per la durata della transazione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e5fedbe14656d2ac2cde8d1878a950e2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E sulla nostra carico \u2013 \u00e8 vero. <strong>Ma ci sono alcuni problemi<\/strong>.<img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/61fd36cadcd9948d624dafa711777307.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I problemi iniziano quando si desidera diagnosticare una sessione, perch\u00e9 tutte le connessioni in entrata sono locali. Sono tutte provenienti da loopback e diventare difficile tracciare la sessione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/36108c4956c410a1b1f286a88bc393d6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Certo, puoi utilizzare application_name_add_host. Questo \u00e8 un modo per Bouncer di aggiungere l'indirizzo IP a application_name. Ma application_name viene impostato con una connessione aggiuntiva. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b4cec483aa776f48db7ad3966c3b78e4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In questo grafico, dove la linea gialla rappresenta le richieste reali, e dove la linea blu rappresenta le richieste che arrivano nel database. E questa differenza \u00e8 proprio l'impostazione di application_name, che \u00e8 necessaria solo per il tracciamento, ma non \u00e8 affatto gratuita. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c02ea73a6f1a2a4cd6af6c621f321ab4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Inoltre, in Bouncer non \u00e8 possibile limitare un pool, cio\u00e8 il numero di connessioni al database per un determinato utente o un determinato database. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3431a463e04106066e2799aead66f571.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A cosa porta questo? Avete un servizio carico, scritto in C++, e vicino c'\u00e8 un piccolo servizio su Node che non fa niente di grave con il database, ma il suo driver \u00e8 sballato. Apre 20.000 connessioni, mentre tutto il resto aspetta. Anche il vostro codice \u00e8 a posto. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d7fa321714dc017b017945dffcf79bc6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Certo, abbiamo scritto una piccola patch per Bouncer, che ha aggiunto questa impostazione, cio\u00e8 il limite dei clienti sul pool. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d58884fc5ac0f90ff8442f126972157a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sarebbe possibile fare questo lato Postgres, cio\u00e8 limitare il numero di connessioni per le ruoli nel database.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8d6ff70db72964ed4eae5eaa47309931.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ma in tal caso si perde la possibilit\u00e0 di capire perch\u00e9 non ci sono connessioni con il server. PgBouncer non restituisce un errore di connessione, riporta sempre la stessa informazione. E non puoi capire: forse la password \u00e8 cambiata, forse il database \u00e8 semplicemente caduto, forse c'\u00e8 qualcosa che non va. Ma non c'\u00e8 alcuna diagnosi. Se non si pu\u00f2 stabilire una sessione, non si scopre perch\u00e9 non \u00e8 possibile farlo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cb3048344a94f2953bf403485d28e69f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A un certo punto, guardate i grafici dell'applicazione e vedete che l'applicazione non funziona.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e67c6680bb9a7f41242af9f9e4920916.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Guarda in cima e vedi che Bouncer \u00e8 monoprodotto. Questo \u00e8 un punto di svolta nella vita del servizio. Capisci che ti stavi preparando a scalare il database tra un anno e mezzo, ma ora devi scalare il pooler. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4c140c4ba6db19cb9939c1148638fb73.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Siamo arrivati alla conclusione che abbiamo bisogno di pi\u00f9 PgBouncer. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (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>Abbiamo applicato qualche patch a Bouncer. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/97755489a25ebfe38efd56ff897bd8fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E abbiamo fatto in modo che possano essere avviati pi\u00f9 Bouncer riutilizzando la porta TCP. Il sistema operativo gestisce automaticamente le connessioni TCP in entrata tra di loro con un round-robin.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ac30d3f067de2a8cd66ad2325c3a3b58.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questo \u00e8 trasparente per i clienti, cio\u00e8 tutto appare come se avessi un solo Bouncer, ma hai una frammentazione delle connessioni idle tra i Bouncer attivi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/53825f075db00b026c12013a610be456.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E a un certo punto potresti notare che questi 3 Bouncer utilizzano ciascuno il proprio core al 100%. Hai bisogno di un numero considerevole di Bouncer. Perch\u00e9? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/66c17883a043e157cd7ceab2c2a4e326.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Perch\u00e9 hai TLS. Hai una connessione crittografata. E se benchmarki Postgres con TLS e senza TLS, scoprirai che il numero di connessioni stabilite diminuisce di quasi due ordini di grandezza quando attivi la crittografia, perch\u00e9 il handshake TLS consuma risorse della CPU. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6101121ebe136af16e5eb1a484c65d66.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nel pannello, puoi vedere molte funzioni crittografiche che vengono eseguite durante le ondate di connessioni in entrata. Poich\u00e9 il nostro primary pu\u00f2 passare tra le aree di disponibilit\u00e0, le ondate di connessioni in entrata sono una situazione piuttosto comune. Cio\u00e8, per qualche motivo, il vecchio primary non era disponibile e tutto il carico \u00e8 stato inviato in un altro data center. Tutti arriveranno contemporaneamente per salutare con TLS. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c238ac2f511568590dc275e01c192c00.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E un gran numero di handshake TLS potrebbe non salutare pi\u00f9 il Bouncer, ma strozzarlo. A causa del timeout, l'ondata di connessioni in entrata pu\u00f2 diventare persistente. Se hai retry nel database senza exponential backoff, non arriveranno continuamente come un'ondata coerente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f42d0b210174d4d172254603ae6b834a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ecco un esempio di 16 PgBouncer che scaricano 16 core al 100%.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8d048d3774c09e5b6a3fb3c7bff62084.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Siamo arrivati al PgBouncer a cascata. Questa \u00e8 la migliore configurazione che possiamo raggiungere con il nostro carico su Bouncer. I Bouncer esterni servono per il TCP handshake, mentre i Bouncer interni servono per il pooling reale, cos\u00ec da non frammentare eccessivamente le connessioni esterne.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3a4ee4ea46d5fe8479a5a7222ee134da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In questa configurazione \u00e8 possibile un riavvio fluido. Puoi riavviare tutti questi 18 Bouncer uno alla volta. Tuttavia, mantenere questa configurazione \u00e8 piuttosto complesso. Gli amministratori di sistema, i DevOps e le persone che sono realmente responsabili di questo server potrebbero non apprezzare questa soluzione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5291fe67dbe02036f3ff8e98bdd84d1b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Potrebbe sembrare che possiamo promuovere tutte le nostre modifiche come open source, ma il supporto per Bouncer non \u00e8 molto buono. Ad esempio, la possibilit\u00e0 di avviare pi\u00f9 PgBouncer sulla stessa porta \u00e8 stata implementata un mese fa. E la pull request per questa funzione risale a diversi anni fa. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (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>Un altro esempio. In Postgres puoi annullare una query in esecuzione inviando un segreto su una connessione diversa senza ulteriori autenticazioni. Ma alcuni client inviano semplicemente un TCP-reset, cio\u00e8 interrompono la connessione di rete. Cosa far\u00e0 Bouncer in questo caso? Non far\u00e0 nulla. Continuer\u00e0 a eseguire la query. Se hai ricevuto un numero enorme di connessioni che con piccole query hanno sovraccaricato il database, quindi semplicemente staccare la connessione da Bouncer non baster\u00e0; sar\u00e0 necessario anche concludere quelle query che stanno girando nel database. <\/p>\n<p><\/p>\n<p>Questo \u00e8 stato patchato e questo problema non \u00e8 ancora stato integrato nell'upstream di Bouncer. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a9695b6d9e640a5543dc73429eb0050b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E cos\u00ec siamo giunti alla conclusione che abbiamo bisogno di un nostro connection pooler, che si sviluppi, venga patchato, nel quale sia possibile risolvere rapidamente i problemi e che, ovviamente, debba essere multithreading. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e755cd9b06a004f0eced1dc12fd3a6fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Abbiamo fissato la multithreading come obiettivo principale. Dobbiamo gestire bene l'ondata di connessioni TLS in ingresso. <\/p>\n<p><\/p>\n<p>Per questo motivo, abbiamo dovuto sviluppare una libreria separata chiamata Machinarium, che \u00e8 dedicata alla descrizione degli stati delle macchine di una connessione di rete come codice sequenziale. Se guardi nel codice sorgente di libpq, vedrai chiamate piuttosto complesse che possono restituirti un risultato e dire: \"Chiamami un po\u2019 dopo. Ora ho IO, ma quando l'IO sar\u00e0 finito avr\u00f2 un carico per il processore\". E questo \u00e8 uno schema multilivello. L'interazione di rete \u00e8 solitamente descritta tramite una macchina a stati. Con molte regole del tipo \"Se ho ricevuto prima un'intestazione di pacchetto di dimensione N, allora ora aspetto N byte\", \"Se ho inviato un pacchetto SYNC, allora ora aspetto un pacchetto con i metadati del risultato\". Ne risulta un codice piuttosto difficile e controintuitivo, come se un labirinto fosse stato trasformato in una rappresentazione lineare. Abbiamo fatto in modo che, invece di una macchina a stati, il programmatore descriva il percorso principale di interazione come codice imperativo normale. In questo codice imperativo, \u00e8 necessario inserire i punti in cui la sequenza di esecuzione deve essere interrotta in attesa dei dati dalla rete, passando il contesto di esecuzione a un'altra corutina (green thread). Questo approccio \u00e8 simile a quando registriamo il percorso pi\u00f9 atteso in un labirinto in modo sequenziale e poi aggiungiamo ramificazioni. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a6bfb4b11961c7db3a7c7184674e3bc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Alla fine abbiamo un flusso che accetta TCP e distribuisce in round-robin le connessioni TPC a pi\u00f9 worker. <\/p>\n<p><\/p>\n<p>Ogni connessione client, infatti, funziona sempre su un singolo processore, il che la rende cache-friendly. <\/p>\n<p><\/p>\n<p>Inoltre, abbiamo migliorato il processo di unione dei piccoli pacchetti in un unico pacchetto per alleggerire lo stack TCP di sistema.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7d740c23baecdd2f993c83cd54a0a8e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Abbiamo anche migliorato il pooling delle transazioni in modo tale che, con la configurazione appropriata, Odyssey possa inviare CANCEL e ROLLBACK in caso di interruzione della connessione di rete, cio\u00e8 se non c'\u00e8 nessuno in attesa della richiesta, Odyssey dir\u00e0 al database di non cercare di eseguire quella richiesta che potrebbe consumare risorse preziose.<\/p>\n<p><\/p>\n<p>E, quando possibile, manteniamo le connessioni associate allo stesso client. Questo evita di dover reinstallare application_name_add_host. Se fattibile, non ci sono ulteriori reinstallazioni dei parametri necessari per la diagnosi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/afb2fb7fb16d65c9ea73a8978d1eb83c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lavoriamo per conto di Yandex.Cloud. Se utilizzate managed PostgreSQL e avete impostato un connection pooler, potete creare una replica logica verso l'esterno, ossia potete distaccarvi da noi se lo desiderate, attraverso la replica logica. Il Bouncer non restituir\u00e0 il flusso della replica logica verso l'esterno. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c53defc92ebd8f3bec57ce64d97b9f72.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questo \u00e8 un esempio di configurazione della replica logica. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a37d9d1abf288d17fa646b642e8b62ab.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Inoltre, supportiamo la replica fisica verso l'esterno. Nel Cloud, ci\u00f2 \u00e8 ovviamente impossibile, perch\u00e9 in tal caso il cluster fornirebbe troppe informazioni su di s\u00e9. Tuttavia, nelle vostre installazioni, se avete bisogno di replica fisica tramite connection pooler in Odyssey, \u00e8 possibile. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/572934ce5b08115e57ab4b55d2153c6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In Odyssey, \u00e8 disponibile un monitoraggio completamente compatibile con PgBouncer. Abbiamo una console simile che esegue quasi tutti gli stessi comandi. Se manca qualcosa, inviate un pull request o, almeno, un issue su GitHub; ci impegneremo a completare i comandi necessari. Ma la funzionalit\u00e0 principale della console di PgBouncer \u00e8 gi\u00e0 presente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/451dd798fb3523a7a174ebfe00a14bc5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E, ovviamente, abbiamo l'error forwarding. Restituiremo l'errore segnalato dal database. Riceverete informazioni sul motivo per cui non riuscite a connettervi al database, e non semplicemente che non ci riuscite. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/14b4cb0efa33a2658dfc528349a5382f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questa opzione \u00e8 disattivata nel caso in cui necessiti di una compatibilit\u00e0 al 100% con PgBouncer. Possiamo comportarci esattamente come Bouncer, giusto per sicurezza. <\/p>\n<p><\/p>\n<p><strong>Sviluppo<\/strong><\/p>\n<p><\/p>\n<p>Qualche parola sul codice sorgente di Odyssey. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (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>Ad esempio, ci sono comandi come \"Pausa \/ Riprendi\". Questi vengono solitamente utilizzati per aggiornare il database. Se hai bisogno di aggiornare Postgres, puoi mettere in pausa il pool di connessioni, eseguire pg_upgrade e poi riprendere. Per il cliente sembrer\u00e0 semplicemente che il database fosse in stallo. Questa funzionalit\u00e0 ci \u00e8 stata fornita dalla comunit\u00e0. Non \u00e8 ancora stata integrata, ma sar\u00e0 presto. (Gi\u00e0 integrata)<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (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 gi\u00e0 integrata<\/p>\n<p><\/p>\n<p>Inoltre, una delle nuove funzionalit\u00e0 in PgBouncer \u00e8 il supporto per l'autenticazione SCRAM, che ci \u00e8 stata fornita da una persona che non lavora in Yandex.Cloud. Entrambe sono funzionalit\u00e0 complesse e importanti. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f39346a543c88d17728233d05c2dff19.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pertanto, vorrei raccontarti di cosa \u00e8 fatto Odyssey, chiss\u00e0 che anche tu voglia scrivere un po' di codice. <\/p>\n<p><\/p>\n<p>Hai una base di origine Odyssey che si basa su due librerie principali. La libreria Kiwi \u00e8 un'implementazione del protocollo di messaggistica di Postgres. In altre parole, il proto 3 nativo di Postgres sono i messaggi standard che i frontend e i backend possono scambiarsi. Sono implementati nella libreria Kiwi.<\/p>\n<p><\/p>\n<p>La libreria Machinarium \u00e8 un'implementazione dei flussi. Un piccolo frammento di questo Machinarium \u00e8 scritto in assembler. Ma non preoccuparti, sono solo 15 righe. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cd18f250af50eabd53536b2c0d7f12b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Architettura di Odyssey. C'\u00e8 una macchina principale in cui sono in esecuzione le coroutine. In questa macchina viene gestito l'accettamento delle connessioni TCP in entrata e la distribuzione tra i workers. <\/p>\n<p><\/p>\n<p>All'interno di un worker pu\u00f2 operare un gestore per pi\u00f9 client. Inoltre, nel thread principale girano la console e l'elaborazione dei compiti crone per rimuovere le connessioni che non sono pi\u00f9 necessarie nel pool.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7072fb20f406f2ee5788542860ccdf50.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Per testare Odyssey si utilizza un set di test standard di Postgres. Basta eseguire install-check tramite Bouncer e attraverso Odyssey, si ottiene un div nullo. Ci sono diversi test relativi alla formattazione delle date che non passano affatto nello stesso modo in Bouncer e in Odyssey.<\/p>\n<p><\/p>\n<p>Inoltre, ci sono molti driver che hanno i propri test. E utilizziamo i loro test per testare Odyssey.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/fb01cc9a0e9724ddcd3cc3d088afb182.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Inoltre, a causa della nostra configurazione a cascata, dobbiamo testare diverse combinazioni: Postgres + Odyssey, PgBouncer + Odyssey, Odyssey + Odyssey, per assicurarci che, se Odyssey si trova in una delle parti della cascata, funzioni ancora come ci aspettiamo. <\/p>\n<p><\/p>\n<p><strong>Rastrelli<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/25855b691180bca083025b9e8b611c09.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Utilizziamo Odyssey in produzione. E non sarebbe corretto dire che tutto funziona semplicemente. No, cio\u00e8, s\u00ec, ma non sempre. Ad esempio, in produzione tutto funzionava, poi sono arrivati i nostri amici di PostgreSQL Professional e ci hanno detto che avevamo una perdita di memoria. Era vero, l'abbiamo risolta. Ma \u00e8 stata una cosa semplice. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e638d88397b32b1ca0b74c9c1b905f81.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Poi abbiamo scoperto che nel connection pooler ci sono connessioni TLS in entrata e connessioni TLS in uscita. E nelle connessioni sono necessari certificati client e certificati server.<\/p>\n<p><\/p>\n<p>I certificati server Bouncer e Odyssey leggono la loro pcache, ma non \u00e8 necessario rileggere i certificati client dalla pcache, perch\u00e9 il nostro Odyssey scalabile alla fine si scontra con la prestazione di sistema nella lettura di questo certificato. \u00c8 stata una sorpresa per noi, perch\u00e9 il problema non si \u00e8 manifestato subito. Inizialmente, si \u00e8 scalato linearmente, ma dopo 20.000 connessioni simultanee in entrata, questo problema si \u00e8 presentato.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6cff094cd59a990e448b82fa0b1572b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il metodo di autenticazione pluggable \u00e8 la possibilit\u00e0 di autenticarsi utilizzando strumenti integrati di Linux. In PgBouncer \u00e8 implementato in modo tale che c'\u00e8 un thread separato in attesa di risposta da PAM e c'\u00e8 il thread principale di PgBouncer, che gestisce la connessione attuale e pu\u00f2 chiedere loro di attendere nel thread PAM. <\/p>\n<p><\/p>\n<p>Non abbiamo deciso di implementarlo per un semplice motivo. Abbiamo molti thread. Perch\u00e9 ne abbiamo bisogno?<\/p>\n<p><\/p>\n<p>Di conseguenza, questo pu\u00f2 creare problemi, poich\u00e9 se hai l'autenticazione PAM e non PAM, un'ampia ondata di autenticazione PAM pu\u00f2 ritardare sostanzialmente l'autenticazione non PAM. Questa \u00e8 una delle cose che non abbiamo corretto. Ma se desideri sistemarlo, puoi occuparti di questo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c7bd9e9980ff7298b30a59c130f03dbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un altro problema che abbiamo riscontrato \u00e8 che abbiamo un flusso che accetta tutte le connessioni in ingresso. Successivamente, queste vengono trasferite a un pool di worker, dove avverr\u00e0 il handshake TLS.<\/p>\n<p><\/p>\n<p>Di conseguenza, se hai un\u2019onda coerente di 20.000 connessioni di rete, tutte saranno accettate. E dal lato client, libpq inizier\u00e0 a conteggiare i timeout. Di default, sembra che ci sia impostato un valore di 3 secondi. <\/p>\n<p><\/p>\n<p>Se non possono accedere al database simultaneamente, non possono entrare nel database, perch\u00e9 tutto ci\u00f2 potrebbe non essere coperto da un retry non esponenziale. <\/p>\n<p><\/p>\n<p>Siamo arrivati al punto di copiare qui lo schema di PgBouncer, considerando che abbiamo il throttling del numero di connessioni TCP che accettiamo. <\/p>\n<p><\/p>\n<p>Se vediamo che accettiamo connessioni, ma non riescono a completare il handshake in tempo, le mettiamo in coda in modo che non consumino risorse della CPU. Questo porta al fatto che il handshake simultaneo non pu\u00f2 avvenire per tutte le connessioni che sono arrivate. Ma almeno qualcuno potr\u00e0 accedere al database, anche se il carico \u00e8 piuttosto elevato.<\/p>\n<p><\/p>\n<p><strong>Roadmap<\/strong><\/p>\n<p><\/p>\n<p>Cosa ci piacerebbe vedere in futuro in Odyssey? Cosa siamo pronti a sviluppare da soli e cosa ci aspettiamo dalla comunit\u00e0?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4719437d80b33efc3da6572af9a4dedb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Ad agosto 2019.<\/strong><\/p>\n<p><\/p>\n<p>Ecco come appariva il roadmap di Odyssey ad agosto:<\/p>\n<p><\/p>\n<ul>\n<li>Volevamo l'autenticazione SCRAM e PAM.<\/li>\n<li>Volevamo inoltrare le query di lettura a standby. <\/li>\n<li>Ci piacerebbe avere un riavvio online. <\/li>\n<li>E la possibilit\u00e0 di fare pause sul server. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/455c92f92df826257c2c57dc2b034e22.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Met\u00e0 di questo roadmap \u00e8 stata realizzata, peraltro non da noi. Ed \u00e8 una buona notizia. Quindi parliamo di ci\u00f2 che resta e aggiungiamo altro. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (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\">Per quanto riguarda l'inoltro delle query di sola lettura a 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=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0873cffd4f1ae15d9ffa6d080671051b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In effetti, in Postgres, a partire dalla versione 10, c'\u00e8 la possibilit\u00e0 di specificare anche session_attrs nella connessione. Nella connessione puoi elencare tutti gli host del database e indicare cosa desideri fare nel database: scrivere o solo leggere. E il driver sceglier\u00e0 automaticamente il primo host della lista che soddisfa i requisiti di session_attrs. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0693d1327fe5826502a01c21d05d5b4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ma il problema di questo approccio \u00e8 che non controlla il ritardo della replica. Potresti avere una replica che \u00e8 in ritardo rispetto al tuo servizio per un tempo inaccettabile. Per rendere possibile l'esecuzione completa delle query di lettura sulla replica, in sostanza, dobbiamo supportare in Odyssey la possibilit\u00e0 di non funzionare quando non \u00e8 possibile leggere. <\/p>\n<p><\/p>\n<p>Odyssey deve controllare periodicamente il database per verificare la distanza di replica dal primary. Se questa distanza supera il limite stabilito, non consentire nuove richieste al database, informando il cliente che deve riavviare le connessioni e possibilmente scegliere un altro host per eseguire le richieste. Questo permetter\u00e0 al database di ripristinare pi\u00f9 rapidamente il ritardo di replica e tornare a rispondere alle richieste. <\/p>\n<p><\/p>\n<p>Difficile indicare un tempo di realizzazione, in quanto si tratta di un progetto open source. Speriamo che non ci vogliano 2,5 anni come per i colleghi di PgBouncer. Questa funzione sarebbe davvero utile in Odyssey. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (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\">Nella comunit\u00e0, le persone hanno chiesto informazioni sul supporto per prepared statement.<\/a><\/noindex>Ora puoi creare prepared statement in due modi. In primo luogo, puoi eseguire l'istruzione SQL denominata 'prepared'. Per comprendere questa istruzione SQL, dobbiamo imparare a gestire SQL dal lato di Bouncer. Questo sarebbe un eccesso, poich\u00e9 avremmo bisogno di un parser completo. Non possiamo analizzare ogni istruzione SQL. <\/p>\n<p><\/p>\n<p>Tuttavia, esiste un prepared statement a livello del protocollo di messaggi su proto3. Ed \u00e8 proprio qui che l'informazione riguardante la creazione del prepared statement viene inviata in forma strutturata. Potremmo cos\u00ec mantenere la comprensione che, su una connessione server, il cliente ha richiesto di creare prepared statements. Anche se la transazione \u00e8 terminata, dobbiamo comunque mantenere la coerenza tra il server e il cliente. <\/p>\n<p><\/p>\n<p>Ma qui sorge un disaccordo nel dialogo, perch\u00e9 qualcuno afferma che \u00e8 necessario comprendere quale specifico prepared statement ha creato il cliente e separare la connessione server tra tutti i clienti che hanno creato tale connessione server, cio\u00e8 quelli che hanno generato quel prepared statement. <\/p>\n<p><\/p>\n<p>Andres Freund ha detto che se arriva un cliente che ha gi\u00e0 creato tale prepared statement in un'altra connessione server, allora \u00e8 opportuno crearlo per lui. Tuttavia, sembra un po' inappropriato eseguire richieste nel database al posto del cliente, ma dal punto di vista di uno sviluppatore che scrive un protocollo di interazione con il database, sarebbe comodo se gli venisse semplicemente fornita una connessione di rete in cui \u00e8 presente quella query preparata. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cd56b3ad015195d86a64e52be365b16a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E un'altra funzione che dobbiamo implementare. Attualmente abbiamo un monitoraggio compatibile con PgBouncer. Possiamo restituire il tempo medio di esecuzione delle query. Ma il tempo medio \u00e8 come la media della temperatura in ospedale: qualcuno \u00e8 freddo, qualcun altro \u00e8 caldo \u2014 in media tutti stanno bene. Questo non \u00e8 vero. <\/p>\n<p><\/p>\n<p>Dobbiamo implementare il supporto per i percentili, che indicherebbero che ci sono query lente che consumano risorse, rendendo il monitoraggio pi\u00f9 utile. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6f285f3eb0d79e7f25d42f0e792b85b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La cosa pi\u00f9 importante \u00e8 che vogliamo la versione 1.0 (\u00e8 gi\u00e0 stata rilasciata la versione 1.1). Il problema \u00e8 che attualmente Odyssey \u00e8 in versione 1.0rc, ovvero release candidate. E tutti i problemi che ho elencato sono stati risolti esattamente con quella versione, tranne il memory leak. <\/p>\n<p><\/p>\n<p>Cosa significherebbe per noi la versione 1.0? Stiamo rilasciando Odyssey sulle nostre basi. Attualmente funziona gi\u00e0 sulle nostre basi, ma quando raggiunger\u00e0 il punto di 1.000.000 di richieste al secondo, potremo dire che \u00e8 una versione di rilascio e che \u00e8 una versione che pu\u00f2 essere chiamata 1.0. <\/p>\n<p><\/p>\n<p>Nella comunit\u00e0, diverse persone hanno richiesto che nella versione 1.0 ci siano anche la pausa e SCRAM. Ma questo significherebbe dover rilasciare gi\u00e0 la prossima versione in produzione, poich\u00e9 n\u00e9 SCRAM n\u00e9 la pausa sono stati ancora uniti. Tuttavia, probabilmente questo problema sar\u00e0 risolto abbastanza rapidamente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Roadmap di Odyssey: cosa desideriamo ancora dal connection pooler. Andrei Borodin (2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2f50de9f51f653a7396965239bd545e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aspetto i vostri pull request. Vorrei anche sapere quali problemi avete con Bouncer. Discutiamone. Potremmo implementare alcune funzioni di cui avete bisogno. <\/p>\n<p><\/p>\n<p>Con questo ho concluso la mia parte, ora vorrei ascoltarvi. Grazie!<\/p>\n<p><\/p>\n<p>Domande<\/p>\n<p><\/p>\n<p><em>Se imposto application_name, verr\u00e0 passato correttamente, incluso nel transaction pooling in Odyssey?<\/em><\/p>\n<p><\/p>\n<p>In Odyssey o in Bouncer?<\/p>\n<p><\/p>\n<p><em>In Odyssey. Viene passato in Bouncer.<\/em> <\/p>\n<p><\/p>\n<p>Faremo il set. <\/p>\n<p><\/p>\n<p><em>E se la mia connessione reale salta tra altre connessioni, verr\u00e0 trasmessa?<\/em><\/p>\n<p><\/p>\n<p>Faremo un set di tutti i parametri elencati. Non posso dire se application_name sia presente in questa lista. Mi sembra di averlo visto. Installeremo tutti gli stessi parametri. Con una sola richiesta, verr\u00e0 impostato tutto ci\u00f2 che era stato configurato dal cliente al momento dell'avvio. <\/p>\n<p><\/p>\n<p><em>Grazie, Andrea, per il rapporto! Un'ottima relazione! Sono felice che Odyssey stia evolvendo sempre pi\u00f9 rapidamente ogni minuto. Spero che continui cos\u00ec. Ci siamo gi\u00e0 rivolti a voi chiedendo di avere una connessione multi data-source, in modo che Odyssey possa connettersi simultaneamente a diversi database, cio\u00e8 master-slave, e poi riconnettersi automaticamente a un nuovo master dopo un failover.<\/em> <\/p>\n<p><\/p>\n<p>S\u00ec, ricordo vagamente questa discussione. Attualmente ci sono diversi storage. Ma non c'\u00e8 switch tra di essi. Dobbiamo interrogare il server dalla nostra parte per verificare che sia ancora attivo e capire se \u00e8 avvenuto un failover, chi chiamer\u00e0 pg_recovery. Ho un metodo standard per capire che non ci troviamo sul master. Dobbiamo avere un modo per capire dagli errori, o come? In altre parole, l'idea \u00e8 interessante, \u00e8 in discussione. Scrivi pi\u00f9 commenti. Se hai persone che conoscono il C, sarebbe fantastico. <\/p>\n<p><\/p>\n<p>La questione della scalabilit\u00e0 delle repliche ci interessa anche, perch\u00e9 vogliamo rendere l'adozione dei cluster replicati il pi\u00f9 semplice possibile per gli sviluppatori dell'applicazione. Ma qui vorremmo pi\u00f9 commenti, cio\u00e8 come implementare correttamente, come ottenere buoni risultati. <\/p>\n<p><\/p>\n<p><em>La domanda riguarda anche le repliche. Quindi, avete un master e diverse repliche. \u00c8 chiaro che ci si connette meno frequentemente alle repliche rispetto al master, poich\u00e9 potrebbero esserci differenze. Avete detto che le differenze nei dati potrebbero non soddisfare le vostre esigenze aziendali e non vi connetterete a esse finch\u00e9 non si saranno replicate completamente. Nel frattempo, se non vi collegate a lungo, e poi iniziate a farlo, i dati necessari non saranno immediatamente disponibili. Cio\u00e8, se ci colleghiamo costantemente al master, la cache sar\u00e0 attiva, mentre la replica avr\u00e0 una cache leggermente indietro.<\/em> <\/p>\n<p><\/p>\n<p>S\u00ec, \u00e8 vero. Nella pcache non ci saranno i blocchi di dati che desiderate, nella cache reale non ci sar\u00e0 informazione sulle tabelle che desiderate, nei piani non ci saranno query analizzate, non ci sar\u00e0 veramente niente. <\/p>\n<p><\/p>\n<p><em>E quando avete un cluster e aggiungete una nuova replica, finch\u00e9 essa si avvia, \u00e8 in uno stato critico, cio\u00e8 sta accumulando la sua cache.<\/em> <\/p>\n<p><\/p>\n<p>Ho compreso l'idea. L'approccio corretto sarebbe avviare inizialmente una piccola percentuale di richieste su una replica, per riscaldare la cache. In altre parole, abbiamo una condizione, che non dobbiamo essere indietro pi\u00f9 di 10 secondi rispetto al master. E questa condizione deve essere attivata non in un'unica ondata, ma gradualmente per alcuni clienti. <\/p>\n<p><\/p>\n<p><em>S\u00ec, aumentare il peso.<\/em><\/p>\n<p><\/p>\n<p>\u00c8 una buona idea. Ma prima dobbiamo implementare questa disattivazione. Prima dobbiamo disattivarci, poi penseremo a come riattivarci. \u00c8 una funzionalit\u00e0 ottima per accendersi gradualmente.<\/p>\n<p><\/p>\n<p><em>In nginx c'\u00e8 un'opzione del genere <code>iniziare lentamente<\/code> nel cluster per il server. E lui aumenta gradualmente il carico.<\/em> <\/p>\n<p><\/p>\n<p>S\u00ec, ottima idea, proveremo quando arriveremo a questo.<\/p>\n<p>Fonte: <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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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\" \/>\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\/it\/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) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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:description\" content=\"\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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/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\udd47Odyssey roadmap: cosa vogliamo ancora dal collegatore di connessioni. Andrey Borodin (2019) | ProHoster","description":"Nel rapporto, Andrey Borodin parler\u00e0 di come hanno considerato l'esperienza di scalabilit\u00e0 di PgBouncer nella progettazione del connection pooler Odyssey, come lo hanno rilasciato in produzione. Inoltre, discuteremo delle funzionalit\u00e0 che ci piacerebbe vedere nelle nuove versioni del pooler: per noi \u00e8 importante non solo soddisfare le nostre esigenze, ma anche sviluppare la comunit\u00e0 degli utenti di Odyssea. Video: Ciao a tutti! Mi chiamo Andrey. In Yandex mi occupo di","canonical_url":"https:\/\/prohoster.info\/it\/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":"it_IT","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:description":"\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","og:url":"https:\/\/prohoster.info\/it\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/96515","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=96515"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/96515\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/96516"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=96515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=96515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=96515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}