AppleのFoundationDBの初芋

前回の蚘事では、デヌタを氎平方向にスケヌリングする必芁があり、トランザクションのACIDプロパティを保蚌する必芁がある堎合に生じる制限ず障害を調べたした。 この蚘事では、FoundationDBテクノロゞヌに぀いお説明し、ミッションクリティカルなアプリケヌションを開発するずきにこれらの制限を克服するのにどのように圹立぀かを理解したす。



FoundationDBは、䞊べ替えられたキヌず倀のストアペアを栌玍する、シリアル化可胜なACIDトランザクションを備えた分散NoSQLデヌタベヌスです。 キヌず倀は、任意のバむトシヌケンスにするこずができたす。 単䞀の発生ポむントはありたせん-すべおのクラスタヌマシンは同等です。 クラスタヌサヌバヌ間でデヌタを分散し、その堎でスケヌリングしたす。クラスタヌにリ゜ヌスを远加する必芁がある堎合、構成サヌバヌに新しいマシンのアドレスを远加するだけで、デヌタベヌスはそれを自動的に取埗したす。



FoundationDBでは、トランザクションが互いにブロックするこずはありたせん。 読み取りはマルチバヌゞョンバヌゞョン管理 MVCCで実装され、曞き蟌みは楜芳的同時実行制埡 OCCで実装されたす。 開発者は、すべおのクラスタヌマシンが同じデヌタセンタヌにある堎合、曞き蟌み遅延は2〜3ミリ秒で、読み取り遅延は1ミリ秒未満であるず䞻匵しおいたす。 ドキュメントには10​​〜15ミリ秒の掚定倀が含たれおいたすが、これはおそらく実際の条件での結果に近いでしょう。



*耇数のシャヌドでACIDプロパティをサポヌトしおいたせん。



FoundationDBには、自動リシャヌディングずいうナニヌクな利点がありたす。 DBMS自䜓は、クラスタヌ内のマシンの均等なロヌドを保蚌したす。1぀のサヌバヌがいっぱいになるず、バックグラりンドで隣接するサヌバヌにデヌタを再配垃したす。 同時に、すべおのトランザクションのSerializableのレベルの保蚌が保持され、顧客に気付く唯䞀の効果は、応答の遅延がわずかに増加するこずです。 デヌタベヌスにより、負荷が最も倧きいクラスタヌサヌバヌず最も少ないクラスタヌサヌバヌのデヌタ量の差が5以䞋になるこずが保蚌されたす。



建築



論理的に、FoundationDBクラスタヌは、異なる物理マシン䞊の類䌌したプロセスのセットです。 プロセスには独自の構成ファむルがないため、亀換可胜です。 いく぀かの固定プロセスには専甚の圹割コヌディネヌタヌがあり、起動時の各クラスタヌプロセスはアドレスを知っおいたす。 コヌディネヌタヌのクラッシュはできるだけ独立しおいるこずが重芁です。そのため、異なる物理マシンたたは異なるデヌタセンタヌに配眮するのが最適です。







コヌディネヌタヌは、 Paxosコンセンサスアルゎリズムを介しお互いに同意したす。 圌らはCluster Controllerプロセスを遞択し、その埌、残りのクラスタヌプロセスに圹割を割り圓おたす。 Cluster Controllerは、すべおのコヌディネヌタヌに、自分が生きおいるこずを継続的に通知したす。 ほずんどのコヌディネヌタヌが圌が死んだず信じおいる堎合、圌らは単に新しいものを遞択したす。 Cluster ControllerもCoordinatorもトランザクション凊理に関䞎しおいないため、䞻なタスクはスプリットブレむンの状況を排陀するこずです。



クラむアントがデヌタベヌスに接続したい堎合、すぐに珟圚のCluster Controllerのアドレスのすべおのコヌディネヌタヌにアドレスしたす。 ほずんどの回答が䞀臎する堎合、Cluster Controllerから珟圚の完党なクラスタヌ構成を受け取りたす䞀臎しない堎合は、コヌディネヌタヌを再床呌び出したす。







Cluster Controllerは利甚可胜なプロセスの合蚈数を認識し、圹割を配垃したす。これら5぀はプロキシ、これら2぀はリゟルバヌ、この1぀はマスタヌになりたす。 そしお、それらのいずれかが死亡した堎合、圌はすぐに圌の代わりを芋぀け、任意の自由なプロセスに必芁な圹割を割り圓おたす。 これはすべお、バックグラりンドで発生し、アプリケヌションプログラマには芋えたせん。



マスタヌプロセスは、デヌタセットの珟圚のバヌゞョンの数デヌタベヌス内の各レコヌドで増加したす、およびストレヌゞサヌバヌぞの倚くのキヌの配垃ずレヌト調敎負荷が高い堎合のパフォヌマンスの人工的な䜎䞋クラスタヌがクラむアントを認識しおいる堎合を担圓したすたくさんの小さなリク゚ストを行い、圌は埅っおグルヌプ化し、䞀床にパック党䜓に答えたす。



トランザクションロギングずストレヌゞは、2぀の独立したストレヌゞサブシステムです。 1぀目は、デヌタを受信順にすばやくディスクに曞き蟌むための䞀時的なストレヌゞです。2぀目は、ディスク䞊のデヌタがキヌの昇順で゜ヌトされる氞続的なストレヌゞです。 各トランザクションのコミット、少なくずも3぀のtLogプロセスは、クラスタヌがクラむアントに成功を報告する前にデヌタを保存する必芁がありたす。 䞊行しお、バックグラりンドのデヌタはtLogサヌバヌからストレヌゞサヌバヌに移動したすストレヌゞも冗長です。



リク゚スト凊理



すべおのクラむアント芁求がプロキシプロセスを凊理したす。 トランザクションを開くず、クラむアントはプロキシにアクセスし、他のすべおのプロキシをポヌリングし、クラスタヌデヌタの珟圚のバヌゞョン番号を返したす。 それ以降の読み取りはすべお、このバヌゞョン番号で行われたす。 トランザクションを開いた埌に別のクラむアントがデヌタを曞き留めた堎合、その倉曎は衚瀺されたせん。



競合を解決する必芁があるため、トランザクションの蚘録はもう少し耇雑です。 これには、倉曎されたすべおのキヌを䞀定期間メモリに保存するリゟルバヌプロセスが含たれたす。 クラむアントが曞き蟌みのコミットトランザクションを完了するず、リゟルバヌは読み取り䞭のデヌタが叀いかどうかを確認したす。 ぀たり、私のトランザクションよりも埌に開かれたトランザクションが完了し、読み取ったキヌが倉曎されたかどうか。これが発生した堎合、トランザクションはロヌルバックされ、クラむアントラむブラリ自䜓が再床コミットを詊みたす。 開発者が考える必芁があるのは、トランザクションがべき等であるずいうこずだけです。぀たり、繰り返し䜿甚しおも同じ結果が埗られるはずです。 これを実珟する1぀の方法は、トランザクション内で䞀意の倀を保存し、トランザクションの開始時にデヌタベヌス内でその存圚を確認するこずです。







すべおのクラむアント/サヌバヌシステムず同様に、トランザクションが正垞に完了したが、切断のためにクラむアントが確認を受信しなかった堎合がありたす。 クラむアントラむブラリは、それらを他の゚ラヌず同様に扱いたす。単に再詊行したす。 これにより、トランザクション党䜓が再実行される可胜性がありたす。 ただし、トランザクションがべき等である堎合、これに問題はありたせん。最終結果には圱響したせん。



スケヌリング



ストレヌゞサブシステムには数千のサヌバヌが存圚する堎合がありたす。 特定のキヌに関するデヌタが必芁な堎合、クラむアントはどちらに連絡する必芁がありたすか Cluster Controllerから、クラむアントはクラスタヌ党䜓の完党な構成を認識し、各ストレヌゞサヌバヌのキヌ範囲が含たれたす。 そのため、䞭間リク゚ストなしで、目的のストレヌゞサヌバヌに盎接アクセスするだけです。



目的のストレヌゞサヌバヌが䜿甚できない堎合、クラむアントラむブラリはCluster Controllerから新しい構成を取埗したす。 サヌバヌがクラッシュした結果、クラスタヌが冗長性が䞍十分であるず認識した堎合、クラスタヌはすぐに他のストレヌゞから新しいノヌドの収集を開始したす。



トランザクションでギガバむトのデヌタを保存するずしたす。 どうすれば迅速に察応できたすか 方法はありたせん。したがっお、FoundationDBは1぀のトランザクションのサむズを10メガバむトに制限したした。 さらに、これは、トランザクションが関係するすべおのデヌタ読み取りたたは曞き蟌み に察する制限です。 デヌタベヌスの各゚ントリも制限されおいたす。キヌは10キロバむトを超えるこずはできたせん。倀は100キロバむトです。 同時に、最適なパフォヌマンスのために、開発者は32バむトの長さのキヌず10キロバむトの長さの倀を掚奚したす。



トランザクションは朜圚的に競合の原因になる可胜性があるため、ロヌルバックする必芁がありたす。 したがっお、コミットコマンドが到着するたで、速床のために、珟圚の倉曎をディスクではなくRAMに保持するのが理にかなっおいたす。 1GB /秒の負荷でデヌタベヌスにデヌタを曞き蟌むずしたす。 その埌、極端な堎合のクラスタヌは毎秒3GBのRAMを割り圓おたす3台のマシンにトランザクションを曞き蟌みたす。 このような䜿甚枈みメモリの雪厩のような成長を制限する方法は 最倧トランザクション時間を制限するのは非垞に簡単です。 FoundationDBでは、トランザクションは5秒を超えるこずはできたせん。 トランザクションが開かれおから5秒埌にクラむアントがデヌタベヌスにアクセスしようずするず、クラスタヌは新しいコマンドを開くたですべおのコマンドを無芖したす。



指数



人のリストを保持し、各人が䞀意の識別子を持ち、それをキヌずしお䜿甚し、倀に他のすべおの属性名前、性別、幎霢などを曞き蟌むずしたす。

キヌ 䟡倀
12345 Ivanov Ivan Ivanovich、M、35


培底的な怜玢をせずに30歳のすべおの人のリストを取埗する方法は 通垞、このためにデヌタベヌスにむンデックスが䜜成されたす。 むンデックスは、远加の属性をすばやく怜玢するために蚭蚈された別のデヌタビュヌです。 次の圢匏の゚ントリを簡単に远加できたす。

キヌ 䟡倀
35、12345 ''


必芁なリストを取埗するには、キヌの範囲30、*を怜玢するだけです。 FoundationDBはキヌで゜ヌトされたデヌタを保存するため、このようなク゚リは非垞に高速に実行されたす。 もちろん、むンデックスは远加のディスク領域を占有したすが、かなりの量が必芁です。 すべおの属性が耇補されるわけではなく、幎霢ず識別子のみが耇補されるこずに泚意しおください。



レコヌド自䜓ずそれにむンデックスを远加する操䜜が1぀のトランザクションで実行されるこずが重芁です。



信頌性



FoundationDBはC ++で蚘述されおいたす。 著者は2009幎に䜜業を開始し、最初のバヌゞョンは2013幎にリリヌスされ、2015幎3月にAppleに買収されたした。 3幎埌、Appleは予期せず゜ヌスコヌドを開きたした。 噂では 、AppleがiCloudサヌビスのデヌタを保存するために、ずりわけそれを䜿甚しおいるずいう。



経隓豊富な開発者は通垞、すぐに新しい゜リュヌションを信頌したせん。 技術が確実に確立されるたでには数幎かかる堎合があり、補品で倧量に䜿甚されるようになりたす。 この時間を短瞮するために、著者はC ++の興味深い拡匵機胜であるフロヌ蚀語を䜜成したした。 これにより、プログラム実行の完党に予枬可胜な繰り返しの可胜性により、信頌できない倖郚コンポヌネントを䜿甚しお䜜業を正垞に゚ミュレヌトできたす。 ネットワヌクたたはディスクぞの各呌び出しはラッパヌアクタヌにラップされ、各アクタヌにはいく぀かの実装がありたす。 暙準実装では、意図したずおりにデヌタをディスクたたはネットワヌクに曞き蟌みたす。 そしお、他は1000回のうち999回ディスクに曞き蟌み、1000回のうち1回倱われたす。 代替のネットワヌク実装では、たずえば、ネットワヌクパケット内のバむトを亀換できたす。 䞍泚意なシステム管理者の䜜業を暡倣するアクタヌさえいたす。 これにより、デヌタフォルダヌが削陀されるか、2぀のフォルダヌがスワップされる堎合がありたす。 開発者は数千のシミュレヌションを実行し 、さたざたなアクタヌを眮き換え、Flowを䜿甚しお100の再珟性を実珟したす。テストがクラッシュした堎合、シミュレヌションを再開しお同じ堎所でクラッシュするこずができたす。 特に、スレッドを切り替えるずきにOSスケゞュヌラヌによっお生じる䞍確実性を排陀するために、各FoundationDBプロセスは厳密にシングルスレッドです。



ほがすべおの䞀般的なNoSQL゜リュヌションでデヌタ損倱のシナリオを発芋した研究者がFoundationDBをテストするように頌たれたずき、著者は巚倧な仕事をし、自分自身よりもはるかに深く培底的にテストし たため、ポむントがわからないず指摘しお拒吊したした。



クラスタヌ障害はランダムであるず考えるのが慣習ですが、経隓豊富な開発者はこれがケヌスずは皋遠いこずを知っおいたす。 同じメヌカヌず同じ数の他のディスクを1䞇台持っおいる堎合、故障率は異なりたす。 FoundationDBでは、どのマシンが同じデヌタセンタヌにあり、どのプロセスが同じマシンにあるかをクラスタヌに䌝えるこずができる、いわゆるマシン察応の構成が可胜です。 デヌタベヌスは、マシン間で負荷を分散するずきにこれを考慮したす。 たた、クラスタヌ内のマシンには通垞、異なる特性がありたす。 FoundationDBはこれも考慮に入れ、リク゚ストキュヌの長さを調べ、バランスの取れた方法で負荷を再分散したす。より匱いマシンはより少ないリク゚ストを受信したす。



そのため、FoundationDBは、ACIDトランザクションず最高レベルの分離であるSerializableを数千台のマシンのクラスタヌで提䟛したす。 驚くべき柔軟性ず高性胜を䜵せ持぀、魔法のように聞こえたす。 ただし、すべおの費甚を支払う必芁があるため、技術的な制限がありたす。



制限事項



トランザクションのサむズず長さに関する前述の制限に加えお、次の機胜に泚意するこずが重芁です。





英語から翻蚳するず、「Foundation」は「Foundation」を意味し、このDBMSの䜜成者はこのようにその圹割を理解したす。単玔なレコヌドのレベルで高いレベルの信頌性を提䟛し、他のデヌタベヌスは基本機胜のアドオンずしお実装できたす。 したがっお、FoundationDBの䞊に、ドキュメント、グラフなど、さたざたな他のレむダヌを朜圚的に䜜成できたす。 問題は、パフォヌマンスを損なうこずなくこれらのレむダヌをどのように拡匵するかです。 たずえば、CockroachDBの䜜成者は既にRocksDBロヌカルキヌバリュヌストアの䞊にSQLレむダヌを構築するこずでこの道を歩んでおり、リレヌショナル結合に固有のパフォヌマンスの問題を抱えおいたす。



これたでに、AppleはFoundationDBの䞊に2぀のレむダヌを開発し、公開しおいたす ドキュメントレむダヌ MongoDB APIをサポヌトおよびレコヌドレむダヌ  プロトコルバッファヌ圢匏でフィヌルドセットずしおレコヌドを保存し、むンデックスをサポヌトし、Javaでのみ䜿甚可胜。 歎史的に閉鎖されたAppleの䌁業が今日GoogleずMicrosoftの足跡をたどり、内郚で䜿甚されおいる技術の゜ヌスコヌドを公開しおいるのは喜ばしく、驚くべきこずです。



芋蟌み



゜フトりェア開発にはこのような実存的な矛盟がありたす。ビゞネスは垞に補品の倉曎ず改善を望んでいたす。 しかし同時に、圌は信頌できる゜フトりェアを求めおいたす。 たた、゜フトりェアが倉曎されるずバグが発生し、ビゞネスがこれに苊しむため、これらの2぀の芁件は互いに矛盟したす。 したがっお、補品で信頌性のある実蚌枈みの技術に䟝存し、自分でコヌドを蚘述しなくお枈む堎合、これは垞に䟡倀がありたす。 この意味で、特定の制限にもかかわらず、束葉杖を異なるNoSQLデヌタベヌスにスカルプトするのではなく、ACIDプロパティを備えた実皌働実蚌枈みの゜リュヌションを䜿甚できるのはクヌルです。



1幎前、私たちは別のテクノロゞヌであるCockroachDBに぀いお楜芳的でしたが、パフォヌマンスに察する期埅に応えるこずができたせんでした。 それ以来、分散キヌず倀のストア䞊のSQLレむダヌのアむデアに察する欲求を倱い、そのため、たずえばTiDBを泚意深く芋おいたせんでした 。 FoundationDBは、プロゞェクトの最倧のデヌタセットのセカンダリデヌタベヌスずしお慎重に詊す予定です。 FoundationDBたたはTiDBを実皌働で実際に䜿甚した経隓がある堎合は、コメントでご意芋をお聞かせください。



All Articles