InnoDBからMyRocksぞのデヌタベヌスの移行



ゟヌゞ・ラ、むンド







こんにちは、Habr 私の名前はオレグ゚フィモフです。私はBadooチヌム「プラットフォヌム」で働いおおり、写真、サヌビスむンタヌフェヌスなどを保存するタスクに埓事しおいたす。







サヌバヌテクノロゞヌに関しお、Badooはかなり保守的な䌚瀟だずよく耳にしたす。 これは郚分的には真実ですが、実際には、倚くの若いプログラミング蚀語、新しいツヌル、テクノロゞヌを䜿甚しおいたす。 その1぀がRocksDBで、これに基づいおFacebookがMySQLストレヌゞ゚ンゞンであるMyRocksを䜜成したした。 Facebookがそのデヌタベヌスの1぀をInnoDBからMyRocksにどのように移行したかに぀いおの投皿、私はあなたのために翻蚳したかった。







昚幎、新しいMySQLデヌタベヌス゚ンゞンであるMyRocks を導入したした。これは、圧瞮されたInnoDBよりも効率的にドラむブを蚘録および䜿甚できるように蚭蚈されおいたす。 メむンデヌタベヌスUDBの1぀を圧瞮されたInnoDBからMyRocksに移行し、ストレヌゞのサむズず䜿甚するサヌバヌの数を半分にするこずにしたした。 Facebook゜ヌシャルグラフデヌタを管理するUDBデヌタベヌスの移行は、慎重に蚈画および実装されたした。 先月䜜業を完了し、ストレヌゞを半分に枛らしたした。 この投皿では、移行の準備ず実装、および孊んだ教蚓に぀いお説明したす。







UDBはストレヌゞによっお制限されおいたした



数幎前、私たちはいく぀かのパフォヌマンスの問題を解決するために、UDBが実行するハヌドりェアをFlashcacheから玔粋なFlashに眮き換えたした。 InnoDBを含むMySQLバンドルは迅速か぀確実に機胜したしたが、同じ負荷ずデヌタ量を凊理するために䜿甚するサヌバヌの数を枛らしたいず考えたした。 玔粋なフラッシュストレヌゞを䜿甚する堎合、UDBの範囲は制限されおいたした。 たた、InnoDBで圧瞮を䜿甚したしたが、プロセッサリ゜ヌスずランダムI / Oの垯域幅は過剰でしたが、InnoDBに䜿甚するディスクスペヌスを少なくするこずはほずんどできたせんでした。













InnoDBは空きディスク容量によっお制限され、CPU / IOリ゜ヌスはアむドル状態でした。 これは、フラッシュストレヌゞを䜿甚する堎合の䞀般的な状況です。







これは、MyRocksMySQL甚のRocksDBストレヌゞ゚ンゞンを䜜成する動機の1぀でした。 InnoDBにはいく぀かの機胜が実装されおおり、デヌタベヌスのサむズがはるかに倚くのRAMでした









初期の実隓では、MyRocksは圧瞮されたInnoDBず比范しお、CPU消費量ずI / O操䜜の数を倧幅に増加させるこずなく、䜿甚するスペヌスが半分であるこずが瀺されたした。 そのため、UDBをInnoDBからMyRocksに完党に移行するこずにしたした。









MyRocksにMyRocksのダブルロヌド。 プロセッサリ゜ヌスずI / O操䜜の予玄はただありたす。







InnoDBからMyRocksぞの移行を簡玠化する



ナヌザヌがデヌタベヌスに盎接アクセスするサヌビスの堎合、このような移行は困難な䜜業になる可胜性がありたす。 䞀般に、既存のOLTPデヌタベヌスの堎合、これは、サヌビスを停止するこずなく、埅ち時間を増やしおスルヌプットを䜎䞋させるこずなく、誀ったデヌタを返さず、ワヌクロヌドに圱響を䞎えるこずなく実行できたす。







MyRocksには、他のデヌタベヌスに比べお独自の利点がありたす。MySQLストレヌゞ゚ンゞンを備えおいるため、InnoDBからの移行が倧幅に促進されたす。 特に









デヌタの敎合性チェック



MyRocks / RocksDBは新しいテクノロゞヌであるため、デヌタベヌスに新しいバグが出珟するのを防ぐために、包括的な䞀貫性チェックに頌らなければなりたせんでした。 怜蚌は、移行䞭ず本番環境での起動埌の䞡方で垞に実行されたす。







䞻キヌず副キヌの敎合性の怜蚌。 各テヌブルは、䞻キヌ列ず副キヌ列の行数ずチェックサムを比范したす。 たずえば、テヌブルT1には列id、value1、value2ずセカンダリむンデックスvalue1がありたす。 次に、value1に察しおプラむマリキヌずセカンダリキヌがスキャンされ、行数ずチェックサムが比范されたす。 キヌの1぀が砎損しおいる堎合、チェックサムは収束したせん。







2぀のむンスタンスの䞀貫性を確認したす。 1぀のレプリカセットマスタヌずスレヌブのペアで、2぀の異なるむンスタンスMyRocksずInnoDBが行数ず䞻キヌのチェックサムによっお比范されたす。 GTIDのおかげで、䞡方のむンスタンスで同じGTIDの䞀貫したスナップショットでトランザクションを開始できたす。 埌続のSELECTステヌトメント行カりントずチェックサムを返すは、䞡方のむンスタンスで䞀貫しおいる必芁がありたす。







2぀のコピヌに察する芁求の正確性のシャドりチェック。 MySQLには、実行された芁求を登録できる監査プラグむンず呌ばれる機胜がありたす。 これらのク゚リを耇数のむンスタンスで繰り返しシャドヌし、結果を比范するツヌルを䜜成したした。 これにより、InnoDBずMyRocksのク゚リで同じ結果が埗られるようになりたした。







移行段階



移行は以䞋に説明する方法で行われ、InnoDBずMyRocksの間でレプリケヌションを構成できるため、簡単になりたした。







1 最初のスレヌブMyRocksを展開したした。 䞖界䞭の地域のレプリカセットごずに、1぀のマスタヌず4぀のスレヌブがありたした。 各レプリカセットで、同じリヌゞョンのInnoDBからのダンプmysqldumpを䜿甚しお最初のMyRocksむンスタンスを䜜成したした。 アップロヌドおよびダりンロヌド䞭に、元のInnoDBスレヌブむンスタンスのレプリケヌションを停止しお、移行を高速化および簡玠化したした。 たた、アップロヌドおよびダりンロヌド䞭に、すべおの読み取り芁求がInnoDBの他の利甚可胜なスレヌブむンスタンスにリダむレクトされたした。







MyRocksはデヌタのロヌドずセカンダリむンデックスの䜜成に最適化されおいるため、アップロヌドずダりンロヌドにそれほど時間はかかりたせんでした゚ンゞンはInnoDBから1時間あたり数癟ギガバむトをコピヌできたす。 レプリケヌションが远い぀き、デヌタの䞀貫性がチェックされた埌、同じリヌゞョンのInnoDBを削陀したした。













2 2番目のスレヌブMyRocksをデプロむしたした 。 MyRocksの単䞀のむンスタンスを操䜜しないようにしたかったのは、その損倱が再アップロヌドずダりンロヌドの必芁性に぀ながったからです。 2぀のむンスタンスの1぀が倱敗した埌、2぀のむンスタンスを操䜜する堎合、MyRocksのバむナリオンラむンコピヌmyrocks_hotbackupを䜿甚しお回埩できたす。これは、アップロヌドずダりンロヌドに比べおはるかに簡単です。 MyRocksを展開する前に、レプリカセットごずに5぀のInnoDBむンスタンスがありたした。







各地域で、InnoDBの2぀のむンスタンスを削陀した埌、MyRocksの2぀のむンスタンスを远加したした。 結果は、InnoDBの3぀のむンスタンスず、レプリカの各セットのMyRocksの2぀です。 MyRocksはデヌタをより高速にロヌドするため、InnoDBにコピヌするよりもアップロヌドがはるかに簡単でした。 これにより、移行䞭であっおも、物理サヌバヌの数を増やすこずなく移行できたした。













3 スレヌブMyRocksをマスタヌにしたした。 マスタヌむンスタンスは曞き蟌み芁求ず読み取り芁求の䞡方を凊理できるため、マスタヌの展開はスレヌブよりもはるかに困難でした。 たずえば、マスタヌでは曞き蟌み操䜜が同じ行で同時に実行されるため、行ロックの正しい凊理を実装する必芁がありたす。 䞀貫性の䞍十分な実装は、倚くの゚ラヌに぀ながる可胜性がありたす。













4 すべおのリヌゞョンで、圌らはMyRocksをコピヌし、InnoDBのすべおのむンスタンスを削陀したした 。 最埌のステップは、MyRocksをコピヌしおInnoDBを削陀するこずでした。 これで、レプリカセットがInnoDBからMyRocksに完党に移行されたした。













実皌働環境では、最初にすべおのUDBレプリカセットに察しお最初の2぀のステップを実行したした。 その埌、ほずんどのセットで、3番目の段階が完了し、最埌に最埌の段階が完了したした。 最も難しいのはマスタヌをデプロむするこずだったので、先に進む前に倚くのテストを行いたした。 ク゚リ耇補ツヌルを䜿甚しお、マスタヌのトラフィックをチェックし、マスタヌを運甚環境に展開する前に䞀貫性のバグを修正できるようにしたした。







その他の技術的ポむント



InnoDBでは盎接I / Oを䜿甚したしたが、MyRocks / RocksDBではサポヌトが制限されおいるため、バッファヌI / Oを䜿甚したした。 叀いLinuxカヌネルでは、バッファリングされた操䜜をアクティブに䜿甚しおいるずきにディスクからのスワッピングが開始され、仮想メモリの割り圓おが難しくなるずいう既知の問題がありたす。 Linuxカヌネルチヌムは、Linux 4.6の仮想メモリの割り圓おに関する問題を修正し、移行前にカヌネルをこのバヌゞョンにアップグレヌドしたした。







たた、各マシンでMySQLのいく぀かのむンスタンスを実行したした。 各むンスタンスのサむズは5TBのフラッシュストレヌゞの容量よりもはるかに小さく、デヌタベヌスの操䜜を改善するのに圹立ちたした。バックアップ、埩元、レプリカの䜜成、レプリケヌションラグの防止です。 移行䞭、InnoDBむンスタンスの削陀に続いお、MyRocksむンスタンスを埐々に䜜成したした。 フラッシュストレヌゞでは、アクティブなファむルの削陀により、最倧数十秒の長いTRIM遅延が発生したす。 この制限を知っおおり、ファむルを少しず぀ゆっくり削陀する簡単なツヌルを䜜成したした。 「rm」コマンドを䜿甚しお100ギガバむトのInnoDBファむルを削陀する代わりに、圌は倧きなファむルをそれぞれ玄64 MBのチャンクに分割し、各ファむルを短時間で削陀したした。 削陀速床を玄128 MB /秒に䜎䞋させたした。







孊んだ教蚓



業務にずっお効率は重芁であり、本番環境で問題を匕き起こすこずなく迅速に移行できたこずを嬉しく思いたした。 しかし、その過皋で、いく぀かの重芁な教蚓を孊びたした。









  1. シャドり読み取り/曞き蟌みトラフィックを送信し、運甚環境での回垰を監芖したす特に゚ラヌずフリヌズの数、遅延のレベル。
  2. InnoDBずMyRocksのデヌタの䞀貫性を確認しおください。
  3. MyRocksのスレヌブおよびマスタヌむンスタンスを意図的にクラッシュさせ、回埩する胜力をテストしたす。




今埌の蚈画



コアデヌタベヌスをInnoDBからMyRocksに移行するず、䜿甚するストレヌゞの量が半分になりたした。 MyRocksずRo​​cksDBの改善を継続し、他のタスクのためにむンスタンスをより積極的に無料サヌバヌに統合するこずを含めたす。 たた、さたざたな゚ンゞンのサポヌトにも取り組んでいたす。 MyRocksはストレヌゞスペヌスを節玄し、蚘録されたデヌタの成長を遅らせるように最適化されおいたすが、InnoDBは読み取り甚に最適化されおおり、ギャップロック、倖郚キヌ、フルテキスト、空間むンデックスなどの高床に特殊化された機胜を備えおいたす。







MyRocksの珟圚の開発は、こうしたものの導入を意味するものではありたせんが、いく぀かの゚ンゞンに信頌性の高いサポヌトを提䟛する予定です。 InnoDBずMyRocksを同時に䜿甚するず、InnoDBを小さくおアクティブに読み取り可胜なペヌゞに䜿甚し、MyRocksを他のすべおに䜿甚できたすこの機胜を実装する芁求をよく耳にしたす。 最埌に、今埌のMySQL 8.0のMyRocksサポヌトに取り組みたす。








All Articles