CLOSE

分散トランザクション in CockroachDB(全4記事)

CockroachDBにおけるトランザクション実行のための3条件 Atomicity、状態判断、順番判断の必要性

Cloud Nativeなシステムを構築するにあたって手助けとなる、アプリケーション開発と運用のアジリティ、可用性、拡張性を支えるさまざまなデータベースを学ぶ「Cloud Native Database Meetup #1」。ここで「分散トランザクション in CockroachDB 」をテーマにkota2and3kan氏が登壇。まずはCockroachDBの概要と課題について紹介します。

CockroachDBの概要

kota2and3kan氏:それでは、「分散トランザクション in CockroachDB」というタイトルで私から話します。まず自己紹介ですが、こたつ&&みかん(@kota2and3kan)というアカウントで活動しています。ふだんはサポートの仕事をしていて、ポスグレやCockroachDBを中心に、データベース周りの技術に興味があります。

(スライドを示して)さっそく本題に入っていきますが、今日はこのような流れで話したいと思います。

まずCockroachDBの概要から話します。CockroachDBは分散SQLデータベースで、いわゆるRDBMS(Relational DataBase Management System)と呼ばれるものです。CockroachDBは分散DBなので、複数のNodeで構成されたクラスタとして動作します。

分散DBであるためデータが分散して格納され、また、すべてのNodeでトランザクションを実行できる特徴もあります。これについて1つずつ見ていきます。

まず、データが分散される部分です。データはRDBMSなので、ユーザーからはテーブルのようなかたちに見えます。そしてこのデータは内部的にKey−Value形式に変換され、Rangeと呼ばれる512メガ単位のデータに分割されます。そして、このRangeを各Nodeにいい感じに分散して格納します。さらにこのRangeは、Raftを使ってReplicaが作成される動作になります。

また、スケールアウトも可能です。先ほどの構成から2匹増えて全体で5匹構成のクラスタになった場合、このデータもいい感じに分散されます。また、スケールインも可能です。

次に、すべてのNodeでトランザクションを実行可能という部分について、話します。CockroachDBではクラスタ内のNode間に役割の差異はありません。いわゆるリーダーやプライマリと呼ばれるような役割の差はなく、すべてのNodeがCoordinatorとして振る舞えます。つまり、すべてのNodeでWriteもReadも実行できるということです。

また、CockroachDBでのCoordinator NodeのことをGateway Nodeと呼びますが、Gateway Nodeは処理対象のKeyを持っているNodeに対して、クエリをルーティングする機能を持っています。

(スライドを示して)例えば、Key15という値に対してWriteを実行しようとすると、実際にはNodeがクエリを受け取りますが、Node自体はデータを持っていないので、Key15という値が入ったデータを持っているNodeにクエリをルーティングして、データを持っているNodeがデータを処理する動きになります。

(スライドを示して)再掲ですが、CockroachDBは分散DBなので、この2つの特徴があります。他にもいろいろありますが、今日はこの2点を押さえてもらえるとよいと思います。

データが分散された状態でトランザクションを実行するための3つの条件

次に、課題について話します。先ほどのように、データが分散された状態でトランザクションを実行するために、いくつかの条件を満たす必要があります。これについても1つずつ見ていきます。

(スライドを示して)まずAtomicityに関してです。CockroachDBでは、先ほどのように分散してデータが格納されていますが、これに対する書き込みは、すべてCOMMITされるか、すべてABORTされるかのどちらかである必要があります。

例えば、トランザクションの中で3つのWriteが実行されると、これらのデータはそれぞれ別々のNodeに書き込まれることになりますが、1つのNodeだけデータが書き込めなかったという状態になることは許されません。

そのため、複数のNodeにまたいだWriteが、すべて一括でCOMMITされるかABORTされるか、Atomicityを満たす必要があります。

次に2つ目の課題です。これは、他のトランザクションの状態を判断する必要があるという内容です。(スライドを示して)例えば、Key15に対してWriteを実行するトランザクションがあります。その隣に、Key15に対してReadを実行するトランザクションがあります。

この2つのトランザクションが同時に実行されると、クエリ自体は真ん中のNodeにルーティングされて、データが書き込まれたり読み込まれたりする動きになります。ただ、Readを実行しているトランザクションがデータを読み込む時には、WriteのトランザクションがCOMMITしているかABORTしているかという情報を確認しないと、どのデータを読んでいいかがわからなくなってしまいます。そのため、トランザクションの状態を確認できるようにする必要があります。

最後に、トランザクションの順番を判断する必要があるという話です。先ほど話したように、CockroachDBでは複数のNodeで同時にトランザクションすることは実行可能です。実際には、複数のトランザクションが複数のNodeで同時に実行されることになります。

(スライドを示して)そうすると、いろいろなクエリが飛び交うことになります。クラスタ全体でクエリが飛び交っている状態で全体の一貫性を確保するために、トランザクションがどのような順番で実行されたかという情報を決める必要があります。これが課題3つ目である、トランザクションの順番を判断する必要がある、という部分です。

(スライドを示して)こちらも再掲ですが、CockroachDBではデータが分散された状態で、今話したような3つの条件を満たす必要があります。こちらも他にも条件などあるのですが、今日はこの3つを押さえておいてもらえると助かります。そしてこの課題を解決するために、分散トランザクションが必要です。

(次回に続く)

続きを読むには会員登録
(無料)が必要です。

会員登録していただくと、すべての記事が制限なく閲覧でき、
著者フォローや記事の保存機能など、便利な機能がご利用いただけます。

無料会員登録

会員の方はこちら

関連タグ:

この記事のスピーカー

同じログの記事

コミュニティ情報

Brand Topics

Brand Topics

  • 大変な現場作業も「動画を撮るだけ」で一瞬で完了 労働者不足のインフラ管理を変える、急成長スタートアップの挑戦 

人気の記事

新着イベント

ログミーBusinessに
記事掲載しませんか?

イベント・インタビュー・対談 etc.

“編集しない編集”で、
スピーカーの「意図をそのまま」お届け!