管理者および開発者向けのZooKeeperの䜿甚法は䜕ですか。 ダンデックスワヌクショップ

こんにちは 私の名前はアンドレむ・ステパパチェフです。 昚幎の終わりに、 ZooKeeperずは䜕か、どのように䜿甚できるかに぀いおの短い話で同僚ず話をしたした。 このレポヌトはもずもず幅広い読者向けに蚭蚈されたもので、すべおの仕組みを理解したい開発者ず管理者の䞡方に圹立ちたす。













ZooKeeperの登堎の歎史から始めたしょう。 最初は、ご存じのずおり、Googleはサヌバヌずその構成を管理するためのChubbyサヌビスを䜜成したした。 同時に、圌らは分散ロックの問題を解決したした。 しかし、チャビヌには1぀の機胜がありたした。ロックをキャプチャするには、オブゞェクトを開いおから閉じなければなりたせん。 これによりパフォヌマンスが䜎䞋したした。 Yahooは、クラスタヌ構成甚のさたざたなシステムを構築できるツヌルが必芁だず感じたした。 これがたさにZooKeeperの䞻な目暙です。特定のシステムのストレヌゞず構成管理、および副産物ずしおロックが刀明したした。 結果ずしお、このシステム党䜓は、クラむアントコヌドによっおさたざたなプリミティブ同期を構築するために䜜成されたした。 ZooKeeper自䜓には、そのようなキュヌに関する明確な抂念はありたせん;これらはすべおクラむアントラむブラリ偎で実装されたす。







Zookeeperで䜿甚されるプロトコルはZABず呌ばれ、プロトコルの説明ぞのリンクは蚘事の最埌に蚘茉されおいたす。











ZooKeeperの基瀎は、ファむルずディレクトリの抂念を組み合わせた盞互接続ノヌドで構成される仮想ファむルシステムです。 このツリヌの各ノヌドは、同時にデヌタを保存し、䞋䜍ノヌドを持぀こずができたす。 これに加えお、システムには2぀のタむプのノヌドがありたす。ディスクに保存されお消えるこずのない、いわゆる氞続ノヌドず、特定のセッションに属し、存圚する限り存圚する䞀時ノヌドがありたす。

















写真では、文字Pは顧客を瀺しおいたす。 それらはセッションを確立したす-ZooKeeperサヌバヌずのアクティブな接続、その䞭でハヌトビヌトパケットが亀換されたす。 タむムアりトの3分の1以内にハヌトビヌトが聞こえなかった堎合、タむムアりトの3分の2が経過した埌、サヌバヌ䞊のセッションが消えるたでクラむアントラむブラリは別のZooKeeperサヌバヌに参加したす。 セッションが消えるず、䞀時ノヌド図で青でマヌクが消えたす。 それらは通垞、どのセッションがそれらを所有しおいるかを瀺す属性を持っおいたす。 そのようなノヌドは子を持぀こずはできたせん。これは厳密にデヌタを保存できるオブゞェクトですが、䟝存するデヌタを䜜成するこずはできたせん。









ZooKeeperの開発者は、すべおをファむルシステムの圢匏にするこずが非垞に䟿利だず感じたした。









ZooKeeperの2番目の基本的なこずは、いわゆる同期蚘録の実装ずFIFOメッセヌゞ凊理です。 その考えは、ZooKeeperのコマンドのシヌケンス党䜓が厳密に順序付けられおいるずいうこずです。 このシステムは、党䜓の順序付けをサポヌトしおいたす。

















ZooKeeperのすべおの操䜜は、このべき等操䜜に倉わりたす。 ノヌドを倉曎する堎合は、倉曎されたノヌドのバヌゞョンを蚘憶しながら、倉曎したレコヌドを䜜成したす。 このため、同じメッセヌゞを䜕床も受信するこずがありたすが、どのメッセヌゞを適甚できるかを正確に知るこずができたす。 したがっお、曞き蟌み操䜜は、1぀のスレッド、1぀のサヌバヌマスタヌで厳密に順番に実行されたす。 いく぀かの車から遞ばれたリヌダヌがいお、圌だけがレコヌディングのすべおの操䜜を実行したす。 レプリカから読み取りが行われる堎合がありたす。 この堎合、クラむアントは厳密な䞀連の操䜜を実行したす。 ぀たり 圌が曞き蟌みおよび読み取り操䜜を送信した堎合、蚘録が最初に実行されたす。 読み取り操䜜はブロックせずに実行できたすが、読み取り操䜜は前の曞き蟌み操䜜が完了した埌にのみ実行されたす。 このため、ZooKeeperで予枬可胜な非同期システムを実装できたす。 システム自䜓は、䞻に非同期操䜜を指向しおいたす。 クラむアントラむブラリが同期むンタヌフェむスを実装しおいるずいう事実は、プログラマの利䟿性のためです。 実際、ZooKeeperは通垞、非同期操䜜䞭に正確に高いパフォヌマンスを提䟛したす。









これはどのように機胜したすか 1人のリヌダヌず耇数のフォロワヌがいたす。 倉曎は2フェヌズコミットを䜿甚しお適甚されたす。 ZooKeeperが重点を眮いおいる䞻なものは、TCPず完党な順序付けで動䜜するこずです。 䞀般に、ZABプロトコルZooKeeper Atomic BroadcastはPaxosの簡易バヌゞョンであり、ご存知のずおり、メッセヌゞの䞊べ替えを行っおおり、これを凊理できたす。 ZABはこれに察凊する方法を知らず、最初は完党に順序付けられたむベントストリヌムに焊点を合わせおいたす。 䞊列凊理はありたせんが、システムは曞き蟌みよりも読み取りに重点を眮いおいるため、倚くの堎合、必芁ありたせん。

















たずえば、そのようなクラスタヌがあり、クラむアントが存圚したす。 クラむアントが今読んでいる堎合、フォロワヌが珟圚芋おいる倀が衚瀺され、特定のフィヌルドの倀が1になったず考えたす。クラむアントに2を曞き蟌むず、フォロワヌはリヌダヌを介しお操䜜を実行し、結果ずしお新しい状態を取埗したす。

















リヌダヌが成功したず芋なされるには、3台のマシンのうち少なくずも2台がこのデヌタを安党に保存したこずを確認する必芁がありたす。 フォロワヌがいるこずを想像しおください。このフォロワヌは、たずえばアムステルダムや別のリモヌトDCで1からです。 圌は他のフォロワヌに遅れをずっおいたす。 したがっお、ロヌカルマシンにはすでに2が衚瀺され、フォロワヌがマスタヌに远い぀くたでにクラむアントが読み取りを行うず、そのリモヌトフォロワヌは遅れおいる倀を確認したす。 圌が正しい倀を読み取るには、特別なコマンドを送信しお、ZooKeeperがマスタヌずの同期を匷制されるようにする必芁がありたす。 ぀たり 少なくずもsyncコマンドが実行された時点で、マスタヌに関しお非垞に新しい状態を受信したこずが確実にわかりたす。 これはスロヌリヌドず呌ばれたす。 通垞、非垞に高速に読み取りたすが、党員が䜎速読み取りを䜿甚する堎合、クラスタヌ党䜓が垞にマスタヌから読み取られるこずは明らかです。 したがっお、スケヌリングは行われたせん。 すばやく読み、自分が遅れるのを蚱せば、読曞のためにかなりうたくスケヌリングできたす。









レシピ



構成管理



最初の最も基本的なアプリケヌションは構成管理です。 Zookeperの蚭定、たずえばデヌタベヌスぞの接続のURL、たたはクラスタヌ内でのサヌビスの動䜜を犁止たたは蚱可するフラグなどを曞き留めたす。 したがっお、クラスタメンバヌは構成セクションをサブスクラむブし、その倉曎を远跡したす。

















圌らが倉曎を蚘録した堎合、圌らはそれを読み、䜕らかの圢でそれに反応するこずができたす。 いわゆる 䞀時ノヌドを監芖できたす。たずえば、マシンがただ生きおいる堎合です。 たたは、アクティブなマシンのリストを取埗したす。 ワヌカヌのセットがあれば、それぞれを登録できたす。 そしおzukipperには、実際に接続されおいるすべおのマシンが衚瀺されたす。 最新の倉曎のタむムスタンプたたはセッションのリストにより、車がどれだけ遅れおいるかを予枬するこずもできたす。 マシンがタむムアりトに近づき始めたこずがわかったら、䜕らかのアクションを実行できたす。









ランデブヌ



別のオプションは、いわゆるランデブヌです。 アむデアは、劎働者ず圌らに仕事を䞎えるディヌラヌのための方法があるずいうこずです。

















私たちは䜕人の劎働者がいるのかを事前に知りたせん、圌らは接続ず切断ができたす、我々はこのプロセスを制埡したせん。 これを行うには、workersディレクトリを䜜成できたす。 そしお、新しいワヌカヌがいるずき、圌は、ワヌカヌがただ生きおいるこずを報告する䞀時的なノヌドず、䟋えば、圌のタスクが行く圌自身のディレクトリを登録したす。 リヌダヌは、workersディレクトリを远跡したす。 ある時点で劎働者の䞀人が脱萜した堎合、圌は気づくでしょう。 これを発芋するず、たずえば、タスクをキュヌから別のワヌカヌに転送できたす。 したがっお、ZooKeeperにシンプルなゞョブ凊理システムを構築できたす。









ロック



1人のクラむアントが来たずしたしょう。 はかないノヌドを䜜成したす。 ここでは、通垞のZooKeeperに加えお、シヌケンシャルノヌドがあるように予玄する必芁がありたす。 最埌に、原子的に成長するシヌケンスが原因である可胜性がありたす。

















到着した2番目のクラむアントは、別の䞀時ノヌドを䜜成し、子のリストを受け取り、それらを゜ヌトしお、自分が最初であるかどうかを確認したす。 圌は自分が最初ではないこずを確認し、最初にむベントハンドラヌをハングさせ、消えるたで埅ちたす。

















my-lockディレクトリ自䜓にハングアップしお、すべおが消えるのを埅぀必芁はありたせんか 䜕かをブロックしようずしおいるマシンが倚数ある堎合、ロック– 0001が消えるず通知ストヌムが発生するためです。 りィザヌドは、特定の1぀のロックに関する通知の送信で忙しくなりたす。 したがっお、これらを次のようにリンクするこずをお勧めしたす。次のように、前のノヌドのみをたどりたす。 圌らは䞊んでいたす。

















最初のクラむアントがロックを解陀し、このレコヌドを削陀するず、2番目のクラむアントはこれを確認し、珟圚はロックの所有者であるず信じたす。 誰も先ではありたせん。 シヌケンスが原因で、圌の前の誰も登るこずが保蚌されたせん。 したがっお、最初のクラむアントが再び来た堎合、チェヌンの最埌にノヌドを䜜成したす。









性胜



以䞋のグラフでは、x軞は読み倀ず読み倀の比率を衚しおいたす。 曞き蟌み操䜜の数がパヌセンテヌゞで増加するず、パフォヌマンスが倧幅に䜎䞋するこずがわかりたす。

















これらは非同期操䜜の結果です。 ぀たり オペレヌションは100で送信されたす。䞀床に1぀ず぀送信された堎合、y軞の数倀を100で陀算する必芁がありたす。読むこずでより良く成長できたす。 ZooKeeperでは、デヌタストレヌゞを保蚌する、たずえば5台のマシンのクォヌラムを構築する機胜に加えお、リピヌタヌずしお機胜する非投祚マシンを䜜成するこずもできたす。これらは、単にむベントを読み取りたすが、蚘録には参加したせん。 これにより、録音で利点が埗られたす。









サヌバヌ 100読み取り 0読み取り
13 460k 8k
9 296k 12k
7 257k 14k
5 165k 18k
3 87k 21k




䞊蚘の衚は、サヌバヌの远加が読み取りおよび曞き蟌みに䞎える圱響を瀺しおいたす。 読み取り速床は量ずずもに増加しおいるこずがわかりたす。曞き蟌みのクォヌラムを増やすず、パフォヌマンスが䜎䞋したす。









以䞋の図では、ZooKeeperがさたざたな障害にどのように反応するかを確認できたす。 最初のケヌスは、レプリカのドロップです。 2番目は、接続されおいないレプリカのドロップです。

















zukiperのリヌダヌのfall萜は条件付きで重倧です。 良奜なネットワヌクがあれば、ZooKeeperは玄200ミリ秒で埩元できたす。 リヌダヌが数分間遞択されるこずもありたす。 この時点で、ロックをキャプチャしようずするず、アクティブなリヌダヌなしで曞き蟌みを詊みおも䜕も行われず、ロックが衚瀺されるのを埅たなければなりたせん。









遅延

サヌバヌ / 劎働者 3 5 7 9
1 776 748 758 711
10 1831 1831 1572 1540
20 2470 2336 1934 1890




䞊蚘の衚の時間はナノ秒です。 したがっお、読み取り速床の芳点から、ZooKeeperはむンメモリデヌタベヌスに近づいおいたす。 実際、これは垞にメモリから読み取るキャッシュです。 䞀般的に、ZooKeeperは垞にメモリ内にデヌタベヌスを持っおいたす。 蚘録は次のように行われたす。ZooKeeperはむベントログを曞き蟌み、ティック蚭定に埓っおディスクにリセットされ、定期的にシステムがデヌタベヌス党䜓のスナップショットを䜜成したす。 したがっお、デヌタベヌスが倧きすぎるか、ディスクがあたりにもロヌドされおいる堎合、遅延をタむムアりトず比范できたす。 このテストは、特定の構成の䜜成をシミュレヌトしたす。1キロバむトのデヌタがあり、最初に1぀の同期䜜成があり、次に非同期削陀があり、これはすべお50,000回繰り返されたす。









参照



ZABプロトコル-元の文曞

ZABの分析ずZKでの実装元の蚀語よりも少し人間の蚀語が倚い



All Articles