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つを押さえておいてもらえると助かります。そしてこの課題を解決するために、分散トランザクションが必要です。

(次回に続く)