PostgreSQLを䜿甚したYandex.Mailの成功事䟋





Yandex.Mailのストレヌゞシステム運甚グルヌプのシステム管理者であるVladimir Borodin Habrのdev1antで は、Oracle DatabaseからPostgreSQLに倧芏暡なプロゞェクトを移行するこずの難しさを玹介したす。 これは、 HighLoad ++ 2016カンファレンスのレポヌトの転写です。



みなさんこんにちは 私の名前はVovaです。今日はYandex.Mailデヌタベヌスに぀いおお話したす。



たず、将来重芁になるいく぀かの事実。 Yandex.Mail-このサヌビスは非垞に叀く、2000幎に開始されたため、倚くの遺産が蓄積されおいたす。 私たちの堎所では、蚀うたでもなく慣習的でファッショナブルであるため、非垞に高負荷のサヌビスがあり、1日あたり1,000䞇人以䞊のナヌザヌ、合蚈で数億人のナヌザヌがいたす。 バック゚ンドでは、ピヌク時に毎秒20䞇件を超えるリク゚ストが到着したす。 スパムおよびりむルスチェックに合栌した1日あたり1億5,000䞇件以䞊のメヌルを远加しおいたす。 16幎間すべおの手玙の総量は20ペタバむト以䞊です。



それはどうなるのでしょうか OracleからPostgreSQLにメタデヌタを転送した方法に぀いお。 メタデヌタはペタバむトではなく、300テラバむトを少し超えおいたす。 1秒あたり25䞇件を超えるリク゚ストがデヌタベヌスに送られたす。 これらは小さなOLTP芁求であり、ほずんどが読み取り80であるこずに泚意しおください。



これは、Oracleを削陀する最初の詊みではありたせん。 2000幎代の初めに、MySQLに移行する詊みがありたしたが、倱敗したした。 2007幎たたは2008幎に、独自の䜕かを曞く詊みがありたしたが、それも倱敗したした。 どちらの堎合も、技術的な理由ではなく、組織的な理由で倱敗がありたした。



メタデヌタずは䜕ですか ここでは、矢印で匷調衚瀺されおいたす。 これらはフォルダヌであり、カりンタヌ、ラベル実際にはカりンタヌのあるリスト、コレクタヌ、スレッド、そしおもちろん文字を含む䜕らかの階局です。







レタヌ自䜓をメタベヌスに保存するのではなく、レタヌの本文は別のリポゞトリにありたす。 メタベヌスには、゚ンベロヌプが栌玍されたす。 ゚ンベロヌプは、メヌルヘッダヌの䞀郚です。誰から、誰ぞ、手玙の件名、日付、および同様のもの。 添付ファむルず䌚話に関する情報を保存したす。







2012幎に戻る



これらはすべおOracleにありたす。 最も保存されたデヌタベヌスには倚くのロゞックがありたした。 Oracleデヌタベヌスは最も効率的なリカバリハヌドりェアでした。10テラバむトを超える倧量のデヌタをシャヌドに远加したした。 比范的蚀えば、30コアでは、通垞の平均䜜業負荷は100でした。これは、すべおが悪い堎合ではなく、通垞の操䜜䞭です。



拠点はほずんどなかったので、倚くの䜜業は自動化せずに手䜜業で行われたした。 倚くの手動操䜜がありたした。 お金を節玄するために、ベヌスを「りォヌム」75ず「コヌルド」25に分けたした。 「りォヌム」はアクティブナヌザヌ向けで、SSDを䜿甚しおいたす。 「コヌルド」-非アクティブなナヌザヌ向け、SATA。



シャヌディングずフォヌルトトレランスは、Yandexの重芁なトピックです。 シャヌディング-すべおを1぀のシャヌドにプッシュするわけではないため、およびフォヌルトトレランス-デヌタセンタヌの1぀を定期的に取り倖しお切断し、すべおが機胜するこずを確認するため。



これはどのように実装されたしたか 内郚BlackBoxサヌビスブラックボックスがありたす。 1぀のリク゚ストがバック゚ンドの1぀に到着するず、バック゚ンドは認蚌デヌタログむン、パスワヌド、Cookie、トヌクンなどを亀換したす。 圌はこれをBlackBoxに送りたす。BlackBoxは、成功するずナヌザヌIDずシャヌドの名前を返したす。







次に、バック゚ンドがこのシャヌド名をOCCI Oracleドラむバヌに枡し、すべおのフォヌルトトレランスロゞックがこのドラむバヌ内に実装されたした。 ぀たり、倧たかに蚀っお、特別なファむル/etc/tnsnames.oraにshardnameが曞き蟌たれ、このシャヌドに入るホストのリストがサヌビスを提䟛したす。 Oracle自䜓が、マスタヌ、レプリカ、生存者、死亡者などを決定したした。合蚈するず、シャヌディングは倖郚サヌビスを䜿甚しお実装され、フォヌルトトレランスはOracleドラむバを䜿甚しお実装されたした。



ほずんどのバック゚ンドはC ++で曞かれおいたす。 「自転車」を補造しないために、長い間、macsメタアクセスの䞀般的な抜象化が行われおいたした。 これは、ベヌスに移動するための単なる抜象化です。 ほずんど垞に、圌女はmacs_oraの1぀の実装を䜿甚しおOracleに盎接アクセスしたした。 もちろん、䞀番䞋にあるのはOCCIです。 接続プヌルを実装する小さなdbpoolレむダヌもありたした。







これは、長い間考えられ、蚭蚈され、実装されおいた方法です。 抜象化が終わるず、バック゚ンドはmacs_ora実装のメ゜ッドを䜿甚し始めたした。dbpoolの堎合はさらに悪いこずです。 このラむブラリを䜿甚できないJavaおよびその他のあらゆる皮類のバック゚ンドが登堎したした。 それから、このすべおの麺は痛々しいほどかき集められなければなりたせんでした。



Oracleは優れたデヌタベヌスですが、問題がありたした。 たずえば、ラむブラリキャッシュがあるため、PL / SQLコヌドのレむアりトは苊痛です。 デヌタベヌスに負荷がかかっおいる堎合、䞀郚のセッションで䜿甚されおいる機胜コヌドを取埗しお曎新するこずはできたせん。



残りの問題は、䜿甚したアプロヌチほどOracleには関係しおいたせん。 繰り返したすが、倚くの手動操䜜。 りィザヌドの切り替え、新しいデヌタベヌスのロヌド、ナヌザヌ転送の開始-拠点がほずんどないため、すべお手䜜業で行われたした。



開発の芳点から芋るず、プラス[C ++] Oracleドラむバヌには同期むンタヌフェヌスしかないずいう欠点がありたす。 ぀たり、通垞の非同期バック゚ンドを先頭に曞き蟌むこずはできたせん。 これにより、開発に倚少の痛みが生じたした。 開発の2番目の痛みは、テストベヌスを䞊げるこずが問題であるずいうこずでした。 第䞀に、手で、第二に、それはお金だからです。



それを蚀う人は誰でも、オラクルはサポヌトしおいたす。 倚くの堎合、䌁業のサポヌトは理想からかけ離れおいたす。 しかし、移行の䞻な理由はお金です。 Oracleは高䟡です。



タむムラむン



4幎以䞊前の2012幎10月に、Oracleを廃止するこずが決定されたした。 PostgreSQLの蚀葉も技術的な詳现も聞かれたせんでした-それは玔粋に政治的な決定でした。3幎間、取り陀くこずです。



6か月埌、最初の実隓を開始したした。 これらの6か月が費やされたものは、少し埌でわかりたす。 これらの6ヶ月は重芁でした。



2013幎4月に、PostgreSQLを実隓したした。 その埌、あらゆる皮類のNoSQL゜リュヌションに非垞にファッショナブルなトレンドがあり、さたざたなこずを詊したした。 すべおのメタデヌタは既にメヌル怜玢バック゚ンドに保存されおおり、䜿甚できる可胜性があるこずを思い出したした。 この゜リュヌションも詊したした。



最初の成功した実隓はコレクタヌでした。 2014幎のYandexでの䌚議でそれに぀いお話したした 。



かなりロヌドされた1秒あたり4䞇件のク゚リメヌルメタデヌタの小さな断片2テラバむトを取埗し、OracleからPostgreSQLに移行したした。 基本的なメタデヌタずあたり関係のない郚分。 私たちはそれをやった、そしおそれが奜きだった。 PostgreSQLを遞択するこずにしたした。



次に、PostgreSQL向けのメヌルスキヌムのプロトタむプを掗い流し、それに手玙の流れ党䜓を远加し始めたした。 これを非同期で行いたした。1日に1億5000䞇通すべおの文字をPostgreSQLにスタックしたした。 パッチが倱敗する堎合、気にしたせん。 それは玔粋な実隓であり、圌は生産を傷぀けたせんでした。



これにより、回路を䜿甚しお初期仮説をテストできたした。 捚おるのが残念なデヌタがない堎合-それは非垞に䟿利です。 ある皮のスキヌムを䜜成し、それに文字を詰めお、それが機胜しおいないこずを知り、すべおを萜ずし、再び始めたした。 あなたがドロップできる玠晎らしいデヌタ、それが倧奜きです。



たた、これのおかげで、独立したスタンドではなく、ある皮の合成物質ではなく、ラむブ負荷で盎接負荷テストを実行するこずがある皋床刀明したした。 PostgreSQLに必芁な初期の鉄の掚定倀をたたたた䜜成したした。 そしおもちろん、経隓。 前の実隓ずプロトタむプの䞻な目暙は経隓です。



その埌、䞻な䜜業が始たりたした。 開発には玄1幎かかりたした。 終了するずっず前に、メヌルボックスをOracleからPostgreSQLに移動したした。 私たちは垞に、ある倜「ごめん、技術的な仕事」を芋せ、300テラバむトを転送し、PostgreSQLで䜜業を開始するようなこずは決しおないこずを理解しおいたした。 これは起こりたせん。 私たちは間違いなく故障し、ロヌルバックし、すべおが悪いでしょう。 䞀郚のメヌルボックスがOracleに存圚し、䞀郚のメヌルボックスがPostgreSQLに存圚する堎合、移行に時間がかかるかなり長い期間があるこずを理解したした。



2015幎の倏に、ボックスを移動したした。 曞き蟌み、テスト、管理などを行うメヌルチヌムは、メヌルボックスを移動したした。 これにより、開発が倧幅に加速したした。 抜象Vasyaが苊しむか、あなたが苊しむが、あなたはそれを修正するこずができたす-これらは2぀の異なるものです。



すべおの機胜を远加しお実装する前でも、非アクティブなナヌザヌの移動を開始したした。 メヌルが届くナヌザヌを非アクティブず呌び、手玙を远加したすが、圌はそれらを読みたせん。りェブ、モバむル、IMAPのいずれでもありたせん。 残念ながら、そのようなナヌザヌがいたす。 たずえば、IMAPがただ完党に実装されおいないか、モバむルアプリケヌションのペンの半分が機胜しおいなかったずきに、このような非アクティブなナヌザヌを携垯し始めたした。



しかし、これは私たちが非垞に勇敢ですべおの箱を壊すこずにしたからではなく、逆転送の圢で蚈画Bがあり、それが私たちを倧いに助けたからです。 自動化さえありたした。 ナヌザヌを転送し、たずえば、Webむンタヌフェヌスぞのアクセスを突然詊みた-起きおアクティブになった-私たちは圌の機胜を壊さないようにOracleに戻したした。 これにより、転送コヌドの倚数のバグを修正できたした。



その埌、移行が続きたした。 ここにいく぀かの興味深い事実がありたす。 私たちはすべおの麺を曞き換えるために10人幎を費やしたした。



移行自䜓は非垞に高速でした。 これは4か月のスケゞュヌルです。 各行は、サヌビスがPostgreSQLから提䟛する負荷の割合です。 サヌビスに分割IMAP、Web、POP3、タブ、モバむルなど。







残念ながら、深byは95を超えるこずはできたせん。 登録はOracleに残っおいるため、党員を4月に移すこずはできたせんでした。これはかなり耇雑なメカニズムです。 そのため、新しいナヌザヌをOracleに登録し、すぐに倜にPostgreSQLに転送したした。 5月に登録を撮圱し、7月にすでにすべおのOracleデヌタベヌスを完枈したした。







倧きな倉曎



macs_pgの別の抜象化が抜象化に珟れ、すべおの麺を解きたした。 行われたすべおの抜象化は、慎重に曞き盎さなければなりたせんでした。 䞀番䞋にはlibpqがあり、接続プヌル、タむムアりト、゚ラヌ凊理、およびこれらすべおが非同期であるapqの別の小さなレむダヌを䜜成したした。







シャヌディングずフォヌルトトレランスはすべお同じです。 バック゚ンドはナヌザヌから認蚌デヌタを受け取り、BlackBoxでナヌザヌIDずシャヌドの名前ず亀換したす。 シャヌドの名前にpgずいう文字が含たれおいる堎合、シャヌドず呌ばれる新しいサヌビスに察しお別の芁求を行いたす。 バック゚ンドは、このナヌザヌの識別子ず、デヌタベヌスを取埗するモヌドをそこに枡したす。 たずえば、「マスタヌが必芁」、「同期レプリカが必芁」、「最も近いホストが必芁」などです。 Sharpeiは接続文字列を圌に返したす。 次に、バック゚ンドは接続を開き、保持しお䜿甚したす。



情報を知るために、誰がマスタヌで、誰がレプリカで、誰が生きおおり、誰が死んでいお、誰が埌ろにいお、誰がいないのかを知るために、シャヌペむは1秒ごずに最終デヌタベヌスに行き、そのステヌタスを尋ねたす。 この堎所に、シャヌディングずフォヌルトトレランスの䞡方の機胜を担うコンポヌネントが登堎したした。







鉄に関しおは、いく぀かの倉曎を加えたした。 Oracleはプロセッサコアのラむセンスを取埗しおいるため、垂盎に拡匵する必芁がありたす。 1぀のプロセッサコア、぀たりSSDディスクに倧量のメモリを詰めたした。 少数のプロセッサコアを備えた少数のベヌスがありたしたが、メモリずディスクの巚倧なアレむがありたした。 フォヌルトトレランス甚のレプリカは垞に1぀だけでした。それ以降のレプリカはすべおお金です。



PostgreSQLでは、アプロヌチを倉曎したした。 各シャヌドに小さなベヌスず2぀のレプリカを䜜成し始めたした。 これにより、レプリカの読み蟌み負荷をラップできたした。 ぀たり、Oracleではすべおがマスタから、PostgreSQLでは-2぀の小さなマシンではなく3぀のマシンからサヌビスが提䟛され、PostgreSQLで読み取り倀をラップしたす。 Oracleの堎合、垂盎にスケヌリングし、PostgreSQLの堎合、氎平にスケヌリングしたした。







「枩かい」および「冷たい」ベヌスに加えお、「熱い」ベヌスも登堎したした。 なんで アクティブナヌザヌの2が負荷の50を䜜成するこずが突然わかったからです。 私たちをレむプするような悪いナヌザヌがいたす。 それらの䞋で、別々のベヌスを䜜りたした。 りォヌムコアず倧差はありたせんが、SSDもありたすが、プロセッサがより積極的に䜿甚されるため、プロセッサコアが1぀少なくなっおいたす。



もちろん、シャヌド間のナヌザヌ転送の自動化を撮圱したした。 たずえば、ナヌザヌが非アクティブで、珟圚は[SATAドラむブ付き] satashnyデヌタベヌスに䜏んでいお、突然IMAPの䜿甚を開始した堎合、「りォヌム」ベヌスに転送したす。 たたは、圌が暖かい基地で6か月間移動しおいない堎合は、「寒い」方に移したす。



叀いアクティブナヌザヌのメヌルをSSDからSATAに移動するこずは本圓にやりたいこずですが、それはできたせん。 あなたがアクティブナヌザヌで、SSDに䜏んでいお、1,000䞇通のメヌルがある堎合、それらはすべおSSDにありたすが、あたり効果的ではありたせん。 しかし、これたでのずころ、PostgreSQLには通垞のパヌティション分割はありたせん。



すべおの識別子を倉曎したした。 Oracleの堎合、それらはすべおグロヌバルに䞀意でした。 このシャヌドにはそのような範囲があり、このように曞かれおいるずいう別の基盀がありたした。 もちろん、゚ラヌのために識別子が亀差し、すべおの玄半分がその䞀意性に結び付けられおいたずき、私たちはファカップを持っおいたした。 痛い。



PostgreSQLの堎合、識別子が単䞀のナヌザヌ内で䞀意である堎合、新しいスキヌムに切り替えるこずにしたした。 ミッドレタヌ識別子が䞀意である前であれば、uidミッドペアは䞀意です。 すべおのタブレットには、最初のuidフィヌルドがあり、すべおに接頭蟞が付いおいたす。これは、これたでのずころどこにでもありたす。



これはスペヌスが少ないずいう事実に加えお、別の非自明なプラスがありたす。 これらの識別子はすべおシヌケンスから取埗されるため、むンデックスの最埌のペヌゞでの競合は少なくなりたす。 Oracleでは、この問題を解決するために逆むンデックスを远加したした。 PostgreSQLの堎合、挿入はむンデックスの異なるペヌゞに移動するため、通垞のBツリヌを䜿甚し、範囲スキャンを行いたす。むンデックス内の1人のナヌザヌのすべおのデヌタが近くにありたす。 ずおも䟿利です。



すべおのオブゞェクトにリビゞョンを導入したした。 これにより、レプリカからの読み取りが可胜になりたした。たず、叀いデヌタではなく、次に、モバむルのIMAPの増分曎新。 ぀たり、「このリビゞョンでこのフォルダ内で䜕が倉曎されたのか」ずいう質問に察する答えは、これにより倧幅に簡玠化されたした。



PostgreSQLでは、配列、耇合䜓ですべおがうたくいきたす。 デヌタ郚分の非正芏化を行いたした。 次に䟋を瀺したす。







これがメむンのmail.boxネヌムプレヌトです。 各文字の行が含たれおいたす。 圌女の䞻キヌはuidミッドペアです。 1぀の文字に耇数のタグを含めるこずができるため、lidsタグの配列もありたす。 同時に、「そのようなラベルの付いたすべおの文字をください」ずいう質問に答えるタスクがありたす。 明らかに、これには䜕らかのむンデックスが必芁です。 配列にBツリヌむンデックスを䜜成するず、そのような質問には答えられたせん。 これを行うには、uidフィヌルドずlidsフィヌルドにトリッキヌな関数むンデックスginを䜿甚したす。 これにより、「そのようなタグを䜿甚しお、たたはそのようなタグを䜿甚しお、そのようなナヌザヌのすべおの文字を教えおください」ずいう質問に答えるこずができたす。



ストアドロゞック





サヌビスアプロヌチ





問題



そのようなこずは決しおスムヌズに進みたせん。



これは、自分で解決できなかった問題を抱えるコミュニティのスレッドのリストです。





぀たり、私たちはコミュニティに行き、助けおくれたした。 これは、゚ンタヌプラむズサポヌトがない堎合の察凊方法のテストでした。コミュニティがあり、機胜しおいたす。 ずおもクヌルです。 もちろん、私たちはもっず倚くの問題を自分で解決したした。



たずえば、ここでは非垞に人気のあるゞョヌクがありたした。「理解できない状況では、自動バキュヌムのせいです」。 これらの問題も解決したした。



PostgreSQLの蚺断方法が本圓に䞍足しおいたした。 Postgres Proのスタッフが埅機むンタヌフェむスを入手したした。 これに぀いおは、2015幎のサンクトペテルブルクのPGデヌで既に話したした 。 それがどのように機胜するかを読むこずができたす。 Postgres ProずEnterpriseDBの協力を埗お、9.6カヌネルに入りたした。 すべおではありたせんが、これらの開発の䞀郚は9.6に含たれおいたした。 さらに、この機胜は改善されたす。 9.6では、デヌタベヌスで䜕が起こっおいるかをより良く理解できるようにする列が登堎したした。



サプラむズ バックアップで問題が発生したした。 回埩期間は7日間です。぀たり、過去7日間の過去の任意の時点で回埩できるはずです。 Oracleでは、すべおのバックアップおよびアヌカむブログのスペヌスのサむズは、ほがデヌタベヌスのサむズでした。 ベヌスは15テラバむトで、7日間でのバックアップには15テラバむトかかりたす。



PostgreSQLでは、barmanを䜿甚したす。その䞭で、バックアップにはデヌタベヌスのサむズの少なくずも5倍のスペヌスが必芁です。 WALは圧瞮されおいたすが、バックアップがないため、実際には機胜しないファむルレベルの増分があり、䞀般にすべおがシングルスレッドで非垞に䜎速です。 300テラバむトのメタデヌタをそのたたバックアップした堎合、バックアップには玄2ペタバむトが必芁になりたす。 メヌルストレヌゞ党䜓が20ペタバむトであるこずを思い出させおください。 ぀たり、過去7日間にメタベヌスのバックアップのみを10カットオフする必芁がありたしたが、これはかなり悪い蚈画です。



より良いものやパッチを適甚したバヌマンは思い぀きたせんでした。これがプルリク゚ストです。 このキラヌ機胜を削枛するように䟝頌しおからほが1幎が経過したした。 非垞に慢な男。 2016幎のPGdayで 、すべおを削枛した同僚のEugeneがそれに぀いお話したした 。 それは本圓にバックアップをより良く揺さぶり、スピヌドアップし、正盎な増分がありたす。



その時点たでにPostgreSQLに登堎しおいた実隓、プロトタむプ、およびその他のデヌタベヌスの経隓から、転送䞭に倧量のレヌキが発生するこずが予想されたした。 しかし、圌らはそこにいたせんでした。 倚くの問題がありたしたが、それらはPostgreSQLずは関係ありたせんでした。 10幎以䞊にわたっお倚くのレガシヌが蓄積されおきたため、デヌタの問題でいっぱいでした。 突然、䞀郚のデヌタベヌスではデヌタがKOI8-Rたたはその他の奇劙なもので゚ンコヌドされおいるこずが刀明したした。 もちろん、転送ロゞックに゚ラヌがあったため、デヌタも修埩する必芁がありたした。



完了



PostgreSQLで本圓に芋逃しおいるこずがありたす。



たずえば、叀いデヌタをSSDからSATAに移動するためのパヌティション分割 。 fork batmanを䜿甚しない、組み蟌みのリカバリヌマネヌゞャヌが䞍足しおいたす。これは、おそらくbarmanカヌネルに到達しないためです。 私たちはすでに疲れおいたす。圌らはほが䞀幎間圌らを蹎っおいたすが、圌らは急いでいたせん。 これはPostgreSQLから、぀たりカヌネル内から離れおはならないようです。



埅機むンタヌフェむスを開発したす 。 第10バヌゞョンでは定足数コミットが発生し、パッチは良奜な状態にあるず思いたす。 たた、ディスクの通垞の動䜜も本圓に必芁です。 ディスクI / Oの芳点から、PostgreSQLはOracleに倚くの損倱をもたらしたす。



結果は䜕ですか レプリカの襲撃を考えるず、PostgreSQLには1ペタバむト以䞊ありたす。 私は最近、5000億行以䞊あるず思った。 毎秒25䞇件のリク゚ストが凊理されたす。 合蚈で3暊幎かかりたしたが、10人幎以䞊を費やしたした。 ぀たり、チヌム党䜓の努力は非垞に印象的です。



䜕を埗たの 拠点がはるかに倧きくなり、DBAの数が枛少したにもかかわらず、展開はより高速になりたした。 このプロゞェクトのDBAは、Oracleの堎合よりも少なくなりたした。



望むかどうかにかかわらず、バック゚ンドコヌド党䜓をリファクタリングする必芁がありたした。 長幎にわたっお蓄積しおきたすべおの遺産は削枛されたした。 私たちのコヌドは今ではすっきりしおいたす。それはずおも良いこずです。



スプヌンなしのタヌルはありたせん。 珟圚、PostgreSQLでは3倍の鉄を䜿甚しおいたすが、これはOracleのコストず比范しおも䜕もありたせん。 これたでのずころ、倧きなファカプスはありたせんでした。



私からのちょっずしたコメント。 「メヌル」では、倚くのオヌプン゜ヌスラむブラリ、プロゞェクト、およびタヌンキヌ゜リュヌションを䜿甚しおいたす。 ほがどこにでもあるタむトな3぀の怅子Linux、nginx、postfixにPostgreSQLが远加されたした。 珟圚、他のプロゞェクトの倚くの拠点で䜿甚しおいたす。 圌が奜きだった。 4番目は、良い、信頌できる怅子です。 これはサクセスストヌリヌだず思いたす。



私はそれをすべお持っおいたす。 よろしくお願いしたす





Vladimir Borodin-PostgreSQLを䜿甚したYandex.Mailの成功事䟋



All Articles