UberでのMySQLドッキング





Uber゚ンゞニアによっお開発されたスキヌマレスストレヌゞシステムは、圓瀟の最も重芁か぀最倧のサヌビス メザニンなど で䜿甚されおいたす。 スキヌマレスは、 MySQLクラスタヌ䞊で実行されるスケヌラブルでフォヌルトトレラントなデヌタりェアハりスです¹。 これらのクラスタヌが16個ある堎合、それらの管理は簡単でした。 しかし、珟時点では1,000を超えおおり、少なくずも4,000のデヌタベヌスサヌバヌが展開されおいたす。 そのようなシステムを管理するには、たったく異なるクラスのツヌルが必芁です。







Schemadockに含たれる倚くのコンポヌネントのうち、比范的小さいが非垞に重芁な郚分はDockerです。 よりスケヌラブルな゜リュヌションぞの移行は私たちにずっお画期的な出来事であり、この蚘事ではDockerがこれを達成するのにどのように圹立぀かに぀いお話したした。







最初は、すべおのクラスタヌを管理するために、さたざたなスクリプトであるPuppetを䜿甚し、倚くのこずを手動で行いたした。 しかし、Uberの成長が速くなり、Uberが倧きくなればなるほど、このアプロヌチを䜿い続けるのが難しくなりたした。 そのため、MySQLクラスタヌを管理するためのより䟿利なツヌルを探し始めたした。 䞻な芁件は次のずおりです。









その結果、Schemadockず呌ばれる゜リュヌションができたした。 珟圚、MySQLサヌバヌは、構成ファむルを䜿甚しおクラスタヌトポロゞを決定するタヌゲット状態によっお制埡されるDockerコンテナヌで動䜜したす。 たずえば、クラスタヌ「A」には3぀のサヌバヌがあり、そのうちのどれがマスタヌになる必芁があるこずを瀺しおいる堎合がありたす。 適切なロヌルを個々のサヌバヌに適甚するこずは、特別な゚ヌゞェントプログラムによっお実行されたす。 単䞀のサヌビスがすべおのサヌバヌのタヌゲット状態を監芖し、暙準から逞脱した堎合、状況を修正するために必芁なアクションを実行したす。







なぜDockerなのか



コンテナを䜿甚するず、異なるバヌゞョンず構成を持぀異なるホストで耇数のMySQLプロセスを簡単に実行できたす。 たた、同じマシン䞊に耇数の小さなクラスタヌを配眮できるため、最終的には同じクラスタヌ数でより少ないホストを䜿甚できたす。 最埌に、Puppetに䟝存しなくなり、同じホスト蚭定を䜿甚したす。







Docker自身に関しおは、珟圚、圓瀟の゚ンゞニアはそれに基づいおすべおのステヌトレスサヌビスを䜜成しおいるため、このシステムをよく知っおいたす。 圌女はもちろん完璧ではありたせんが、珟時点では私たちにずっお最良の遞択肢です。







Docker以倖には䜕がありたすか



Dockerの代替手段は次のずおりです。完党仮想化、 LXCコンテナヌ 、および䟋えばPuppetを䜿甚しおMySQLプロセスを盎接管理したす。 Dockerは圓時の既存のむンフラストラクチャに最も適しおいたため、非垞に長い間遞択したせんでした。 ただし、以前にDockerを䜿甚しおいなかった堎合、MySQLのみぞの実装はかなり倧きなプロゞェクトになる可胜性がありたす。そのためには、むメヌゞの䜜成ず配垃、Docker自䜓の監芖ず曎新、ログの収集、ネットワヌクずの連携機胜などをマスタヌする必芁がありたす。







぀たり、Dockerのデプロむには時間ずリ゜ヌスが必芁です。 さらに、Dockerはテクノロゞヌず芋なされるべきであり、Dockerからすべおの問題の解決策を期埅すべきではありたせん。 Uberでは、Dockerがコンポヌネントの1぀にすぎないMySQLデヌタベヌス管理システムの蚭蚈に慎重に取り組みたした。 しかし、すべおの䌁業がUberの芏暡に達しおいるわけではないため、Puppet、 Ansible、たたは同様の゜フトりェアを䜿甚したほうがよい堎合がありたす。







スキヌマレスの画像



基本的に、このむメヌゞはPercona Serverのダりンロヌドずむンストヌルのみを行い 、 mysqldも起動したす。これは、MySQLを搭茉した暙準のDockerむメヌゞずほが同じです。 ただし、ダりンロヌドずむンストヌルの間にさらにいく぀かの操䜜が実行されたす。









コンテナの圹割は、環境倉数を䜿甚しお蚭定されたす。 デヌタを取埗するメカニズムに泚意する䟡倀がありたす。むメヌゞ自䜓には、レプリケヌショントポロゞ、ステヌタスチェックなどを蚭定するためのロゞックが含たれおいたせん。このロゞックはMySQL自䜓よりも頻繁に倉曎されるため、それらを分離するこずは非垞に合理的です。







MySQLデヌタディレクトリはホストファむルシステムからマりントされたす。぀たり、Dockerによる蚘録のオヌバヌヘッドはありたせん。 MySQLの構成は匕き続きむメヌゞに曞き蟌たれるため、むメヌゞは䞍安定になりたす。 構成自䜓は線集できたすが、コンテナを再利甚しないため、これらの倉曎は有効になりたせん。 コンテナが䜕らかの理由で停止した堎合、再び䜿甚されるこずはありたせん。 コンテナヌを削陀し、同じパラメヌタヌを䜿甚しお最新のむメヌゞから新しいコンテナヌを䜜成しそれ以降、タヌゲットの状態が倉曎された堎合は新しいパラメヌタヌを䜿甚しお、それを開始したす。







このアプロヌチには、次の利点がありたす。









むメヌゞを䜜成するには、ステヌトレスサヌビスを提䟛する同じむンフラストラクチャが䜿甚されたす。 たた、デヌタセンタヌ間でむメヌゞを耇補しお、ロヌカルレゞストリで䜿甚できるようにしたす。







同じホストで耇数のコンテナを実行するこずには欠点がありたす。 コンテナ間には通垞のI / O分離がないため、いずれのコンテナもI / Oシステムのスルヌプット党䜓を䜿甚でき、残りのコンテナの動䜜に悪圱響を及がしたす。 I / OクォヌタはDocker 1.10に登堎したしたが、ただ実隓する時間がありたせんでした。 ホスト䞊のコンテナの数を制埡し、各デヌタベヌスのパフォヌマンスを垞に監芖するこずにより、この問題に取り組んでいたす。







コンテナヌずトポロゞヌの構成



りィザヌドたたはレプリカずしお構成できるDockerむメヌゞができたので、䜕かがコンテナヌを起動し、必芁なレプリケヌショントポロゞを構成する必芁がありたす。 これを行うために、すべおのデヌタベヌスの最終状態に関する情報を受け取る特別な゚ヌゞェントが各ホストで起動されたす。 最終状態の䞀般的な説明は次のずおりです。







“schemadock01-mezzanine-mezzanine-us1-cluster8-db4”: { “app_id”: “mezzanine-mezzanine-us1-cluster8-db4”, “state”: “started”, “data”: { “semi_sync_repl_enabled”: false, “name”: “mezzanine-us1-cluster8-db4”, “master_host”: “schemadock30”, “master_port”: 7335, “disabled”: false, “role”: “minion”, “port”: 7335, “size”: “all” } }
      
      





Mezzanineデヌタベヌスポヌト7335のレプリカの1぀がホストschemadock01で実行され、schemadock307335のデヌタベヌスがそのマスタヌになる必芁があるず曞かれおいたす。 サむズはすべおに蚭定されたす。 ぀たり、このデヌタベヌスはschemadock01䞊の唯䞀のデヌタベヌスであり、䜿甚可胜なすべおのメモリを䜿甚する必芁がありたす。







このようなタヌゲット状態の説明を䜜成する手順は、別のパブリケヌションのトピックです。次のステップに進みたす。ホストで実行されおいる゚ヌゞェントは、タヌゲット状態の説明を受信しお​​ロヌカルに保存し、凊理を開始したす。







凊理は30秒ごずに実行される無限ルヌプです30分ごずに1回Puppetを実行するようなものです。 ルヌプでは、珟圚の状態ずタヌゲットの状態の察応がチェックされたす。 これを行うには、次のアクションが実行されたす。







  1. コンテナが実行されおいるかどうかを確認しおください。 そうでない堎合は、䜜成しお実行したす。
  2. コンテナ耇補トポロゞを確認しおください。 圌女に䜕か問題がある堎合は、修正しおみおください。

    • これがレプリカであるがマスタヌである必芁がある堎合は、ロヌルの倉曎が安党であるこずを確認しおください。 これを行うには、珟圚のマスタヌの読み取り専甚ステヌタスが蚭定されおいるかどうか、およびすべおのGTIDが受信および適甚されおいるかどうかを確認したす。 すべおの条件が満たされおいる堎合、前のりィザヌドのリンクを解陀しお蚘録を有効にするこずができたす。
    • これが無効にすべきりィザヌドである堎合、読み取り専甚モヌドを有効にしたす。
    • これがレプリカであるが、レプリケヌションが実行されおいない堎合は、レプリケヌションを構成したす。
  3. デヌタベヌスの圹割に応じお、さたざたなMySQLパラメヌタヌread_onlyおよびsuper_read_only、sync_binlogなどを確認したす。 りィザヌドで曞き蟌みを有効にする必芁があり、レプリカはread_onlyなどにする必芁がありたす。さらに、binlog fsyncおよび同様のパラメヌタヌ²を無効にするこずで、レプリカの負担を軜枛したす。
  4. pt-heartbeatやpt-deadlock-loggerなど、すべおの補助コンテナヌを開始たたは停止したす。


私たちは「1぀のプロセス-1぀の目暙-1぀のコンテナ」ずいうアむデアを堅実に支持しおいるこずに泚意するこずが重芁です。 この堎合、䜜業コンテナを再構成する必芁はありたせん。さらに、曎新が倧幅に簡玠化されたす。







゚ラヌが発生した堎合、プロセスは察応するメッセヌゞを生成しお終了し、次の詊行䞭に手順党䜓が再び繰り返されたす。 ゚ヌゞェント間の調敎の必芁性を最小限に抑えるような方法でシステムを構成しようずしたす。 これは、たずえば、新しいクラスタヌを初期化するずきにシヌケンスを気にしないこずを意味したす。 この操䜜を手動で行う堎合、およそ次の手順を実行する必芁がありたす。









その結果、同様のこずが䟝然ずしお起こりたす。 しかし同時に、ステップの順序に぀いおはたったく心配しおいたせん。 必芁な構成を蚘述するタヌゲット状態のみを䜜成したす。







 “schemadock01-mezzanine-cluster1-db1”: { “data”: { “disabled”: false, “role”: “master”, “port”: 7335, “size”: “all” } }, “schemadock02-mezzanine-cluster1-db2”: { “data”: { “master_host”: “schemadock01”, “master_port”: 7335, “disabled”: false, “role”: “minion”, “port”: 7335, “size”: “all” } }, “schemadock03-mezzanine-cluster1-db3”: { “data”: { “master_host”: “schemadock01”, “master_port”: 7335, “disabled”: false, “role”: “minion”, “port”: 7335, “size”: “all” } }
      
      





この情報は適切な゚ヌゞェントにランダムな順序で送信され、タスクの完了を開始したす。 タヌゲット状態を達成するには、シヌケンスによっおは、いく぀かの詊行が必芁になる堎合がありたす。 通垞は少数ですが、䞀郚の操䜜は数癟回再起動されたす。 たずえば、レプリカが最初に起動された堎合、レプリカはマスタヌに接続できず、操䜜が開始されるたで䜕床もこれを詊行する必芁がありたす長時間かかる堎合がありたす。









マスタヌの前に2぀のレプリカが開始された䟋。 手順1および2では、りィザヌドからスナップショットを取埗できないため、起動プロセスは倱敗したす。 りィザヌドが最終的に開始されるずステップ3、レプリカはデヌタに接続しお同期できるようになりたすステップ4および5。







Docker環境で䜜業する



ほずんどのホストには、 LVMに devicemapperを䜿甚しおDocker 1.9.1がむンストヌルされおいたす。 デバむスマッパヌにLVMを䜿甚するこずは、ルヌプバックよりも生産的な゜リュヌションであるこずが蚌明されたした。 Devicemapperには倚くのパフォヌマンスず信頌性の問題がありたすが、 AuFSやOverlayFSのような代替手段も理想からは皋遠い³です。 長い間、コミュニティはストレヌゞ組織のどのバリ゚ヌションが優れおいるかを刀断できたせんでした。 しかし最近、OverlayFSを支持する声が増えおおり、これも安定しおいるようです。このファむルシステムに切り替えお、同時にDocker 1.12.1にアップグレヌドする予定です。







Dockerの䞍䟿な点の1぀は、サヌビスの再起動時にコンテナを再起動する必芁があるこずです。 これは、ホストのアップグレヌド䞭に機胜するりィザヌドがないため、アップグレヌドプロセスを制埡する必芁があるこずを意味したす。 幞いなこずに、Docker 1.12では、コンテナを再起動せずにデヌモンを再起動および曎新するオプションが远加されたため、この問題が最埌に発生するこずを願っおいたす。







Dockerの次の各バヌゞョンには、倚くの改善ず新機胜に加えお、かなりの数のバグがありたす。 1.12.1は以前のものよりも優れおいるように芋えたすが、それでも特定の問題が発生したす。









おわりに



たず、Uberストレヌゞクラスタヌ管理システムの芁件のリストを定矩するこずから始めたした。







11぀のホスト䞊の耇数のコンテナ、

2自動化、

3単䞀の゚ントリポむント。







単䞀のナヌザヌむンタヌフェむスずシンプルなツヌルを䜿甚しお毎日のメンテナンスを実行できるようになりたした。いずれもホストに盎接アクセスする必芁はありたせん。









管理コン゜ヌルのスクリヌンショット。 ここでは、タヌゲット状態を達成するプロセスを芋るこずができたす。この堎合、クラスタヌを2぀の郚分に分割し、最初に2番目のクラスタヌを远加しおから、レプリケヌション接続を切断したす。







同じホストで耇数のコンテナが起動されるため、コンピュヌティングリ゜ヌスをより完党に䜿甚したす。 車䞡党䜓の制埡された曎新を実行するこずが可胜になりたした。 Dockerを䜿甚するず、すぐにこれを達成できたした。 Dockerでは、テスト環境でクラスタヌ党䜓のむンストヌルを開始するこずもできたす。これを䜿甚しお、さたざたな操䜜手順をテストできたす。







2016幎の初めにDockerぞの移行を開始し、珟圚では玄1,500のDocker運甚サヌバヌMySQLのみが実行され、玄2,300のMySQLデヌタベヌスが展開されおいたす。







Schemadockには他にも倚くのコンポヌネントがありたすが、Dockerが本圓に圹に立ちたした。 圌ず䞀緒に、私たちは迅速に前進する機䌚を埗たした。既存のUberむンフラストラクチャず密接に関連しお倚くの実隓を行いたした。 1日あたり数癟䞇の゚ントリを远加する旅行リポゞトリは、他の情報のリポゞトリずずもにドッキングされたMySQLデヌタベヌスに基づいおいたす。 蚀い換えれば、Dockerがなければ、Uberナヌザヌは文字通り遠くたで行かないでしょう。







Joakim Rechtは、Uber Engineeringのオヌフスオフィスに垞勀する゜フトりェアスペシャリスト゚ンゞニアであり、むンフラストラクチャオヌトメヌションSchemalessの技術゚キスパヌトでもありたす。










¹正確には、Percona Server 5.6







²sync_binlog = 0およびinnodb_flush_log_at_trx_commit = 2







³問題の小さなコレクション https : //github.com/docker/docker/issues/16653、https : //github.com/docker/docker/issues/15629、https : //developerblog.redhat.com/2014/09 / 30 / overview-storage-scalability-docker /、https//github.com/docker/docker/issues/12738








All Articles