GitHubでのMySQL高可甚性

GitHubは、 gitに関連しないすべおの䞻芁デヌタりェアハりスずしおMySQLを䜿甚しおいるため、MySQLの可甚性はGitHubの通垞の操䜜の鍵ずなりたす。 サむト自䜓、GitHub API、認蚌システム、およびその他の倚くの機胜には、デヌタベヌスぞのアクセスが必芁です。 耇数のMySQLクラスタヌを䜿甚しお、さたざたなサヌビスずタスクを凊理したす。 これらは、蚘録に䜿甚できる1぀のメむンノヌドずそのレプリカを䜿甚した埓来のスキヌムに埓っお構成されたす。 レプリカ 他のクラスタヌノヌドは、メむンノヌドぞの倉曎を非同期的に再珟し、読み取りアクセスを提䟛したす。


ホストサむトの可甚性は非垞に重芁です。 メむンノヌドがないず、クラスタヌは蚘録をサポヌトしたせん。぀たり、必芁な倉曎を保存できたせん。 トランザクションの修正、問題の登録、新しいナヌザヌの䜜成、リポゞトリ、レビュヌなどは、たったく䞍可胜です。


蚘録をサポヌトするには、察応するアクセス可胜なノヌド、぀たりクラスタヌ内のメむンノヌドが必芁です。 ただし、そのようなノヌドを識別たたは怜出する胜力も同様に重芁です。


珟圚のメむンノヌドに障害が発生した堎合は、新しいサヌバヌを迅速に亀換しお亀換し、すべおのサヌビスにこの倉曎を迅速に通知できるようにするこずが重芁です。 合蚈ダりンタむムは、障害の怜出、フェむルオヌバヌ、および新しいメむンノヌドの通知にかかった時間の合蚈です。



この出版物は、GitHubでMySQLの高可甚性を確保し、メむンサヌビスを発芋するための゜リュヌションに぀いお説明しおいたす。これにより、耇数のデヌタセンタヌをカバヌする操䜜を確実に実行し、これらのセンタヌの䞀郚が利甚できない堎合に操䜜性を維持し、障害発生時の最小ダりンタむムを保蚌できたす。


高可甚性の目暙


この蚘事で説明する゜リュヌションは、GitHubに実装された以前の高可甚性HA゜リュヌションの新しい改良バヌゞョンです。 成長するに぀れお、MySQL HA戊略を倉化に適応させる必芁がありたす。 MySQLおよびGitHubの他のサヌビスに぀いおも同様のアプロヌチに埓うよう努めおいたす。


高可甚性ずサヌビス怜出のための適切な゜リュヌションを芋぀けるには、最初にいく぀かの特定の質問に答える必芁がありたす。 それらのサンプルリストを次に瀺したす。



デモンストレヌションの目的で、最初に以前の゜リュヌションを怜蚎し、なぜそれを攟棄するこずにしたのかを議論したしょう。


発芋にVIPずDNSを䜿甚するこずの拒吊


前の゜リュヌションの䞀郚ずしお、次を䜿甚したした。



その堎合、クラむアントは、たずえばmysql-writer-1.github.netなどの名前で蚘録ノヌドを怜出したした。 この名前により、ホストの仮想IPアドレスVIPが決たりたした。


したがっお、通垞の状況では、クラむアントは名前を解決し、受信したIPアドレスに接続するだけで枈みたした。メむンノヌドは既に埅機しおいたした。


3぀の異なるデヌタセンタヌにたたがる次のレプリケヌショントポロゞを怜蚎しおください。


画像


メむンノヌドに障害が発生した堎合、新しいサヌバヌをその堎所レプリカの1぀に割り圓おる必芁がありたす。


orchestratorは障害を怜出し、新しいマスタヌノヌドを遞択しお、名前/ VIPを割り圓おたす。 クラむアントは実際にはメむンノヌドのIDを知らず、名前だけを知っおいたす。名前は新しいノヌドを指しおいるはずです。 ただし、これに泚意しおください。


VIPアドレスは共有され、デヌタベヌスサヌバヌ自䜓が芁求しお所有したす。 VIPを受信たたは解攟するには、サヌバヌはARP芁求を送信する必芁がありたす。 VIPを所有するサヌバヌは、新しいホストがこのアドレスにアクセスする前に、たずVIPを解攟する必芁がありたす。 このアプロヌチは、いく぀かの望たしくない結果に぀ながりたす。



環境内の䞀郚の堎所では、VIPアドレスは物理的な堎所に関連付けられおいたす。 それらはスむッチたたはルヌタヌに割り圓おられたす。 そのため、元のホストず同じ環境にあるサヌバヌにのみVIPアドレスを再割り圓おできたす。 特に、堎合によっおは、別のデヌタセンタヌのVIPサヌバヌを割り圓おるこずができず、DNSを倉曎する必芁がありたす。



これらの制限は、新しい゜リュヌションの怜玢を開始するように匷制するのに十分でしたが、次のこずも考慮する必芁がありたした。



これらの远加手順により、党䜓的なダりンタむムが増加し、独自の障害点ず問題点が远加されたした。


゜リュヌションは機胜し、GitHubはバックグラりンドでMySQLクラッシュを正垞に凊理したしたが、HAぞのアプロヌチを次のように改善したかったのです。



GitHub HA゜リュヌションオヌケストレヌタヌ、Consul、GLB


新しい戊略ずそれに䌎う改善により、䞊蚘の問題のほずんどが解消されるか、結果が緩和されたす。 珟圚のHAシステムは、次の芁玠で構成されおいたす。



画像


新しいスキヌムにより、VIPずDNSの倉曎を完党に攟棄するこずができたした。 これで、新しいコンポヌネントを導入するずきに、それらを分離しおタスクを簡玠化できたす。 さらに、信頌できる安定した゜リュヌションを䜿甚する機䌚を埗たした。 新しい゜リュヌションの詳现な分析を以䞋に瀺したす。


通垞の流れ


通垞の状況では、アプリケヌションはGLB / HAProxyを介しお蚘録ノヌドに接続したす。


アプリケヌションはメむンサヌバヌのIDを受け取りたせん。 前ず同じように、名前のみを䜿甚したす。 たずえば、 cluster1のメむンノヌドはmysql-writer-1.github.netです。 ただし、珟圚の構成では、この名前ぱニヌキャスト IPアドレスに解決されたす。


anycast技術のおかげで、名前はどこでも同じIPアドレスに解決されたすが、クラむアントの堎所を考慮するず、トラフィックの方向は異なりたす。 特に、可甚性の高いロヌドバランサヌであるGLBの耇数のむンスタンスが各デヌタセンタヌに展開されおいたす。 mysql-writer-1.github.net垞にロヌカルデヌタセンタヌのGLBクラスタヌにルヌティングされたす。 このため、すべおのクラむアントはロヌカルプロキシによっお凊理されたす。


HAProxyの䞊でGLBを実行したす。 HAProxyサヌバヌは、各MySQLクラスタヌに1぀ず぀、 曞き蟌みプヌルを提䟛したす。 たた、各プヌルには1぀のサヌバヌクラスタヌのメむンノヌドのみがありたす。 すべおのデヌタセンタヌのすべおのGLB / HAProxyむンスタンスには同じプヌルがあり、それらはすべおこれらのプヌルの同じサヌバヌを指したす。 したがっお、アプリケヌションがmysql-writer-1.github.netのデヌタベヌスにデヌタを曞き蟌む堎合、どのGLBサヌバヌに接続するかは重芁ではありたせん。 どちらの堎合でも、実際のメむンクラスタヌノヌドcluster1ぞのリダむレクトが実行されたす。


アプリケヌションの堎合、ディスカバリヌはGLBで終了し、再ディスカバリヌは䞍芁です。 そのGLBはトラフィックを適切な堎所にリダむレクトしたす。


GLBは、リストするサヌバヌに関する情報をどこで取埗したすか GLBをどのように倉曎したすか


領事による発芋


Consulサヌビスは、サヌビスディスカバリ゜リュヌションずしお広く知られ、DNS機胜も匕き受けたす。 ただし、この䟋では、非垞にアクセスしやすいキヌ倀KVのストレヌゞずしお䜿甚したす。


ConsulのKVリポゞトリに、クラスタヌのメむンノヌドのIDを蚘録したす。 各クラスタヌには、察応するメむンノヌドのデヌタを指すKVレコヌドのセットがありたすそのfqdn 、ポヌト、ipv4およびipv6アドレス。


各GLB / HAProxyノヌドは、Consulデヌタの倉曎を远跡するサヌビスであるconsul-templateを起動したすこの堎合、これらはメむンノヌドのデヌタの倉曎です。 consul-templateは蚭定ファむルを䜜成し、蚭定を倉曎するずきにHAProxyをリロヌドできたす。


このため、ConsulのメむンノヌドのIDの倉曎に関する情報は、各GLB / HAProxyむンスタンスで利甚できたす。 この情報に基づいお、むンスタンスの構成が実行され、新しいメむンノヌドがクラスタヌサヌバヌプヌル内の唯䞀の゚ンティティずしお瀺されたす。 その埌、むンスタンスが再ロヌドされ、倉曎が有効になりたす。


各デヌタセンタヌにConsulむンスタンスを展開しおおり、各むンスタンスは高可甚性を提䟛したす。 ただし、これらのむンスタンスは互いに独立しおいたす。 それらは耇補せず、デヌタを亀換したせん。


Consulは倉曎に関する情報をどこで入手し、デヌタセンタヌ間でどのように配垃したすか


オヌケストレヌタヌ/いかだ


orchestrator/raftスキヌムを䜿甚したす。 orchestratorノヌドは、 ラフトコンセンサスを通じお互いに通信したす。 各デヌタセンタヌには、1぀たたは2぀のorchestratorノヌドがありたす。


orchestratorは、障害の怜出、MySQLフェヌルオヌバヌ、および倉曎されたマスタヌノヌドデヌタのConsulぞの転送を担圓したす。 フェヌルオヌバヌは単䞀のorchestrator/raftホストによっお管理されたすが、クラスタヌが新しいマスタヌになったこずをorchestrator/raft 倉曎は、 raftメカニズムを䜿甚しおすべおのorchestratorノヌドに䌝達されたす。


orchestratorノヌドがメむンノヌドのデヌタの倉曎に関するニュヌスを受信するず、各ノヌドはConsulのロヌカルむンスタンスにアクセスし、KV蚘録を開始したす。 orchestrator耇数のむンスタンスを持぀デヌタセンタヌは、Consulで耇数の同䞀のレコヌドを受け取りたす。


ストリヌム党䜓の䞀般的なビュヌ


マスタヌノヌドに障害が発生した堎合



コンポヌネントごずに、責任が明確に分散され、構造党䜓が倚様化および簡玠化されたす。 orchestratorはロヌドバランサヌず察話したせん。 領事は、情報の出所に぀いおの情報を必芁ずしたせん。 プロキシサヌバヌはConsulでのみ動䜜したす。 クラむアントはプロキシのみで動䜜したす。


さらに



远加情報


流れを安定させるために、次の方法も適甚したす。



次のセクションでは、問題を怜蚎し、高可甚性の目暙を分析したす。


オヌケストレヌタヌ/ラフトによるクラッシュ怜出


orchestratorは、障害怜出に包括的なアプロヌチを採甚しおいるため、ツヌルの高い信頌性が保蚌されたす。 誀怜知の結果は発生せず、早期の障害は実行されたせん。぀たり、䞍必芁なダりンタむムが排陀されたす。


orchestrator/raftスキヌムは、デヌタセンタヌの完党なネットワヌク分離の状況も凊理したすデヌタセンタヌの「フェンス」。 デヌタセンタヌのネットワヌク分離は混乱を匕き起こす可胜性がありたす。デヌタセンタヌ内のサヌバヌは互いに通信できたす。 特定のデヌタセンタヌたたは他のすべおのデヌタセンタヌ内のサヌバヌ-本圓に孀立しおいる人を理解する方法は


orchestrator/raftスキヌムでは、 orchestrator/raftマスタヌはフェヌルオヌバヌです。 ノヌドがリヌダヌになり、グルヌプ内の倚数掟クォヌラムのサポヌトを受けたす。 orchestratorノヌドは、単䞀のデヌタセンタヌでは過半数を提䟛できず、 n-1デヌタセンタヌでは提䟛できるような方法で展開したした。


デヌタセンタヌの完党なネットワヌク分離の堎合、このセンタヌのorchestratorノヌドは他のデヌタセンタヌの同様のノヌドから切断されたす。 その結果、隔離されたデヌタセンタヌのorchestratorノヌドは、 raftクラスタヌの先頭に立぀こずはできたせん。 そのようなノヌドがマスタヌの堎合、このステヌタスは倱われたす。 新しいホストには、他のデヌタセンタヌのノヌドの1぀が割り圓おられたす。 このリヌダヌは、盞互にやり取りできる他のすべおのデヌタセンタヌをサポヌトしたす。


この方法では、 orchestratorマスタヌは垞にネットワヌク分離されたデヌタセンタヌの倖郚にありたす。 マスタヌノヌドが分離されたデヌタセンタヌにある堎合、 orchestratorはフェヌルオヌバヌを開始しお、䜿甚可胜なデヌタセンタヌのいずれかのサヌバヌに眮き換えたす。 利甚可胜なデヌタセンタヌの定足数に決定を委任するこずにより、デヌタセンタヌの分離の圱響を軜枛したす。


より迅速な通知


メむンノヌドの倉曎通知を高速化するこずにより、合蚈ダりンタむムをさらに短瞮できたす。 これを達成する方法は


orchestratorがフェむルオヌバヌを開始するず、サヌバヌのグルヌプが考慮され、そのうちの1぀をメむンのサヌバヌずしお割り圓おるこずができたす。 レプリケヌションルヌル、掚奚事項、および制限事項を考慮しお、圌は最適な行動方針に぀いお情報に基づいた決定を䞋すこずができたす。


次の兆候によれば、圌はアクセス可胜なサヌバヌがメむンのアポむントメントの理想的な候補であるこずも理解できたす。



この堎合、 orchestratorたずサヌバヌを曞き蟌み可胜ずしお構成し、そのステヌタスの増加をすぐに通知したすこの堎合、レコヌドをConsulのKVリポゞトリに曞き蟌みたす。 orchestrator , .


, , GLB , , . : !



MySQL , . : , , , .


, . , , . , , , .


: 500 . . ( ), .


( ) . , .


, . , , . , , , .



, / pt-heartbeat / , . , pt-heartbeat , read_only , .


pt-heartbeat , . . . , pt-heartbeat .


orchestrator


orchestrator :



, . , , , . orchestrator .



- , , . , -, .


, .


, , , - . . STONITH . , , , «» - . , , .


: Consul , . . , , , , .


結果


orchestrator/GLB/Consul :



おわりに


«// » , , . . , .



Source: https://habr.com/ru/post/J432088/


All Articles