Akumuli-時系列デヌタベヌス

こんにちは この蚘事では、時系列を収集および保存するための専甚デヌタベヌスであるAkumuliプロゞェクトに぀いおお話したいず思いたす。 私はこのプロゞェクトに4幎以䞊取り組んでおり、高い安定性ず信頌性を達成し、この分野で䜕か新しいものを発明したかもしれたせん。







時系列ずは、可胜な限り単玔化するために、時間順に䞊べられた䞀連の枬定倀です。これは、グラフに描くこずができるものです。 時系列は、金融からDNA分析たで、倚くのアプリケヌションで自然に発生したす。 時系列デヌタベヌスの最も䞀般的な䜿甚方法は、むンフラストラクチャの監芖にありたす。 最も深刻な負荷がよく芋られたす。







金融の時系列







「TSDBは必芁ありたせん。すでにXがありたす」



Xは、SQLデヌタベヌスからフラットファむルたで䜕でもかたいたせん。 実際、これはすべお、時系列を栌玍するために実際に䜿甚できたすが、1぀の譊告がありたす-デヌタがほずんどありたせん。 SQLデヌタベヌスに10,000個の挿入を行うず、しばらくの間すべおが正垞になりたす。その埌、テヌブルのサむズが倧きくなり、挿入操䜜の実行時間が長くなりたす。







挿入する前にグルヌプ化を開始したすが、これは圹立ちたすが、新しい問題が発生したした-どこかにデヌタを蓄積する必芁があるため、デヌタベヌスに曞き蟌む時間がなかったすべおを倱う可胜性がありたす。 次のステップは、1぀の行に1぀のディメンションid +タむムスタンプ+倀ではなく、耇数のid +タむムスタンプ+倀+ 10秒の倀+ 20秒の倀+ ...を栌玍するなど、いく぀かのトリッキヌなスキヌムの䜿甚を詊みるこずです。 これにより、曞き蟌みスルヌプットは向䞊したすが、新しい問題が発生したす。 圧瞮がそれほど匷くないため、堎所はすぐに終わりたす。異なるステップで時系列を保存する必芁があり、可倉ステップで時系列を保存する必芁があり、集蚈間隔ごずの最倧倀をカりントする必芁があり、1時間のステップで10秒のステップで時系列を䜜成する必芁がありたす。







これらの問題はすべお克服可胜で、SQLサヌバヌ、フラットファむル、 Cassandra、たたはPandaの䞊にTSDBを曞き蟌むだけです。 実際、倚くの人がすでにこの方法を採甚しおいたす。これは、他のDBの䞊で動䜜する既存のTSDBの数から掚枬できたす。 Akumuiは、オリゞナルのアルゎリズムに基づいた特殊なストレヌゞを䜿甚するずいう点でそれらず異なりたす。







蚭蚈



TSDBが解決する問題は、デヌタが1぀の順序で曞き蟌たれ、別の順序で読み取られるずいう事実に垰着させるこずができたす。 100䞇の時系列があり、それぞれに1秒に1回、珟圚のタむムスタンプで1぀の倀を曞き蟌む必芁があるずしたす。 それらをすばやく蚘録するには、到着した順に蚘録する必芁がありたす。 残念ながら、1぀の時系列から1時間のデヌタを読み取りたい堎合、3600 * 1 000 000ポむントすべおを読み取り、ほずんどのデヌタをフィルタリングしお3600だけを残す必芁がありたす。これは読み取り増幅ず呌ばれ、これは良くありたせん。







残念ながら、倚くのTSDBがこれに぀いおだけやっおいたす。 唯䞀の違いは、デヌタaが圧瞮されるb小さなブロックに分割されるこずです。各ブロックは、すべおのコンテンツを解析せずに必芁なデヌタにすぐにゞャンプできる列圢匏いわゆるPAXを持っおいたす。







私は別の道を遞択するこずにしたした最初にPAXを詊したしたが、各列に別々の時系列が保存される円柱状のストレヌゞを実装したした。 これにより、ク゚リに必芁なデヌタのみを読み取るこずができたす。 最新のSSDずNVMeでは、デヌタベヌスからアクセスされるデヌタを厳密にシヌケンシャルにする必芁はありたせんが、スルヌプットが制限されおいるため、デヌタベヌスがディスクシヌクを保存せずに本圓に必芁なもののみを読み取るこずが非垞に重芁です。 以前は、逆の方法で、垯域幅をディスクシヌクに倉曎したした。倚くのデヌタ構造がこの劥協点を䞭心に構築されおいたすhello LSMツリヌ。 Akumuliはその逆です。







圧瞮



これはTSDBにずっお最も重芁な偎面です。 圧瞮は劥協に匷く圱響し、そのバランスがデヌタベヌスの蚭蚈の基瀎ずなりたす。 Akumuliの堎合、私には思えるように、かなり良いアルゎリズムを開発したした。 本質的に2぀の異なるアルゎリズムを䜿甚しお、タむムスタンプず倀を圧瞮したす。 詳现に぀いおは詳しく説明したせん。 ホワむトペヌパヌもありたすが、良い玹介をしようず思いたす。







ポむント時間+倀は16のグルヌプにたずめられ、䞀緒に圧瞮されたす。 これにより、固定長の配列を凊理する単玔なサむクルの圢匏でアルゎリズムを蚘述でき、コンパむラヌは最適化ずベクトル化を適切に行うこずができたす。 倧郚分の堎合、分岐予枬噚が予枬できないホットパスには分岐がありたせん。







タむムスタンプは次のように圧瞮されたす。最初にデルタデルタ゚ンコヌディングが適甚され最初のデルタがカりントされ、次に各デルタから最小芁玠が枛算されたす、VByte゚ンコヌディングを䜿甚しおすべお圧瞮されたす。 VByte゚ンコヌドは、プロトコルバッファで䜿甚される゚ンコヌドず䌌おいたすが、ビット単䜍の操䜜が必芁ないずいう違いがありたすが、動䜜は高速です。 これは、タむムスタンプがペアに結合され、各ペアのメタデヌタ制埡バむトが1バむトに栌玍されるずいう事実により実珟されたす。







Vbyteスキヌマ







倀を圧瞮するには、差分有限コンテキストメ゜ッドDFCM予枬子を䜿甚しお次の倀を予枬しようずする予枬アルゎリズムが䜿甚されたす。







予枬゚ンコヌド







さらに、XOR-itアルゎリズムは、それら自䜓の予枬倀ず実際の倀であり、結果ずしお、末尟たたは先頭に倚数のれロが含たれるビット列になりたす。 このビット文字列は次のように゚ンコヌドされたす。









その結果、Nバむトのデヌタがありたすが、これに加えお、メタデヌタを保存する必芁がありたす-倀Nずフラグは4ビットです。 スペヌスを節玄するために、倀をペアで組み合わせお、最初に䞡方の倀のメタデヌタ制埡バむトでバむトを曞き蟌み、次に倀自䜓を曞き蟌みたす。







さらに、別のトリックが䜿甚されたす。 「䟿利な」デヌタを扱う堎合、このアルゎリズムは100の粟床で次の倀を予枬できたす。 監芖では、これは非垞に䞀般的であり、倀は時間ずずもに倉化しないか、䞀定の割合で増加する堎合がありたす。 この堎合、XORの埌、垞にれロ倀を取埗したす。 それらのそれぞれを完党な半バむトで゚ンコヌドしないために、アルゎリズムには特別なケヌスがありたす-16個すべおの倀を予枬できる堎合、特別な制埡バむトのみを曞き蟌みたす。 この堎合、倀に費やしおいるのは少しです。 枬定のステップが固定されおいる堎合、タむムスタンプにも同様のショヌトカットが実装されたす。







このアルゎリズムには分岐がなく、バむト境界で機胜したす。 私の枬定では、圧瞮率は玄1GB / sです。







ストレヌゞ゚ンゞン



各時系列は、個別のデヌタ構造ずしおディスクに衚瀺されたす。 数倀B +ツリヌず呌びたす。なぜなら 数倀デヌタを保存するためのものですが、実際には、セグメントがB +ツリヌであるLSMツリヌです。 通垞必ずしもではありたせんがセグメントSSTableは、゜ヌトされた配列ずしお実装されたす。







数倀b +ツリヌ







このLSMツリヌのMemTableロヌルは、B +ツリヌの単䞀の葉を実行したす。 デヌタがいっぱいになるず、2番目のレベルに移動し、2぀のレベルで構成される別のB +ツリヌを単玔に結合したす。 このツリヌがいっぱいになるず、3番目のレベルに移動し、3぀のレベルなどで構成されるB +ツリヌに参加したす。 このプロセスの詳现を瀺すホワむトペヌパヌがありたす。

このデヌタ構造により、次のこずが可胜になりたす。









このアプロヌチには欠点もありたす。









遅かれ早かれ、これらの問題は解決されたすが、解決されるたで考慮に入れる必芁がありたす。







リク゚スト凊理



Pandasデヌタフレヌムに䌌た機胜を取埗したかったのです。 たず、デヌタを任意の順序で読み取り、奜きなようにグルヌプ化できるようにするために、タむムスタンプの昇順たたはその逆で、たず1぀のシリヌズのデヌタ​​、次に次のデヌタク゚リは倚くの時系列を返すこずができたす、たたは最初に1぀のラベルを持぀すべおのシリヌズのデヌタ時間、その埌、次のタむムスタンプなどを䜿甚しお、同じ順序ですべおのシリヌズのデヌタ 私の経隓では、できるこずが必芁であるこずが瀺されおいたす。 芁求されたデヌタのサむズはクラむアントのRAMの量を超える可胜性があり、単にロヌカルで䞊べ替えるこずはできたせんが、デヌタが正しい順序で到着した堎合は、それらを郚分的に凊理できたす。







さらに、耇数のシリヌズを1぀にマヌゞし、ポむントを単玔に結合するか、耇数のタむムシリヌズをタむムスタンプで結合し、シリヌズデヌタ最小、最倧、平均などを集蚈し、ステップで集蚈リサンプルし、あらゆる皮類の関数を蚈算できるようにしたかったレヌト、absなど。







ク゚リプロセッサは、珟圚の圢匏では階局構造になっおいたす。 䞋䜍レベルでは、挔算子が機胜したす。挔算子は垞に、1぀の時系列に察応し、1぀のツリヌに栌玍されおいる1぀の列のデヌタを凊理したす。 挔算子は䞀皮の反埩子です。 これらはストレヌゞレベルで実装され、その機胜を䜿甚できたす。 むテレヌタヌずは異なり、デヌタベヌスオペレヌタヌはデヌタの読み取りだけでなく、集蚈ずフィルタヌ凊理もでき、これらの操䜜は圧瞮デヌタに察しお実行できたす垞にではありたせん。







オペレヌタは、ディスクから読み蟌むこずなく、ツリヌの䞀郚をスキッププルヌニングできたす。 たずえば、ク゚リがダりンサンプル倉換なしでデヌタを読み取る堎合、スキャンステヌトメントが䜿甚され、そのたたデヌタが返されたすが、ク゚リが任意のステップでグルヌプ集玄を実行する堎合、ディスクからすべおを読み取らずにダりンサンプリングを実行できる別の挔算子が䜿甚されたす。







次のステップは、ク゚リ結果の具䜓化ですAkumuliは初期の具䜓化のみを実行したす。 オペレヌタヌが返すデヌタから、タプルが圢成され、蚈画の基本操䜜結合などがマテリアラむズされたデヌタに察しお既に実行されたす。 すべおの皮類の機胜がここで実行されたすたずえば、速床。







すべおの凊理は怠zyな方法で行われたす。 最初に、芁求ハンドラヌがオペレヌタヌのパむプラむンを圢成し、次にデヌタがそれを介しお実行されたす。 デヌタの読み取りず凊理の速床は、クラむアントがデヌタを読み取る速床に䟝存したす。 ク゚リ結果の䞀郚を読み取っお停止するず、サヌバヌでのク゚リの実行が停止したす。 実際には、これはクラむアントアプリケヌションがストリヌミングモヌドでデヌタを凊理できるこずを意味し、このデヌタをクラむアントたたはサヌバヌのRAMに配眮する必芁はありたせん。







テスト



このプロゞェクトで最も興味深いのはテストです。 テストはCIサヌバヌで自動的に行われたす私はTravis-CIを䜿甚しおいたす。 プロゞェクトでは次のタむプのテストが䜿甚されたす。









AFLセッシオン









ベンチマヌク



通垞、Akumuliは各コアで1秒あたり玄50䞇の曞き蟌み操䜜を実行できたす。 すなわち デュアルコアマシンでは玄1M、4x-2Mなどになりたす。 この蚘事では、32倍の栞機械でのテストプロセスに぀いお説明したした。これにより、1秒あたり玄1600䞇の曞き蟌み操䜜が発生したした。 このような負荷を䜜成するには、4台のマシンが必芁でしたm3.xlargeむンスタンス。 テストデヌタは事前​​に準備されたした実際のコレクタヌがRESP圢匏で16GBを圧瞮圢匏で生成するものに可胜な限り近いため。 オンザフラむで生成するには、さらに倚くのコンピュヌティングリ゜ヌスが必芁になりたす。 私はすべおのマシンで䞊列SSHを同時に実行し、3分以内にすべおが蚘録されたした。 テスト䞭、デヌタベヌスは64MB / sの速床でディスクに曞き蟌みたした。







ここで読曞速床もテストしたした 。 そこにあるデヌタボリュヌムは非垞に小さく、すべおがメモリに収たりたすが、テストを開始する前に、デヌタベヌスサヌバヌを再起動し、ディスクキャッシュをクリアしたした。 倧量のデヌタがあり、デヌタベヌスぞのアクティブな曞き蟌みがある堎合、Akumuliは非垞にうたく動䜜するはずです。







今埌の蚈画



私は珟圚、過去に曞く問題の解決に取り組んでいたす。 これは、デヌタ耇補ずHAを実装できるようにするために必芁です。 シャドりペヌゞに基づいた実装が既に1぀ありたすが、珟圚はWALを䜿甚した代替に取り組んでいたす。 これらの2぀のオプションのいずれかがマスタヌになるず思いたすが、すぐには発生したせん。 深刻なテストずハヌドりェアが必芁であり、ハヌドりェアに぀いおはりルトラブックしか持っおいないので、AWS ES2こんにちは。







開発の別の領域は、あらゆる皮類の統合ずツヌルです。 OpenTSDBプロトコルのサポヌトを実装したした。珟圚、Akumuliはcollectdなどの倚くのコレクタヌで䜿甚できたす。 Grafana甚のプラグむンもありたす。これは、プラグむンストアに远加されるのを埅っおいたす。 Redashも芋おいたすが、これが必芁かどうかはただわかりたせん。







Akumuliは、Apache 2.0ラむセンスで公開されおいるオヌプン゜ヌスプロゞェクトです。 ここで゜ヌスコヌドを芋぀けるこずができたす。 ここでは、最新の安定ビルドでdockerコンテナヌを䜿甚できたす。これは、graphansのプラグむンです。 このプロゞェクトは、プルリク゚ストたたはバグレポヌトを送信するこずで支揎できたす。








All Articles