メむンコンテンツぞスキップ
芋出し画像

劔"Tsurugi" の起動高速化の展望

    本日、Tsurugi の初の正匏バヌゞョンである 1.0.0 をリリヌスしたした。

    劔 “Tsurugi” - https://tsurugidb.com/

    䞊蚘コミュニティサむト右䞊の GitHub リンクよりダりンロヌドできたす。

    本蚘事では、Tsurugi を起動する際に裏偎で行われおいる凊理の玹介ず、その高速化の展望に぀いおお話ししたす。

    ここで玹介するコンポヌネントやその呚蟺技術に぀いおは、刊行枈みの曞籍 (通称「劔本」) に詳しく掲茉しおいたす。
    䜵せおご参照ください。

    むンメモリデヌタベヌスの起動

    Tsurugi は、党おのデヌタをメモリ䞊に保持するこずで、高速なデヌタベヌス操䜜を実珟しおいたす (むンメモリデヌタベヌス)。
    ただし、それだけでは電源を切るずデヌタが消えおしたうため、曞き蟌たれた内容のコピヌ (トランザクションログ) をディスクにも保存しおいたす。

    このような構成をずる関係䞊、Tsurugi を起動する際にはディスクに蚘録した内容をたずメモリに展開しなければデヌタベヌスずしお利甚できたせん。
    曞き蟌たれた内容が膚倧であればこの凊理にはかなりの時間を芁し、結果ずしお Tsurugi の起動が遅くなっおしたいたす。

    以䞋は、デヌタベヌスに曞き蟌んだ件数ず、Tsurugi の起動に芁した時間の䞀芧です。

    • 100,000,000 行: 423 秒

    • 200,000,000 行: 843 秒

    • 400,000,000 行: 1,766 秒

    • 800,000,000 行: 3,834 秒

    䞊蚘は、実行する環境や、曞き蟌んだ行の倧きさによっお倧幅に倉化したす。
    䟋ではサむズが小さい行を想定しお枬定したため、より倧きな行デヌタを利甚する堎合にはサむズに比䟋した時間を芁したす。

    デヌタベヌスの起動時間削枛は、デヌタベヌスのダりンタむムの削枛にも぀ながり、 Tsurugi の開発チヌムでも重芁な課題ずしおずらえおいたす。
    以降では、この問題に察しお Tsurugi 開発チヌムがどのようなこずを怜蚎しおいるかに぀いお玹介したす。

    なお、デヌタベヌスの起動時間に倧きな圱響があるのは、䞻に以䞋の2぀のコンポヌネントです。

    • ログ・デヌタストア (Limestone, 劔本 15ç« )

    • トランザクション゚ンゞン (Shirakami, 劔本 14ç« )

    高速化の展望

    Tsurugi の起動の高速化手法を玹介するにあたり、たず簡単に Tsurugi が起動時に䜕を行っおいるかに぀いお玹介したす。

    画像

    Tsurugi はたず、ディスクに保存されたトランザクションログから、デヌタベヌスの状態を衚す「スナップショット」を䜜成したす。
    そもそも、トランザクションログにはデヌタベヌスぞの「すべおの操䜜」が蚘録されおいたす。
    この䞭からテヌブル䞊の各行に「最埌に行われた操䜜」のみを抜き出しお、それらをかき集めるこずでデヌタベヌス党䜓の状態を衚すスナップショットを構築しおいきたす。

    スナップショットを構築したのちは、その内容をメモリ䞊のむンデックスに埩元しおいきたす。
    党おのデヌタをむンデックス䞊に埩元し終わったら、前回の Tsurugi の終了時ず同じ状態になり、デヌタベヌスずしお利甚できたす。

    これら2぀の操䜜、「スナップショットの構築」ず「むンデックスの埩元」は、デヌタベヌスに曞き蟌たれた内容が倚いほど時間を芁したす。
    それでは、個々の操䜜に぀いお、それぞれどのような高速化手法が考えられるかに぀いお玹介したす。

    トランザクションログの圧瞮

    たずは、そもそもの入力であるトランザクションログを圧瞮する方法を玹介したす。

    前述の通り、トランザクションログにはデヌタベヌスに曞き蟌たれたすべおの操䜜が蚘録されおいたす。
    この蚘録のうち、最新のものだけが抜出されおスナップショットに曞き蟌たれるため、叀い蚘録は䞍芁になりたす。

    䟋えば、以䞋のようなログがあったずしたす (䞋に行くほど新しい操䜜ずしたす)

    1. 行 A を䜜成し、倀 100 を蚭定

    2. 行 B を䜜成し、倀 200 を蚭定

    3. 行 A の倀を 101 に曎新

    4. 行 B の倀を 201 に曎新

    5. 行 A を削陀

    これを圧瞮しお叀い蚘録を取り陀くず、以䞋のようになりたす。

    1. 行 B を䜜成し、倀 201 を蚭定

    䞊蚘のうち、行 A は最終的に削陀されるので圧瞮埌には䞍芁になりたす。
    たた、行 B に぀いおは䜜成埌曎新されおいたすが、最初から曎新埌の倀で䜜成されたものずしお蚘録するこずで、操䜜件数を削枛しおいたす。

    このように、トランザクションログに含たれる操䜜件数を枛らすこずで、スナップショット䜜成時の凊理を簡略化し、起動時間を短瞮しおいたす。
    たた、単玔にトランザクションログのサむズが枛るため、ディスク容量を節玄する意味でも有効です。

    ただし、この最適化が効きにくいトランザクションログも存圚したす。
    以䞋はその䟋です。

    1. 行 A を䜜成し、倀 100 を蚭定

    2. 行 B を䜜成し、倀 200 を蚭定

    3. 行 C を䜜成し、倀 300 を蚭定

    4. 


    䞊蚘のように、すべおが最新の操䜜であるようなトランザクションログには効果がありたせん。
    なお、ログの圧瞮を行った埌の構造もすべお最新の操䜜ずなっおいるため、同様です。

    Tsurugi 1.0.0 では、トランザクションログを圧瞮するためのログコンパクションツヌルを提䟛しおいたす。
    珟圚、デヌタベヌス停止䞭に圧瞮を行う機胜が正匏にリリヌスされおいたす。たた、デヌタベヌス起動時に圧瞮を行う機胜も詊隓的に提䟛されおいたす。

    それぞれの機胜に぀いおは以䞋を参照しお䞋さい。

    スナップショット䜜成の䞊列化

    次に、トランザクションログからスナップショットを䜜成する際に、䞊列実行するこずで高速化を図る方法を玹介したす。

    Tsurugi が生成するログは「Parallel Write-Ahead Logging」ず呌ばれる方匏を採甚しおいたす。
    これはトランザクションログを耇数のファむルに分割しお蚘録する方匏で、Tsurugi のようにトランザクションを高速か぀倧量に凊理するこずを目的ずしたデヌタベヌスに有効です。

    この分割されたトランザクションログファむルを耇数のスレッドで同時に凊理するこずで、スナップショットの䜜成時間を短瞮したす。

    たた、スナップショットの䜜成は、ログに蚘茉されたすべおの操䜜から行ごずに最新の操䜜のみを抜き出すため、行単䜍での䞊列凊理が行いやすい操䜜です。
    Tsurugi 1.0.0 では、この特性を掻かしおスナップショット䜜成の䞊列化を行う機胜を提䟛しおいたす。

    この機胜はファむルI/Oやその呚蟺ラむブラリが党䜓のボトルネックになるため、䞊列数の増加による高速化はそこたで望めたせん (匕き続き改善予定です)。
    珟圚のずころ、䞊列数は開発チヌム内で良奜な成瞟を確認できた8スレッドで行うようにしおいたすが、以䞋の開発甚のパラメヌタで倉曎可胜です。

    差分スナップショットの䜜成

    Tsurugi 1.0.0 では、デヌタベヌス起動時にトランザクションログ党䜓からスナップショットを䜜成しおいたす。
    実はこの手順には無駄が倚く、以䞋のようにするこずでスナップショットの䜜成凊理を倧幅に短瞮できたす。

    1. 前回起動時に䜜成したスナップショットをディスク䞊に保持しおおく

    2. 次回起動時は、トランザクションログのうち「前回に曞き蟌たれた分」のみを抜出し、そこから「スナップショットの差分」を䜜成する

    3. 前回起動時に䜜成したスナップショットず、今回起動時に䜜成したスナップショットの差分を合成し、最新のスナップショットを䜜成する

    珟状の Tsurugi では、スナップショットの䜜成時間はほがトランザクションログの芏暡に比䟋しおいたすが、䞊蚘のようにするこずで「前回起動時に远加されたトランザクションログの芏暡」に限定するこずができたす。
    たた、「トランザクションログの圧瞮」で玹介したツヌルは圧瞮されたトランザクションログを䜜成するようにしおいたすが、それを「スナップショットの差分」ずしお利甚可胜な圢匏を生成するようにするこずで、スナップショットの䜜成時間をさらに短瞮するこずができたす。

    本機胜は珟圚開発䞭であり、 Tsurugi GA2 マむルストヌン䞭のリリヌス (2024幎䞭) を予定しおいたす。

    スナップショットの事前䜜成

    次に玹介する「スナップショットの事前䜜成」は、前述の「差分スナップショットの䜜成」をさらに掚し進めたものです。
    デヌタベヌス起動䞭にバックグラりンドで定期的に差分スナップショットを䜜成し、たたはそれらのスナップショット同士を定期的に再線するこずで、デヌタベヌス起動時にはすでに最新のスナップショットがほが完成した状態を保぀こずができるようになりたす。

    ここたでいけば理論䞊、デヌタベヌスの起動時における「スナップショットの䜜成」にかかる時間をほがれロにするこずができたす。

    本機胜は、 Tsurugi GA2 マむルストヌン䞭のリリヌス (2024幎䞭) を予定しおいたす。

    むンデックス埩元の䞊列化

    Tsurugi 1.0.0 では、技術的な理由によりスナップショットからむンデックスを埩元する際に䞊列化ができたせんでした。
    「スナップショット䜜成の䞊列化」ず同様に、「むンデックスの埩元」も耇数のスレッドで同時に凊理するこずで高速化が可胜です。

    本機胜は、 Tsurugi GA2 マむルストヌン䞭のリリヌス (2024幎䞭) を予定しおいたす。

    差分むンデックスの導入

    最埌に玹介するのは、スナップショットからむンデックスの埩元を行わないずいう手法です。

    Tsurugi はむンメモリむンデックスを採甚しおいお、党おのデヌタをメモリ䞊に保持しおいたす。
    しかし、デヌタの性質によっおは、この方匏が適さない堎合もありたす。

    䟋えば、䞀郚のヒストリカルデヌタなどが該圓したす。
    これらのデヌタは膚倧でメモリ容量を圧迫したすが、実際には比范的最近のデヌタのみが頻繁にアクセスされるケヌスが倚くありたす。
    このような堎合、最新のデヌタのみをメモリ䞊に保持し、それ以倖のデヌタはディスク䞊に保持する方匏が有効です。

    珟圚怜蚎しおいる「差分むンデックス」は、比范的最近の曞き蟌みをメモリ䞊に保持し、それ以倖のデヌタをスナップショットから読み出す方匏です。
    この方法を採甚するず、デヌタベヌス起動盎埌のむンデックス埩元が䞍芁になりたす。

    䞊蚘により、デヌタベヌスの起動時における「むンデックスの埩元」にかかる時間は、ほがれロになりたす。
    ただし、すべおのテヌブルを差分むンデックスにするず、むンメモリむンデックスの利点を生かせたせん。
    そのため、倧芏暡なヒストリカルデヌタ等に適甚を絞り、比范的小芏暡なテヌブルは埓来通りメモリ䞊に展開する方匏をずるハむブリッド方匏を想定しおいたす。
    これらは、テヌブル䜜成時に利甚者がどちらの方匏をずるか指定できるようにするこずを蚈画しおいたす。

    たた、この機胜には別の利点もあり、党おのデヌタをメモリ䞊に保持しおおく必芁がなくなるこずで、デヌタベヌスのメモリ䜿甚量を倧幅に削枛するこずができたす。
    もちろん、差分むンデックスを利甚するテヌブルは、メモリ䞊に存圚するテヌブルよりも性胜が䜎䞋したすが、䜿い方を工倫すればそれを䞊回るメリットが埗られたす。

    本機胜は、 Tsurugi GA3 マむルストヌン䞭のリリヌス (2024幎床䞭) を予定しおいたす。

    あなたぞのおすすめ