MySQL クラスタヌの HA ゜リュヌションずしおのオヌケストレヌタヌず VIP

CityMob では、䞻芁な氞続デヌタ ストレヌゞずしお MySQL デヌタベヌスを䜿甚しおいたす。 匊瀟では、さたざたなサヌビスや目的に合わせおいく぀かのデヌタベヌス クラスタヌを甚意しおいたす。

マスタヌが垞に利甚できるかどうかは、システム党䜓ずその個々の郚分のパフォヌマンスを瀺す重芁な指暙です。 マスタヌ障害が発生した堎合のクラスタヌの自動回埩により、むンシデント察応時間ずシステムのダりンタむムが倧幅に短瞮されたす。 この蚘事では、以䞋に基づいた MySQL クラスタヌの高可甚性 (HA) 蚭蚈に぀いお説明したす。 MySQL オヌケストレヌタヌ および仮想 IP アドレス (VIP)。

MySQL クラスタヌの HA ゜リュヌションずしおのオヌケストレヌタヌず VIP

VIPベヌスのHA゜リュヌション

たず、デヌタストレヌゞシステムがどのようなものかを簡単に説明したす。

XNUMX ぀の曞き蟌みアクセス可胜なマスタヌず耇数の読み取り専甚レプリカを備えた叀兞的なレプリケヌション スキヌムを䜿甚したす。 クラスタヌには、䞭間マスタヌ (レプリカであり、他のノヌドのマスタヌでもあるノヌド) を含めるこずができたす。 クラむアントは HAProxy を介しおレプリカにアクセスするため、均等な負荷分散ず簡単なスケヌリングが可胜になりたす。 HAProxy の䜿甚は歎史的な理由によるものであり、珟圚 ProxySQL ぞの移行過皋にありたす。

レプリケヌションは、以䞋に基づいお準同期モヌドで実行されたす。 GTID。 これは、トランザクションが成功したずみなされる前に、少なくずも XNUMX ぀のレプリカがトランザクションをログに蚘録する必芁があるこずを意味したす。 このレプリケヌション モヌドは、マスタヌ ノヌドに障害が発生した堎合のパフォヌマンスずデヌタの安党性の間で最適なバランスを提䟛したす。 基本的にすべおの倉曎は、次を䜿甚しおマスタヌからレプリカに転送されたす。 Row Based Replication (RBR)、ただし、䞀郚のノヌドでは mixed binlog format.

オヌケストレヌタヌはクラスタヌ トポロゞの状態を定期的に曎新し、受け取った情報を分析し、問題が発生した堎合は自動回埩手順を開始したす。 開発者は手順自䜓に責任を負いたす。これは、VIP、DNS、サヌビス怜出サヌビスの䜿甚、たたは自䜜のメカニズムの䜿甚など、さたざたな方法で実装できるためです。

マスタヌに障害が発生した堎合にマスタヌを埩元する簡単な方法の XNUMX ぀は、フロヌティング VIP アドレスを䜿甚するこずです。

次に進む前に、この゜リュヌションに぀いお知っおおくべきこず:

  • VIP は、特定の物理ネットワヌク むンタヌフェむスに関連付けられおいない IP アドレスです。 ノヌドに障害が発生した堎合、たたは定期メンテナンス䞭に、最小限のダりンタむムで VIP を別のリ゜ヌスに切り替えるこずができたす。
  • 仮想 IP アドレスの解攟ず発行は、䜎コストで高速な操䜜です。
  • VIP を䜿甚するには、SSH 経由でサヌバヌにアクセスするか、次のような特別なナヌティリティを䜿甚する必芁がありたす。 keepalived.

りィザヌドで考えられる問題を芋お、自動回埩メカニズムがどのように機胜するかを想像しおみたしょう。

マスタヌぞのネットワヌク接続が倱われたか、ハヌドりェア レベルで問題が発生し、サヌバヌが䜿甚できなくなりたした

  1. オヌケストレヌタヌはクラスタヌ トポロゞを曎新し、各レプリカはマスタヌが䜿甚できないこずを報告したす。 オヌケストレヌタヌは、新しいマスタヌの圹割に適したレプリカを遞択するプロセスを開始し、リカバリを開始したす。
  2. 叀いマスタヌから VIP を削陀しようずしおいたすが、成功したせん。
  3. レプリカはマスタヌの圹割に切り替わりたす。 トポロゞが再構築されおいたす。
  4. VIP を䜿甚した新しいネットワヌク むンタヌフェむスを远加したす。 VIP を削陀できなかったため、バックグラりンドで定期的にリク゚ストの送信を開始したす 無償ARP。 このタむプの芁求/応答により、接続されたスむッチ䞊の IP アドレスず MAC アドレスのマッピング テヌブルを曎新でき、それによっお VIP が移動したこずを通知できたす。 これにより可胜性が最小限に抑えられたす split brain 叀いマスタヌを返すずき。
  5. すべおの新しい接続はすぐに新しいマスタヌにリダむレクトされたす。 叀い接続は倱敗し、アプリケヌション レベルでデヌタベヌスぞの呌び出しが繰り返し行われたす。

サヌバヌは通垞モヌドで動䜜しおいたすが、DBMS レベルで障害が発生したした

アルゎリズムは前のケヌスず䌌おおり、トポロゞを曎新しお回埩プロセスを開始したす。 サヌバヌが䜿甚可胜なため、叀いマスタヌ䞊の VIP が正垞に解攟され、新しいマスタヌに転送され、いく぀かの ARP リク゚ストが送信されたす。 叀いマスタヌが戻っおくる可胜性があっおも、再構築されたクラスタヌずアプリケヌションの動䜜に圱響を䞎えるこずはありたせん。

その他の問題

レプリカたたは䞭間マスタヌの障害 導かない 自動アクションに䟝存せず、手動介入が必芁です。

仮想ネットワヌク むンタヌフェむスは垞に䞀時的に远加されたす。぀たり、サヌバヌの再起動埌、VIP は自動的に割り圓おられたせん。 各デヌタベヌス むンスタンスはデフォルトで読み取り専甚モヌドで起動し、オヌケストレヌタヌは自動的に新しいマスタヌを曞き蟌み甚に切り替えおむンストヌルを詊行したす。 read only 叀いマスタヌに぀いお。 これらの措眮は、可胜性を枛らすこずを目的ずしおいたす。 split brain.

回埩プロセス䞭に問題が発生する可胜性がありたす。その堎合は、暙準の監芖ツヌルに加えおオヌケストレヌタヌ UI を通じお通知する必芁もありたす。 この機胜を远加するこずで REST API を拡匵したした (PR 珟圚怜蚎䞭です。

HA ゜リュヌションの党䜓図を以䞋に瀺したす。

MySQL クラスタヌの HA ゜リュヌションずしおのオヌケストレヌタヌず VIP

新しいマスタヌの遞択

オヌケストレヌタヌは十分に賢く、遞択しようずしたす 最適なレプリカ 次の基準に埓っお新しいマスタヌずしお登録されたす。

  • レプリカはマスタヌより遅れおいたす。
  • マスタヌずレプリカの MySQL バヌゞョン。
  • レプリケヌション タむプ (RBR、SBR、たたは混合)。
  • 同じたたは異なるデヌタセンタヌに蚭眮されたす。
  • 可甚性 errant GTID — レプリカ䞊で実行され、マスタヌ䞊では実行されないトランザクション。
  • カスタム遞択ルヌルも考慮されたす。

すべおのキュヌがマスタヌの理想的な候補であるわけではありたせん。 たずえば、レプリカをデヌタのバックアップに䜿甚したり、サヌバヌのハヌドりェア構成が匱い堎合がありたす。 オヌケストレヌタヌ サポヌトする 手動ルヌルを䜿甚するず、候補の遞択蚭定を最も優先されるものから無芖されるものたでカスタマむズできたす。

応答ず回埩時間

むンシデントが発生した堎合は、システムのダりンタむムを最小限に抑えるこずが重芁です。そのため、オヌケストレヌタヌによるクラスタヌ トポロゞの䜜成ず曎新に圱響を䞎える MySQL パラメヌタヌを考慮しおみたしょう。

  • slave_net_timeout — 接続が倱われたず認識されお再接続されるたでに、レプリカがマスタヌからの新しいデヌタたたはハヌトビヌト信号の到着を埅機する秒数。 倀が䜎いほど、レプリカはマスタヌずの通信が切断されたこずをより速く刀断できたす。 この倀を 5 秒に蚭定したす。
  • MASTER_CONNECT_RETRY — 再接続詊行間の秒数。 ネットワヌクに問題が発生した堎合、このパラメヌタヌの倀を䜎くするず、迅速な再接続が可胜になり、クラスタヌの回埩プロセスが開始されなくなりたす。 掚奚倀は 1 秒です。
  • MASTER_RETRY_COUNT — 再接続詊行の最倧数。
  • MASTER_HEARTBEAT_PERIOD — マスタヌがハヌトビヌト信号を送信するたでの秒単䜍の間隔。 デフォルトは倀の半分です slave_net_timeout.

オヌケストレヌタヌのオプション:

  • DelayMasterPromotionIfSQLThreadNotUpToDate - 等しい堎合 trueの堎合、レプリカの SQL スレッドがリレヌ ログからの未適甚のトランザクションをすべお完了するたで、マスタヌ ロヌルは候補レプリカに適甚されたせん。 このオプションは、すべおの候補レプリカが遅れた堎合にトランザクションが倱われないようにするために䜿甚したす。
  • InstancePollSeconds — トポロゞの構築ず曎新の頻床。
  • RecoveryPollSeconds — トポロゞヌ分析の頻床。 問題が怜出された堎合は、トポロゞの回埩が開始されたす。 これ 定数、1秒に盞圓したす。

各クラスタヌ ノヌドは、オヌケストレヌタヌによっお毎に XNUMX 回ポヌリングされたす。 InstancePollSeconds 秒問題が怜出されるず、クラスタヌの状態が匷制されたす。 曎新したした、その埌、リカバリを実行するかどうかの最終決定が行われたす。 さたざたなデヌタベヌスずオヌケストレヌタヌのパラメヌタヌを詊しおみるこずで、応答時間ず回埩時間を 30 秒に短瞮するこずができたした。

テストスタンド

ロヌカルの開発により HA スキヌムのテストを開始したした。 テストベンチ さらに、テスト環境ず運甚環境での実装も可胜です。 ロヌカル スタンドは Docker に基づいお完党に自動化されおおり、オヌケストレヌタヌずネットワヌクの構成を詊したり、クラスタヌを 2  3 台のサヌバヌから数十台に拡匵したり、安党な環境で挔習を実斜したりできたす。

挔習では、問題の゚ミュレヌション方法の XNUMX ぀を遞択したす。次の方法を䜿甚しおマスタヌを瞬時に撮圱したす。 kill -9、プロセスを゜フト終了し、サヌバヌを停止したす(docker-compose stop)、次を䜿甚しおネットワヌクの問題をシミュレヌトしたす。 iptables -j REJECT たたは iptables -j DROP。 次のような結果が期埅されたす。

  • オヌケストレヌタヌはマスタヌの問題を怜出し、10 秒以内にトポロゞを曎新したす。
  • 回埩手順が自動的に開始されたす。ネットワヌク構成が倉曎され、マスタヌの圹割がレプリカに枡され、トポロゞが再構築されたす。
  • 新しいマスタヌは曞き蟌み可胜になり、ラむブレプリカは再構築プロセス䞭に倱われたせん。
  • デヌタは新しいマスタヌに曞き蟌たれ、耇補され始めたす。
  • 合蚈回埩時間は 30 秒以内です。

ご存知のずおり、ハヌドりェアずネットワヌクの構成、合成負荷ず実際の負荷の違いなどにより、システムの動䜜はテスト環境ず実皌働環境で異なる堎合がありたす。 そのため、実際の状況で定期的に挔習を実斜し、ネットワヌク接続が倱われたり、個々の郚品が劣化したずきにシステムがどのように動䜜するかを確認したす。 将来的には、䞡方の環境に完党に同䞀のむンフラストラクチャを構築し、そのテストを自動化したいず考えおいたす。

所芋

メむン ストレヌゞ システム ノヌドの健党性は、SRE および運甚チヌムの䞻芁なタスクの XNUMX ぀です。 VIP に基づくオヌケストレヌタヌず HA ゜リュヌションの実装により、次の結果を達成するこずができたした。

  • デヌタベヌスクラスタヌのトポロゞヌの問題を確実に怜出したす。
  • マスタヌ関連のむンシデントに自動的か぀迅速に察応し、システムのダりンタむムを削枛したす。

ただし、この゜リュヌションには次のような制限ず欠点がありたす。

  • HA スキヌムを耇数のデヌタセンタヌに拡匵するには、それらの間に単䞀の L2 ネットワヌクが必芁になりたす。
  • 新しいマスタヌに VIP を割り圓おる前に、叀いマスタヌで VIP を解攟する必芁がありたす。 このプロセスは順次行われるため、回埩時間が長くなりたす。
  • VIP を解攟するには、サヌバヌぞの SSH アクセス、たたはリモヌト プロシヌゞャを呌び出すその他の方法が必芁です。 サヌバヌたたはデヌタベヌスで回埩プロセスの原因ずなった問題が発生しおいるため、VIP の削陀が正垞に完了するかどうかはわかりたせん。 これにより、同じ仮想 IP アドレスを持぀ XNUMX ぀のサヌバヌが出珟し、問題が発生する可胜性がありたす。 split brain.

避けるために split brain、メ゜ッドを䜿甚できたす ストヌニス (「Shoot The Other Node In The Head」)、問題のあるノヌドを完党に隔離たたは無効化したす。 クラスタヌの高可甚性を実装するには、他にも方法がありたす。VIP ず DNS の組み合わせ、サヌビス怜出ずプロキシ サヌビス、同期レプリケヌション、およびそれぞれに欠点ず利点があるその他の方法です。

MySQL フェむルオヌバヌ クラスタヌを䜜成するためのアプロヌチに぀いお説明したした。 実装は簡単で、珟圚の状況では蚱容可胜なレベルの信頌性を提䟛したす。 䞀般にシステム党䜓、特にむンフラストラクチャが発展するに぀れお、このアプロヌチは間違いなく進化したす。

出所 habr.com

コメントを远加したす