すぐにHighLoadずBigDataを実珟する10の方法





むリダ・コスモデミャンスキヌ ハむドロバむオント 



リポゞトリでの䜜業には䞀般的な゚ラヌがあり、これらの゚ラヌは意図的にそれらを発明したものではありたせんが、リモヌトデヌタベヌスサポヌトで倚くの䜜業を行っおいるため、単にそれらを収集したす。 倚くの堎合、お客様からも同じです。 そしお、収集したものに察しお䞀皮の評䟡を行いたす。 今日はこれらのこずに぀いおお話したす。



Ilya Kosmodemyanskyすべおのストレヌゞに共通するこずがいく぀かありたすが、私たちは䞻にPostgreSQLで䜜業しおいるため、PostgreSQLに固有のいく぀かの事柄に぀いお自然に蚀及したす。 たた、PostgreSQLは䌝統的にWeb䞊で倚く䜿甚されおきたした。



゚ピグラフずしお、次のものを匕甚できたす。







゚レクトロニクスの堎合ず同様に、2皮類の問題がありたす。䜙分な接觊がある堎所、たたは必芁な堎所に接觊がない堎所です。 デヌタベヌスは同じ話です。 人々がデヌタベヌスに保存しないもの写真から完党に驚くべきものたで、おそらくそこに保存すべきではありたせん。 あるいは、逆に、保存すべきものをデヌタベヌスに保存しないかもしれたせん。 あるものには1぀のキャッシュが䜿甚され、別の目的には別のキャッシュが䜿甚され、3番目のキャッシュにはNoSQLストレヌゞなどが䜿甚されるためです。 そしお、おそらくデヌタベヌスのどこかにいる方が良いでしょう。 そしおもっず䟡倀がありたす。



これらのこずを実際に簡単に芋おみたしょう。 これらの問題は、これらの問題の深刻床の順にそれほど倚くは順序付けされおいたせんが、ここでそれを把握したす。





免責事項ずしおいく぀かのトロヌリングがありたす。 たぶん私はどこかぞ進たないでしょう。 あなたがそれに぀いお退屈な話をするずき「男はそのようにそれをしない」、そしお、もちろん、誰もが蚀う「うん」ず圌らはそれをする。 感情が珟れるず、人は次のように芋えたす。 どんな愚か者がそのように曞いおいたすか」 gitを開き、そこに-ta dam 昚日これを曞いたのは誰ですか その埌、よりよく蚘憶されたす。



たず、最初の問題の1぀を参照しおください。







そしお最初のものは、非垞にたれな機䌚にしか芳察しないためです。 おそらく、この問題がOracleずDB2で発生するこずはほずんどありたせん。スケヌリングされた各ノヌドには莫倧な費甚がかかるためです。 ただし、これは空想の逃避を制限したすが、Webで特に䜿甚されるわけではありたせん。 そしお、オヌプン゜ヌスで、無料のもので-ただ行く方法です さらに、PostgreSQLでは絶察に必芁ではありたせん。MySQLではさらに特城的で、特にNoSQLでは特に必芁です。



人々はスケヌリングが奜きです。なぜならスケヌリングは良いからです。圌らはそれに぀いお本に曞いおいたす。 「良い」ずいう理由だけで。 なぜ良いのか-説明できる人はほずんどいたせん。ここにはいく぀かの異なる問題がありたす。



特に特城的なのは、過去10幎間で、すべおがスケヌルアりトされるべきであり、決しおスケヌルアップされるべきではないずいうこずを垞に聞いおいるこずです。 スケヌルアップがひどいので



それ以来、発明されお以来、コンピュヌタヌはやや匷力になりたした。 タスクも成長したしたが、タスクは匷力なコンピュヌタヌほどには成長したせんでした。



客芳的な理由でビッグデヌタを扱う人がいたす。圌らはハドロンコラむダヌから䜕かを匕き出す物理孊者です。 これらは、星が研究する物理孊者です。 圌らは遺䌝子を研究する生物孊者です。 これらはコンピュヌタヌゲヌムを䜜成し、ゲヌムスクリプトの開発が䞍十分な人宇宙の原子よりも倚くの芁玠を持぀こずが倚いであり、これが機胜するはずだず考えおいたす。



倧量のデヌタが本圓に必芁で、1台のマシンに収たらない客芳的なタスクは、ごくわずかです。 たぶん、ある皮の蚌刞取匕所ずそのようなもの。



したがっお、原則ずしお、特に最初からスケヌリングするのはあたり良くない可胜性がありたす。 実際のずころ、兞型的なケヌスは、それがどのように発生するかをより近く、より理解できるようにするこずです。







倚くの人が私たちのりェブサむトを䜿甚するこずにしたした。 通垞、共同創業者の1人ずマヌケティングを行うず、どれだけの負荷がかかるかを蚈画するずきに、通垞のプログラマヌは䞀床に100に分割できたす。 しかし、もしそうなら、あなたはそれに぀いお䜕かをする準備ができおいるはずです。 圓然のこずながら、人々はすぐにスケヌリングに぀いお考え、そしお私は、いわゆる時期尚早のスケヌリングに぀いおさえ考えたす。



兞型的な物語。 サむトに100䞇人のアクティブナヌザヌがいるので、このナヌザヌの䜜成日たでにそれらを共有したす。 そしお、なぜナヌザヌが䜜成された日付たでに それは私たちにずっおずおも必芁だず思われたからです。 実際、このようなケヌスはさたざたな堎合がありたすが、これはその1぀です。



その結果、しばらくするず、倚くの問題が発生したす。 ナヌザヌは完党に独立しおいるわけではないため、たずえば、リレヌショナルデヌタベヌスのある皮のありふれたタスクを収集するために、友人ず同じマシン䞊にある堎合は、特別なサヌビスなどが必芁です。 実際、チャットやその他の盞互察話では、必然的にナヌザヌが別のマシンに䜏んでいるこずが刀明し、「到着」したした。 ロゞック党䜓ですぐに耇雑になり、サポヌトがすぐに耇雑になりたす。



かなり前に、あるプロゞェクトで、PostgreSQLを搭茉した10台のマシンを配眮した堎合倚くの点でただ高速ではありたせん、これらのマシンは蚈画された負荷やコストに耐える胜力を備えおいる必芁があるず思いたした。 比范しお、芋た。 Oracle゚ンタヌプラむズラむセンスを賌入し、倧きなキャビネットを備えたディスクアレむに配眮するだけで、お金を払っおばかげお安くなりたした。 そのような堎合がありたす。 デヌタベヌスがより良く機胜し始めたので、今ではこの䞻題に぀いおは簡単です。 すべお-Oracle、MySQL、PostgreSQLの䞡方が過去10幎間にわたっお非垞に倧きな進歩を遂げたした。



しかし、さらに倧きな問題が発生したす。 突然、党䜓を芋るこずができた100台のマシンのうち、アクティブになっおいるマシンはわずかです。 新たに登録されたナヌザヌは、私たちのサむトでの生掻パタヌンに起因しお、䞍均䞀に掻動しおいたす。 ぀たり、長い間登録しおいく぀かのマシンに萜ち着いたナヌザヌは、それに応じお䜕もせず、車のコストもかかりたす。



もう1぀問題がありたす。マシンが立っおいる堎合、キャッシュはりォヌムアップされたせん。 デヌタベヌスは、ディスクからではなくキャッシュからデヌタを返すず、より高速に動䜜したす。 したがっお、「あるナヌザヌに関するデヌタを取埗する」ずいうリク゚ストが1時間に1回届くず、完璧なタむミングからはほど遠い堎合、りォヌムアップされないため、これを行うためにリク゚ストが数倍遅くなるこずがわかりたす。キャッシュ、すべおがうたく機胜したせん。



100台の車を配達し、むンフラストラクチャに適切な倉曎を加え、䜜動䞍胜なシステムを受け取ったため、すぐにやり盎す必芁があるずいう問題がありたす。



そしお、䞀般的に、このケヌスははるかに広いです。 最初に圌らは砎片に䞀぀の鍵を芋たした、そしお圌らは実際には完党に異なる䜕かをする必芁があるこずに気づきたした。 それぞれ、やり盎し始めたした。 Webが動いおいるタヌゲットであり、実際、蚭蚈よりも速く条件が倉化するため、もう䞀床別の方法で必芁であるこずがわかりたした。



したがっお、私の兞型的なアドバむスは、最初に通垞のリレヌショナルベヌスで1台のマシンのリ゜ヌスたで拡倧し、そのペヌスでどこに到達するかを確認するこずです。 次に、この車のアップグレヌドにかかる費甚ず、よりファッショナブルなハヌドりェアでより良く、より速く生きるこずができる金額をそれぞれ蚈算したす。 そしお、これを蚈算した埌、その埌のみスケヌリングに぀いお決定したす。



そしお、このアプロヌチは実際には耇数のプロゞェクトを節玄したした。なぜなら、早​​すぎるスケヌリングは倚くのチヌムリ゜ヌスず倚くのお金を必芁ずし、結局はより高䟡で悪くなるだけだからです。







2番目のポむントは、ランキングでも十分高い。 これらは「れロからのビッグデヌタ」のケヌスです。 䌁業は「垞時デヌタ」を持ちたいず考えおいたす。 兞型的なストヌリヌ-いく぀かの統蚈を考慮し、収集したすが、ナヌザヌアクティビティ、タむムむンベントリ、䞀般的には知りたせん。 実際、そこには新しいデヌタがあるので、そこからの集蚈のみが必芁です。それは、先日、先週、最埌の1時間です。 それ以倖はすべお事前に蚈算された単䜍です。 そしお、これらのナニットを幎に1回再集蚈する必芁がありたす。 他のケヌスでは、それらはたったく数えられないこずがわかりたしたが、数テラバむトを保持しおいるため、単にそこに暪たわっおいたした。 これは、䞍良バッグデヌタの兞型的な䟋です。



このタスクをビゞネスに説明するのはプログラマヌのタスクです。ビゞネスがデヌタを倱い、分析を蚈算しないずいう恐怖は完党に明癜だからです。 デヌタはお金で、すべおがシンプルです。 しかし、同時に、4テラバむトを保持する代わりに、さたざたな興味深いこずを行うこずができたす。 デヌタを正しくアヌカむブでき、生デヌタをアヌカむブマシンのどこかに保存するこずもできるため、必芁に応じお、それらに基づいお集蚈を再蚈算できたす。これは、突然新しい集蚈が必芁になった堎合に、統蚈などに䜿甚したす。 しかし、その結果、到着したばかりのホットデヌタは4テラバむトではなく100ギガバむトを占有し、これを扱うのがはるかに簡単になりたす。



さらに、倚くのデヌタベヌス、たずえば同じPostgreSQLには、これを可胜にする倚くの自動ツヌルがありたす。 たずえば、PL /プロキシを䜿甚するず、アヌカむブされたデヌタをリモヌトマシンに転送し、必芁に応じおそこからデヌタをプルしお、サンプルを返すこずができたす。



これを行うには倚くの方法がありたすが、この状況では、これたたはそのアヌカむブずホットデヌタぞのパヌティション化が非垞に圹立ちたす。 数千倍のサむズのデヌタ​​ベヌスを運甚するためには、このデヌタの倧郚分が本物である堎合、90は必芁ありたせん-垞に苊痛であり、その必芁はありたせん。







圌らは普遍的なアプロヌチを䜿甚するのが奜きです。 Entity-Attribute-Valueは、䞀般に、DBAにずっお灜難です。 プログラマヌは蚭蚈に非垞に興味があるからです。 すべおが普遍的であるため、䜕か新しいものを远加する必芁がある堎合、テヌブルの構造を倉曎する必芁はありたせんが、新しいタむプの属性を远加し、新しい属性を登録し、そこに新しい倀を入れるこずができたす。



良い、䟿利、玠晎らしいですが、結果ずしお、それはすべお巚倧な3぀たたは4぀のタむプがある堎合テヌブルに成長したす。 そしお、あなたのデヌタはすべおそこにあり、あなたは垞にそれらに参加しおいたす。 同時に、実際には、これらのJOINを䜕らかの圢で最適化するこずは非垞に困難です。なぜなら、そのような状況では、ある皮の「テキスト」にデヌタが含たれおいる可胜性が高いからです。 たずえば、それらを異なるタむプに配眮するこずは難しく、そのようなデヌタのむンデックス䜜成効率は、別々のリレヌショナルテヌブルに保持する堎合よりも桁違いに小さくなるためです。



さらに、それが䜕の属性なのかを把握するためにどれだけのドキュメントを保持する必芁があるか想像できたすか。 それでも、特に合理的な説明があれば、リレヌショナルスキヌマ自䜓がある皋床文曞化されたす。 EAVでは、適切なドキュメントがなければ、たったく状況がたったくなく、そのように理解するこずはできたせん。



その結果、EAVを構成するものは䞀般に「コア」ず呌ばれたす。 完党に動䜜しなくなるような状態になるず、誇らしげな名前「core」に名前が倉曎されたす。 そしお、これはすべお異なるアむデアで重み付けされ始めたす。実際には、非正芏化されたデヌタが保存されるため、少なくずも䜕らかの皮類の迅速なアクセスが可胜になりたす。



その結果、蚭蚈の初期の簡玠化から䜕も残っおいたせん。 これはゆっくりず、ひどく機胜し、このスキヌムの倉曎は、倚くの堎合、異なる人々や物事の郚門によっおも曞かれた、完党に独立したばらばらの束に投げ蟌たれなければなりたせん。その結果、そこに述べた目暙を効果的に達成できたせん。







ORMでも同じです。 私は長いホリバヌに行きたくありたせん。ORMを持っおいるのは良いこずでも悪いこずでもありたすが、DBAずしお私はORMが嫌いです。 原則ずしお、ORMで䜕かをすばやくプロトタむプしたいずいう願望を理解しおいたすが、実際には、奇劙な珟象が始たりたす。 ORMはデヌタベヌスの速床を倧幅に䜎䞋させるこずを理解しおおり、プレヌンSQLで䞀郚のク゚リをやり盎し始めおいたす。 さらに良いこずに、適切なク゚リを䜜成するようにORMをトレヌニングしおみおください。 これは、䞀般的にひどいこずです。 ORMによっお生成されたリク゚ストに勇気を持っお奮闘し、それを正しく曞く方法を知っおいる人を芋たこずがありたす。 圌はすでにリク゚ストをしおいお、それを正しく曞いた。 そしお圌は、ORMが同じタむプのリク゚ストを生成し、それが正垞に動䜜するようにORMをトレヌニングしようずしたした。 これの無意味さが完党に明らかになりたす。



さらに、原則ずしお、たずえば、トピックに関する別のレポヌトを読むこずができたす。「ORMがアクセスしたSQLク゚リログで掚枬したしょう」。 これ䞊のスラむドは䜕ですか 䞀般に、倚くのORMはこれによっお眪を犯したす。 しかし、このINが非垞に倧きなサむズになる可胜性があるこずを付け加えるず、ほずんどの堎合、Djangoはこれず同じになりたす。 Ruby on Railsでは、それらは短くなりたす。



実際のずころ、ORMは倚くの方法で掚枬できたすが、このこずは䞀般的に非垞に悪いこずです。 なんで このリストは䜕でも構いたせんから。 オプティマむザは、それをどう凊理するかをたったく知りたせん。 これが䜕らかの皮類のJOINに眮き換えられた堎合、どこにいおも動䜜する可胜性が最も高くなりたす。 䜕らかの圢で最適化できたす。 非垞に汚いハッキングがなければ、このINで䜕もできたせん。 そしおORMで ある皋床、すべおの芁求はそのように行われたす。



぀たり、はい、お気に入りのORMのプロトタむプを䜜成しおください。ただし、いずれにせよ、遅かれ早かれ、いずれにせよ、䞍快で悪くなるこずを理解する必芁がありたす。 そしおパフォヌマンスの面では、䞻なものは悪いです。







ビッグデヌタに関する玔粋なpostgresのこずを次に瀺したす。 PostgreSQLにはそのような自動バキュヌム機胜がありたす。 PostgreSQLは、挿入するず挿入し、曎新するず挿入+削陀したす。 同時に、削陀も削陀ではなく、単にスコヌプからタプルを削陀するだけです。



そしお、非垞に断片化されたテヌブルを取埗したす。 タブレットの実際の実際の倀は100,000である可胜性があり、数癟䞇個の関連性のないタプルが含たれおいるずいう理由だけで、ある皮の地獄ギガバむトの重さがありたす。 圌らはただ運転し、デヌタベヌスを兞型的なビッグデヌタの䟋に倉えたす。



圓然、そこに䜕も蚭定されおいない堎合、すべおがうたく機胜しない堎合、それを悪甚する人々の最初の反応は次のずおりです。「自動バキュヌムをオフにしたしょう 実行時間が最も長いプロセスであるため、すべおに干枉したす。むンデックスを远加するこずはできたせん。autovacuumがテヌブルを通過する堎合、DDLを実行する必芁はありたせん。 オフにしたしょう」



それは非垞に䞍十分に終わり、それに応じお、あなたはそれに぀いおたくさん話すこずができたす。



autovacuumの察凊方法ず察凊方法に関する掚奚事項のリファレンスを次に瀺したす。 䞻なこずは、結果が絶察に怪しいので、䜕らかの方法でそれをオフにする必芁がないこずです。 本圓に必芁のない時系列デヌタを䜿甚するよりも、「すぐに䜿える」ビッグデヌタを取埗し、デヌタベヌスのスペヌスを占有したす。







「参加するのは悪です」 私はこれが私の頭のどこから来たのかを芳察しおいたす。 たずえば、長い間他のバヌゞョン3でMySQLを䜿甚しおいた人々は、倚くの堎合、JOINは悪であるずいう考えを持っおいたす。



ここで䜕が蚀えたすか JOINは良いです。 なぜリレヌショナルモデルがこれほど成功しおいるのですか 関係モデルは、未知のもののように、そのような埌方のものであるず聞いたこずがありたすか スキヌマレスのNoSQLが登堎しおみんなを倒すずいう意芋を誰もが聞いたこずがあるず思いたす。 発生したせん。



なんで デヌタは1぀の方法で䟿利に保存されたす-ディスク䞊のブロックの圢で、別の方法で、できればより高いレベルで取埗するのが䟿利だからです。 したがっお、異なるテヌブルなどから高レベルの方法でデヌタを取埗する堎合、最適化を行うにはリレヌショナルモデルが非垞に䟿利です。 そしお、リレヌショナルモデルを䜿甚する堎合、それを最倧限に掻甚する必芁がありたす。



JOINの代わりに䜕ができたすか ずおも簡単です。 私たちは、お気に入りのプログラミング蚀語、アプリケヌションサヌバヌ、バック゚ンド-どこでも-2枚たたは3枚のプレヌトからデヌタを取り蟌みたす。 実際、それらはすでにアプリケヌションに存圚し、スペヌスを占有するなどしおいたす。これらのプレヌトは簡単に倧きくなる可胜性がありたす。 ぀たり、実際には最埌に10行を取埗する必芁があり、巚倧なシヌトを匕き出したす。



そしお、手䜜業でJOINを行いたす。そのような「手䜜業による日没」です。 最初にサむクルを歩き始め、それが遅いこずに気づき、そこである皮のハッシュアルゎリズムを発明し始めたす。



実際、「フルサむズのラむブモデルの蒞気゚ンゞン」などのデヌタベヌスを発明し始めおいたす。 それでも、オプティマむザヌはJOINアルゎリズムネストされたルヌプ、ハッシュ、マヌゞ、たたはその他のパラメヌタヌを遞択するためにパラメヌタヌの束に関する情報を収集するため、やや悪いでしょう。 プログラミング蚀語では、すべお自分で曞き盎したす。 そしお、これはなぜですか



しかし、誰もこれを芋たこずがない人はいたすか たっすぐに 他の誰もが少なくずも䞀床はどこかでこれに䌚った。 , -.



, . SQL – . , , JOIN , , .







– . Slony? PostgreSQL , , , , Slony, . , . trigger based , .



, , , ( , ), - .



PostgreSQL , , : Shipping Log' Hot Standby', Slony, Londiste PgQ, , . , , , Shipping' Log'. , , - , - .



, , - . , . – . , . , , - - , , , -. - . , , , -, .



, - , - , , .



, , , SQL. , - , , - , , SQL. , , , , .



- – . , – , , , , . – . , SQL statement', , , 8- , , redo . , , slave . , . . , .







, , .



, EXPLAIN. , , . , , . , , , , production 100 . , , , , , , , - . .



, Highload++ Junior 2016 . — 2016 YouTube.


, – , workload . , , , . - , , , , , . , , - , .



, , - production DBA. – . , , , , , «, », , - . これは間違っおいたす。



, - , , , - . , PostgreSQL pg_stat_statements, , – : , ; .



, , « ». , . production, , .







Java-. pretending to be smart. , – - , - .



Java. Java , , Java' , , , . . , , , . , , – . , . : 10 . , 10 . 10 .



? , , . ́ . , .



– . . : , . – . なに なんで



DBA , ? ( - , – PostgreSQL , , BEGIN, EXPLAIN ANALYZE ROLLBACK, ) . , . – .



, , , . . . , , , Python' , .



, , , , , , , , / .







, , . , .



, - , , . – , . -. , - - ? . - , - .. , ? . 明らかに。



EXPLAIN - , , ETL, - - , , – - ?



, . , : , - , - ; . , , - . , .



count(*), , - , . .



. , , . , . PostgreSQL , , , - , , , .



– . , 261 526 , , , 15 . , ?



count(*) – . count(*) – Seq Scan ( PostgreSQL), . count(*) . 20 ? , .



? ?



. . SQL- -, ! . , , - . . , , , , , . .



: «Know your data!» , .



- ( - Oracle , , Orace , SQL- ..; , – !) : « , SQL-?». : « , , ».



, , , , , , , , . , PostgreSQL , , .



. . ありがずう .



: , autovacuum . append-only, ?



: . .



, .



-, , . . , append , , .



-, pg_catalog, . . autovacuum, . - pg_class , . , .



. , - , , , autovacuum . , , , 90% autovacuum, autovacuum performance , , . .



: . , ?



: , , , , , , . : , , , , . .



: , . . ? , - , , - . - , , «», , - , - . , .



PL/Proxy , , , ? - ?



: . -, – - , , , , . « ».



, . – , , .



concurrency , – , – . , , .



, , , PL/Proxy. , , , , , . この技術は䜕ですか , , , PL/Proxy, , PL/pgSQL, . , , . , Microsoft. .



, , VIEW UNION' , , , , PL/Proxy. , , , WHERE, , . – PL/Proxy , , , UNION . , .



: , , - - ? ? ?



: , , , , , , .



, , . , – . . . , - , . : SSD , , , - .



, «» – , , , , .



, PostgreSQL - , – , , 30 , - , – , , . . .



, , , - workload. , , UTP-, master. - , , , , , , , .



, . , . – , , UTP, , , . .



: , . PL/Proxy foreign data wrapper? ?



: foreign data wrapper, . PL/Proxy , , autocommit, , RPC, . foreign data wrapper – , -, , -, , , .



Foreign data wrapper PostgreSQL . , , – , .



, foreign data wrapper , foreign data wrapper , .



: PL/Proxy , ?



: , , , , .



: : , - shared storage - OCFS2, OCFS2 read-only .



: . , - table space - , latency, .



: ?



: , table space ? , read-only. - table space, page, , .



: Oracle - ?



: . Oracle RAC, .



: - ORM? ORM, ? production ? ?



: , , . -. , ORM , -, ORM, , – . .



, ORM , SQL – , Java , , . « ». , , , .



: , ORM, ; , ORM, . , - ORM . , 90% , ORM, .



, – , ORM , – , , . . – , SQL , , , - .



ORM . - , , . , , , – , .



– . -, , . . - .





» hydrobiont

» ik@postgresql-consulting.com



— HighLoad++ Junior .



, , HighLoad++ Junior HighLoad++ .



? — 5 6 ? .



( :) — , , highload-. — .



, Project1917 (http://project1917.ru/), Nginx+MySQL+Laravel+AngularJS . , highload — , ( ) .



: HTTP- , , HTTP- , , MySQL .



, , ! !




All Articles