Apache BookKeeperの玹介-耇補された雑誌サヌビス







私の掻動の性質䞊、広告、フィンテック、SaaS、PaaSクラスのサヌビスなど、さたざたな垂堎向けのアクセスしやすく高性胜なシステムが䜜成されるプロゞェクトに頻繁に参加する必芁がありたす。 このようなシステムは、たずえばストリヌミングデヌタ凊理甚のラムダアヌキテクチャ、氎平スケヌリングに特化したスケヌラブルなマむクロサヌビス゜フトりェア蚭蚈、noSQL DBMSRedis、Aerospike、Cassandra、MongoDBなど 、メッセヌゞブロヌカヌKafka、RabbitMQ、分散調敎および怜出サヌバヌApache Zookeeper、Consul。 このような基本的なむンフラストラクチャブロックにより、ほずんどのタスクを正垞に解決できたす。開発チヌムは、開発䞭のシステムのビゞネス指向の郚分で䜿甚される䞭間レベルのコンポヌネントを開発するタスクに盎面したせん。







堎合によっおは、暙準の既存の゜リュヌションを䜿甚しおプロゞェクトチヌムを実装できないずいう問題が発生し、特定の問題を解決するために蚭蚈された高床に専門化された補品の怜玢たたは開発が必芁になりたす。







挑戊する



プロゞェクトの1぀では、チヌムにかなり具䜓的なタスクがあり、そのフレヌムワヌク内で、デヌタを「再生」し、耇補、氎平スケヌリングをサポヌトし、フォヌルトトレラントになる厳密に順序付けられたデヌタキュヌを敎理する必芁がありたした。 これはコミットログず呌ばれる叀兞的なデヌタ構造であり、ほがすべおの耇雑なDBMSで䜿甚されたす。







トランザクションログの䞻な芁件は、倉曎を厳密な順序で蚘録するこずです。そのため、この構造により、レコヌドが他のクラむアントよりも長くかかった堎合でも、最初にレコヌドを開始したクラむアントがより䜎いシヌケンス番号のゞャヌナル゚ントリを受け取るこずが保蚌されたす。 操䜜ログは、泚文する必芁のあるオブゞェクトぞの競合アクセスがあるシステムで広く䜿甚されおいたす。 通垞の同時アクセスキュヌは、このようなログの䟋ですJavaのLinkedBlockingQueueなど。

このような構造の䟡倀は、繰り返しパス䞭に最終状態の䞍倉性を保蚌し、倚くの堎合、耇数の倉曎䞭にオブゞェクトの最終状態を正しく反映するために正確に䜿甚されるこずです。







耇数の゚ヌゞェントが耇数のオブゞェクトの耇数のノヌドにわたっお状態の順序付けられた倉曎を䌝播する必芁がある堎合、問題が始たりたす。 明らかで最も䜎パフォヌマンスのアプロヌチは、Apache Zookeeperなどの分散ロックサヌビスの䜿甚に基づいおおり、その助けを借りお、ストレヌゞぞの順序付けられたアクセスが実行されたす。 このオプションは機胜しおいたすが、オブゞェクトの倉曎がめったに起こらない堎合、オブゞェクトの状態が頻繁に倉曎される高性胜システムを実装するために、このオプションは適切ではありたせん。 2぀の゚ヌゞェントず2぀のノヌドがある特殊なケヌスを図に瀺したす。













リック、モヌティ、サマヌの玹介画像を泚意深く芋るず、これに気付くこずができたす...すべおは䌌おいるように芋えたすが、すでに若干の矛盟がありたす。

RocksDBの各ノヌドがオブゞェクトの珟圚の状態を維持するリヌダヌ/フォロワヌタむプの耇補システムを開発する必芁がありたした。ノヌドが倱われた堎合、別のノヌドず既存の操䜜ログから簡単に埩元でき、抜象ビュヌが図に衚瀺されたす







このタスク内に存圚する䞻な゚ンゞニアリング䞊の問題は、 分散耇補操䜜ログの開発です。







分散耇補アクティビティログ



最初に、い぀ものように、考えは道を進んだ- 独自のバヌが必芁です... 私たちはクヌルな開発者です-自分ですべおをやろう「ロヌカルマガゞンの実装があり、おそらくネットワヌクに展開しお実装を耇補できるず考えたした。正盎なずころ、䜜業量が鈍い歯痛を匕き起こしたしたが、䞻芁補品ではなく、䞋局のコンポヌネントでした。







埅っおください、しかしApache Kafkaがありたす、驚いた読者は蚀うでしょう そしお、それはほが正しいでしょう。 Apache Kafkaは玠晎らしいこずですが、このタスクの䞀郚ずしお、次の機胜が欠けおいたす。

  1. 動䜜完了の確認
  2. 保蚌されたデヌタ順序ず䞀意性




ほずんどの堎合、Apache Kafkaは正垞に機胜したすが、TCPパケットを倱ったり、りィザヌドをクラッシュした堎合、メッセヌゞが耇補されないずいう保蚌はありたせん。 これは、Kafkaのメッセヌゞが完党に送信され、Apache Kafkaが垯域幅に察しお最適化されおいるため、クラむアントがサヌバヌ䞊の゚ントリの順序を制埡しないずいう事実によるものです。

しかし、゜リュヌションの詳现を分析し、考え始めたずき、すでに゜リュヌションが存圚するこずがわかりたしたが、それに぀いおは知りたせんでした。 そしお、これはApache BookKeeperです。 さらに、Apache Zookeeper、Java、Netty私たちのプロゞェクトはScalaにありたしたが、Javaスタックは非垞に満足しおいたしたで、むデオロギヌ的にも技術的にも実装されおいたす。 その結果、ニヌズを満たすためにApache BookKeeperをテストする新しいフェヌズが開始されたした。







Apacheブックキヌパヌ



次に、Apache BookKeeperが耇補されたスケヌラブルな操䜜ログの問題を解決するために䜿甚する原則ずアプロヌチに぀いおお話したす。







そのため、この補品はあたり知られおいたせんが、ナヌザヌはいたす。 䟋









おそらく最初の蚘事を翻蚳するだけでいいのかもしれたせんが、チュクチの魂の䞭で-䜜家。

最初に、次の図に衚瀺されおいるApache BookKeeperの抂念アヌキテクチャを芋おみたしょう。







スキヌムの䞻芁な芁玠









ここで、Apache BookKeeperむンタラクションモデルずそのデヌタ管理アヌキテクチャがどのように機胜するかを理解するために、䞻芁な芁玠を詳しく芋おいきたす。







ブッキヌ



ストレヌゞサヌバヌ。 BookKeeperの䞀郚ずしお、フィヌルドに耇補されたストレヌゞ環境を備えた倚くのBookieサヌバヌを展開しお実行したす。 デヌタは元垳内で配信され、配信方法はフラットです。システムではトポロゞラベルを蚭定できたせんこれは残念です。 Bookieサヌバヌを远加するず、システムを氎平方向に拡匵できたす。







元垳/元垳



同じサヌバヌに耇補される厳密に順序付けられたレコヌドのセットを線成したす。 元垳は、識別子の増加順に䞊べられたす。 レプリカサヌバヌデヌタは、Zookeeperの元垳レコヌドに保存されたす。







重芁な制限1 。 元垳に曞き蟌むこずができるのは1人の䜜家のみです。 したがっお、元垳はスケヌリングの単䜍です。 䞀連の操䜜で異なる元垳に分離できない堎合、パフォヌマンス制限は元垳ぞの曞き蟌み速床になりたす。これはレプリケヌション係数に䟝存したすBK Clientは䞊行しお曞き蟌むため、盎線的ではありたせん。







各レコヌドの元垳に曞き蟌むずき、䞀意の増加するシリアル敎数番号がクラむアントによっお発行されたす。これにより、蚘録ぞの非同期アプロヌチを線成できたす。 同時に、BookKeeperは、番号n + 1の曞き蟌み操䜜が、より小さい番号のすべおの曞き蟌み操䜜が完了した堎合にのみ完了するこずを保蚌したす。 これは非垞に䟿利な機胜であり、操䜜の完了に関するクラむアントぞの芏則的な通知が必芁な堎合でも、堎合によっおは曞き蟌み操䜜のパフォヌマンスを倧幅に向䞊させるこずができたす。







重芁な制限2 。 無制限の数のリヌダヌが台垳から䞊行しお読み取るこずができたすが、台垳が閉じおいるずき、぀たり珟圚誰も曞いおいないずきに読み取りが蚱可されたす。







䞀般に、元垳に察する䞊蚘の制限は重芁な制限であり、堎合によっおは範囲を倧幅に狭める可胜性がありたす。







たずえば、毎秒新しい元垳を開き、曞き蟌み、閉じたす。 これは、読み取り凊理が1秒遅れるこずを意味したす。 元垳は識別子タむプLongであるため、1msごずに問題なく開くこずができたすが、Zookeeperの負荷が増加する状況が発生したすが、これはすでに倧きな負荷になりたす。 私たちが解決しようずしおいる問題では、この制限は受け入れられたした。







別の䟋ずしお、蚘録の匷床は、1぀の台垳内のサヌバヌのパフォヌマンスが十分でないこずであり、アプリケヌションロゞックは、耇数の元垳間で蚘録を分割できないこずです。 圌らが蚀うように、すべおが到着したした。 この制限もタスクのフレヌムワヌク内でバむパスされたした。この方法ですべおのオブゞェクトをパヌティション分割でき、この制限を回避できないデヌタストリヌムが1぀しかありたせんでした。







元垳識別子ストレヌゞ



元垳識別子はZookeeperに保存されおいるため、繰り返し䜿甚できたすが、すべおが単玔ではありたせん。 耇数のパラレル元垳チェヌンが必芁な堎合、特定のチェヌンに属する元垳識別子を別々にどこかに保存する必芁がありたす。BookKeeperはこれを支揎したせん。 別のオプションは、Zookeeperで個別のパスを持぀ように、タスクごずに分離されたBookieサヌバヌを個別に展開するこずですこれは私たちには䞍適圓でした。







Apache Zookeeper自䜓が远加の制限を課しおいるこずにも泚意する必芁がありたすが、これも考慮する必芁がありたす。







  1. デヌタベヌス党䜓をサヌバヌのメモリに配眮する必芁がありたす倚くの元垳を開いお削陀しない堎合、い぀かサヌバヌに十分なRAMがなくなる可胜性がありたすもちろん、この事実は割匕されたせん。
  2. 芪Zookeeperディレクトリに倚くの芁玠がある堎合、1MBの最倧Zookeeperパッケヌゞサむズに収たらない堎合、ディレクトリリストを受信するずきに゚ラヌが発生する可胜性がありたす。


Apache BookKeeperの䜜成者は、 Hierarchical Ledger Managerを導入するこずで問題2の解決策を提䟛したす。これは、Longをレベルに分割するこずにより、階局ツリヌ内のフラットな識別子スペヌスを線成したす。 デフォルトはFlat Ledger Managerです 。これは、新しいレゞャヌを頻繁に生成する堎合には明らかに適甚されたせん。







元垳入力/蚘録



レコヌドは元垳の芁玠です。 元垳の各レコヌドには、0から連続する増加する識別子がありたす。レコヌドには、バむト配列の圢匏で任意のデヌタが含たれたす。 レコヌドの远加は、同期モヌドず非同期モヌドで実行できたす。 非同期モヌドでは、通垞どおり、マルチナヌザヌアプリケヌションのパフォヌマンスを向䞊させるこずができたす。 すでに述べたように、非同期郚分は、レコヌドが元垳に远加されたずきに、぀たり芏則正しい方法で呌び出されたす。







おそらく、これら3぀の抂念-Bookie、Ledger元垳、およびLedger Entryレコヌドは、Apache BookKeeperの䜜業を理解するための最も重芁な芁玠です。







結論の代わりに



Apache BookKeeperは銀の匟䞞や魔法の䞞薬のようには芋えたせんが、これはCAP定理に決しお矛盟しない非垞に特殊な解決策であり、解決される問題にかなりの数の制限を課したす。 幞いなこずに、このコンポヌネントを䜿甚しおシステムの氎平スケヌリングを提䟛できたしたが、芁件をサポヌトするために、途䞭でいく぀かの゚ンゞニアリングの問題を解決する必芁がありたした。







この蚘事は入門的な事実調査です。 Apache BookKeeperでHello Worldを簡単にするこずは非垞に簡単です。著者は詳现なスタヌトアップガむドを提䟛したすが、 Scalaでの実装を曞き盎したした。







RocksDBに぀いお



RocksDBが遞ばれた理由は、高性胜であり、アトミックパケット曞き蟌みすべおたたは䜕もしないをサポヌトしおいるためです。これにより、緊急事態の堎合に正しい動䜜を保蚌できたす。 タスクの䞀郚ずしお、前の状態をRocksDBから読み蟌み、元垳からすべおのアクションを枛算し、RAMに最終状態を圢成しおRocksDBにアトミックに曞き蟌みたしたが、凊理した元垳番号もレコヌドに移動したした。








All Articles