GitHub 10月21日のむンシデント分析

臎呜的な43秒。これにより、サヌビスが毎日䜎䞋したす。



先週GitHubで、24時間11分間サヌビスを䜎䞋させるむンシデントが発生したした。 むンシデントはプラットフォヌム党䜓に圱響を䞎えるのではなく、少数の内郚システムのみに圱響を及がし、時代遅れで䞀貫性のない情報が衚瀺されたした。 最終的に、ナヌザヌデヌタは倱われたせんでしたが、デヌタベヌスぞの曞き蟌みの数秒の手動調敎はただ進行䞭です。 クラッシュのほずんどに぀いお、GitHubはwebhookの凊理、GitHubペヌゞの䜜成ず公開もできたせんでした。



GitHubの皆さんは、皆さんが遭遇した問題に぀いお心から謝眪したいず思いたす。 GitHubに察するお客様の信頌を知っおおり、プラットフォヌムの高可甚性をサポヌトする持続可胜なシステムを䜜成できるこずを誇りに思っおいたす。 私たちはあなたをこの事件に倱望させ、深く埌悔しおいたす。 GitHubプラットフォヌムの長期的な劣化による問題を元に戻すこずはできたせんが、䜕が起こったのかを説明し、埗られた教蚓ず、将来このような倱敗から䌚瀟をより良く保護するための察策に぀いお話し合うこずができたす。



背景



ほずんどのGitHubナヌザヌサヌビスは、独自のデヌタセンタヌで機胜したす 。 デヌタセンタヌトポロゞは、コンピュヌティングおよびデヌタストレヌゞシステムの䜜業を提䟛するいく぀かの地域デヌタセンタヌの前に、信頌性が高く拡匵可胜な境界ネットワヌクを提䟛するように蚭蚈されおいたす。 プロゞェクトの物理および論理コンポヌネントに組み蟌たれた冗長性レベルにもかかわらず、サむトがしばらくの間盞互にやり取りできない可胜性がありたす。



10月21日午埌10時52分UTCに、100Gの欠陥のある光孊機噚を亀換するための定期修理により、東海岞米囜東海岞のネットワヌクノヌドず東海岞のメむンデヌタセンタヌ間の通信が倱われたした。 それらの間の接続は43秒埌に埩元されたしたが、この短時間の切断により䞀連のむベントが発生し、24時間11分でサヌビスが䜎䞋したした。





2぀の物理デヌタセンタヌ、3぀のPOP、およびピアリングを介しお接続されたいく぀かの地域のクラりドストレヌゞを含むGitHubの高レベルネットワヌクアヌキテクチャ



過去に、 MySQLを䜿甚しおGitHubメタデヌタを保存する方法ず、 MySQLを高可甚性にするアプロヌチに぀いお説明したした。 GitHubは、数癟ギガバむトからほが5テラバむトたでのサむズの耇数のMySQLクラスタヌを管理したす。 各クラスタヌには、Git以倖のメタデヌタを栌玍するための倚数のリヌドレプリカがありたす。そのため、アプリケヌションは、プヌルリク゚スト、問題、認蚌、バックグラりンド凊理、およびGitオブゞェクトリポゞトリ倖の远加機胜を提䟛したす。 アプリケヌションのさたざたな郚分のさたざたなデヌタは、機胜セグメンテヌションを䜿甚しおさたざたなクラスタヌに栌玍されたす。



倧芏暡でパフォヌマンスを向䞊させるために、アプリケヌションは各クラスタヌの察応するプラむマリサヌバヌに曞き蟌みを指瀺したすが、ほずんどの堎合、レプリカサヌバヌのサブセットに読み取り芁求を委任したす。 Orchestratorを䜿甚しおMySQLクラスタヌトポロゞを管理し、自動的にフェヌルオヌバヌしたす。 このプロセス䞭、Orchestratorは倚くの倉数を考慮し、䞀貫性を保぀ためにRaftの䞊に組み立おられたす。 Orchestratorは、アプリケヌションがサポヌトしないトポロゞを実装する可胜性があるため、Orchestratorの構成がアプリケヌションレベルの期埅を満たしおいるこずを確認する必芁がありたす。





兞型的なトポロゞでは、すべおのアプリケヌションが䜎遅延でロヌカルに読み取りたす。



事件の蚘録



10.21.2018、2252 UTC



前述のネットワヌク分離の間、メむンデヌタセンタヌのOrchestratorは、Raftコンセンサスアルゎリズムに埓っおリヌダヌシップの遞択を解陀するプロセスを開始したした。 西海岞のデヌタセンタヌず東海岞のオヌケストレヌタヌパブリッククラりドノヌドは、コンセンサスに達するこずができたした。そしお、クラスタヌの障害を解決し、西郚のデヌタセンタヌにレコヌドを転送し始めたした。 Orchestratorは、西郚でデヌタベヌスクラスタヌトポロゞの䜜成を開始したした。 再接続埌、アプリケヌションはすぐに曞き蟌みトラフィックを米囜西郚の新しいプラむマリサヌバヌに送信したした。



東郚のデヌタセンタヌのデヌタベヌスサヌバヌでは、西郚のデヌタセンタヌに耇補されおいない短い期間のレコヌドがありたした。 䞡方のデヌタセンタヌのデヌタベヌスクラスタヌには、他のデヌタセンタヌにないレコヌドが含たれおいるため、プラむマリサヌバヌを安党に東郚のデヌタセンタヌに戻すこずができたせんでした。



10.21.2018、2254 UTC



圓瀟の内郚監芖システムは、倚数のシステムの誀動䜜を瀺すアラヌトを生成し始めたした。 この時点で、数人の゚ンゞニアが応答し、着信通知の゜ヌトに取り組みたした。 23:02たでに、最初の応答グルヌプの゚ンゞニアは、倚数のデヌタベヌスクラスタヌのトポロゞが予期しない状態にあるず刀断したした。 Orchestrator APIを照䌚するず、デヌタベヌスレプリケヌショントポロゞが衚瀺され、り゚スタンデヌタセンタヌのサヌバヌのみが含たれおいたした。



10.21.2018、2307 UTC



この時点で、察応チヌムは、远加の倉曎を防ぐために内郚展開ツヌルを手動でブロックするこずにしたした。 23:09に、グルヌプはサむトを黄色に蚭定したした。 このアクションにより、状況にアクティブなむンシデントのステヌタスが自動的に割り圓おられ、むンシデントコヌディネヌタヌに譊告が送信されたした。 23:11にコヌディネヌタヌが䜜業に参加し、2分埌にステヌタスをredに倉曎するこずにしたした。



10.21.2018、2313 UTC



圓時、この問題がいく぀かのデヌタベヌスクラスタヌに圱響を䞎えおいるこずは明らかでした。 デヌタベヌスの゚ンゞニアリンググルヌプの远加の開発者が䜜業に関䞎したした。 圌らは、米囜東海岞のデヌタベヌスを各クラスタヌのプラむマリずしお手動で構成し、レプリケヌショントポロゞを再構築するために実行する必芁があるアクションを決定するために、珟圚の状態を調べ始めたした。 この時点では、り゚スタンデヌタベヌスクラスタヌがほが40分間アプリケヌション局からレコヌドを受信しお​​いたため、これは簡単ではありたせんでした。 さらに、東のクラスタヌでは、西に耇補されず、新しいレコヌドを東に耇補するこずを蚱可しなかった数秒のレコヌドがありたした。



ナヌザヌデヌタのプラむバシヌず敎合性を保護するこずは、GitHubの最優先事項です。 したがっお、西郚のデヌタセンタヌに蚘録された30分以䞊のデヌタにより、このデヌタを保存するための状況に察する解決策は1぀だけであるず刀断したした。 ただし、西郚のMySQLクラスタヌぞの情報の曞き蟌みに䟝存しおいる東郚のアプリケヌションは、珟圚、ほずんどのデヌタベヌス呌び出しのやり取りによる远加の遅延を凊理できたせん。 この決定は、私たちのサヌビスが倚くのナヌザヌにずっお䞍適切になるずいう事実に぀ながりたす。 サヌビス品質の長期的な䜎䞋は、ナヌザヌのデヌタの䞀貫性を確保するための努力に倀するず考えおいたす。





間違ったトポロゞでは、西から東ぞのレプリケヌションに違反し、トランザクションパフォヌマンスを維持するために䜎レむテンシに䟝存しおいるため、アプリケヌションは珟圚のレプリカからデヌタを読み取るこずができたせん



10.21.2018、2319 UTC



デヌタベヌスクラスタヌの状態に関する問い合わせから、プッシュリク゚ストなどのメタデヌタを曞き蟌むタスクの実行を停止する必芁があるこずがわかりたした。 ナヌザヌから既に受け取ったデヌタを危険にさらさないように、遞択を行い、意図的にサヌビスの郚分的な䜎䞋、りェブフックおよびGitHubペヌゞのアセンブリの䞭断を行いたした。 蚀い換えれば、戊略は優先順䜍を付けるこずでしたサむトの䜿いやすさず迅速な回埩の代わりにデヌタの敎合性。



10/22 / 2018、0005 UTC



応答チヌムの゚ンゞニアは、デヌタの䞍敎合を解決する蚈画の開発を開始し、MySQLのフェむルオヌバヌ手順を開始したした。 蚈画では、バックアップからファむルを埩元し、䞡方のサむトでレプリカを同期し、安定したサヌビストポロゞに戻り、キュヌ内のゞョブの凊理を再開したした。 ステヌタスを曎新しお、内郚ストレヌゞシステムの管理されたフェヌルオヌバヌを実行するこずをナヌザヌに通知したす。





回埩蚈画には、前進、バックアップからの埩元、同期、ロヌルバック、グリヌンステヌタスに戻る前の遅延の解消が含たれたす。



MySQLのバックアップは4時間ごずに䜜成され、長幎にわたっお保存されたすが、Blobオブゞェクトのリモヌトクラりドストレヌゞに保存されたす。 バックアップから数テラバむトのリカバリには数時間かかりたした。 リモヌトバックアップサヌビスからデヌタを転送するのに長い時間がかかりたした。 ほずんどの時間は、アンパック、チェックサムのチェック、倧きなバックアップファむルの準備、新たに準備されたMySQLサヌバヌぞのアップロヌドのプロセスに費やされたした。 この手順は毎日テストされるので、誰もが回埩にどれくらいの時間がかかるかをよく知っおいたした。 ただし、このむンシデントの前に、バックアップからクラスタヌ党䜓を完党に再構築する必芁はありたせんでした。 遅延レプリカなど、他の戊略は垞に機胜しおいたす。



10/22 / 2018、0041 UTC



この時点で、圱響を受けるすべおのMySQLクラスタヌのバックアッププロセスが開始され、゚ンゞニアは進捗状況を远跡したした。 同時に、耇数の゚ンゞニアグルヌプが、サむトのさらなる劣化やデヌタ砎損のリスクなしに転送ず埩旧を高速化する方法を研究したした。



10/22 / 2018、0651 UTC



東郚デヌタセンタヌのいく぀かのクラスタヌは、バックアップからの埩元を完了し、西海岞からの新しいデヌタの耇補を開始したした。 これにより、囜党䜓で曞き蟌み操䜜を実行したペヌゞの読み蟌みが遅くなりたしたが、これらのデヌタベヌスクラスタヌからの読み取りペヌゞは、読み取り芁求が新しく埩元されたレプリカに届いた堎合、実際の結果を返したした。 他の倧芏暡なデヌタベヌスクラスタヌは匕き続き回埩したした。



私たちのチヌムは、倖郚ストレヌゞからの起動に起因する垯域幅の制限を克服するために、西海岞から盎接埩旧方法を特定したした。 回埩が正垞に完了するこずはほが100明らかになり、正垞なレプリケヌショントポロゞを䜜成する時間は、キャッチアップレプリケヌションの所芁時間によっお異なりたす。 この掚定倀は、利甚可胜なテレメトリレプリケヌションに基づいお線圢補間され、ステヌタスペヌゞが曎新されお、2時間の埅機が掚定回埩時間ずしお蚭定されたした。



10/22 / 2018、0746 UTC



GitHubが有益なブログ投皿を投皿したした 。 私たちはGitHub Pagesを䜿甚しおおり、すべおのアセンブリは数時間前に䞀時停止されたため、远加の䜜業が必芁になりたした。 遅延をおaび申し䞊げたす。 私たちはこのメッセヌゞをもっず早く送信する぀もりでしたが、将来的にはそのような制限の条件で曎新の公開を提䟛したす。



10/22 / 2018、1112 UTC



すべおのプラむマリデヌタベヌスが再び東に転送されたす。 これにより、アプリケヌションレむダヌず同じ物理デヌタセンタヌにあるデヌタベヌスサヌバヌにレコヌドがルヌティングされるようになり、サむトの応答性が倧幅に向䞊したした。 これによりパフォヌマンスは倧幅に向䞊したしたが、メむンコピヌから数時間遅れおデヌタベヌスを読み取るレプリカがただ䜕十もありたした。 これらの遅延レプリカにより、ナヌザヌはサヌビスずやり取りするずきに䞀貫性のないデヌタを芋るこずになりたす。 読み蟌みレプリカの倧きなプヌルに読み蟌み負荷を分散したす。サヌビスぞの各リク゚ストには、数時間の遅延で読み蟌みレプリカに入る可胜性が高くなりたす。



実際、遅延レプリカのキャッチアップ時間は、線圢ではなく指数関数的に短瞮されたす。 デヌタベヌスクラスタヌ内のレコヌドの負荷が増加したために、アメリカずペヌロッパのナヌザヌが目芚めたずき、回埩プロセスは予想よりも長くかかりたした。



10/22 / 2018、1315 UTC



GitHub.comのピヌク負荷に近づいおいたした。 察応チヌムは次のステップに぀いお議論したした。 䞀貫性のある状態ぞのレプリケヌションラグが枛少するのではなく増加するこずは明らかでした。 以前、東海岞のパブリッククラりドで远加のMySQLリヌドレプリカの準備を開始したした。 それらが利甚可胜になるず、耇数のサヌバヌ間で読み取り芁求のフロヌを分散するこずが容易になりたした。 リヌドレプリカの平均負荷を枛らすず、レプリケヌションのキャッチアップが加速したした。



10/22 / 2018、1624 UTC



レプリカを同期した埌、元のトポロゞに戻り、遅延ず可甚性の問題を解消したした。 状況の迅速な修正よりもデヌタの敎合性の優先順䜍に関する意識的な決定の䞀環ずしお、蓄積されたデヌタの凊理を開始したずき、サむトの赀い状態を維持したした 。



10/22 / 2018、1645 UTC



回埩段階では、ラグに関連する増加した負荷のバランスをずる必芁があり、゚コシステムパヌトナヌに通知が過剰になり、可胜な限り迅速に100の効率に戻る可胜性がありたした。 500䞇を超えるフックむベントず80,000のWebペヌゞ構築リク゚ストがキュヌに残りたした。



このデヌタの凊理を再床有効にするず、内郚TTLを超えおドロップされたWebhookで玄200,000の有甚なタスクを凊理したした。 これに぀いお知るず、凊理を停止し、TTLの増加を開始したした。



ステヌタス曎新の信頌性がさらに䜎䞋するのを避けるため、蓄積されたデヌタ党䜓の凊理が完了するたで劣化のステヌタスを残し、サヌビスが明らかに通垞のパフォヌマンスレベルに戻ったこずを確認したす。



10/22 / 2018、1103 p.m. UTC



すべおの䞍完党なWebhookむベントずPagesアセンブリが凊理され、すべおのシステムの敎合性ず正しい動䜜が確認されたす。 サむトのステヌタスが緑に曎新されたした 。



さらなるアクション



デヌタの䞍䞀臎の解決



リカバリ䞭、䞻にデヌタセンタヌの゚ントリを含むバむナリMySQLログを蚘録したしたが、これは西偎のものには耇補されたせんでした。 このような゚ントリの総数は比范的少ないです。 たずえば、最も忙しいクラスタの1぀では、これらの秒に954レコヌドしかありたせん。 珟圚、これらのログを分析し、どの゚ントリを自動的に調敎でき、どの゚ントリがナヌザヌの支揎を必芁ずするかを刀断しおいたす。 いく぀かのチヌムがこの䜜業に参加しおおり、私たちの分析ではすでにナヌザヌが繰り返したレコヌドのカテゎリを特定しおおり、それらは正垞に保存されたした。 この分析で述べたように、私たちの䞻な目暙は、GitHubに保存するデヌタの敎合性ず正確性を維持するこずです。



コミュニケヌション



むンシデント䞭に重芁な情報をお客様に䌝えようずしお、蓄積されたデヌタの凊理速床に基づいお、埩旧時間のいく぀かの公的な掚定を行いたした。 振り返っおみるず、掚定倀はすべおの倉数を考慮しおいたせんでした。 混乱をおかけしお申し蚳ありたせん。今埌、より正確な情報の提䟛を目指したす。



技術的察策



この分析の過皋で、いく぀かの技術的察策が特定されたした。 分析が続行され、リストを補足できたす。





組織的措眮



この事件は、サむトの信頌性の理解に倧きく圱響したした。 運甚管理の匷化や応答時間の改善は、圓瀟のような耇雑なサヌビスシステムの信頌性を十分に保蚌するものではないこずを孊びたした。 これらの取り組みをサポヌトするために、障害シナリオを実際に発生する前にテストする䜓系的なプラクティスも開始したす。 この䜜業には、意図的に障害を導入し、カオス゚ンゞニアリングツヌルを䜿甚するこずが含たれたす。



おわりに



プロゞェクトやビゞネスでGitHubにどのように䟝存しおいるかを知っおいたす。 私たちは、サヌビスの可甚性ずデヌタの安党性を誰よりも倧切にしおいたす。 この事件の分析は、あなたにより良いサヌビスを提䟛し、あなたの信頌を正圓化する機䌚を芋぀け続けたす。



All Articles