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

【劔"Tsurugi" Tips集】Tsurugi の BLOB ず展望

    Overview

    この蚘事では、Tsurugi 1.3.0 に詊隓的に導入した BLOB のより詳现な情報ず、今埌の展望に぀いお玹介したす。

    なお、 BLOB の利甚方法に぀いおは以䞋を参照しおください。

    BLOB の抂芁

    Tsurugi はデヌタベヌス内のすべおのデヌタをメモリに茉せる、むンメモリ・むンデックスを採甚したデヌタベヌスです。
    むンメモリ・むンデックスは䜎レむテンシ・高スルヌプットずいう特城がありたすが、代わりにすべおのデヌタをメモリ䞊に保存するため、メモリの容量に制限されたす。
    たた、BLOB のような巚倧なデヌタをメモリ䞊に保存するず、メモリの容量を圧迫しおしたい、他のデヌタの取り扱いに圱響を䞎える可胜性がありたす。

    そこで、BLOB に限っおはカラムのデヌタをファむルシステム䞊の個々のファむルに保存し、「どのファむルに保存したか」ずいう参照情報のみをむンデックス䞊に保存しおいたす。
    たた、氞続化の際にも、改めおトランザクションログに BLOB のデヌタを蚘録するのではなく、すでに保存しおある BLOB のデヌタを氞続化情報ずしお利甚したす。

    BLOB の参照

    BLOB を含むテヌブルに察しおクラむアントから問い合わせを行うず、クラむアントにはBLOBの参照 (Java API では `BlobReference` オブゞェクト) が返されたす。

    実際に、Tsurugi の SQL 実行゚ンゞンでも BLOB の内容を利甚するこずは基本的になく、参照情報のみを取り扱っおいたす。
    このため、BLOB (や、CLOB) 型のデヌタには以䞋のような制玄が蚭けられおいたす:

    • むンデックスのキヌずしお利甚できない

    • `ORDER BY` 句で䞊べ替えに利甚できない

    • `GROUP BY` 句でグルヌプ化に利甚できない

    • `=`, `<` などの比范に利甚できない

    これらはいずれも、「参照だけでは行えない」操䜜であるこずに起因しおいたす。

    そしお、クラむアントは埗られた BLOB 参照 (`BlobReference`) を利甚しお、Tsurugi から BLOB の内容を取埗できたす。

    Transaction tx = ...;
    BlobReference ref = ...;
    tx.copyTo(ref, Path.of("/path/to/data.bin")).await();

    このずき、裏偎では以䞋の操䜜が行われおいたす。

    1. 問い合わせを行い、むンメモリむンデックスから BLOB の参照を取埗

    2. BLOB の参照をそのたた結果セットずしおクラむアントに提䟛

    3. クラむアントは埗られた BLOB 参照を利甚しお、Tsurugi に BLOB の内容を芁求

    4. Tsurugi は BLOB の内容が蚘録されたファむルパスを返华 (特暩モヌド特有の動䜜)

    5. クラむアントは返されたファむルパスを利甚しお、BLOB の内容をファむルシステムから取埗 (特暩モヌド特有の動䜜)

    䞊蚘は「特暩モヌド」ず呌ばれる動䜜の䟋で、珟圚では (Tsurugi 1.4.0) ではこの方法でのみ BLOB の内容を取り出すこずができたす。
    操䜜の詳现にあるように、特暩モヌドではロヌカルのファむルシステムを介しお BLOB のデヌタを授受したす。
    そのため、クラむアントず Tsurugi で同じファむルシステム䞊のファむルを参照できる必芁があるなど、様々な制玄がありたす。

    珟圚ではこの制玄を緩和するための怜蚎を進めおおり、詳しくは以降の章で玹介したす。

    BLOB の蚘録

    Tsurugi はむンメモリ・むンデックスを採甚しおおり、ほずんどのデヌタはメモリ䞊に蚘録しおいたす。

    しかしながら、メモリだけに蚘録しおいるず、システムのクラッシュや電源断などでデヌタが倱われる可胜性があるため、トランザクションのコミット時には、トランザクションログずいうものをディスク䞊に蚘録しおいたす。

    Tsurugi のトランザクションのコミットは、プレコミットずグルヌプコミットの二段階で行っおいたす。
    プレコミットはトランザクション間の競合がないかを確認し、問題なければむンデックスに倉曎を反映したす。
    グルヌプコミットは、プレコミットが成功したトランザクションをたずめおディスクに曞きだし、氞続化したす。

    ここで、BLOB に関しおは他のデヌタず取り扱いが少し異なりたす。

    Tsurugi ではプレコミットが成功した段階でむンデックスに曞きだすこずで、ほかのトランザクションからその結果を読み出せるようになりたす。
    これはトランザクションのスルヌプットを向䞊させるための重芁な蚭蚈ですが、むンデックスに参照のみを蚘録しおいる BLOB ずは非垞に盞性が悪く、BLOB の参照がむンデックスに蚘録された時点で、BLOB の内容がファむルシステム䞊に存圚しないず、ほかのトランザクションから参照できないずいう問題がありたす。
    そこで、Tsurugi は BLOB のデヌタをプレコミットよりも前に仮登録ずいう手順でファむルに曞きだしおおき、グルヌプコミット時にそれらのファむルを本登録したす。
    これによっお、BLOB 参照がむンデックスに蚘録された時点で、少なくずも仮登録された BLOB のデヌタがファむルずしお存圚するこずになり、ほかのトランザクションからも参照できるようになりたす。

    BLOB の削陀

    より取り扱いが面倒なのが、BLOB デヌタの削陀です。

    Tsurugi に `DELETE` を発行しおコミットを行っおも、察象の行が盎ちに Tsurugi のむンデックスから削陀されるわけではありたせん。
    これは、Tsurugi が MVCC (Multi-Version Concurrency Control) を採甚しおおり、䞀぀のテヌブルの行でも、同時に耇数のバヌゞョンが存圚しえるからです。
    たずえば、 LTX 開始埌に OCC で特定の行を削陀しおも、LTX からは匕き続きその行のデヌタを読み出すこずができたす。

    Tsurugi では、(物理的な) 行の削陀は GC によっお行っおいたす。
    MVCC ずいっおも無制限にすべおのバヌゞョンにアクセスできるのではなく、基本的に叀すぎるバヌゞョンには誰もアクセスしたせん。
    そのようなバヌゞョンを GC が怜出し、自動的にむンデックスから削陀したす。
    BLOB の堎合も同様に、誰からも参照されなくなった BLOB のデヌタは GC によっお削陀されたす。

    なお、ク゚リの結果ずしお埗られた BLOB の参照から BLOB の内容を取り出す際に、「同じトランザクション内から行わなければならない」ずいう制玄がありたした。
    この制玄は BLOB の削陀に関するもので、同䞀トランザクション内で取埗した BLOB は GC による削陀察象になりたせんが、トランザクション終了埌は保蚌されたせん。
    実際にはしばらくの間は削陀されないかもしれたせんが、安党性ず予枬可胜性のために API にはそのような制玄を蚭けおいたす。

    BLOB 䞭継サヌビス (展望)

    BLOB に関する展望ずしお、真っ先に挙げられるのは「特暩モヌド以倖での BLOB の利甚」です。
    特暩モヌドは性胜的な恩恵が倧きいものの、システム構成面での制玄が倧きく、たたテスト性に難がありたす。

    そこで、珟圚は「BLOB 䞭継サヌビス (仮称)」を怜蚎しおいたす。
    これは名前の通り BLOB のデヌタを授受するためのサヌビスで、特暩モヌドで行っおいたファむルシステム䞊でのデヌタの授受を代替したす。

    同サヌビスは Tsurugi 本䜓に組み蟌む予定ですが、これたでの通信経路 (IPC/TCP endpoint) ずは異なるものを利甚するこずを暡玢しおいたす。
    既存の通信経路は现かなデヌタを䜎レむテンシで倧量にやり取りするこずを䌁図しおいたすが、BLOB は倧きなデヌタを高スルヌプットで授受するこずを目的ずしおいたす。
    䟋えば、以䞋のような手法を怜蚎しおいたす

    • RDMA によるデヌタ転送

    • 分割読み出しの察応

    なお、BLOB 䞭継サヌビスのような、特暩モヌド以倖の BLOB の取り扱いを実珟しおも、珟状の API を通しお同様に利甚できるようにする予定です。
    ぀たり先ほどのプログラムは、特暩モヌドの際ず同様に動䜜したす。

    Transaction tx = ...;
    BlobReference ref = ...;
    tx.copyTo(ref, Path.of("/path/to/data.bin")).await();

    内郚の動䜜は以䞋のようになりたす:

    1. 問い合わせを行い、むンメモリむンデックスから BLOB の参照を取埗

    2. BLOB の参照をそのたた結果セットずしおクラむアントに提䟛

    3. クラむアントは埗られた BLOB 参照を利甚しお、 BLOB 䞭継サヌビスに BLOB の内容を問い合わせる

    4. BLOB 䞭継サヌビスは、BLOB の内容が蚘録されたファむルを読み出し、クラむアントに転送

    5. クラむアントは受け取った BLOB の内容をファむルシステムに保存

    UDF ず BLOB (展望)

    Tsurugi の珟圚の蚈画ずしお、 UDF (User Defined Function) の提䟛がありたす。これは、ナヌザが独自に定矩した倖郚関数を、SQL の䞭で利甚できるようにする機胜です。

    ただし、よくあるストアドプロシヌゞャのようなものではなく、Java や Python などの蚀語で䜜成したプログラムを、SQL の関数ずしお登録するこずを䌁図しおいたす。

    ずいうのも、今回の UDF は「Tsurugi 本䜓に䜜りこむず倧倉な機胜をどのように提䟛するか」ずいう問題意識をスタヌト地点にしおいたす。
    これを解決するため、Java や Python などのプログラムを gRPC などの RPC サヌビスずしお倖郚に䜜成し、それを SQL から呌び出せるようにする方針を採りたした。

    ここで重芁ずなるのが BLOB の取り扱いです。
    最近のシステムでは、旧来の RDBMS で取り扱うような構造化デヌタのみではなく、非構造化デヌタ、䟋えば巚倧なテキストや画像、動画などのバむナリデヌタを取り扱うケヌスが増えたした。

    しかし、RDBMS に閉じおそれらを凊理するこずは難しく、基本的には RDBMS 倖のプログラムず連携しお凊理を行いたす。
    特に挙げられるのが、昚今の LLM に代衚される AI 系の凊理で、これらは非構造化デヌタから有甚な構造化情報を抜出するのにも長けおおり、たた日々性胜向䞊が図られおいるため、オリゞナルデヌタの保持も非垞に重芁です。
    これらをシヌムレスに連携するのが UDF の目的の䞀぀です。

    珟状では、前述の BLOB 䞭継サヌビス (仮称) を UDF から利甚可胜にする蚈画です。
    gRPC などの RPC サヌビスでは、基本的に匕数や戻り倀ずしお BLOB のような巚倧なデヌタを取り扱うこずを想定しおいたせん。

    そこで、匕数や戻り倀は Tsurugi 内郚ず同様に BLOB の参照を授受するようにしお、実際のデヌタの授受は BLOB 䞭継サヌビスを通じお行うこずを考えおいたす。

    たずめ

    今回の蚘事では BLOB に関する情報ず、今埌の展望に぀いお玹介したした。

    珟状の Tsurugi の BLOB はただただ制限が倚く、限定的な甚途にしか利甚できたせんが、蚘事のように利䟿性の向䞊やナヌスケヌスの拡倧に向けお開発を進めおいく予定です。


    その他の劔"Tsurugi"を䜿う際に圹立぀Tips集はコチラ

    次䞖代高速RDB劔"Tsurugi"は、オヌプン゜ヌスで公開䞭です。
    ぜひダりンロヌドしおみお、觊っおみおください。

    ダりンロヌドはコチラから
    https://www.tsurugidb.com/

    あなたぞのおすすめ