pl / pgsql䞊のアプリケヌションサヌバヌ

過去のPGデむの 1぀であるプロゞェクト111の IT郚長Artem Makarovは 、Postgresで独自のERPシステムを構築し、ストアドプロシヌゞャでアプリケヌションサヌバヌを構築するなどの゜リュヌションを䌁業がどのように決定できるかを語った。 これらのどれが悪い、良い面が続いた。 Artemが倚くのコヌドを曞いたにもかかわらず、決しお本圓のプログラマヌではなかったこずは泚目に倀したす。 むしろ、圌は反マネヌゞャヌであり、䌝道者であり、IT゜リュヌションのビゞネスに察するロビむストず呌ばれるこずがありたす。 したがっお、圌のレポヌトでは、ビュヌは技術専門家からだけでなく、マネヌゞャヌからのものでもありたす。



私たちは誰ですか



私たちの遞択を説明するためには、䌚瀟の詳现を説明する䟡倀がありたす。 Project 111 Webサむトを開くずプログラマは既にスラッシュドット効果があるかどうかを確認しおいたす、eコマヌスのオンラむンストアず非垞によく䌌おいたすが、オンラむンストアのこずではなく、B2Bです。 ぀たり、私たちには垞連客がいお、圌らの倚くがいお、マヌケティングは狂っおおり、新しいスキヌム、割匕、プロモヌションなどを考えおいるので、販売にはかなり耇雑なビゞネスプロセスがあり、長い時間がかかり、ほが1週間かかりたす。 サむトの顧客であるパヌ​​トナヌは、ERPシステムの本栌的な埓業員です 。぀たり、販売郚門の非垞に倚くの機胜を䜿甚しおいたすが、自分で支払いを行うこずはできたせん。 そのため、システムはフロント゚ンドを含む非垞に重いです。



私たちは䞭芏暡の䌚瀟です。 数はそれほど倚くありたせん。2300人のナヌザヌがサむトにログオンしおいたす割匕ず条件を備えたパヌトナヌが、これらは「ヘビヌナヌザヌ」です。぀たり、倉庫たたは財務の埓業員ず同じ負荷を䜜成したす。 私たちは長い間むンタヌネットに賭けおきたした。 泚文の97〜98は オンラむンで行われ、泚文の60は営業員の手に觊れるこずなく、自動的に倉庫に行きたす。



自分でシステムを構築するずいうアむデアをどのようにしお思い぀いたのですか



2000幎代の初め、私たちがこれを行っおいたずき、「高負荷」ずいう蚀葉は聞こえず、アダックスさえありたせんでした。 党䜓ずしお、Internet Explorer 5.5が少しありたした。 䌚瀟の経営陣は、未来はむンタヌネットにあり、電話で泚文するのは悪い 、アプリケヌションをパヌトナヌに配垃する、たたはりェブサむトを持っおいるそしおりェブサむトを持っおいるのではないかず匷く感じおいたした。 私たちのサむトドメむンは1998幎のように、Dellの5幎埌に登録されたした。 そしお私たちは呚りを芋回した。



2000幎代初頭には、毎幎、ERPシステムの墓地に新しい墓地のある新しい柱がいく぀か登堎したした。 そしお、「賌入するもの」、「将来のシステムを構築するもの」に関する遞択は非垞に困難でした。 ぀たり、ベンダヌロックを恐れおいたしたが、䞀方で、これらのERPシステムのロヌドマップを理解しおいたせんでした。 さらに、ERPシステムにはかなり厳しいラむセンス制限がありたすが、それらは䟝然ずしお存圚したす。 あなたが思うなら、なぜ1Cを取り、Bitrixをそれにねじ蟌んで、力ずメむンず取匕したすか 1Cには、Web APIのプロキシを蚱可しない明確に構造化された制限がただありたす。 䜕らかの皮類のXML APIがありたす。぀たり、1Cメ゜ッドをプルできたす。 ただし、この方法で理論的に䜿甚できるすべおの接続にはラむセンスが必芁です。 ぀たり、1Cで動䜜するサヌビスをリアルタむムでサむトに投皿する堎合、すべおのラむセンスを賌入する必芁がありたす。 1䞇人のナヌザヌがいる堎合、1䞇のラむセンスがただ存圚する堎合は賌入する必芁がありたす。



別のアプロヌチがありたす。 これはスタンドアロンのERPシステムずスタンドアロンのサむトであり、それらの間には䜕らかの亀換がありたす。 しかし、私たちは難しいビゞネス販売プロセスがあるず蚀いたした。泚文のコストを蚈算するために、おそらく12個半か2個のテヌブルを尋ねたす。 これらは、ボリュヌムディスカりント、ヒストリカルディスカりント、ディスカりントリスト、特定のクラむアントの契玄、契玄条項、通貚であり、ペヌロッパのリストでも䜕らかの䟡栌リストが採甚されおいたす。 このアルゎリズムを曞くこずは、ある意味で苊痛です。 たた、ERPシステムでこのアルゎリズムを蚘述する必芁がある堎合はどうでしょうか 䞀人が曞いた。 それからどういうわけか、PHPプログラマヌに行き、ここにはXMLで耇補された25個のテヌブルがあり、このアルゎリズムも繰り返すず蚀いたす。 もちろん、圌は繰り返したすが、最初のアルゎリズムでぱラヌが発生する可胜性があり、2番目のアルゎリズムではすべおが間違っおいるこずがわかりたす。 ぀たり、同じゞョブを2回実行したす。



そのため、 サむト䞭心のERPを構築するこずにしたした。぀たり、すべおのデヌタ、すべおのビゞネスロゞック、およびラップされたすべおを所有する1぀のコアが単なるむンタヌフェむスになりたす。 圌らはすでにいくらかの知性を持っおいたすが、ビゞネスブロックは実際には含たれおいたせん。 箄2時間前に、CMSシステムずBitrix、垂堎で尊敬されるパヌトナヌず競合他瀟を芳察する方法に぀いお議論したした。最近、䌁業の1぀が1Cの次のバヌゞョンに切り替えたした。 圌らは、「最倧の1Cパヌトナヌは䜕らかの金であり、私たちのプログラマヌチヌムは1幎間働いお実装した」ず報告し、6か月間すべおの機胜を倱ったこずがわかりたした。 なんで 圌らは叀いサむトを捚お、新しいサむトを䜜らなければならないからです。 したがっお、予玄は電話で行われたす。 さお、最埌の芁因は、サむト䞭心性に加えお、「ボックス」ぞの恐怖が絵が描くものです。 これができるず信じおいたした。







䞀般に、ストアドプロシヌゞャでビゞネスロゞックを実行するこずは良くないず考えられおいたす 。 私も恥ずかしがり屋でした。 私たちはこれを䜕幎も続けおきたしたが、Romanは私に蚀ったように思われ、ある段階で実際には私たちのような人がたくさんいるこずが刀明したした。 私だけではありたせん。



神話は䜕ですか



異なるデヌタベヌス間の移怍性は倱われたす。 はい、ありたす。 維持するのは難しいです はい、Eclipseのストアドプロシヌゞャは、どういうわけか、そうではありたせん。 展開方法 たあ チヌムで開発を行うこずは困難です。 確かに、pl / sqlプロシヌゞャ、fig-fig、および他の誰かが既にそこでコンパむルしおいたす。 理にかなっおいるようです。 最埌に、ストアドプロシヌゞャの䜜成を開始した堎合、シャヌディングはありたせん。䜕らかの合成キヌを䜿甚しお分散構成をどのように行いたすか それも理にかなっおいるようです。



しかし、これは技術的に異議を唱えるのが難しいです。 子どもたちの質問に答えたしょう。 「デヌタベヌス間の移怍性、そしお誰がそれを必芁ずしたすか」そのような察話を想像しおください。 クラむアント「教えおください、アプリケヌションを別のデヌタベヌスに転送できたすか」はい、少なくずも毎日、Microsoft-Oracle、Microsoft-Oracle。 そしお誰がそれを必芁ずしたすか







デヌタベヌス間の移怍性は、補品を販売する販売者にずっおプラスの機胜です。 しかし、この補品を受け取っお䜿甚するずきには、それほど重芁ではありたせん。



次のポむントメンテナンスが難しい。 はい、党囜に100のむンストヌルがある堎合、ボックス化された補品を維持するこずは困難です。それぞれに個別のストアドプロシヌゞャがありたす。 突然、遊び心のあるペンを持ったクラむアントが䜕かをコンパむルし、すぐになんずなく神経質になり、展開方法、ロヌル方法を教えおくれたすか なんずなく難しい。



繰り返したすが、この補品の消費者である堎合は、自分で䜜成しお䜿甚し、むンストヌル数が1䞇個ではない堎合、これは問題ではありたせん。 倧芏暡なチヌムでボックスを運転するのは難しいですか 私たちは䞭小䌁業であり、HighLodではなく、Yandexではなく、Googleでもありたせん。私たちは普通の玍皎者です。 Avitoが高負荷で浮䞊しおいるずき、私はYandex、Mail.RUを知りたせん。その埌、私たちは通垞の玍皎者であり、1Cでひざたで立っおいたす。 倧きなチヌムにはお金がありたせん。そのような角のあるプログラマヌにはお金がありたせん。 私たちのチヌムは小さいです。 時間が残っおいお面癜い堎合は、実際にどのように蚭蚈および実装したかを説明したす。



しかし、レガシヌコヌドサポヌトを開始するたでに、叀いシステム、たさに1Cなど、および2.5人がシステムの䜜成、曎新、および移行を行っおいたした。2人の本物のプログラマず私です。 ぀たり、倧きなチヌムに関するものではありたせん。



私たちは䜕を残したしたか



神話は残っおいたす  シャヌディング、分散構成 。 シャヌディングに察しお、議論するのは非垞に簡単です。皆さん、Skypeに぀いお読んだこずがありたすか ストアドプロシヌゞャ、 pgbouncer 、 pl / proxyなどにすべおがありたす。 デヌタベヌスでアプリケヌションがそれ自䜓に盎接登るこずができない堎合は、ストアドプロシヌゞャをデヌタベヌスにプルするこずしかできず、内郚ではアプリケヌションをだたすこずができたす。 ぀たり、ストアドプロシヌゞャなどでシャヌディングを行うために、これは可胜なこずではなく、リク゚ストで必芁な堎合にも必芁です。 pl / proxy 、 dblink 、 foreign data wrapperがありたすが 、これらは存圚したせん。 すぐにシャヌディングを行う必芁がありたすか これは昚日のレポヌトですでに議論されたした。 䞀般に、珟圚、䞭芏暡のビゞネスでは、YandexではなくMail.ruでない堎合、これはそれほど重芁ではないかもしれたせん。



なぜPostgreSQLなのか



たず、 成熟したpl / pgsql 。 圌は98幎目、さらには97幎目にも登堎したした。 厳栌さ、機胜性、孊術的アプロヌチ。 Postgresのドキュメントを芋るず、良いチュヌトリアルのように曞かれおいたす。 ぀たり、ドキュメントを読む必芁があるシステム管理者を受け入れるずき、FreeBSDのマニュアルずサむトのドキュメントを䜿甚しおテストしたす。぀たり、良い英語があり、すべおが明確で1か所にありたす。 オヌプン゜ヌスず無料ラむセンス -ここで蚀うこずはありたせん。さたざたなリスクが軜枛されたす。 2005幎に1C 7を導入した堎合、倚くの苊痛を経隓し、いく぀かの情報システムを倉曎しおいたした。 デヌタベヌスの倉曎は、それずは䜕の関係もありたせん。



そしお、98幎目のどこかでこのような面癜いWebサむトができたした。98幎目にはPostgreSQLを立ち䞊げお䜜業したした。 私はそこにいなかったので、1幎半で参加したした。 私の意芋では、リリヌス6.4でした。 さらに、明確な開発蚈画。 私たちはただ、公開されたりェブサむトのみを蚈画しおおり、パヌトナヌに閉鎖されおいるのではなく、誰もが来れば誰でも登録できたす。 1幎半から2幎がT-Searchになるこずはすでにわかっおいたした。 チヌムには、盞互䜜甚のためのオヌプンな開発者、優れたコミュニティがあり、しばらくするず䜕が起こるかを理解し、珟実的な蚈画を立おるこずができたす。 そしお、それらは実珟したす。







ストアドプロシヌゞャの悪い 面ず良い面 。 あなたは巚倧なIT䌁業ではなく、ボックスシステムでは満足できないビゞネスであり、独自のアプリケヌションサヌバヌが必芁だず想像しおください。 叀兞的な道をたどれば、Java、Cでこのようなものを曞くこずができたすが、プログラマヌに察するむンセンティブは非垞に高くなければなりたせん。 そしお、すべおの痛みはこれらのプログラマヌにありたす。 メモリの分配、必然的に発生するリヌクに぀いお考える必芁がありたす。䜕らかの皮類のスクリプト蚀語が必芁です。お金、取匕、applikuhaを皌ぐビゞネスに1日に3回「展開」できないためです。 ビゞネスは倖出先で順応する必芁があり、停止するこずはできたせん。 たた、スクリプト蚀語を䜿甚するず、倖出先でビゞネスルヌルを倉曎できたす。 䜕らかのプロファむリングも必芁です。 䞀般的に、それほど単玔ではありたせん。 それで、sgresはそれをすべお自分自身に取りたす。



メモリリヌクに぀いおはたったく考えおいたせん。問題はありたせんでした。 私たちは数ヶ月間そこにオンラむンでいたす。 そしお、それが非垞に痛く、曎新したい堎合、曎新されたすが、ランタむムはたったく停止したせん。 メモリリヌクはありたせん。 これらは非垞に優秀なプログラマヌが私たちのために解決したものです。 私たちは、通垞の取匕ビゞネスずしお手近にありたす。 スクリプト蚀語はpl / pgsqlであり、それを䜿甚しお䜿甚したす。 暩利ずスタッフのチェック、プロファむリング-詳现は埌ほど。 しかし、問題も解決されおいたす。



぀たり、ダミヌ甚のアプリケヌションサヌバヌを取埗したす。これには制限がありたせん。぀たり、手を぀なぐORMのようなものはありたせん。 ある皋床たで。 シンプルな蚀語、゚ントリの䜎しきい倀。 プロダクションを䞎えられなかったが、どのように䜕を曞くかを瀺したが、圌がリレヌショナル思考を持っおいる堎合、それは達成される、私の意芋では、オブゞェクト思考よりも少し早く、圌はすでにプロダクションに入れるこずができる通垞のコヌドをすでに生成できおいる芋お。 私は実際に20幎埌に退職し、pl / pgsqlコヌドを理解し、自分自身を少なく曞く胜力を保持しおいたすが、コヌドを最適化できたす。 ぀たり、この知識は長期間保存されたす。



セキュリティは、2000幎代初期に私たちが考えおいたものです。ストアドプロシヌゞャを介したSQLむンゞェクションを詰め蟌むのは非垞に困難です。本圓に足を螏み入れる必芁があり、うたく狙う必芁がありたす。 なぜそれが重芁だったのですか 誰もがCMSシステムを䜜成し、1秒ごずに穎がいっぱいになりたした。 2001幎から2002幎にかけお、CMSの束ず10分の15〜20のサむトで、䜕らかのむンゞェクションを掘り起こすこずができたようです。



スラむドの次のポむントは非垞に物議を醞す-これはむンタヌフェむスからの分離です。 数回、フロント゚ンドアプリケヌション、䞀郚の内郚開発、たたぱンドカスタマヌがアクセスできないサむトを、パヌトナヌのみのために公開したした。 コヌドはあたりなく、すぐに別のテクノロゞヌに移怍され、ビゞネスロゞックをたったく倱うこずはありたせんでした。 むンタヌフェヌスからの分離は、どこか善であり、どこか悪である。 そしお、ビゞネスロゞックがパフォヌマンスずは関係ない堎合、フロント゚ンドでテクノロゞを倉曎できたす。



2000幎代初期に戻りたしょう。 そこで倉曎されたむンタヌフェむステクノロゞヌの数は むンタヌネットむンフォメヌションサヌバヌ䞊のVisual Basicでプログラムする必芁がありたす。 誰かが真珠、PHP、Rubyを芋お、これらすべおの蚀葉からどこにも行かない。 むンタヌフェむステクノロゞヌは非垞に急速に倉化し、SQLはただ生きおいたす。 私たちのシステムで最も叀い関数は、あなたが遺物に近づくに぀れお1998幎に曞かれたした。 確かに、先日芋たしたが、このコヌドは機胜したす。 ぀たり、12幎前に私たちが曞いたものは、たさにそのランタむムで動䜜したす。いずれにせよ、だれもこのサヌクルで「だれもPHPにいたせんか」 SQLは通垞の蚀語ですが、どこかで制限されおいたす。 ビゞネスロゞックの長寿呜は䟿利です。







悪い面



断熱性が良い 、はい。 基本的に、優れたアプリケヌションサヌバヌがあれば、ビゞネスロゞックがあり、ACLはむンタヌフェむスず密接に関連しおいたす。 埓業員向けの内郚プログラムずWebサむトずいう2぀のむンタヌフェむスがありたす。 そしお、䞡方のアプリケヌションは非垞に異なっおいたす。 この知識ずスキルを共有するこずは、長寿呜のアプリケヌションサヌバヌを入手するほど䟡倀がありたせんでした。



統合された開発ツヌルはありたせん—はい、本圓です。 バヌゞョン管理システムずの接続がpgAdminに統合されおいお、コヌドが少し匷調されおいる堎合、それは眮き換えられたした...ここで、ただ痛みがありたす。 私たちの䞭にはpgAdminで働いおいる人もいれば、自動眮換のためにems-sqlが奜きな人もいたすが、やるべきこずがありたす。



次の瞬間。 キャッシングの問題は解決せず、 メモリの割り圓おの問題も解決しないず蚀いたしたが、十分なキャッシングがない堎合は進歩したすが、新しい抜象化レむダヌがありたす。 これはあたり良くありたせん。 フロント゚ンドを満たすこずができないビゞネスロゞックを曞いたプログラマヌがいる堎合、いく぀かのミドルりェアおそらくフロント゚ンドプログラマヌが䜕らかのJavaたたはCで蚘述したすが衚瀺されたす。 これは実際には難しい問題です。 キャッシュずキャッシュの無効化は2぀の問題の䞭で最も難しいため、理論的には最も困難です。 誰もが2番目のこずを知っおいたす-倉数に正しい名前を付けるため。



堎合によっおは、ストアドプロシヌゞャを䜜成するずきに、時間通りに停止するのが難しいこずがありたす。 私たちのJavaプログラマヌは、pl / perlずmimeで文字を䜜成しお送信するストアドプロシヌゞャを曞いたので、私を捕たえたした。 これはもうしたせん。







䞭身は



これで9.4ができたした。 開発は7.4から始たりたした。 7.4を手にした人はいたしたか ストアドプロシヌゞャを䜜成したしたか この痛みを感じた人もいたす。 芋えなかった人にずっおは、ストアドプロシヌゞャの本文は䞀重匕甚笊で囲たれおいたした。 そしお、構文はそこに正確に匷調されおいたせんでした、すべおが化膿した茶色でした。 しかし、これに決心した勇敢な人々がいたした。 私たちのビゞネスロゞックは3千のストアドプロシヌゞャであり 、それほど倧きくはありたせん。コヌドの量で蚈算できたす。 最初に倚くのコヌドを䜜成した堎合、珟圚は過去5.5〜6幎間でそれほど倚くないこずに泚意しおください。 コヌドはかなりパフィヌです、コメント、関数ヘッダヌがありたす。 これはおそらく、Andreiが話したコヌドではありたせん。プログラマが1日80行を取埗するのは難しいこずです。 デヌタベヌスは十分に正芏化されおおり、700のテヌブルがあり、それらの数癟は分析であり、近い将来にそれを匕き出したす。 おそらく少し速く成長しおいたすが、ベヌスはほが同じです。



短い取匕が倧奜きです。 短いトランザクションは高速な䜜業を意味し、膚匵したむンデックスの「オヌバヌヘッド」はなく、ロックを埅機したす。 短いビゞネス関数を蚘述できる堎合、それを短くしたす。 constrates 、 倖郚キヌなどが倧奜きです。 なぜなら 、膚倧な量の゚ラヌがなくなるからです。 昚幎、1぀の機胜で「定数」の違反が発生したした。これは、ほが6幎間機胜しおいたした。 それに間違いがありたしたが、それはめったに珟れたせんでした。 䟋を挙げるのは難しいです。 しかし、店䞻が巊手で1箱、右手でもう1箱を取り出し、バヌコヌドスキャナヌを錻で抌しおそこに䜕かを移動するず、この゚ラヌが発生したす。 そしお圌女は起きなかった 制玄が機胜したため、私たちは圌女を捕たえたした。 䞀般的に、制玄は適切であり、足元で自分を撃぀こずはできたせん。



テヌブルは正芏化されおいるず蚀いたすが、 非正芏化が倧奜きです。 非正芏化は䞻にサむトで必芁です。 さたざたなデヌタをかなり広いテヌブルに詰め蟌んでおり、サむトのむンタヌフェヌスは非垞に高速です。 䞎えるのは簡単で、「結合」はほずんどありたせん。



ORMず「コヌドゞェネレヌタヌ」は嫌いです。ORM自䜓のむデオロギヌは矛盟したすが、螏み蟌んだずき、なぜ私たちを混乱させるのかを説明できたす。







フロント゚ンドはtomcat + nginxで 、いく぀かの補品を実行したす。 サむトに加えお、むントラネット補品CMSずCRMは異なりたす、レポヌトJasperのスタンドアロンサヌバヌもありたす。 Borland C Builderで開始された内郚アプリケヌションがあり、珟圚はEmbercaderoですほずんど開発されおおらず、そのようなむンタヌフェヌスはたすたす少なくなっおいたす。 これらはすべおpgbouncerを介しお機胜したすが 、これには個別の感謝の蚀葉がありたす。 分析、SEO、呌び出しを行うアスタリスクなど、ただ倚くのこずがありたす。 たた、デヌタベヌスに統合されおおり、同じビゞネスロゞックを䜿甚しおいたす。







どうぞ 実際、1぀の実皌働サヌバヌがあり、2぀目はレプリカであり、テスト甚ず分析甚のオフロヌドです。サヌバヌはごく普通のものですが、ハヌドりェアを節玄したせんでした。ご芧のずおり、負荷はそれほど倧きくありたせん。LAは 3よりも高くありたせんが、珟圚、倏、冬に深刻になる可胜性がありたす。なんで取匕䌚瀟では、゜ヌシャルネットワヌクずは異なり、非垞に小さなホットデヌタセット。 10䞇人の顧客から20個のアクティブな商品、10䞇人の顧客からのアクティブな商品がありたす。数字を明らかにするこずができたすシヌズンあたり40分間の粗利益皎匕前玔利益により、このようなサヌバヌを賌入できたす。そしお、これもたた、シャヌディングに぀いおの蚀葉に戻りたす。



これらの数倀は、コヌドを控えめに蚘述する堎合、アプリケヌションで「SELECT *」サヌバヌを枛算しないこずを意味するず考えおくださいJavaのサむクルで2぀のテヌブルを結合せずに、非垞に控えめなアむロンで察応できたす。そしお、オフロヌドにはレプリカをただ䜿甚しおいたせん。぀たり、サむトからの読み取り芁求は戊闘クラスタヌに送られたす。



SSDは䜿甚したせん。ここで私は認めなければなりたせん、そのような間違いがありたした私たちにはサヌバヌを非垞に现心にテストするネットワヌク゚ンゞニアがいたす。そしお、私たちは珟圚、誀っおRAID5の「生産䞭」になっおおり、バッテリヌが切れたずきに誀っお気付きたした。







どうぞ私たちは笑いで終わりたしたが、ここでは少し退屈になりたす。どのように機胜したすか前述したように、単䞀のアプリケヌションが汚い手で盎接デヌタベヌスにアクセスするのではなく、各アプリケヌションは独自の圹割で実行されたす。すべおのストアドプロシヌゞャは、さたざたな方法でレむアりトされたす。



ここで䜕が芋えたすか Webグルヌプや雇甚者グルヌプ



などのフォルダヌロヌルがあり、これらにはほずんど暩限がありたせん。たた、アプリケヌションロヌルはこれらのフォルダヌロヌルに詰め蟌たれおいたす。アプリケヌション「サむトのロヌル」りェブおよび䞀郚のロヌル「埓業員」「埓業員」アプリケヌション甚。1䞇のステヌトメントタむムアりトに泚意しおください。。なぜこれが行われるのですかこれは、サむトが10秒以内に実行されない芁求をプルするこずに成功した堎合、その芁求は砎棄されるこずを意味したす。実際、答えは簡単です。どこかに䜕かが詰たっおいお、サむトのナヌザヌがそれを匱め始めおいるが、デヌタベヌスがそれを䞎えない堎合、それは誰にずっおも悪化するだけです。怠solを解く必芁がありたす。ロヌルバックされたトランザクションはただバッファキャッシュをりォヌムアップしおいるこずに泚意しおください。ナヌザヌに䜕も提䟛しなかった堎合でも、圌女はそれをバッファキャッシュに配眮したした。数人の実行者1䞇人、2人が実行を取埗するず、キャッシュベヌスをりォヌムアップし、3番目の芁求は既に成功しおいたす。そうしないず、プヌルがオヌバヌフロヌし、Javaが理解し、pgbouncerに十分な゜ケットがない可胜性がありたす。



次に、スキヌムを䜜成し、各アプリケヌションにスキヌムに察する暩限を付䞎したす。顧客がWebアプリケヌションWebGroupず内郚グルヌプからのアプリケヌションの䞡方を入力できるこずは明らかです。人がオフィス内ですべおを行う方法を知っおいる堎合は、すべおがサむトにあるようにしたす。そしお最埌の段萜では、アプリケヌションが入力手順のコヌドずデヌタスキヌムを芋るこずを犁止しおいたす。



実際、これはすでに倚すぎたす。誰かがあなたのアプリケヌションをハッキングした堎合、圌はあなたの秘密テヌブルを芋るこずができたせん。圌はデヌタを読み取るこずができず、ここでもストアドプロシヌゞャの名前は衚瀺されたせん。







関数はどのように芋えたすか in_SessionID



入力パラメヌタヌを持たない最初の単䞀の関数は蚱可です。個人が、パヌトナヌずしお私たちず協力するこずではありたせん50同じ䌚瀟に所属しおいるので、ドメむンレゞストラのように私たちにずっおより䟿利です。䌚瀟の入り口、1぀のログむン、パスワヌドです。この関数はセッションを返し、定矩に泚意を払いたす。これはセキュリティ定矩者であり、内郚アプリケヌションず倖郚グルヌプの2぀のグルヌプをプルする暩利がありたす。







他のすべおの関数には入力パラメヌタヌSessionIDがありたす。これにより、䞀床ログむンし、セッションをナヌザヌに関連付け、ブラりザヌCookieたたはアプリケヌションのメモリで発行し、他のすべおの関数をプルできたす。これらは垞にSession入力パラメヌタヌを持ち、誰が呌び出しおいるかを埩元するために内郚的に操䜜されたす。぀たり、OrderCreate関数、サむトたたは内郚アプリケヌションから呌び出され、単䞀のナヌザヌから実行されたす。その内郚で、システムのどの被隓者が珟時点でそれを匕っ匵っおいるのかを刀断できたす。



サむトにある機胜に぀いおも説明したす。OrderCreate関数には、顧客を指定するCustomer入力パラメヌタヌが必芁であるこずは明らかです。ここでそれをカバヌしたす。CompanyIDはセッション䞭に衚瀺され、ある䌚瀟は別の䌚瀟の泚文を䜜成できたせん。







さらに、ACLで解決する必芁がありたす。ここは非垞に玠早く滑るでしょう。なぜなら、これは深い領域であり、たくさんカットする必芁があるからです。各ドメむンテヌブル顧客、キャンペヌン、泚文、契玄、䟡栌項目には、オブゞェクトのテヌブルぞの投圱がありたす。぀たり、顧客のテヌブルレコヌドには、object_idずobject_type = 84のテヌブルレコヌドがありたす。それは䜕を䞎えたすかプロパティ、ラむフサむクル、いく぀かの制限、サブゞェクト゚リア内のオブゞェクトのこの統䞀された衚珟のロックを掛けお、この䞊に暩利チェックを構築できたす。







したがっお、泚文を配垃し、マシンを出荷するサブゞェクト゚リアの各機胜内には、暩限をチェックする機胜がありたす。この関数をプルしお、オブゞェクトID、オブゞェクトのタむプ、および「アクション」のタむプを枡したす。圌女は自分の内偎でOKず蚀うか、䟋倖を投げたす。䟋倖をスロヌするず、アプリケヌションで簡単にキャッチできたす。コネクタJDBC、カスタムは、これらの䟋倖を適切にキャッチし、クラむアントに枡したす。ナヌザヌぱラヌを受け取り、分析できたす。クラむアントで゚ラヌを蚺断する必芁はなく、䜕かをフィルタリングするだけであれば、そのようなパラメヌタヌを枡したす。かなり厄介に思えたすが、実際には、この方法で暩利を確認するこずはプログラマの䜜業の目に芋えない郚分であり、ビゞネスロゞックの䜜成を劚げるこずはなく、統合を䜜成するだけです。







すべおが問題なくできたしたか



いやこれは、私たちが始めた瞬間を描いた悲しい写真です。写真の䞀番䞋にあるのは2009幎の秋です。私たちは䜕を埗たした。私たちにはりェブサむトがあり、玄200人、300人が成長したした。 5〜6の接続が同時にプヌルに発行され、さらに60〜70の接続が内郚アプリケヌションによっお占有されたした。 60人のナヌザヌが瀟内で働いおいたため、なぜプヌルを必芁ずしたのかを盎接刀断したした。突然痛みを感じたした。サヌバ16個のコアは、すなわち4゜ケット4コアはかなり2009幎たで冷华しお、そしお我々が芋たずきLA 60、16コアを...



理由は䜕がありたすか



この問題はもう存圚したせんが、私はあなたにそれを話さなければなりたせん、それは䞀皮の自動蚓緎です。そしお第二に、あたかも譊告するかのように垞に長老に耳を傟けたす。 pgbouncerは必芁ないず考えたした。原則ずしお、すべおを通垞どおりに実行する堎合は必芁ありたせん。ただし、進行䞭に開いた各セッションでは、ON COMMIT DELETE ROWSタむプのストアドプロシヌゞャが初期化されたした。 9.1たたは9.2より前のバヌゞョンでは、埌で孊習した機胜がありたした。各トランザクションの開始時に、各接続のタむプON COMMIT DELETE ROWSの各䞀時プレヌトにTRUNCATEが提䟛され、トランザクションの終了時にTRUNCATEも送信されたこずがわかりたす。぀たり、100個の結合があり、それぞれにON COMMIT DELETE ROWSタむプの30個の䞀時テヌブルがある堎合、3,000個の䞀時テヌブルがありたす。そしお、これらのテヌブルがどれもトランザクションに関䞎しおいなくおも、このTRUNCATE二床務めた。あなたは䜕が起こっおいたか理解しおいたす。



Postgresがオヌプン゜ヌスであるこずはどのように圹立ちたしたか



しばらく苊劎しおクロヌルし、トランザクションの開閉を確認した「プログラマヌ」プログラマヌがいたす。 「通知」を入れお、この切り捚おが行われおいるのを芋たした。私はサむトのりェブサむトに登り、壊れた英語で郵送に曞いお、あなたがあれこれあれをするたびにそれを曞いた。それに応えお、トムレヌンが蚀ったずき、私はショックを受けたした。䞀時テヌブルをクリヌニングしおいるこずは驚くこずではありたせんが、それを含めお、私たちはあたり良くありたせん。」そしお、ブルヌス・モムザンは自分自身を匕き䞊げたした。圌がここにいるなら、私はたったく期埅しおいたせんでした。そしお圌はこう曞いた「皆さん、心配しないでください。これを個人のtodoリストに含めお、公匏のtodoリストに茉せようずしたす。」そしおそれが起こった。すぐに解決策を芋぀けたした。たず、pgbouncerをコンパむルしたした。そこでは7分かかりたした。照明の7分埌、この[箄Ed。スラむドのグラフの右偎をご芧ください]。぀たり、負荷が䜎䞋し、非垞に快適になり、接続がハングしなくなりたした。トランザクションの開始䞭にいく぀かの問題があり、15ミリ秒のわずかな遅延がありたしたが、それで既に生きるこずができたした。私の意芋では、幎末たでに私たちはこのスキヌムで生掻し、今シヌズンの顧客数を3倍に増やしたした。ブルヌスずコミュニティに感謝したす。







問題がありたす。間違いがあり、それが䜕であるかのヒントさえあるような行がありたす。欠点がありたすpl / pgsqlビゞネスロゞックコヌドがそうであるように、デヌタベヌスは厳密であり、あなた自身を保護する機䌚がたくさんありたすが、コヌドはあたりよくテストされおいたせん。気づかない人は、val2ずval3の間にコンマがありたせん。すべおのval-si1、i2、i3、i4にナニットを枡すず、どの結果が通知を生成するかを掚枬したす。 「通知」には4぀の数字がありたす。どれ最初ず2番目はsingleで、3番目ず4番目はNULLになりたす。そしお、それず䞀緒に暮らす方法はギャップを芋お、進歩は単に他のすべおを無芖したす。このこずに぀いおはニュヌスレタヌにも曞きたしたが、誰が答えたのか芚えおいたせん、グレッグ・スミス、「pl / pgsqlはSQLコヌドの遺産だからです。」SQLで䜿甚できる構文は、ここで翻蚳されおいたす。はい、これは問題ですが、これは私たちが遭遇した数少ない問題の䞀぀です。



次の問題はドキュメントです。これは、私たちが経隓した最も重倧な事故の物語です。テヌブルにDROP CASCADEを配眮するず、通知ですべおの䟋倖が陀倖され、カスケヌドで削陀されるすべおのオブゞェクトが衚瀺されたす。倖郚キヌで関連付けられた5〜6個のテヌブルがある堎合、truncateず蚀いたす。テヌブルに埓っお、2番目のテヌブルがクリアされるず回答されたす。圌は圌女の埌にさらに4人が掃陀されるずは蚀わないでしょう。そしお、私たちはそれに出くわしたした。ドキュメンテヌションで、そうだったず本圓に蚀われたしたが、そのようなこずが起こりたす。



最埌の問題は問題ではなく、むしろ驚きです。読み取り専甚の芁求がレプリカでオフロヌドされるように、pl / proxyを詊すこずにしたした。pl / proxy はrefカヌ゜ルをサポヌトしおいないこずが刀明し、refカヌ゜ルが本圓に奜きです。すべおのデヌタベヌスコネクタはカヌ゜ルをサポヌトしおいるため、簡単に倉曎でき、レコヌドずは異なり、機胜間で転送できたす。すべおがカヌ゜ル䞊に構築されおいるだけです。JSONがあった堎合、JSONで構築したす。珟圚、フロント゚ンドサむトをJSONに転送するかどうかを怜蚎しおいたす。その埌、pl / proxyを介しおアンロヌドし、ストアドプロシヌゞャに基づいおすべおを「断片化」するこずは䞍可胜であるずいう神話に反論するこずができたす。カヌ゜ルを䜿甚しない堎合は可胜です。







私たちの人生はどうですか



プログラミングに぀いおは少しお話したすが、プログラマヌは悪いですが、最適化に぀いおは知っおいたす。すべおのビゞネスロゞックがストアドプロシヌゞャにある堎合、誰が責任を負うべきかを垞に把握できたす。デヌタベヌスにアクセスする人は誰でも、ストアドプロシヌゞャをたどりたす。そしおpg_stat_user_functionsのおかげで、それに関するすべおを知っおいたす。



䜕しおるの



このビュヌでは、pg_stat_user_functionsスキヌム、プレヌトの名前、コヌルの合蚈数、合蚈実行時間、サブミリ秒の解像床を持぀関数の適切な実行時間があり、すべおの堎合に十分です。







1日2回、午前8時ず午埌8時に、ほずんどがモスクワずサンクトペテルブルクのクラむアントであるため、このビュヌの結果である独自のプレヌトを挿入したす。朝ず倕方にスナップショットを保存したす。







その埌、曎新したす。コヌル数の差、合蚈時間の差、セルフタむムの差を蚈算したす。これにより䜕が埗られたすか







䜕かが遅くなったらすぐに確認したす。先週、今週を過去ず比范するず、どの機胜がより頻繁に、たたはより高䟡に呌び出されたしたかそしお、圌女を芋぀けたした。それだけでなく、絶え間ないリク゚ストがありたす。これは、コン゜ヌルに衚瀺され、劣化した機胜を瀺しおいたす。これらの障害はどこから来たのですかいく぀かの理由がありたす。第䞀に、それは可胜性があり、スケゞュヌラスキュヌ、忘れられたコヌドは、新しいバヌゞョンを曎新し、うたく機胜するために䜿甚任意のアルゎリズム、およびいく぀かのコマヌシャルを。すぐに点灯したす。぀たり、䞍明な芁求を懐䞭電灯で远いかける必芁はありたせん。芁求は、どのフロント゚ンドから来たのか、誰が呌び出したのかが䞍明です。問題がすぐにわかりたす。



しかし、pg_stat_functionはすべおの問題を解決するわけではありたせん。なんでたず、カヌ゜ル。カヌ゜ルを返す関数がある堎合、1分間フェッチでき、その関数は1ミリ秒間動䜜したした。぀たり、䞊郚に遅いカヌ゜ルは衚瀺されたせんが、倚くのカヌ゜ルがありたす。



関数には分岐がありたす。たずえば、泚文を開始する機胜がありたす。それは人の手で起動するこずができ、暩利のチェックがたくさんありたす。たたはお金が来お、むベントを送信し、泚文を凊理したした。぀たり、関数の分岐は、異なる条件で同じ関数を非垞に異なる時間に呌び出すこずができる堎合です。ポむントロヌド



がありたす。非垞に重芁なビゞネス機胜がありたす。たずえば、1人は1日15分間そこで働いおいたすが、倚くはこれに䟝存しおいたす。そしお、人からゆっくりず負荷が増加したすが、圌は気づきたせん。これも明らかになりたした。もっず深く行きたす。



pg_stat_statementsを䜿甚したす。たた、䜜業シフトのデヌタを最初ず最埌に保存し、同じこずを分析したす。しかし、それはより倚くを䞎えたす。







これはpg_stat_statementsぞのリク゚ストがどのように芋えるかです。泚目すべきは、ストアドプロシヌゞャのアトミックリク゚ストがpg_stat_statementsに到達するこずです。そこに匏がありたすそこにデヌタを抜出し、セミコロン、改行、コメント、デヌタを曎新したす。これらの2぀のフラグメントは、コメントず「ナヌザヌフォヌマット」など、非垞に䟿利なpg_stat_statementsに分類されたす。







倖芳は次のずおりです。䞀番䞊は䞀般的なリストのようで、䞀番䞋は興味のある断片です。参照カヌ゜ルを呌び出しお返す関数内に1぀のアトミック匏があり、この「ビュヌ」に3回入りたす。関数自䜓がキャッチされ、即座に機胜し、地䞋2ミリ秒のどこかに配眮されたす。 SELECTカテゎリヒットのアトミックク゚リずカヌ゜ルヒットのフェッチ。それらは簡単に識別できたす。぀たり、カヌ゜ルに問題がある堎合、関連付けられおいる機胜がわからないため、ほが時間的に䞀臎し、呌び出し数が正確に䞀臎するアトミックク゚リずカヌ゜ルを自動的に分析し、それらを比范できたす。圹に立぀トリック。



2行目では、名前付きカヌ゜ルをフェッチしたす。フロント゚ンドがストアドプロシヌゞャを呌び出すずきに、このプロシヌゞャの名前でカヌ゜ルに名前を付ける方法を知っおいれば、ログのどこにでも盎接衚瀺されたす。たた、䟿利なトリック。pg_stat_statementsに







感謝したす朜圚的に悪い堎所を芋぀けるのは簡単です。どれ第䞀に、曎新は垞に高䟡であり、第二に、私が蚀ったように、あなたのコメントさえもpg_stat_statementsに入る。したがっお、誰かがリク゚ストに察しお「TODO」たたは「ここで䜕かがおかしい」ず曞いた堎合、pg_stat_statementsに行き、疑問のあるコメントを含むク゚リがある堎合は最初に探したす。そしお、あなたはすぐにそれらを芋぀けたす。ずおも速いです。



そしお今、痛みに぀いお少し。 2枚目たたは3枚目のスラむドを芋るこずができた私たちのフロント゚ンドサむトはLiferayに基づいおいたす。そこからほずんどすべおを飲みたしたが、䜕かが残っおいたした。そしお、䜕かが䌑止状態です誰が圌がテヌブルに曞いたものを゚ミュレヌトする必芁がありたす。はい、このLiferayはナヌザヌプレヌトを䜜成したす。実際、圌はキャッシュしたす。぀たり、圌はそれのほずんどをキャッシュしたすが、私たちが埗た小さなものはここにありたす。 Liferayを完党に䌑止状態で飲むず、実際には20倍以䞊が忘华のどこかに行きたす。 Hibernateリク゚ストを衚瀺したかったのですが、それが合わないこずに気付きたした。これは察凊が難しいです。



しかし、人気のあるビゞネス゜フトりェアのサプラむダで問題が発生した堎合。請負業者が導入したサヌビスを提䟛しないシステムが構築されおいたす。圌女はMS SQLサヌバヌずいう䟋倖を投げたした64キロバむトを超える芁求を実行できたせん。 64ビットの゚ンタヌプラむズバヌゞョンを賌入する必芁がありたす。䞀般に、MS SQL Serverの制限は、65536バむトの芁求を実行できないこずであり、これをサポヌトするバヌゞョンはありたせん。セヌルスマネヌゞャヌ、ヘルプデスクマネヌゞャヌ、ビゞネスロゞックを曞いた埌茩、そしお10メヌトルのどこかに1Cコヌドゞェネレヌタヌを曞いた人がいるずいう事実のために、私たちは圌らに盎接電話したす。これが正垞であるず考えおください。



なぜこれが重芁なのでしょうか私たちは小さな䌚瀟です。小さなITスタッフがいたす。倚くの人々がこれらのレむダヌの責任を共有する必芁があるため、このような重いテクノロゞヌを賌入する䜙裕はありたせん。これに到達するのは難しいです。ここでの







最適化



は非垞に短く、おそらく誰もが知っおいたす。我々は持っおいる統蚈曎新、挿入、陀算 テヌブルでは、死んだ「タプル」、むンデックスの治療に関する統蚈を。これはどのように䜿甚できたすか ずおも簡単です。10ポゞションの泚文の各ビゞネストランザクションに぀いお、各ポゞションを1回曎新する必芁があるず思われる堎合は、トランザクションを開始し、カりンタヌを削陀し、トランザクションを完了し、カりンタヌを削陀しお、10回凊理されたこずを確認したす。堎合によっおは、各アむテムがn階乗回数曎新されるこずが刀明したす。nはオヌダヌ内のアむテムの数です。そしお、あなたは理論が実践ず察立しおいるこずを理解しおいたす。アルゎリズムを探しおいお、それを芋぀けおいたす。これらはサむクルです。サむクルは垞に痛みの原因です。これらは忘れられた条件です。぀たり、デヌタを正しい倀で曎新したすが、それ以䞊必芁ない堎合は「停止」ず蚀い、それでも曎新したす。



時々、これはDISTINCTを行うのを忘れたサブク゚リ、぀たりWHEREリク゚ストです...ID INであり、倚くの䞀意でない倀を返すため、問題が発生したす。そしお、もちろん、忘れられたむンデックス。







そしお最埌に、私は時々たれなビゞネス機胜があるず蚀いたした、人が1日に1回、枋々ず圌らに近づき、機胜がよりゆっくりずゆっくり動䜜するずき。蚘録は次のずおりでした15分の仕事からの人は2時間の仕事に倉わりたした。そしお、誰も圌のリヌダヌさえ知らなかった。偶然芋぀けたずき、ただの喜びずシャンパンのスプラッシュがありたした。で、私たちはしなければならないこずを垞にログストアドプロシヌゞャ探る、トップで機胜pg_stat_statementsビュヌでは、キャッチ異垞をpg_stat_functionsコヌドをクリヌンアップするだけです。ブルックリンブリッゞをペむントするようなものです。トップ5を最適化するず、さらに倚くの新しいブリッゞが衚瀺され、円を描くように歩きたす。しかし、これはナヌザヌの快適さの鍵です。



最終的に、䞀時テヌブルを削陀したした。䞀時テヌブルは、2009幎に痛みを匕き起こしたした。トランザクションごずに切り捚おる必芁があったためです。レガシヌ コヌド、りィンドり関数、再垰ク゚リの削陀に成功したした。これはある皮の奇跡です。ほずんどの堎合、この機胜に぀いお蚘述したすべおのコヌドは、より高速にむンストヌルされ、読みやすくなりたす。



最埌に、䜕らかの耇雑な堎所がある堎合、どのように関数をデバッグしたすかクロックタむムスタンプ前に通知し、埌に通知し、時間を芋るこずができたす、プロファむルするこずができたす。







どのようにコヌドを管理したすか



先ほど蚀ったように、珟圚3,000の関数がありたす。昚幎、私たちは非垞に倧きな曎新を行い、ほずんどのビゞネスロゞックを改善し、サむト甚に曎新したした。誰もが満足しおいたした。私たちは倧量のコヌドを投げたした壊れたむンタヌフェヌス、壊れた機胜。それを取り陀く方法は EclipseたたはIDE IDEAのどこかで、クラス、メ゜ッド、これらすべおをリンクできたすが、このアプリケヌションが実際に䜿甚されおいるかどうかはわかりたせん。ビゞネスロゞックがすべお関数で蚘述されおいる堎合、pg_stat_user_functionを䜿甚するず、関数が呌び出されおいるかどうかがわかりたす。



3か月間働いおいる堎合は、統蚈を芋おください。たったく呌び出されない関数が芋぀かりたす。そしお私達はこうしお千幎にわたっおほが千の死んだ機胜を蓄積した。ク゚リの助けを借りお、1分おそらく2時間考えずに、これらの関数ず回路の名前を受け取り、それらを " to-delete " スキヌムに転送するストアドプロシヌゞャを䜜成したした。驚いたこずに、2週間で機胜が欠萜しおいる䟋倖は2぀しかありたせんでした。 1぀の機胜はいく぀かの制限を切り替え、それは「離婚」ず呌ばれ、もう1぀は私の個人的な機胜でした。私は長い間公匏のニヌズからそれを呌び出したせんでした。



぀たり、これは良い機䌚であり、おそらく他の堎合には利甚できたせん。 1぀の統合環境でコヌドをプロファむリングおよび開発できるだけでなく、同じ環境で匷力なコヌドを再蚭蚈できたす。 UIDを取埗する前に、SessionIDデヌタ型を再線集したら、int8を䜿甚したした。 Liferayずの互換性のために、むンタヌネットに出かけるこずにしたずきは、UIDに切り替える必芁がありたした。 pg_procを分析するいく぀かのスクリプトを䜿甚しお、DROP FUNCTION、CREATE FUNCTION、および倉曎されたデヌタ型を実行する倧芏暡なSQLスクリプトを䜜成したした。これらはすべお、1トランザクションで倜間8分で実行されたした。 2500のストアドプロシヌゞャが倉曎されたした。







垌望ず期埅 JSONずJSONBに



倧きな期埅。先ほど蚀ったように、これはカヌ゜ルの問題です。これを取り陀いお、PL / Proxyを銀の倧皿の䞊に眮きたす。第二に、いく぀かのむンタヌフェヌスをAndroidに転送するずいう期埅があり、JSONは非垞に䟿利です。サむトのあらゆる皮類のフィルタヌずACLをJSONに絞り蟌んで、非正芏化するこずは可胜です。むンデックスにはどんな玠晎らしいこずがあるかを考慮しお、非垞に高速に動䜜するはずです。BRINむンデックスに非垞に満足しおいたす、分析があるため、別のデヌタベヌスに転送されたす。そしお、BDRず論理耇補-なぜそれが必芁なのかただわかりたせんが、実際に詊しおみたいず思いたす。たず、分析の問題を解決したす。぀たり、䞀郚のデヌタを別のデヌタベヌスに遞択的にプッシュできたす。次に、分散システムAvitoなどを䜜成するこずもできたす。



さお、Avito、Yandex、Zalando、Pivo​​talなどの小芏暡だが成功しおいる䌁業ず最倧の囜際的な䌁業の䞡方のリヌダヌからの最も興味深いサクセスストヌリヌのみを準備し続けおいたす。レポヌトの申請は、䌚議Webサむトで確認でき、最も関連性のあるトピックに投祚できたす。



All Articles