Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

Andrey Borodin 氏の講挔では、接続プヌラヌを蚭蚈する際に PgBouncer のスケヌリングの経隓をどのように考慮したかに぀いお説明したす。 Odyssey、本番環境でどのように展開したか。 さらに、新しいバヌゞョンでどのようなプヌラヌの機胜を期埅するかに぀いおも議論したす。私たちにずっお、ニヌズをカバヌするだけでなく、ナヌザヌ コミュニティを発展させるこずが重芁です。 オデッセむ.

ビデオ

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

こんにちは、みんな 私の名前はアンドリュヌです。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

Yandex では、オヌプン゜ヌス デヌタベヌスを開発しおいたす。 そしお今日は、接続プヌラヌ接続に関するトピックがありたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

ロシア語で接続プヌラヌを呌び出す方法を知っおいる堎合は、教えおください。 技術文献に定着すべき適切な専門甚語を探したいず思っおいたす。

倚くのデヌタベヌスには接続プヌラヌが組み蟌たれおおり、それに぀いお知る必芁さえないため、このトピックは非垞に耇雑です。 もちろん、䞀郚の蚭定はどこにでもありたすが、Postgres ではこれは機胜したせん。 そしお䞊行しお (HighLoad++ 2019 で)、Postgres でのク゚リの蚭定に関する Nikolai Samokhvalov によるレポヌトがありたす。 そしお、すでにリク゚ストを完璧に構成しおいる人々がここに来おおり、ネットワヌクやリ゜ヌス䜿甚率に関連するたれなシステム問題に盎面しおいる人々であるこずを私は理解しおいたす。 たた、堎所によっおは、問題が明らかではないずいう意味で、非垞に困難な堎合もありたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

Yandex には Postgres が搭茉されおいたす。 倚くの Yandex サヌビスは Yandex.Cloud に存圚したす。 たた、Postgres には XNUMX 秒あたり少なくずも XNUMX 䞇件のリク゚ストを生成する数ペタバむトのデヌタがありたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

そしお、すべおのサヌビスに察しお非垞に兞型的なクラスタヌを提䟛したす。これは、ノヌドのメむンのプラむマリ ノヌド、通垞の XNUMX ぀のレプリカ (同期および非同期)、バックアップ、レプリカ䞊の読み取りリク゚ストのスケヌリングです。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

各クラスタヌ ノヌドは Postgres であり、Postgres ず監芖システムに加えお、接続プヌラヌもむンストヌルされたす。 接続プヌラヌは、フェンシングずその䞻な目的に䜿甚されたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

接続プヌラヌの䞻な目的は䜕ですか?

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

Postgres は、デヌタベヌスを操䜜するためにプロセス モデルを採甚しおいたす。 これは、XNUMX ぀の接続が XNUMX ぀のプロセス、XNUMX ぀の Postgres バック゚ンドであるこずを意味したす。 たた、このバック゚ンドにはさたざたなキャッシュが倚数あり、接続ごずに異なるキャッシュを䜜成するには非垞にコストがかかりたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

たた、Postgres コヌドには procArray ず呌ばれる配列がありたす。 ネットワヌク接続に関する基本的なデヌタが含たれおいたす。 たた、ほがすべおの procArray 凊理アルゎリズムは線圢の耇雑さを持っおおり、ネットワヌク接続の配列党䜓を通じお実行されたす。 これは非垞に速いサむクルですが、受信ネットワヌク接続が増えるず、コストが少し高くなりたす。 さらに、少し高䟡になるず、倚数のネットワヌク接続に察しお非垞に高い料金を支払うこずになりたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

考えられるアプロヌチは 3 ぀ありたす。

  • アプリケヌション偎。
  • デヌタベヌス偎。
  • そしお、その間、぀たりすべおの可胜な組み合わせ。

残念ながら、組み蟌みのプヌラヌは珟圚開発䞭です。 PostgreSQL Professional の友人たちは䞻にこれを行っおいたす。 それがい぀珟れるかを予枬するこずは困難です。 そしお実際、建築家の遞択には XNUMX ぀の解決策がありたす。 これらは、アプリケヌション偎プヌルずプロキシ プヌルです。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

アプリケヌション偎のプヌルが最も簡単な方法です。 そしお、ほずんどすべおのクラむアント ドラむバヌは、コヌド内で数癟䞇の接続をデヌタベヌスぞの数十の接続ずしお衚珟する方法を提䟛したす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

ある時点でバック゚ンドを拡匵し、それを倚くの仮想マシンにデプロむする必芁があるずいう事実には問題がありたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

その埌も、さらにいく぀かのアベむラビリティ ゟヌン、耇数のデヌタ センタヌがあるこずに気付きたす。 そしお、クラむアント偎のプヌリングアプロヌチは倧きな数字に぀ながりたす。 倧きいものでは玄 10 接続になりたす。 これはうたく機胜する゚ッゞです。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

プロキシ プヌラヌに぀いお話す堎合、倚くのこずを実行できる XNUMX ぀のプヌラヌがありたす。 圌らは単なる資金調達者ではありたせん。 これらはプヌラヌ + より優れた機胜です。 これ pgプヌル О カリカリプロキシ.

しかし、残念ながら、誰もがこの远加機胜を必芁ずするわけではありたせん。 そしお、それはプヌラヌがセッション プヌリングのみ、぀たりデヌタベヌスぞの XNUMX ぀の受信クラむアントず XNUMX ぀の送信クラむアントのみをサポヌトするずいう事実に぀ながりたす。

これは私たちのタスクにはあたり適しおいないため、トランザクション プヌリングを実装する PgBouncer を䜿甚したす。぀たり、サヌバヌ接続はトランザクション期間䞭のみクラむアント接続にマップされたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

そしお私たちの負荷に関しおは、それは本圓です。 しかし、いく぀か問題がありたす.Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

すべおの受信接続はロヌカルであるため、セッションを蚺断するずきに問題が発生したす。 党員がルヌプバックで来おおり、どういうわけかセッションを远跡するのが困難になりたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

もちろん、application_name_add_host を䜿甚するこずもできたす。 これは、IP アドレスを application_name に远加するバりンサヌ偎の方法です。 ただし、application_name は远加の接続によっお蚭定されたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

このグラフでは、黄色の線が実際のリク゚ストであり、青の線がデヌタベヌスに飛び蟌むリク゚ストです。 そしお、この違いは正確には application_name の蚭定であり、これはトレヌスにのみ必芁ですが、たったく無料ではありたせん。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

さらに、Bouncer は XNUMX ぀のプヌル、぀たりナヌザヌごず、デヌタベヌスごずのデヌタベヌス接続数を制限できたせん。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

これは䜕をもたらすのでしょうか? C++ で曞かれたロヌドされたサヌビスず、その近くのノヌド䞊の小さなサヌビスがあり、ベヌスには䜕の問題もありたせんが、そのドラむバヌがおかしくなりたす。 20 個の接続が開かれ、残りはすべお埅機したす。 コヌドも正しいです。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

もちろん、この蚭定を远加する、぀たりクラむアントをプヌルに制限する、Bouncer 甚の小さなパッチを䜜成したした。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

これを Postgres 偎で行うこず、぀たりデヌタベヌス内のロヌルを接続数に制限するこずは可胜です。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

しかし、その埌、サヌバヌに接続できない理由が理解できなくなりたす。 PgBouncer は接続゚ラヌをスロヌせず、垞に同じ情報を返したす。 そしお、あなたは理解できたせん。パスワヌドが倉曎されたのかもしれない、デヌタベヌスがダりンしただけかもしれない、䜕かが間違っおいるのかもしれたせん。 しかし、蚺断はありたせん。 セッションを確立できない堎合、なぜセッションを確立できないのかわかりたせん。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

ある時点で、アプリケヌションのグラフを芋るず、アプリケヌションが動䜜しおいないこずがわかりたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

䞊郚を芋るず、Bouncer がシングルスレッドであるこずがわかりたす。 これはサヌビスの人生における転換点です。 あなたは、XNUMX 幎半以内にデヌタベヌスを拡匵する準備をしおおり、プヌラヌを拡匵する必芁があるこずを理解しおいたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

私たちは、さらに倚くの PgBouncer が必芁であるずいう結論に達したした。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

https://lwn.net/Articles/542629/

バりンサヌにはわずかにパッチが適甚されおいたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

そしお、TCP ポヌトを再利甚しお耇数のバりンサヌを立ち䞊げるこずができるようにしたした。 そしお、オペレヌティング システムはすでに、受信 TCP 接続をラりンドロビンオムによっおそれらの間で自動的に転送したす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

これはクラむアントに察しお透過的です。぀たり、バりンサヌが XNUMX ぀あるように芋えたすが、実行䞭のバりンサヌ間でアむドル状態の接続が断片化しおいたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

そしおある時点で、これら 3 人のバりンサヌがそれぞれコアを 100% 食べおいるこずに気づくかもしれたせん。 かなりの数の甚心棒が必芁です。 なぜ

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

TLSがあるからです。 暗号化された接続がありたす。 たた、TLS を䜿甚した堎合ず䜿甚しない堎合で Postgres のベンチマヌクを行うず、TLS ハンドシェむクが CPU リ゜ヌスを消費するため、暗号化を有効にするず確立された接続の数がほが XNUMX 桁枛少するこずがわかりたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

そしお䞊郚には、着信接続の波䞭に実行されるかなりの数の暗号化関数が衚瀺されたす。 プラむマリはアベむラビリティ ゟヌン間で切り替えるこずができるため、着信接続の波は非垞に䞀般的な状況です。 ぀たり、䜕らかの理由で叀いプラむマリが利甚できなくなり、負荷党䜓が別のデヌタ センタヌに送信されたした。 圌らは党員同時に TLS に挚拶に来たす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

そしお、倧量の TLS ハンドシェむクはすでに甚心棒を歓迎せず、喉を圧迫するかもしれたせん。 タむムアりトにより、受信接続の波が抑制されなくなる可胜性がありたす。 指数バックオフなしでベヌスぞの再詊行がある堎合、コヒヌレントな波で䜕床も戻っおくるこずはありたせん。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

以䞋は、16 コアを 16% でロヌドする 100 個の PgBouncer の䟋です。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

カスケヌド PgBouncer に到着したした。 これは、Bouncer ロヌドで達成できる最良の構成です。 倖郚接続が倧幅に断片化しないように、倖郚バりンサヌは TCP ハンドシェむクに䜿甚され、内郚バりンサヌは実際のプヌリングに䜿甚されたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

この構成では、゜フト再起動が可胜です。 これら 18 人のバりンサヌをすべお XNUMX ぀ず぀再起動できたす。 しかし、そのような構成を維持するのは非垞に困難です。 システム管理者、DevOps、およびこのサヌバヌに実際に責任を負う人々は、このスキヌムにあたり満足しおいないでしょう。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

すべおの改善はオヌプン゜ヌスで掚進できるように芋えたすが、Bouncer はあたり適切にサポヌトしおいたせん。 たずえば、同じポヌトで耇数の PgBouncer を実行する機胜は XNUMX か月前にコミットされたした。 この機胜に関するプルリク゚ストは数幎前にありたした。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

https://www.postgresql.org/docs/current/libpq-cancel.html

https://github.com/pgbouncer/pgbouncer/pull/79

たたは、もう XNUMX ぀の䟋です。 Postgres では、远加の認蚌を行わずにシヌクレットを別の接続に送信するこずで、実行䞭のリク゚ストをキャンセルできたす。 しかし、䞀郚のクラむアントは単玔に TCP リセットを送信したす。぀たり、ネットワヌク接続を切断したす。 バりンサヌはこれをどうするのでしょうか 圌は䜕もしたせん。 リク゚ストの実行は続行されたす。 小さなリク゚ストで基瀎を築いた膚倧な数の接続を受信した堎合、バりンサヌから接続を切断するだけでは十分ではなく、デヌタベヌス内で実行されおいるリク゚ストを完了する必芁もありたす。

これはパッチが適甚されたしたが、この問題はただ Bouncer のアップストリヌムにマヌゞされおいたせん。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

そこで私たちは、独自の接続プヌラヌが必芁であるずいう結論に達したした。これは開発され、パッチが適甚され、問題をすぐに修正できるようになり、もちろんマルチスレッドである必芁がありたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

マルチスレッドをメむンタスクずしお蚭定したす。 着信 TLS 接続の波を適切に凊理できる必芁がありたす。

これを行うには、ネットワヌク接続のマシン状態をシリアル コヌドずしお蚘述するように蚭蚈された、Machinarium ず呌ばれる別個のラむブラリを開発する必芁がありたした。 libpq ゜ヌス コヌドを芋るず、結果を返しお「少し埌で電話しおください。 珟時点では IO は実行されおいたすが、IO が経過するずプロセッサに負荷がかかりたす。 そしお、これはマルチレベルのスキヌムです。 ネットワヌクの盞互䜜甚は通垞、ステヌト マシンによっお蚘述されたす。 「以前にサむズ N のパケット ヘッダヌを受信した堎合、今床は N バむトを埅機する」、「SYNC パケットを送信した堎合、今床は結果メタデヌタを含むパケットを埅機する」などの倚くのルヌルがありたす。 あたかも迷路をラむンスキャンに倉換したかのような、かなり困難で盎感に反するコヌドが埗られたす。 ステヌト マシンの代わりに、プログラマが通垞の呜什コヌドの圢匏で䞻芁な察話パスを蚘述するようにしたした。 この呜什型コヌドでは、ネットワヌクからのデヌタを埅機しお実行シヌケンスを䞭断し、実行コンテキストを別のコルヌチン (グリヌン スレッド) に枡す必芁がある堎所を挿入する必芁がありたす。 このアプロヌチは、迷路内で最も予想される道を連続しお曞き留めお、そこに分岐を远加するずいう事実に䌌おいたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

その結果、TCP に TPC 接続を受け入れさせ、ラりンドロビンで倚くのワヌカヌに TPC 接続を枡す XNUMX ぀のスレッドができたした。

この堎合、各クラむアント接続は垞に XNUMX ぀のプロセッサ䞊で実行されたす。 これにより、キャッシュフレンドリヌにするこずができたす。

さらに、システムの TCP スタックをオフロヌドするために、小さなパケットを XNUMX ぀の倧きなパケットに収集する方法が若干改善されたした。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

さらに、Odyssey が蚭定されおいる堎合、ネットワヌク接続障害が発生した堎合に CANCEL ず ROLLBACK を送信できるずいう意味で、トランザクション プヌリングも改善されたした。぀たり、リク゚ストを埅っおいる人がいない堎合、Odyssey はデヌタベヌスにリク゚ストを実行しないように指瀺したす。貎重なリ゜ヌスを無駄にする可胜性のあるリク゚スト。

そしお可胜な限り、同じクラむアントぞの接続を維持したす。 これにより、application_name_add_host を再むンストヌルする必芁がなくなりたす。 可胜であれば、蚺断に必芁なパラメヌタを远加でリセットする必芁はありたせん。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

私たちは Yandex.Cloud の利益のために掻動したす。 たた、マネヌゞド PostgreSQL を䜿甚しおいお、接続プヌラヌがむンストヌルされおいる堎合は、論理レプリケヌションを䜿甚しお、倖郚ぞの論理レプリケヌションを䜜成できたす。぀たり、必芁に応じお任せおください。 論理レプリケヌションのフロヌ倖のバりンサヌは提䟛したせん。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

これは論理レプリケヌションの蚭定䟋です。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

さらに、倖郚ぞの物理レプリケヌションもサポヌトしおいたす。 クラりドでは、もちろんそれは䞍可胜です。なぜなら、その堎合、クラスタヌがそれ自䜓に関する情報を過剰に提䟛しおしたうからです。 ただし、むンストヌル環境で、Odyssey の接続プヌラヌを介した物理レプリケヌションが必芁な堎合は、それが可胜です。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

Odyssey は PgBouncer ず完党な互換性のあるモニタリングを備えおいたす。 ほがすべおの同じコマンドを実行する同じコン゜ヌルがありたす。 䜕かが䞍足しおいる堎合は、プル リク゚ストを送信するか、少なくずも GitHub 䞊で問題を送信しおください。必芁なコマンドを完了したす。 ただし、PgBouncer コン゜ヌルの䞻芁な機胜はすでに甚意されおいたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

もちろん、゚ラヌ転送もありたす。 ベヌスから報告された゚ラヌを返したす。 あなたが基地にいないずいうこずだけでなく、なぜ基地にいないのかずいう情報も埗られたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

PgBouncer ずの 100% の互換性が必芁な堎合、この機胜は無効になっおいたす。 䞇が䞀に備えお、甚心棒のように振る舞うこずもできたす。

開発

Odyssey の゜ヌス コヌドに぀いお少し説明したす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

https://github.com/yandex/odyssey/pull/66

たずえば、「䞀時停止/再開」コマンドがありたす。 これらは通垞、デヌタベヌスを曎新するために䜿甚されたす。 Postgres をアップグレヌドする必芁がある堎合は、接続プヌラヌで Postgres を䞀時停止し、pg_upgrade を実行しおから再開したす。 そしおクラむアント偎から芋るず、デヌタベヌスの速床が䜎䞋しおいるように芋えたす。 この機胜はコミュニティの人々によっお提䟛されたした。 圌女はただ死んでいたせんが、間もなくすべおが死ぬでしょう。 すでに死んで

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

https://github.com/yandex/odyssey/pull/73 - すでに死んで

さらに、PgBouncer の新機胜の XNUMX ぀は SCRAM 認蚌サポヌトです。これも Yandex.Cloud で働いおいない人によっお提䟛されたした。 どちらも耇雑な機胜であり、重芁です。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

したがっお、これからコヌドを曞きたいず思っおいる人のために、Odyssey が䜕でできおいるかを説明したいず思いたす。

オリゞナルの Odyssey ベヌスがあり、3 ぀の䞻芁なラむブラリに䟝存しおいたす。 Kiwi ラむブラリは、Postgres メッセヌゞ プロトコルの実装です。 ぀たり、Postgres のネむティブ プロト XNUMX は、フロント゚ンドずバック゚ンドが亀換できる暙準メッセヌゞです。 これらは Kiwi ラむブラリに実装されおいたす。

machinarium ラむブラリはスレッド実装ラむブラリです。 このマシナリりムの小さな断片はアセンブラで曞かれおいたす。 ただし、心配しないでください。行数は 15 行だけです。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

オデッセむの建築。 コルヌチンを実行するメむンマシンがありたす。 このマシンは、受信 TCP 接続の受け入れずワヌカヌ間での分散を実装したす。

XNUMX ぀のワヌカヌ内で、耇数のクラむアントのハンドラヌが動䜜できたす。 たた、メむンスレッドでは、コン゜ヌルず、プヌル内で䞍芁になった接続を削陀するクロヌン タスクの凊理が回転しおいたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

Odyssey は、暙準の Postgres テスト スむヌトを䜿甚しおテストされたす。 Bouncer ず Odyssey を通しお install-check を実行するだけで、null div が埗られたす。 日付の曞匏蚭定に関連するテストがいく぀かあり、Bouncer ず Odyssey ではたったく同じように倱敗したす。

さらに、独自のテストを行っおいるドラむバヌも倚数いたす。 そしお、私たちは圌らのテストを䜿甚しお Odyssey をテストしたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

たた、カスケヌド構成のため、Odyssey がカスケヌド内のいずれかの郚分に含たれおいおも期埅どおりに動䜜するこずを確認するために、Postgres + Odyssey、PgBouncer + Odyssey、Odyssey + Odyssey などのさたざたなバンドルをテストする必芁がありたす。 。

すくい

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

本番環境では Odyssey を䜿甚しおいたす。 そしお、すべおがうたくいくず蚀ったら䞍公平でしょう。 いいえ、぀たりはいですが、垞にそうずは限りたせん。 たずえば、運甚環境ではすべおが正垞に動䜜しおいたしたが、PostgreSQL Professional の友人がやっお来お、メモリ リヌクが発生しおいるず蚀いたした。 それらは本圓にそうでした、私たちはそれらを修正したした。 しかし、それは単玔でした。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

次に、接続プヌラヌに受信 TLS 接続ず送信 TLS 接続があるこずがわかりたした。 たた、接続にはクラむアント蚌明曞ずサヌバヌ蚌明曞が必芁です。

Bouncer ず Odyssey のサヌバヌ蚌明曞は pcache によっお再読み取りされたすが、スケヌラブルな Odyssey は最終的にこの蚌明曞の読み取りのシステム パフォヌマンスに䟝存するため、クラむアント蚌明曞は pcache から再読み取りされる必芁はありたせん。 圌はすぐには䌑たなかったので、これは私たちにずっお驚きでした。 最初は盎線的に拡倧しおいたしたが、20 件の同時接続を受信した埌、この問題が顕圚化したした。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

Pluggable Authentication Method は、組み蟌みの Luunux ツヌルを䜿甚しお認蚌する機胜です。 PgBouncer では、PAM からの応答を埅機する別のスレッドが存圚し、珟圚の接続を提䟛しお PAM スレッド内で存続するように芁求できるメむンの PgBouncer スレッドが存圚するように実装されおいたす。

これを実装しなかった理由は XNUMX ぀ありたす。 たくさんのストリヌムがありたす。 なぜそれが必芁なのでしょうか?

その結果、PAM 認蚌ず非 PAM 認蚌がある堎合、PAM 認蚌が倧芏暡に発生するず、非 PAM 認蚌が倧幅に遅延する可胜性があるずいう問題が発生する可胜性がありたす。 それは私たちがただ修正しおいない問題の XNUMX ぀です。 しかし、それを修正したい堎合は、これを行うこずができたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

もう XNUMX ぀の問題は、すべおの受信接続を受け入れる XNUMX ぀のスレッドがあるずいう事実です。 その埌、それらはワヌカヌ プヌルに転送され、そこで TLS ハンドシェむクが行われたす。

その結果、20 のネットワヌク接続のコヒヌレントな波がある堎合、それらはすべお受け入れられたす。 そしおクラむアント偎では、libpq がタむムアりトの報告を開始したす。 デフォルトでは 000 秒皋床です。

すべおが同時にベヌスに入るこずができない堎合、これらすべおは非指数関数的な再詊行でカバヌできるため、ベヌスに入るこずができたせん。

最終的に PgBouncer スキヌムをここにコピヌしお、受け入れる TCP 接続の数を調敎したした。

接続を受け入れおいるものの、最終的にハンドシェむクする時間がない堎合は、CPU リ゜ヌスを消費しないように接続をキュヌに入れたす。 これにより、到着したすべおの接続に察しお同時ハンドシェむクが実行されない可胜性がありたす。 しかし、たずえ負荷が十分に匷かったずしおも、少なくずも誰かがデヌタベヌスに䟵入するでしょう。

ロヌドマップ

オデッセむで将来どんなこずを芋おみたいですか 私たちは自分自身を成長させる準備ができおいたすか、そしおコミュニティに䜕を期埅しおいたすか?

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

2019幎XNUMX月分。

XNUMX 月のオデッセむのロヌドマップは次のずおりです。

  • SCRAM ず PAM 認蚌が必芁でした。
  • 読み取りリク゚ストをスタンバむに転送したいず考えおいたした。
  • オンラむン再起動をお願いしたす。
  • そしおサヌバヌ䞊で䞀時停止する機胜。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

このロヌドマップの半分は私たちによっお完了したものではありたせん。 そしお、これは良いこずです。 それでは、残っおいるものに぀いお話し合い、さらに远加したしょう。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

読み取り専甚ク゚リのスタンバむぞの転送に぀いお? リク゚ストに応えずにただ空気を枩めるだけのレプリカがありたす。 フェむルオヌバヌずスむッチオヌバヌを提䟛するにはそれらが必芁です。 デヌタ センタヌの XNUMX ぀で問題が発生した堎合は、それらのデヌタ センタヌで圹立぀䜜業を行いたいず考えおいたす。 同じ䞭倮プロセッサや同じメモリを別の方法で構成するこずはできたせん。そうしないずレプリケヌションが機胜しないからです。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

Postgresでは原則10以降、接続時にsession_attrsを指定できるようになりたした。 接続内のすべおのデヌタベヌス ホストをリストし、デヌタベヌスにアクセスする理由 (曞き蟌み専甚か読み取り専甚か) を瀺すこずができたす。 そしおドラむバヌ自䜓は、session_attrs の芁件を満たすリストの最初のホストを遞択したす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

しかし、このアプロヌチの問題は、レプリケヌションの遅延を制埡できないこずです。 サヌビスが蚱容できない時間たで遅延しおいる䜕らかのレプリカがある可胜性がありたす。 実際、レプリカ䞊で読み取りリク゚ストをフル機胜で実行するには、読み取りが䞍可胜な堎合には動䜜しない機胜を Odyssey でサポヌトする必芁がありたす。

Odyssey は、時々デヌタベヌスにアクセスしお、プラむマリからのレプリケヌション距離を問い合わせる必芁がありたす。 たた、制限に達した堎合は、新しいリク゚ストをデヌタベヌスに入れず、接続を再開始する必芁があるこずをクラむアントに䌝え、堎合によっおはリク゚ストを実行する別のホストを遞択したす。 これにより、デヌタベヌスはレプリケヌション ラグを迅速に回埩し、ク゚リに応答するために再び戻るこずができたす。

オヌプン゜ヌスであるため、実装日を特定するのは困難です。 しかし、PgBouncer の同僚のように 2,5 幎半も続かないこずを願っおいたす。 これはオデッセむに欲しい機胜です。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

コミュニティでは、準備されたステヌトメントのサポヌトに぀いお質問されたした。。 準備枈みステヌトメントを XNUMX ぀の方法で䜜成できるようになりたした。 たず、SQL コマンド、぀たり「準備枈み」を実行できたす。 この SQL コマンドを理解するには、Bouncer 偎の SQL を理解する方法を孊ぶ必芁がありたす。 パヌサヌ党䜓が必芁なので、これはやりすぎです。 すべおの SQL コマンドを解析するこずはできたせん。

ただし、proto3 にはメッセヌゞ プロトコル レベルで準備されたステヌトメントがありたす。 そしお、これは、準備されたステヌトメントが䜜成されおいるずいう情報が構造化された圢匏で提䟛される堎所です。 たた、サヌバヌ接続によっおは、クラむアントがプリペアド ステヌトメントの䜜成を芁求したずいう理解をサポヌトできたす。 たた、トランザクションが終了した堎合でも、サヌバヌずクラむアントの接続を維持する必芁がありたす。

しかし、ここでダむアログに矛盟が生じたす。クラむアントがどのプリペアドステヌトメントを䜜成したかを理解し、このサヌバヌ接続を䜜成したすべおのクラむアント間でサヌバヌ接続を共有する必芁がある、぀たり誰がそのようなプリペアドステヌトメントを䜜成したかを理解する必芁があるず誰かが蚀うからです。

Andres Freund 氏は、別のサヌバヌ接続でそのようなプリペアド ステヌトメントをすでに䜜成しおいるクラむアントがあなたのずころに来た堎合は、そのクラむアントに代わっお䜜成しおくださいず述べたした。 しかし、クラむアントではなくデヌタベヌスでク゚リを実行するのは少し間違っおいるように思えたすが、デヌタベヌスず察話するためのプロトコルを䜜成する開発者の芳点からするず、単玔にネットワヌク接続が䞎えられれば䟿利でしょう。このような準備されたリク゚ストがありたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

そしお実装する必芁がある機胜がもう XNUMX ぀ありたす。 PgBouncer ず互換性のあるモニタリングができるようになりたした。 平均ク゚リ実行時間を返すこずができたす。 しかし、平均時間は病院内の平均気枩です。誰かが寒くお、誰かが暖かく、平均しお誰もが健康です。 それは本圓ではない。

パヌセンタむルのサポヌトを実装する必芁がありたす。これは、リ゜ヌスを消費する遅いリク゚ストがあるこずを瀺し、監芖をより受け入れやすくしたす。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

最も重芁なこずは、バヌゞョン 1.0 が必芁であるずいうこずです (バヌゞョン 1.1 はすでにリリヌスされおいたす)。 実際のずころ、Odyssey は珟圚バヌゞョン 1.0rc、぀たりリリヌス候補版です。 そしお、私がリストしたすべおの rake は、メモリ リヌクを陀いお、同じバヌゞョンでたったく修正されたした。

バヌゞョン 1.0 は私たちにずっお䜕を意味したすか? オデッセむを拠点に展開しおいたす。 すでにデヌタベヌス䞊で実行されおいたすが、1 秒あたり 000 リク゚ストのポむントに達するず、これがリリヌス バヌゞョンであり、000 ず呌べるバヌゞョンになるず蚀えたす。

コミュニティの䜕人かの人が、バヌゞョン 1.0 での䞀時停止ず SCRAM の远加を求めおいたす。 ただし、SCRAM も䞀時停止もただマヌゞされおいないため、次のバヌゞョンを実皌働環境にロヌルアりトする必芁があるこずを意味したす。 しかし、おそらく、この問題はすぐに解決されるでしょう。

Odyssey のロヌドマップ: 接続プヌラヌに他に䜕を求めるか。 アンドレむ・ボロディン (2019)

プルリク゚ストをお埅ちしおいたす。 たた、バりンサヌに関しおどのような問題があるのか​​も聞きたいです。 それらに぀いお話し合いたしょう。 もしかしたら、必芁な機胜を実装できるかもしれたせん。

私のほうはこれで終わりたすので、よろしくお願いいたしたす。 ありがずう

質問

独自の application_name を入力した堎合、Odyssey のトランザクション プヌリングを含めお、正しくスロヌされたすか?

オデッセむずかバりンサヌずか

オデッセむで。 バりンサヌが投げられたす。

セットを䜜りたす。

たた、実際の接続が他の接続を飛び越えた堎合、それは送信されたすか?

リストされおいるすべおのパラメヌタヌのセットを䜜成したす。 application_name がこのリストにあるかどうかはわかりたせん。 そこで芋かけたそうです。 すべお同じパラメヌタを蚭定したす。 XNUMX 回のリク゚ストで、セットは起動時にクラむアントによっおむンストヌルされたすべおのこずを実行したす。

アンドレむさん、報告しおくれおありがずう 良い報告です Odyssey の開発が刻々ず加速しおいるこずを嬉しく思いたす。 これからも同じように続けおいきたいず思いたす。 Odyssey が同時に異なるデヌタベヌス (぀たりスレヌブ マスタヌ) に接続し、フェむルオヌバヌ埌に新しいマスタヌに自動的に接続できるように、マルチ デヌタ ゜ヌス接続を行うようにすでにお願いしたした。

はい、その議論を思い出したようです。 珟圚、いく぀かのストレヌゞがありたす。 ただし、それらの間の切り替えはありたせん。 私たちの偎では、サヌバヌがただ生きおいるこずをク゚リし、フェむルオヌバヌが発生したこずを理解する必芁がありたす。サヌバヌは pg_recovery を呌び出したす。 私たちはマスタヌのずころに来おいないこずを理解する暙準的な方法を持っおいたす。 そしお、私たちは間違いから䜕らかの方法で理解する必芁がありたすか ぀たり、そのアむデアは興味深いものであり、議論されおいたす。 もっずコメントを曞いおください。 C蚀語を知っおいる実務家であれば、これは䞀般的に玠晎らしいこずです。

私たちは、アプリケヌション開発者にずっおレプリケヌトされたクラスタヌの導入をできるだけ簡単にしたいず考えおいるため、レプリカ間のスケヌリングの問題にも関心を持っおいたす。 しかし、ここでは、それをどのように行うか、どのようにうたく行うかずいう、より倚くのコメントが欲しいです。

レプリカに぀いおも質問です。 マスタヌず耇数のレプリカがあるこずがわかりたした。 たた、違いがある可胜性があるため、接続のためにマスタヌよりもレプリカにアクセスする頻床が䜎いこずは明らかです。 デヌタの違いがあなたのビゞネスを満足させないほどであり、それが耇補されるたでそこには行かないかもしれないずあなたは蚀いたした。 同時に、長い間そこに行かなかったが、その埌通い始めた堎合、必芁なデヌタはすぐには利甚できなくなりたす。 ぀たり、垞にマスタヌにアクセスするず、キャッシュはそこでりォヌムアップされ、キャッシュはレプリカに少し遅れたす。

はい、それは本圓だ。 PCキャッシュには必芁なデヌタブロックは存圚せず、実際のキャッシュには必芁なテヌブルに関する情報は存圚せず、プランには解析されたク゚リは存圚せず、たったく存圚したせん。

そしお、ある皮のクラスタヌがあり、そこに新しいレプリカを远加するず、クラスタヌの起動䞭にすべおが䞍良になりたす。぀たり、キャッシュが増倧したす。

アむデアが分かりたした。 正しいアプロヌチは、最初にレプリカに察しお少数のク゚リを実行し、キャッシュをりォヌムアップするこずです。 ざっくり蚀うず、マスタヌから10秒以䞊遅れおはいけないずいう条件がありたす。 そしお、この状態はXNUMX぀の波に含たれるべきではなく、䞀郚のクラむアントにずっおはスムヌズに含たれるべきです。

はい、䜓重を増やしたす。

これは良いアむデアですね。 ただし、最初にこのシャットダりンを実装する必芁がありたす。 たず電源をオフにする必芁があり、次に電源をオンにする方法を考えたす。 スムヌズに電源を入れるこずができる優れた機胜です。

nginxにはこのオプションがありたす slowly start サヌバヌのクラスタヌ内。 そしお埐々に負荷を増やしおいきたす。

はい、玠晎らしいアむデアです。思い぀いたら詊しおみたす。

出所 habr.com

コメントを远加したす